ELK 集群搭建总结

2019-06-12  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读