前言
因公司开发人员查询线上日志困难需求,故计划搭建 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. 以后可能的方案
上边的方案其实已经能够满足一般公司的日志需求,但超大的日志数量可能会存在数据错乱缺失,节点脑裂等多个问题。要尽量解决这些问题,要做的工作还很多,这里收集部分网上的建议,记录如下:
- 更多节点时区分 master data ingest 节点角色(目前我们的方案是三个节点都同时具有这三个角色)
- 日志收集和 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
网友评论