美文网首页
ELK 集群搭建总结

ELK 集群搭建总结

作者: 流月汐志 | 来源:发表于2019-06-12 16:36 被阅读0次

    前言

    因公司开发人员查询线上日志困难需求,故计划搭建 ELK 系统解决这一问题。了解到之前搭建过单机单节点的 ELK,但由于负载内存过高,停止弃用了。所以这次准备了三台性能不错的服务器,开始搭建 ELK 集群。
    过程曲折且艰辛,记录下来以备不时之需。

    准备环境

    1. 服务器
    • elk-node01: 172.17.2.95 & 4核16G
    • elk-node02: 172.17.2.96 & 8核16G
    • elk-node03: 172.16.4.10 & 4核16G
    2. elk安装包

    这里准备的是elk 官网下载的最新7.1.1版本 rpm 包,方便于快速安装。
    下载地址:https://www.elastic.co/cn/downloads/

    • elasticsearch-7.1.1-x86_64.rpm
    • logstash-7.1.1.rpm
    • kibana-7.1.1-x86_64.rpm
    • filebeat-7.1.1-x86_64.rpm

    设计方案

    1. 刚开始计划方案

    由于这种方案,每个 logstash 都需要占用较大内存,这对线上各日志收集的应用服务器,压力太大难以承受。

    2. 之后设计的方案

    filebeat是一个轻量级的日志采集器,部署简单占用内存小。这一方案总体上比较好了,只是 logstash 这一节点的压力比较大,查询到filebeat可以负载均衡输出到多个logstash,所以后边考虑了在准备的三台 elk 服务器上都安装一个 logstash ,这样就实现了下边这一方案。

    3. 最后敲定的方案
    4. 以后可能的方案

    上边的方案其实已经能够满足一般公司的日志需求,但超大的日志数量可能会存在数据错乱缺失,节点脑裂等多个问题。要尽量解决这些问题,要做的工作还很多,这里收集部分网上的建议,记录如下:

    1. 更多节点时区分 master data ingest 节点角色(目前我们的方案是三个节点都同时具有这三个角色)
    2. 日志收集和 logstash 之间可以引入 kafka 消息队列

    整体部署详情

    1. elk-node01: 172.17.2.95
    • elasticsearch
    • logstash
    • kibana
    2. elk-node02: 172.17.2.96
    • elasticsearch
    • logstash
    3. elk-node03: 172.16.4.10
    • elasticsearch
    • logstash
    4. 各应用服务器
    • filebeat

    安装及配置

    1. 安装

    在个服务器上通过 yum install -y ***.rpm直接快速安装
    安装后程序位置都在 /usr/share/
    配置文件都在 /etc/

    2. 配置

    elasticsearch 配置:/etc/elasticsearch/elasticsearch.yml
    三个节点必须修改项 - node.name - network.host

    # 集群名,一个集群的集群名称必须一致
    cluster.name: Panda_elk_cluster
    # 节点名,一个集群的各节点名不能一样
    node.name: elk-node01
    # 是否开启 master 角色选举
    node.master: true
    # 是否开启数据节点角色
    node.data: true
    # 数据存储路径
    # 因为我们是挂载 nas 共享文件盘,几个节点是区分了文件夹名的
    path.data: /data/elk/elasticsearch_node01/data
    # 日志存储路径
    path.logs: /data/elk/elasticsearch_node01/logs
    # 是否开启内存锁定,这一项需要同时修改启动脚本
    bootstrap.memory_lock: true
    # 开放网卡地址
    network.host: 172.17.2.95
    # 开放端口号
    http.port: 9200
    # 集群间传输端口号
    transport.tcp.port: 9300
    # 以下两项是外部访问http需要开启的项
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    # 集群发现 host 池
    discovery.seed_hosts: ["172.17.2.95", "172.17.2.96", "172.16.4.10"]
    # 选举最小同意数
    discovery.zen.minimum_master_nodes: 2
    # 集群初始化 master 节点
    cluster.initial_master_nodes: ["elk-node01", "elk-node02", "elk-node03"]
    # 开启分片分配意识
    # 官网文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/allocation-awareness.html
    node.attr.rack_id: rack_one
    cluster.routing.allocation.awareness.attributes: rack_id
    
    # 内存锁定修改启动脚本 /usr/lib/systemd/system/elasticsearch.service
    LimitMEMLOCK=infinity
    
    # jvm 设置项 /etc/elasticsearch/jvm.options
    # 官方建议不超过物理内存的一半,最大设置32g
    # 如果物理内存很大,可以考虑一台机器开启多个节点
    -Xms6g
    -Xmx6g
    

    kibana 配置:

    # 这里是使用 nginx 做反向代理,并且开启了认证
    # 所以只对本机开放了 ip 和 端口
    server.port: 5601
    server.host: "127.0.0.1"
    server.name: "Panda-kibana"
    elasticsearch.hosts: ["http://172.17.2.95:9200", "http://172.17.2.96:9200", "http://172.16.4.10:9200"]
    
    # 生成认证文件
    yum install -y httpd-tools
    htpasswd -bc /usr/local/nginx/htppass.txt <用户名> <密码>
    # nginx 配置
    upstream kibana_server {
        server 127.0.0.1:5601 weight=1 max_fails=3 fail_timeout=60;
    }
    
    server {
        listen 80;
        server_name elk.***.com;
        auth_basic "Restricted Access";
        auth_basic_user_file /usr/local/nginx/htppass.txt;
        location / {
        proxy_pass http://kibana_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        }
    }
    

    filebeat 配置:

    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /www/logs/vrbp.log
      multiline:
          # 我们的日志都是以时间开头的
          pattern: '^\d{4}-\d{1,2}-\d{1,2}'
          # 不是以时间开头的会合并到一行
          negate: true
          # 放在匹配到的后面
          match: after
      tags: ["xp-api"]
      # 以下都是附带到日志信息一起传到 logstash 
      # 进行日志清洗整合
      fields:
        app_id: api_91
        env: prod
        pattern_type: xp-api
        ip_addr: 172.16.1.10
    
    output.logstash:
      hosts: ["172.17.2.95:5000", "172.17.2.96:5000", "172.16.4.10:5000"]
      # 开启负载均衡
      loadbalance: true
    

    logstash 配置:

    # /etc/logstash/logstash.yml
    path.data: /data/elk/logstash_node01/data
    path.logs: /data/elk/logstash_node01/logs
    
    # jvm 设置项 /etc/logstash/jvm.options
    -Xms4g
    -Xmx4g
    
    # 根据业务需要,在 /etc/logstash/conf.d/ 下添加配置文件
    # 以下配置文件需要配合 filebeat 的配置文件一起看
    # /etc/logstash/conf.d/logstash_api.conf
    input {
        beats {
            port => 5000
        }
    }
    
    filter {
        mutate {
            gsub => ["message", "\u001B\[[;\d]*m", ""]
        }
    
        if [fields][pattern_type] == "xp-api" {
            grok {
                patterns_dir => ["/etc/logstash/pattern"]
                match => {
                    message => "%{MYDATE:time}\s*%{JAVACLASS:classInfo}\s*%{DATA:treadInfo}\s*%{LOGLEVEL:logLevel}\s*%{GREEDYDATAALL:message}"
            }
            overwrite => ["message"]
            }
        # 匹配时间time字段,并替换系统的timestamp
           date {
               match => [ "time", "yy-MM-dd HH:mm:ss,SSS" ]
           }
        }
    }
    
    output {
        elasticsearch {
            hosts => ["http://172.17.2.95:9200", "http://172.17.2.96:9200", "http://172.16.4.10:9200"]
            index => "%{[fields][env]}-%{[fields][pattern_type]}-%{+YYYY.MM.dd}"
            #document_type => "%{type}"
        }
    }
    
    # /etc/logstash/pattern/mypattern
    MYDATE ([0-9]?[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))\s(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)
    COLOR .{5}
    GREEDYDATAALL [\s\S]*
    

    启停顺序

    建议用 ansible 管理
    启动:elasticsearch --- logstash --- filebeat --- kibana
    停止:kibana --- filebeat --- logstash --- elasticsearch

    相关文章

      网友评论

          本文标题:ELK 集群搭建总结

          本文链接:https://www.haomeiwen.com/subject/gedzxctx.html