最近公司起的新项目,做了分布式部署,查日志很不方便,看网上都说用ELK来做日志收集比较好,就试着搭了一下。
ELK介绍
ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。
- Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
- Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
- Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
ELK三者之间的协作架构图:
需求背景
- 业务发展越来越庞大,服务器越来越多
- 各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
- 开发人员排查问题,需要到服务器上查日志,不方便
- 运营人员需要一些数据,需要我们运维到服务器上分析日志
为什么要用ELK
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
ELK安装的准备工作
准备三台linux虚拟机
三台虚拟机,一主二从。
角色划分
- 3台机器全部安装jdk1.8,因为elasticsearch是java开发的
- 3台全部安装elasticsearch (后续都简称为es)
- 10.167.201.57作为主节点
- 10.167.201.58以及10.167.201.59作为数据节点
- 主节点上需要安装kibana
- 在10.167.201.58上安装 logstash
ELK版本信息
- Elasticsearch-6.0.0
- logstash-6.0.0
- kibana-6.0.0
- filebeat-6.0.0
配置三台机器的hosts文件内容如下:
$ vim /etc/hosts
10.167.201.57 master-node
10.167.201.58 data-node1
10.167.201.59 data-node2
然后三台机器都得关闭防火墙或清空防火墙规则。
安装Elasticsearch
安装
这里直接使用rpm方式安装(三台都需要装)
[root@master-node ~]# wget httpss://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm
[root@master-node ~]# rpm -ivh elasticsearch-6.0.0.rpm
配置ES
ES配置文件在两个地方
[root@master-node ~]# ll /etc/elasticsearch
总用量 16
-rw-rw---- 1 root elasticsearch 2869 2月 17 03:03 elasticsearch.yml
-rw-rw---- 1 root elasticsearch 2809 2月 17 03:03 jvm.options
-rw-rw---- 1 root elasticsearch 5091 2月 17 03:03 log4j2.properties
[root@local ~]# ll /etc/sysconfig/elasticsearch
-rw-rw---- 1 root elasticsearch 1613 2月 17 03:03 /etc/sysconfig/elasticsearch
[root@master-node ~]#
- elasticsearch.yml 文件用于配置集群节点等相关信息的。
- elasticsearch 文件则是配置服务本身相关的配置,例如某个配置文件的路径以及java的一些路径配置什么的。
配置集群主节点的yml配置文件:
[root@master-node ~]# vim /etc/elasticsearch/elasticsearch.yml # 增加或更改以下内容
cluster.name: master-node # 集群中的名称
node.name: master # 该节点名称
node.master: true # 意思是该节点为主节点
node.data: false # 表示这不是数据节点
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
https.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["10.167.201.57", "10.167.201.58", "10.167.201.59"] # 配置自动发现
[root@master-node ~]#
两个从节点的yml配置文件仅仅有两处改动:
[root@data-node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: master-node # 集群中的名称
node.name: data-node1 # 该节点名称
node.master: false # 意思是该节点为主节点
node.data: true # 表示这不是数据节点
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
https.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["10.167.201.57", "10.167.201.58", "10.167.201.59"] # 配置自动发现
[root@data-node2 ~]# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: master-node # 集群中的名称
node.name: data-node2 # 该节点名称
node.master: false # 意思是该节点为主节点
node.data: true # 表示这不是数据节点
network.host: 0.0.0.0 # 监听全部ip,在实际环境中应设置为一个安全的ip
https.port: 9200 # es服务的端口号
discovery.zen.ping.unicast.hosts: ["10.167.201.57", "10.167.201.58", "10.167.201.59"] # 配置自动发现
完成以上的配置之后,到主节点上,启动es服务:
systemctl start elasticsearch.service
启动排错
我这里启动主节点的时候没有启动成功,于是查看es的日志,但是却并没有生成,那就只能去看系统日志了:
[root@master-node ~]# ls /var/log/elasticsearch/
[root@master-node ~]# tail -n50 /var/log/messages
错误日志如下:
如图,可以看到是JDK的路径配置得不对,没法在PATH里找到相应的目录。于是查看JAVA_HOME环境变量的值指向哪里:
[root@master-node ~]# echo $JAVA_HOME
/usr/local/jdk1.8/
[root@master-node ~]# ls /usr/local/jdk1.8/
bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt
COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt
[root@master-node ~]#
发现指向的路径并没有错,那就可能是忘记在profile里写export了,于是在profile的末尾加上了这一句:
export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
使用source命令重新加载了profile之后,重新启动es服务,但是依旧启动不起来,于是我发现我忽略了一条错误日志:
这是无法在环境变量中找到java可执行文件,那就好办了,做一个软链接过去即可:
[root@master-node ~]# ln -s /usr/local/jdk1.8/bin/java /usr/bin/
再次启动es服务,这次就终于启动成功了:
[root@master-node ~]# systemctl restart elasticsearch.service
[root@master-node ~]# ps aux |grep elasticsearch
elastic+ 2655 9.4 31.8 3621592 1231396 ? Ssl 15:42 0:14 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.4M9NarAc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/var/log/elasticsearch/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
root 2735 0.0 0.0 112660 968 pts/0 S+ 15:44 0:00 grep --color=auto elasticsearch
[root@master-node ~]# netstat -lntp |grep java # es服务会监听两个端口
tcp6 0 0 :::9200 :::* LISTEN 2655/java
tcp6 0 0 :::9300 :::* LISTEN 2655/java
[root@master-node ~]#
9300端口是集群通信用的,9200则是数据传输时用的。主节点启动成功后,依次启动其他节点即可。
curl查看es集群
集群的健康检查
[root@master-node ~]# curl '10.167.201.57:9200/_cluster/health?pretty'
{
"cluster_name" : "master-node",
"status" : "green", # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
"timed_out" : false, # 是否有超时
"number_of_nodes" : 3, # 集群中的节点数量
"number_of_data_nodes" : 2, # 集群中data节点的数量
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
[root@master-node ~]#
集群的详细信息
[root@master-node ~]# curl '10.167.201.57:9200/_cluster/state?pretty'
{
"cluster_name" : "master-node",
"compressed_size_in_bytes" : 354,
"version" : 4,
"state_uuid" : "QkECzZHVQJOXB7K_9CgXYQ",
"master_node" : "SGez5oKUTa2eIijLp8MsLQ",
"blocks" : { },
"nodes" : {
"4sJURH6cTsykgLberJ6pVw" : {
"name" : "data-node1",
"ephemeral_id" : "t16_uw92T5ajJqp2HWodrg",
"transport_address" : "10.167.201.57:9300",
"attributes" : { }
},
"SGez5oKUTa2eIijLp8MsLQ" : {
"name" : "master",
"ephemeral_id" : "eJZX20tpSNyJCHgBIC4x4Q",
"transport_address" : "10.167.201.57:9300",
"attributes" : { }
},
"nZ4L5-KwSdirnluhJTGn7Q" : {
"name" : "data-node2",
"ephemeral_id" : "pQENcoUcRY6fTs7SamX2KQ",
"transport_address" : "10.167.201.59:9300",
"attributes" : { }
}
},
"metadata" : {
"cluster_uuid" : "jZPv-awrQDe163Nu3y2hHw",
"templates" : { },
"indices" : { },
"index-graveyard" : {
"tombstones" : [ ]
}
},
"routing_table" : {
"indices" : { }
},
"routing_nodes" : {
"unassigned" : [ ],
"nodes" : {
"nZ4L5-KwSdirnluhJTGn7Q" : [ ],
"4sJURH6cTsykgLberJ6pVw" : [ ]
}
},
"restore" : {
"snapshots" : [ ]
},
"snapshot_deletions" : {
"snapshot_deletions" : [ ]
},
"snapshots" : {
"snapshots" : [ ]
}
}
[root@master-node ~]#
浏览器查看
显示出来的也是一堆字符串,如果要这些信息能以图形化的方式显示出来,那就需要安装kibana来展示这些数据了。