ELK部署
一、前期准备
下载安装包:elasticsearch、kibana、logstash、filebeat 注意版本要一致,这里用的是7.13.4
es下载地址:https://www.elastic.co/cn/downloads/elasticsearch
这个地址可以下载所有软件,选择不同版本:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.4-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/kibana/kibana-7.13.4-linux-x86_64.tar.gz
https://artifacts.elastic.co/downloads/logstash/logstash-7.13.4-linux-x86_64.tar.gz
注意防火墙,测试环境可以关闭防火墙,生产可以选择放开相应端口
二、环境搭建
1、安装es
1. 下载解压
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz
tar -xzvf elasticsearch-7.13.4-linux-x86_64.tar.gz
2. 创建账号
#es不能使用root用户启动,所以需要创建用户
#创建账户
useradd elastic
#设置密码
passwd elastic
#给账户赋予目录权限
chown -R elastic:elastic {{espath}}
#切换用户
su elastic
3. 服务启动与关闭
# 前台进程
./bin/elasticsearch
# 后台启动 守护进程
./bin/elasticsearch -d
#关闭服务只能直接杀掉进程
ps -ef | grep elastic
kill -9 进程id
4. 单机配置
#修改config/elasticsearch.yml文件
#指定数据存储目录
path.data: /path/to/data
#指定日志存储目录
path.logs: /path/to/logs
#节点对外提供服务的地址以及集群内通信的ip地址,写服务器ip地址即可
network.host: ***.***.***.***
# 初始主节点列表,单机部署写一个就行
cluster.initial_master_nodes: ["node-1"]
5. 集群部署
配置描述
- cluster.name:集群名称,节点根据集群名称确定是否是同一个集群。
- node.name:节点名称,集群内唯一。
- node.roles:[ data, master, voting_only ],
node.roles
配置项如果没有显式的配置,那么当前节点拥有所有角色(master、data、ingest、ml、remote_cluster_client、transform)。如果你放开了注释,或者手动显式添加了node.roles
配置项,那么当前节点仅拥有此配置项的中括号中显式配置的角色,没有配置的角色将被阉割。因此如果在不熟悉角色配置的情况下,不要轻易修改角色配置值, 切勿画蛇添足 。 - network.host: 节点对外提供服务的地址以及集群内通信的ip地址
- bootstrap.memory_lock: Swapping对性能和节点稳定性非常不利,应该不惜一切代价避免。它可能导致GC持续几分钟而不是几毫秒,并且可能导致节点响应缓慢甚至与集群断开连接。在弹性分布式系统中,使用Swap还不如让操作系统杀死节点效果更好。可以通过设置
bootstrap.memory_lock: true
以防止任何 Elasticsearch 堆内存被换出。 - http.port:对外提供服务的端口号
- discovery.seed_hosts: 集群初始化的种子节点,可配置部分或全部候选节点,大型集群可通过嗅探器发现剩余节点,考试环境配置全部节点即可
- cluster.initial_master_nodes:节点初始
active master
节点, 必须是有master角色的节点,即必须是候选节点,但并不是必须配置所有候选节点。生产模式下启动新集群时,必须明确列出应在第一次选举中计算其选票的候选节点。第一次成功形成集群后,cluster.initial_master_nodes
从每个节点的配置中删除设置。重新启动集群或向现有集群添加新节点时,请勿使用此设置。
node1
cluster.name: c1
node.name: node-1
node.roles: [master]
path.data: /path/to/data
path.logs: /path/to/logs
bootstrap.memory_lock: true
network.host: 192.168.3.181
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.3.181:9300", "192.168.3.182:9300","192.168.3.183:9300", "192.168.3.184:9300","192.168.3.185:9300"]
cluster.initial_master_nodes: ["node-1"]
node2
cluster.name: c1
node.name: node-2
node.roles: [master]
path.data: /path/to/data
path.logs: /path/to/logs
bootstrap.memory_lock: true
network.host: 192.168.3.181
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.3.181:9300", "192.168.3.182:9300","192.168.3.183:9300", "192.168.3.184:9300","192.168.3.185:9300"]
cluster.initial_master_nodes: ["node-1"]
node3
cluster.name: c1
node.name: node-3
node.roles: [master,data,voting_only]
path.data: /path/to/data
path.logs: /path/to/logs
bootstrap.memory_lock: true
network.host: 192.168.3.183
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.3.181:9300", "192.168.3.182:9300","192.168.3.183:9300", "192.168.3.184:9300","192.168.3.185:9300"]
cluster.initial_master_nodes: ["node-1"]
node4
cluster.name: c1
node.name: node-4
node.roles: [data]
path.data: /path/to/data
path.logs: /path/to/logs
bootstrap.memory_lock: true
network.host: 192.168.3.184
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.3.181:9300", "192.168.3.182:9300","192.168.3.183:9300", "192.168.3.184:9300","192.168.3.185:9300"]
cluster.initial_master_nodes: ["node-1"]
node5
cluster.name: c1
node.name: node-5
node.roles: [data]
path.data: /path/to/data
path.logs: /path/to/logs
bootstrap.memory_lock: true
network.host: 192.168.3.185
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.3.181:9300", "192.168.3.182:9300","192.168.3.183:9300", "192.168.3.184:9300","192.168.3.185:9300"]
cluster.initial_master_nodes: ["node-1"]
6. 验证
http://ip:9200
7. 安装分词器
-
下载地址:(选择对应版本的分词器下载,直接下载zip即可)
https://gitcode.net/mirrors/medcl/elasticsearch-analysis-ik/-/releases?spm=1033.2243.3001.5877 -
es安装目录中的plugins目录下新建目录ik,将下载的zip解压到新建目录下
-
重启es,log中可以看到插件加载成功
-
验证插件
#xshell中执行下面命令
#创建index结点
curl -XPUT http://localhost:9200/index
#创建mapping
curl -XPOST http://localhost:9200/index/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
#推送中文内容
curl -XPOST http://localhost:9200/index/_create/1 -H 'Content-Type:application/json' -d'
{"content":"分词器测试"}
'
curl -XPOST http://localhost:9200/index/_create/2 -H 'Content-Type:application/json' -d'
{"content":"分词器测试我是中文字符"}
'
#查询
curl -XPOST http://localhost:9200/index/_search -H 'Content-Type:application/json' -d'
{
"query" : { "match" : { "content" : "分词器" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
'
2、安装kibana
1. 下载解压
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.13.4-linux-x86_64.tar.gz
tar -xzvf kibana-7.13.4-linux-x86_64.tar.gz
2. 创建账号
kibana也不能使用root账户启动,使用上面es创建的账户即可
3. 服务启动与关闭
# 前台进程
./bin/kibana
# 后台启动 守护进程
nohup ./bin/kibana &
#关闭服务只能直接杀掉进程
ps -ef | grep kibana
kill -9 进程id
4. 配置
#修改config/kibana.yml
#服务ip
server.host: "***.***.***.***"
#es地址
elasticsearch.hosts: ["http://ip:port"]
#国际化,中文
i18n.locale: "zh-CN"
5. 验证
http://ip:5601/
3、安装logstash
1. 下载解压
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.13.4-linux-x86_64.tar.gz
tar -xzvf logstash-7.13.4-linux-x86_64.tar.gz
2. 配置
#修改logstash-sample.conf文件
#input是输入:stdin是从控制台输入,beats是从beats输入
#output 是输出:可以在beats中配置tags属性,在output中使用tags属性区分不同服务
input {
#stdin{}
beats {
port => 5044
}
}
output {
if "aaa" in [tags] {
elasticsearch {
hosts => ["http://esip:9200"]
index => "aaa-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
else if "bbb" in [tags] {
elasticsearch {
hosts => ["http://esip:9200"]
index => "bbb-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch {
hosts => ["http://esip:9200"]
index => "ccc-%{+YYYY.MM.dd}"
}
}
}
3. 服务启动与关闭
# 前台进程
./logstash -f ../pipeline/logstash-sample.conf
# 后台启动 守护进程
nohup ./logstash -f ../pipeline/logstash-sample.conf &
#关闭服务只能直接杀掉进程
ps -ef | grep logstash
kill -9 进程id
4、安装filebeats
1. 下载解压
#哪台服务器需要采集日志,在哪台服务器安装
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.13.4-linux-x86_64.tar.gz
tar -xzvf filebeat-7.13.4-linux-x86_64.tar.gz
2. 配置
#修改filebeat.yml,一个filebeats可以同时采集多个文件,可以使用tags标记,也可以不标记
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/1.log
tags: ["aaa"]
#编码设置,elk默认使用utf-8编码,如果服务器是GB2312,这边需要配置,否则会中文乱码
encoding: GB2312
- type: log
enabled: true
paths:
- /var/log/2.log
tags: ["bbb"]
#注意 默认是输出到es,这里要改成logstash
output.logstash:
# The Logstash hosts
hosts: ["logstash-ip:5044"]
3. 服务启动与关闭
# 前台进程
./filebeat -e -c filebeat.yml
# 后台启动 守护进程
nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
#关闭服务只能直接杀掉进程
ps -ef | grep filebeat
kill -9 进程id
三、索引配置
- 点击左侧菜单栏:home -> Stack Management -> 索引模式
- 点击创建索引模式
- 输入上面logstatus中创建的索引,如:aaa-*,如果elk部署成功可以查到索引,否则,检查日志文件中是否有数据,地址是否有访问权限,filebeat中配置的日志文件路径是否正确
- 点击下一步即可创建出索引
- 点击左侧菜单栏:home -> Discover,即可看到刚才的索引日志
四、定时删除索引
#新建文件delete_index.sh, 写入下面代码
#!/bin/bash
#保留近 N 天
KEEP_DAYS=7
# 删除前 N的所有天到 前N+10天==>每天执行
function get_todelete_days()
{
# declare -A DAY_ARR
# DAY_ARR=""
for i in $(seq 1 10);
do
THIS_DAY=$(date -d "$(($KEEP_DAYS+$i)) day ago" +%Y.%m.%d)
DAY_ARR=( "${DAY_ARR[@]}" $THIS_DAY)
done
echo ${DAY_ARR[*]}
}
# 返回数组的写法
TO_DELETE_DAYS=(`get_todelete_days`)
for day in "${TO_DELETE_DAYS[@]}"
do
echo "$day will be delete"
curl -XDELETE 'http://localhost:9200/*-'${day}
done
#新建定时任务
#执行
crontab -e
#写入定时任务
0 1 * * * sh /data/elk/delete_index.sh