分布式日志框架ELK搭建(上)

/ 冷姿势 / 2 条评论 / 403人围观

最近公司起的新项目,做了分布式部署,查日志很不方便,看网上都说用ELK来做日志收集比较好,就试着搭了一下。

ELK介绍

ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。

  1. Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  2. Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
  3. Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

ELK三者之间的协作架构图: 请输入图片描述

需求背景

  1. 业务发展越来越庞大,服务器越来越多
  2. 各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
  3. 开发人员排查问题,需要到服务器上查日志,不方便
  4. 运营人员需要一些数据,需要我们运维到服务器上分析日志

为什么要用ELK

一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

ELK安装的准备工作

准备三台linux虚拟机

三台虚拟机,一主二从。

角色划分

  1. 3台机器全部安装jdk1.8,因为elasticsearch是java开发的
  2. 3台全部安装elasticsearch (后续都简称为es)
  3. 10.167.201.57作为主节点
  4. 10.167.201.58以及10.167.201.59作为数据节点
  5. 主节点上需要安装kibana
  6. 在10.167.201.58上安装 logstash

ELK版本信息

  1. Elasticsearch-6.0.0
  2. logstash-6.0.0
  3. kibana-6.0.0
  4. 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 ~]# 

配置集群主节点的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来展示这些数据了。

  1. 发送到发送

    回复
  2. qqqqqqqqqqqqqqq

    回复