Elastic日志系统-filebeat-redis-logstash-elasticsearch-kibana-6.8.0搭建流程
搭建步骤
1. 需要准备的环境
系统环境
主机 | 软件 |
---|---|
192.168.100.104 | elasticsearch, es-head, redis, logstash |
192.168.100.105 | filebeat, elasticsearch |
192.168.100.106 | elasticsearch, kibana, filebeat |
系统版本:
CentOS Linux release 7.7.1908 (Core)
1.1 软件版本
elastic系列为6.8.0
版本,使用rpm
包安装,简单,方便管理。
1.2 软件安装
elastic系列软件下载地址:https://www.elastic.co/cn/downloads/past-releases
这个地址可以下载各个版本的elastic系列软件包。
点击下载
elasticsearch下载
kibana下载
logstash下载
filebeat下载
将上面的rpm
包下载好,上传到指定主机,用yum命令安装即可。
1.3 需求说明
- 所有日志收集后,通过index进行区分;
- 不同的服务,输出到不同的index中;
- 相同的服务,不在一个主机,也输入到一个index进行管理。
- index按照时间滚动,只保留指定天数(比如7天)的index,防止不断积累。
2. elasticsearch简单配置
2.1 elasticsearch配置
es简单配置如下
cluster.name: my-application # 集群名称,3个节点的都要一样
node.name: node-104 # 节点名
path.data: /var/lib/elasticsearch # 数据存储路径
path.logs: /var/log/elasticsearch # 日志输出路径
network.host: 192.168.100.104 # 主机IP
http.port: 9200 # 开放的端口
# 3节点
discovery.zen.ping.unicast.hosts: ["192.168.100.104:9300", "192.168.100.105:9300","192.168.100.106:9300"]
9200端口是http协议端口,主要用于外部通信
9300端口是tcp协议端口,主要用于集群间传递信息
在每台主机上修改好配置。启动es
systemctl start elasticsearch
systemctl status elasticsearch
启动成功后,可以通过api接口命令查看集群状态
curl http://192.168.100.104:9200
curl http://192.168.100.104:9200/_cat/nodes
curl http://192.168.100.104:9200/_cat/master
可以看到3节点都已经加到了集群中,且104被选为master。
2.2 es-head配置
需要配置nodejs环境。nodejs可以用yum安装,或者用源码安装。
yum install epel-release git -y
yum install nodejs npm -y
下载源码
cd /usr/local
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm install grunt --save
安装
npm install -g grunt-cli #安装grunt命令行工具grunt-cli
npm install grunt --save-dev #安装grunt及其插件
grunt -version #查看安装版本情况
修改elasticsearch配置文件,增加如下字段
http.cors.enabled: true
http.cors.allow-origin: "*"
修改es配置可以只在es-head需要连接的那台主机上进行。
修改elasticsearch-head目录下的Gruntfile.js文件
#其中增加一段配置
hostname: '0.0.0.0' 或者是 hostname: '*'
如果有端口冲突的情况,也可以修改下面的监听端口。
启动es-head
cd /usr/local/elasticsearch-head/ # 注意,一定要进入代码目录下启动,否则启动不了
nohup grunt server > ./grunt.log 2>&1 &
netstat -tnulp|grep 9100 # 如果没有端口冲突的情况,启动不会有什么异常
如果是长期使用es-head,可以考虑把它配置为系统服务。
可以参考https://blog.csdn.net/wind_2307154495/article/details/79402911
启动成功后就可以连接使用了。
3. kibana简单配置
配置文件:/etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.100.106"
server.name: "elk-106"
elasticsearch.hosts: ["http://192.168.100.106:9200"] # es地址
kibana.index: ".kibana"
logging.dest: /var/log/kibana.log # 日志输出路径
i18n.locale: "zh-CN" # 中文配置
注意:
- kibana如果不配置日志输出,一般日志会输出到/var/log/message里面,导致系统日志文件越来越大,且信息太多,难以区分,所以最好配置单独的日志输出路径。如果要配置日志输出路径,特别要注意权限文件,执行以下命令
touch /var/log/kibana.log
chown kibana.kibana /var/log/kibana.log
# 或者直接改权限
chmod 666 /var/log/kibana.log
登录:http://192.168.100.106:5601
可以添加样例数据。打开之后如下显示:
es索引管理
4. elasticsearch配置用户认证,权限管理(X-pack)
生产中,需要对es进行管理,首先要有权限管理配置,否则任何人,只要能访问到es主机,知道端口,都可以对他进行管理操作,这是非常危险的。
如果是生产中,需要添加es认证,需要停服务,这个操作,需要提前跟开发沟通好,最好选择业务低峰期。这样对用户的影响就非常小。
- 生成秘钥,
在主节点执行以下操作
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
mkdir /etc/elasticsearch/cert/
mv elastic-* /etc/elasticsearch/cert/
chmod 600 /etc/elasticsearch/cert/*
chown -R elasticsearch.elasticsearch /etc/elasticsearch/cert/elastic-* # 更改权限
生成的配置文件elastic-certificates.p12需要copy到所有节点上/etc/elasticsearch/cert/目录下,注意保存秘钥密码
2. 秘钥密码认证,在所有节点执行
这一步一定不能少,否则es会启动报错,启动失败
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
/usr/share/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
- 所有节点增加如下配置
vim /etc/elasticsearch/elasticsearch.yml
# 分片数限制
cluster.max_shards_per_node: 50000
# ---------------------------------- X-pack ------------------------------------
xpack.license.self_generated.type: basic
#
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: cert/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: cert/elastic-certificates.p12
#
#-------ellasticsearch-head-------------
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
- 重启服务
sudo systemctl start elasticsearch.service
sudo systemctl status elasticsearch.service
要确保各节点服务启动正常,上面的命令执行缺一不可,如果启动异常可以通过日志检查错误。
5. 重启之后,生成账号密码(在其中一台上执行)
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
执行后会生成一些默认账号的密码:
6. 配置kibana,配置账号密码
增加如下配置段
配置完成后,重启,重新刷新kibana页面
sudo systemctl restart kibana.service
输入你的账号密码既可以了。
常用的账号已经配置到了es中
账号配置流程:新建角色–>配置角色权限(集群权限,索引权限,可以使用正则匹配)–>配置用户(绑定角色)
配置角色权限也可以直接用已经配置好的角色,以权限角色运行。
角色权限参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/security-privileges.html#privileges-list-cluster
为了方便开发人员查看日志,我们新建一个只读账号
索引权限,可以使用正则匹配。只给只读权限。
如果是项目使用,在配置单独索引的读写权限。
单个用户,是可以选择多个角色的。
使用新建用户的账号密码登录。可以看到,用户看不到es的index界面,也不能修改kibana已经创建的索引。
下面是日志传送流程:
5. filebeat配置
/etc/filebeat/filebeat.yml
filebeat.inputs:
# 这一段是默认配置
- type: log
enabled: false # 是否启用,默认不启用
paths:
- /var/log/*.log
# 下面是我们自定义的配置
- type: log
enable: true # 启用配置,收集日志
paths:
- /tmp/002.txt # 日志路径,可以定义多个,可以使用正则
tail_files: true # Filebeat从文件尾开始监控文件新增内容,非从头开始
document_type: "test-redis" #设定Elasticsearch输出时的document的type字段 可以用来给日志进行分类。Default: log
fields_under_root: true
fields: # 下面是自定义字段,可以用来区分日志类型,日志信息
log_type: "test-redis"
service: "test-redis"
- type: log
enable: true
paths:
- /tmp/003.txt # 这个是测试路径,方便我们调试
tail_files: true
document_type: "testlog"
exclude_files: ['.gz$']
tags: "testlog"
fields_under_root: true
fields:
log_type: "testlog"
service: "testlog"
# java日志收集
- type: log
enable: true
paths:
- /tmp/logs/catalina*
exclude_files: ['.gz$']
exclude_lines: ['^$']
tags: "java"
# 定义多行的情况
multiline:
# 这个匹配,根据日志情况自定义
pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'
negate: true
match: after
max_lines: 1000
timeout: 60
fields_under_root: true
fields:
log_type: "java"
service: "cms"
# 下面是输出配置
# 具体配置参考官网:https://www.elastic.co/guide/en/beats/filebeat/current/redis-output.html
# 输出中间,如果数据量不大的情况下,redis是很好的选择,数据量很大,建议使用kafka集群
output.redis:
hosts: ["192.168.100.104:6379"]
password: "changeme" # redis一定要加上认证
key: "filebeat" # 日志发布到的Redis列表或渠道的名称
db: 0
timeout: 5 #连接超时时间
如何对filebeat搜集的日志进行区分,然后保存到不同的index里面呢?
通过自定义字段
redis简单配置
主要是下面两个配置。
bind 192.168.100.104
requirepass changme
配置完成后,可以启动服务了。
systemctl restart filebeat
systemctl restart redis
注意观察日志啊。
6. logstash配置
日志通过filebeat到了redis,然后logstash从redis中取数据,输出到es中,在这一部,我们要通过自定义的字段,把日志输出到不同的index中。
配置如下:
vim /etc/logstash/conf.d/redis.conf
注意:logstash配置文件路径是/etc/logstash/conf.d/
# 从redis中拿数据
input {
redis {
data_type => "list"
key => "filebeat"
host => "192.168.100.104"
port => "6379"
password => "changme"
}
}
# 输出到es中
output {
# 通过自定义字段fields.service判断日志是属于哪个服务的,相同的服务输出到一个index中
if [service] {
elasticsearch {
hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"]
user => "elastic"
password => "changme"
index => "logstash-%{service}-%{+YYYY.MM.dd}"
http_compression => true
}
}
# 如果没有source字段匹配,就输出到另一个公共的index中
else {
elasticsearch {
hosts => ["192.168.100.104:9200","192.168.100.105:9200","192.168.100.106:9200"]
user => "elastic"
password => "changme"
index => "logstash-other-%{+YYYY.MM.dd}"
http_compression => true
}
}
}
配置之后,可以先对配置文件进行测试,确认配置没有问题
/usr/share/logstash/bin/logstash -t /etc/logstash/conf.d/redis.conf --debug
配置文件检查没有问题,重启logstash服务
sudo systemctl restart logstash
7. 开始测试
现在所有服务都已经配置完了。我们开始测试。
刚才在filebeat中定义了3个日志输入路径:
/tmp/002.txt 对应service:test-redis
/tmp/003.txt 对应service:testlog
/tmp/logs/catalina* 对应service:cms
写入日志到这些测试文件中。可以看到已经有index了
然后创建kibana的索引,方便进行查看
创建完索引之后,就可以在Discover里面看到了
其它几个kibana索引的创建方式。参考上面的即可。
至此,所有流程就全部打通了。
后面需要做的工作:
- nginx接入进来,展示nginx信息,站点访问情况,状态码等等
- es的index要按照日期,定时删除
es的定期删除策略
可以参考如下脚本:
# 保留15天内日志索引
date=$(date -d "-15 days" "+%Y.%m.%d")
# 获取要删除的索引
delete_index=$(curl -s -u elastic:l7oTPEalirnWNBZHnuWt http://192.168.100.104:9200/_cat/indices|grep test|grep ${date} |awk '{print $3}')
#
for index in ${delete_index}
do
#echo $index
curl -XDELETE -u elastic:changme http://192.168.100.104:9200/$index
done
使用es的定期删除策略
- 配置生命周期管理:3天后删除
- 配置索引模板,引用策略
在kibana的开发工具中操作
PUT _template/logs_template
{
"index_patterns": ["logs-*"], # 匹配所有以logs开头的索引
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "delete-3day",
"index.lifecycle.rollover_alias": "logs"
}
}
参考:
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/_applying_a_policy_to_our_index.html
注意:只有新索引会自动绑定策略,原来的不会变化,还是需要手动绑定