ELK监控平台搭建
前提条件:服务器上已经安装好docker以及jdk1.8的环境
注意:搭建elk时,需要保证使用的版本统一,为了兼容skywalking(官网推荐使用6.x版本的es),此次搭建我们使用的均为6.8.2版本。此外,本文对于ES的地址均使用localhost来代替,实际操作中需修改为ES的真实地址进行操作。
如何对接搭建好的ELK监控平台请参考:ELK监控平台对接
elasticsearch
服务器部署
1.下载tar.gz 源码包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.2.tar.gz
2.由于es无法使用root用户启动(官方建议:由于elasticsearch可以接收用户输入的脚本并且执行,为了系统安全考虑, 建议创建一个单独的用户用来运行elasticsearch),因此我们需要创建一个用户组,并在该用户组下创建用户,便于管理。
# 创建用户组。注意:此处的用户组名称自定义即可
groupadd elsearch
# 创建用户。注意:此处的用户名和密码自定义即可
useradd elsearch -g elsearch -p yourPassword
# 为用户分配文件夹操作权限。注意:此处需输入你创建的用户组和用户名称,文件夹需指定为elasticsearch的所在文件夹。
chown -R elsearch:elsearch ./elk/
3.登录elsearch用户,解压es压缩包,修改配置文件保存后启动。
tar -zxvf elasticsearch-6.8.2.tar.gz
mv elasticsearch-6.8.2 elasticsearch
cd elasticsearch/config
vim elasticsearch.yml
elasticsearch.yml
配置文件修改项如下:
# elasticsearch.yml中添加如下配置,支持跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0 # 监听全部ip,注意:在实际环境中应设置为一个安全的ip
http.port: 9200 # es服务的端口号
xpack.security.enabled: true # 开启认证,注意:若无需开启则可不设置该配置
discovery.type: single-node # 单节点配置,注意:该配置需根据实际需求进行配置。
jvm.options
配置文件修改项如下:
# 调整elasticsearch jvm.options的堆内存大小。注意:如果内存足够可以调整为当前服务器内存的一半大小,但是不要超过32g,因为官方不推荐。jvm超过32g后指针压缩效果失效。本文服务器内存大小为16g,因此配置为8g。
-Xms8g
-Xmx8g
修改完成后保存配置并启动es,直接启动和后台启动的命令如下:
# 直接启动
./elasticsearch/bin/elasticsearch
# 后台启动
./elasticsearch/bin/elasticsearch -d
4.设置内置用户密码(若未开启认证配置则忽略此步骤):
# 为es内置用户设置初始密码,默认密码为changeMe,
./bin/elasticsearch-setup-passwords interactive
注意:设置内置用户密码时报错:
java.nio.file.AccessDeniedException:/data/elk/elasticsearch/config/elasticsearch.keystore
解决:使用ll命令查看config下文件的属主信息,发现elasticsearch.keystore文件是属于root用户的 将该文件为当前用户赋予权限就可以了
5.检查单实例集群运行情况(若开启ES认证,则建议使用postMan调用es内置接口,这样权限比较好添加。)shell调用接口例子如下:
# 检查单实例集群运行情况
curl -X GET "localhost:9200/_cat/health?v" # localhost需替换为实际的es地址
# 获取集群节点情况
curl -X GET "localhost:9200/_cat/nodes?v" # localhost需替换为实际的es地址
# 列出所有指数
curl -X GET "localhost:9200/_cat/indices?v" # localhost需替换为实际的es地址
# 新增一个文档
curl -X PUT "localhost:9200/customer/_doc/1?pretty" -H # localhost需替换为实际的es地址
'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
# 删除一个文档
curl -X DELETE "localhost:9200/customer?pretty" # localhost需替换为实际的es地址
# 列出所有索引
curl -X GET "localhost:9200/_cat/indices?v" # localhost需替换为实际的es地址
# 获取某个文档。在查询参数中加上pretty 会调用pretty-print功能,将json格式化打印
curl -X GET "localhost:9200/customer/_doc/1?pretty" # localhost需替换为实际的es地址
# 删除索引
curl -X DELETE "localhost:9200/_all" # localhost需替换为实际的es地址
curl -X DELETE "localhost:9200/dev_*" # localhost需替换为实际的es地址
elasticsearch-head
docker 安装
github地址: elasticsearch-head
1.下载镜像
docker pull mobz/elasticsearch-head:5
2.启动服务
docker run -d --name elasticsearch-head -p 9100:9100 docker.io/mobz/elasticsearch-head:5
3.访问首页,连接es访问,若连接不上,需要在es的配置文件中添加允许跨域访问,并重启elasticsearch。
# elasticsearch.yml中添加如下配置,支持跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
- 注意:若es添加了权限校验的配置,则访问es-header时需要添加授权用户。否则
&
符号后面的参数均不需添加,例子如下:
# 注意:此处的localhost需替换为实际的elasticsearch-head地址
http://localhost:9100/?base_uri=http://localhost:9200&auth_user=elastic&auth_password=changeMe
logstash
服务器部署
1.下载tar.gz 源码包
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.2.tar.gz
2.解压,调整配置文件,参数修改完成后保存即可
tar -zxvf logstash-6.8.2.tar.gz
mv logstash-6.8.2 logstash
cd logstash/config
cp logstash-sample.conf syslog.conf
vim syslog.conf
示例配置如下:
input {
beats {
# 端口信息
port => 5044
}
}
# 对filebeat中传输过来的信息进行过滤
filter {
mutate {
rename => { "[host][name]" => "host" }
}
# 排除tag中无用的参数,避免生成的ES索引格式有问题。注意:若不操作filebeat的tag时则无需该if条件及里面的mutate配置
if "beats_input_codec_plain_applied" in [tags] {
mutate {
remove_tag => ["beats_input_codec_plain_applied"]
}
}
# 标准配置,若无特殊需求可不做修改
grok {
match => { "message" => [
"\[%{TIMESTAMP_ISO8601:logtime}\]\s*\[%{LOGLEVEL:loglevel}\]\s*\[%{IPORHOST:instancehost}\]\s*\[%{DATA:module}\]\s*%{JAVACLASS:class}\s*\[pic:%{DATA:pic}\]\s*\[%{DATA:keys}\]\s*%{GREEDYDATA:content}",
"\[%{TIMESTAMP_ISO8601:logtime}\]\s*\[%{LOGLEVEL:loglevel}\]\s*\[%{IPORHOST:instancehost}\]\s*\[%{DATA:module}\]\s*%{JAVACLASS:class}\s*\[pic:%{DATA:pic}\]\s*%{GREEDYDATA:content}",
"\[%{TIMESTAMP_ISO8601:logtime}\]\s*%{GREEDYDATA:content}",
"%{GREEDYDATA:content}"
]}
}
# 标准配置,若无特殊需求可不做修改
date {
match => [ "logtime", "ISO8601", "yyyy-MM-dd'T'HH:mm:ss.SSS", "yyyy-MM-dd'T'HH:mm:ss,SSS", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss,SSS" ]
target => "@timestamp"
timezone => "Asia/Shanghai"
}
}
# 配置输出到ES中的索引格式
output {
elasticsearch {
# elasticsearch的hosts地址。注意:需将localhost修改为实际的地址
hosts => ["http://localhost:9200"]
# 以filebeat定义的tags为前缀,日期为后缀组成索引,例如:(integration_dev-hzero-platform-2019.11.02)。注意:该配置需修改为实际想要的索引格式。
index => "%{[tags]}-%{+YYYY.MM.dd}"
# elastic用户名
user => "elastic"
# 注意:此处的密码需修改为实际elastic用户的密码,未修改时默认为changeMe,建议统一进行修改
password => "changeMe"
}
}
注意:上述配置中需要重点关注filter部分以及output部分的配置内容,在配置时需根据实际需求来修改相应的配置项,需修改的地方文中均有注释进行标注。
3.启动logstash
# 直接启动
./logstash -f ../config/syslog.conf
# 后台启动
nohup ./bin/logstash -f ./config/syslog.conf &
kibana
服务器部署
1.下载tar.gz源码包
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.3-linux-x86_64.tar.gz
2.解压,调整配置文件,参数修改完成后保存即可
tar -zxvf kibana-6.8.3.tar.gz
mv kibana-6.8.3 kibana
cd kibana/config
vim kibana.yml
示例配置如下:
server.port: 5601 # Kibana端口号
server.host: "localhost" # kibana地址。注意:该配置需修改为实际kibana的host地址。
elasticsearch.hosts: ["http://localhost:9200"] # kibana连接es的host。注意:该配置需修改为实际es的host地址。
elasticsearch.username: "elastic" # es用户名,当es开启认证授权时需要配置。
elasticsearch.password: "changeMe" # es密码,当es开启认证授权时需要配置,该配置需修改为实际elastic账户的密码。
i18n.locale: "zh-CN" # 配置中文Kibana环境。注意:该配置按需进行配置,不加时默认为英文操作环境。
3.启动Kibana
# 直接启动
./bin/kibana
# 后台启动
nohup ./bin/kibana &
至此我们的elk环境已经初步搭建完成,下面就需要将搜集到的日志信息与elk日志监控平台进行对接。
搭建问题记录
问题:
1.单机部署elk时,集群健康值总是为red,排查原因是因为存在副本分片数导致不稳定。
解决方式是在elasticsearch-header中或postman中执行复合查询。
请求路径如下:
http://localhost:9200/_template/template_http_request_record,(注意:请求中的localhost需替换为实际的es地址)
传参如下:
{"index_patterns":["*"],"settings":{"number_of_shards":1,"number_of_replicas":0}}
执行返回{"acknowledged": true}说明修改成功,此时在启动logstash和filebeat传输数据,es创建的索引主分片是1,副本分片是0
注意:elasticsearch的主分片和副本分片不可以存在于同一节点上。否则会出问题
2.部署elk后索引状态为UNASSIGNED(UNASSIGNED原因:Too many open files)
此时需要在es用户下执行ulimit -a 查看当前用户的open file数量,默认1024,然后在root用户下执行
vim /etc/security/limits.conf文件,在文件中添加配置:
elsearch soft nofile 65535
elsearch hard nofile 65535
elasticsearch 常用接口
1.检查es健康状态
GET http://localhost:9200/_cat/health?v # localhost需替换为实际的es地址
2.检查es分片详情,排查unassigned原因
GET http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason4 # localhost需替换为实际的es地址
3.强制失败的es索引重新分片
POST http://localhost:9200/_cluster/reroute?retry_failed # localhost需替换为实际的es地址
4.删除es前缀为dev_的索引
DELETE http://localhost:9200/dev_* # localhost需替换为实际的es地址
5.创建es索引模板(创建名称为hpfm的索引模板)
PUT http://localhost:9200/_template/hpfm # localhost需替换为实际的es地址
6.查看节点状态信息(unsigned时调用该接口查看原因)
http://localhost:9200/_nodes/stats\?pretty # localhost需替换为实际的es地址