当前位置: 首页>编程语言>正文

elk环境 ELK环境搭建 今日头条

ELK:日志监控系统的巨擘,由于是一家公司所开发和负责维护的,我们通常把它们三个并在一起。

而在实际应用中,三者的完美结合也给我们带来了很大的便利。

本文分为以下几个模块:

  1. 基本安装:ES,Logstash,Kibana安装
  2. 常用的head插件安装
  3. x-pack安装和使用
  4. 已经测试可用的单机伪集群ES安装

通常来说,ELK三者已经几乎完美了,但我们还会加上一些插件,常用的就是Head插件,本文也会把head插件的相关安装加以介绍。

因为公司给的机器是一台全新的实体机,所以一切都要从头来干:

1:jdk安装

这个没什么花,直接下载下来,解压;修改下环境变量即可,我这里用的是软链接:

ln -s  jdk1.8.0_111 java

2:ElasticSearch的安装

给我的博客打个广告,可以参照相关文档即可:

此次安装中,冒出来一些新的坑:

Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536

这个坑,查看了一下,还是要修改相应的文件,即security/limits.conf文件,但是给出的提示很明确,按照提示走即可。

2:logstash的搭建和配置文件:

我这里用的是5.6.2的logtash,下载下来,直接进行解压即可,这里主要说下我的配置文件:

input{
     kafka{
           bootstrap_servers =>"kafka01:9092,kafka02:9092,kafka03:9092"
           topics => "flume-logback-log"
           group_id => "elastic_consumer"
           max_partition_fetch_bytes => "10485760"
     }
}
filter{
        json{
                source => "message"
        }
        mutate{
                convert => ["timestamp","integer"]
        }
        date{
                match => ["timestamp","UNIX_MS"]
                timezone => "UTC"
                remove_field => ["timestamp","myHeader"]
        }
}
output{
        if[application] =="data" {
                elasticsearch{
                        hosts => "esmaster:9200"
                        index => "data-%{+YYYY.MM.dd}"
                }
        }
        if[application] =="dis-data" {
                elasticsearch{
                        hosts => "esmaster:9200"
                        index => "dis-data-%{+YYYY.MM.dd}"
                }
        }
        if[application] =="credit" {
                elasticsearch{
                        hosts => "esmaster:9200"
                        index => "credit-%{+YYYY.MM.dd}"
                }
        }
}

下面,针对该配置文件,简单说一下Logstash的使用:

  1. logstash的核心,分为三大块,input确定输入源,output确定接收的地方,fitler插件起过滤作用,这点是比flume好用些的地方,因为flume如果要对日志进行复杂处理的话,通常需要配置自己的拦截器。
  2. 我的配置文件里使用的是kafka的数据来源:bootstrap_servers指定了kafka的borker地址,以英文逗号分隔;topics指定了topic,可以指定多个topic;group_id是自己定义的消费者;至于最下面的,是因为使用过程中,一次性返回的数据超过了logstash的最大限制,所以加以修改,就5.6.2版本的logstash来说,默认的最大限制好像是1048576,正好是1M,对于正常使用来说,有点小了。
  3. 接下来看filter这块,因为我传入的是JSON串,所以使用json插件,将其key和value全部摘了出来。
  4. mutate插件,可以参照官方文档,我这里JSON串内存在timestamp字段,本身是个Long转的字符串,就是timemillis的long形成的字符串,为了接下来的转换,这里将其先转换类型为interger,这里很奇怪,因为long的大小超过了integer,但是mutate不支持long,interger可以支持这么大值的转化。
  5. date插件:这里面的第一句,必须要弄清楚,这里的match匹配,是从你的消息中匹配东西的,所以我写的是UNIX_MS,官方说法是支持integer的时间转换,timezone指定了时区,接着,remove_field指定了需要从消息中去除的key。
  6. 这里的output,在我的消息中,application值区分了不同的消息,所以我按照消息的不同,把数据打到了不同的elasticsearch索引中,index指定了不同的索引,文件中的格式表示按照每天不同的日期进行索引的不断递增,这样也方便后续的索引删除。

综合来看,logstash的使用并不复杂,如有不明白的地方,一定要参照官方文档,基本都能得到解释。

至于logstash的启动:

./logstash -f kafka.conf > /dev/null 2>&1 &

就是这么简单粗暴。

至于logstash的关闭:看到当前用户下的Main进程,那就是logstash进程,kill掉即可,如果有多个,仔细检查下,安全kill即可。

3:kibana的安装

没什么可说的,开箱即用,内部配置的主要修改地方在于:

elasticsearch.url: "http://192.168.20.30:9200"

因为kibana实际上来说,只是ES的具象化展示,只要能够连上ES,就万事大吉。

多说一句,如何关掉Kibana:

ps -ef|grep node
kill -9 ...

直接搜索kibana是找不到对应的进程的。

4:head插件的安装和配置文件:

这个重点说一下:

1:首先,我们需要从git上下载源码,所以必须要安装git服务:

yum -y install git

2:接下来2-5步,是安装node相关服务

wget https://nodejs.org/dist/v4.2.2/node-v4.2.2-linux-x64.tar.gz

3:解压到/usr/local处:

tar -zxvf node-v4.2.2-linux-x64.tar.gz -C /usr/local/

4:建立相应的软链接:

