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


    最近公司起的新项目,做了分布式部署,查日志很不方便,看网上都说用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 ~]# 
    
    • 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来展示这些数据了。

  • 相关阅读:
    学习路线
    环境搭建时用到的文档
    商城技术重点分析
    svn 忽略文件
    实用的css3 学习笔记
    转载 《AngularJS》5个实例详解Directive(指令)机制
    php 单例设计模式 example
    html5 图片转base64预览显示
    curl返回常见错误码
    jquery的end(),addBack()方法example
  • 原文地址:https://www.cnblogs.com/zhangjianbing/p/12443496.html
Copyright © 2020-2023  润新知