ln -sv node-v4.2.2-linux-x64/ node
ln -sv /usr/local/node/bin/* /usr/sbin/

5:安装npm服务:因为我们的node插件,实际上是node.js开发的:

npm install grunt-cli
grunt-cli@1.2.0 node_modules/grunt-cli
├── grunt-known-options@1.1.0
├── resolve@1.1.7
├── nopt@3.0.6 (abbrev@1.1.1)
└── findup-sync@0.3.0 (glob@5.0.15)

这种状态下,基本就是成功了:

6:安装并且修改head源码,注意,这里才是我们安装head的开始:

git clone git://github.com/mobz/elasticsearch-head.git


修改服务器监听地址:


connect: {
                        server: {
                                options: {
                                        port: 9100,
                                        hostname:'*',
                                        base: '.',
                                        keepalive: true
                                }
                        }
                }

8:修改head的连接地址:这里是机器的外网地址:

this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.20.30:9200";

9:在elasticsearch-head目录下,执行命令,目的是把我们下载下来的包进行编译

npm install

10:编译完成后,在head目录下,会出现总数15个文件,我们看其中的grunt文件夹,如果存在的话,说明安装正常,接下来就是启动服务了:

grunt server &

最后,服务启动,这里使用的是phantomsJs作为浏览器。

5:说下ES单机伪集群版本的安装

老大的意思,先在一个硬盘比较大的机器上把程序跑起来,无奈,只好搭建了一个单机伪装集群版本,必须先警告下,单机伪集群版本不是很稳定,我在使用过程中莫名其妙死掉了,重启之后恢复正常,目前原因还未确定,后续解决将补出解决方案:

步骤如下:

  1. 5.6.2的tar下载下来,解压成两份,这里,我使用的是未曾加入任何索引的ES,以避免任何可能出现的问题:
  2. 其中一份作为master,这里给出我的配置文件:
#
cluster.name: elasticsearch-production
#关于集群名称,最好不好用默认名称,就ES的自动同网段发现机制来说,很可能会添加上一些未知的节点,导致数据问题
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: node-1
node.master: true
node.data: true
#这里,我的主节点既是master,也是data节点
# Add custom attributes to the node:
#
#node.attr.rack: r1
node.max_local_storage_nodes: 3
#单机最大共享实例,必须配置,至少是2,要不然也不叫单机多实例了
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /data/data
#说下path.data:我选择了我的服务器上最大的盘新建了目录,注意目录的权限问题即可
# Path to log files:
#
#path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
#第一个true表示内存锁定,第二个会在启动时候报错,提示需要改成false
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 192.168.20.30
#本机外网地址
# Set a custom port for HTTP:
#
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
transport.tcp.port: 9300
#这是第一个实例,重点在其中的*号
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.zen.ping.unicast.hosts: ["192.168.20.30:9300"]
#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#大家别这么配置,最好是按照官方配置,防止脑裂问题
discovery.zen.minimum_master_nodes: 1

所谓的脑裂,就是集群中出现两个Master节点,互相独立,各自为政,对于集群的影响可想而知。

上面是master的配置,下面说下slave1:

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 192.168.20.30
#
# Set a custom port for HTTP:
#
http.port: 9202
transport.tcp.port: 9302
#
# For more information, consult the network module documentation.

重点修改的两个地方如上,另外,我新建的时候,修改了第二个实例的日志目录。

同时启动,单机多实例搭建完毕。

6:最后说下x-pack这个东东:

首先声明,我这里的x-pack安装是基于ElasticSearch集群的,而非单机:而且x-pack插件本身是收费的,注意,是收费的,下载的试用版有效期一个月!!!

安装步骤:

  1. 先把每个ES都安装上x-pack插件,注意:是每个ES节点都要安装上,不然会报错,连接不上:
bin/elasticsearch-plugin install x-pack

命令简单粗暴,安装的时候需要把ES服务停止,不然会报错;我这里倒没有尝试是否会报错,其中会有一些WARNING,不用理会,一直继续即可

    2. 给kibana也安装上x-pack插件,同样,kibana服务停止:

bin/kibana-plugin install x-pack

同样的简单粗暴

安装完之后,我们再次访问ES就会发现访问收到限制,需要用户输入账户和密码,那么默认的账户和密码是什么:

user : elastic
passwd : changeme

看起来,这里强烈号召我们修改密码,那不改密码都对不起提示了:

curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/elastic/_password' -d '{
  "password" : "elasticpassword"
}'

这里,提交的请求就是修改密码的请求,里面的password就是我们定义的,而修改密码时候会出现提示:

enter host pasword for user 'elastic'

这个密码就是changeme了。

修改完ES的密码之后,我们再修改下kibana中对接ES的密码,这个修改在kibana.yml中。

elasticsearch.username: "elastic"
elasticsearch.password: "admin"

启动,成功,是不是so easy?

这里,必须注意另外一点,因为elastic是整个系统最高级的用户,拥有创建索引,添加用户的权限,所以,我们通常不会将其授予给用户使用,所以,我们需要创建其他的用户,在创建之前,我们看看这个用户能做什么:

必须说明,安装了x-pack之后,head插件失效了,应该是没有相应的权限了,那么,这个在哪儿改呢?

按照head插件官方的说法来做吧:

elasticsearch-head will add basic auth headers to each request if you pass in the correct url parameters
You will also need to add http.cors.allow-headers: Authorization to the elasticsearch configuration

提示我们在ES节点增加配置:

http.cors.allow-headers: "Authorization"

然后访问的时候形如:

http://localhost:9100/?auth_user=elastic&auth_password=changeme

悲催的是,我这里更改了密码,即使是用我的改过的密码访问,依旧是失效,无法连接,原因未明,大家尝试时候需要注意。

还真的不信了,果然,还是有大神提供了解决办法:

http://www.mamicode.com/info-detail-2145696.html

继续修改elasticsearch.xml,只需要修改主节点的即可:

http.cors.allow-headers: "Authorization,X-Requested-With,Content-Length,Content-Type"

https://www.xamrdz.com/lan/5ab1938486.html

相关文章: