一、ELK 介绍
ELK是ElasticSearch、Logstash和Kibana三个开源软件的组合体,它是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。
Logstash:作为信息收集者,主要是用来对日志的搜集、分析、过滤,支持大量的数据获取方式,一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Elasticsearch:作为数据的保存者,保存来自L(Logstash)收集的系统日志数据。
Kibana :作为展示者,主要是将ES上的数据通过页面可视化的形式展现出来。包括可以通过语句查询、安装插件对指标进行可视化等。
二、ELK安装和部署
2.1环境准备
NODE | 节点 | |
elk-1 | 10.10.10.66 | elasticsearch、kabana |
elk-2 | 10.10.10.67 | elasticsearch、logstash |
elk-3 | 10.10.10.68 | elasticsearch |
修改三台服务器主机名
hostnamectl --static set-hostname elk-1
hostnamectl --static set-hostname elk-2
hostnamectl --static set-hostname elk-3
2.2系统优化
cat >> /etc/sysctl.conf <<EOF
vm.max_map_count=262144
EOF
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
echo "* soft nofile 1024000 " >> /etc/security/limits.conf
echo "* hard nofile 1024000 " >> /etc/security/limits.conf
echo "* soft nproc 1024000 " >> /etc/security/limits.conf
echo "* hard nproc 1024000 " >> /etc/security/limits.conf
sed -i 's/* soft nproc 4096/* soft nproc 40960/g' /etc/security/limits.d/20-nproc.conf
sysctl -p
2.3安装elasticsearch
- 创建用户及授权
useradd elk #三台服务器分别执行
- 创建数据目录
mkdir -p /data/elk/es-data/
- 修改elasticsearch.yml配置文件
1、master节点
cluster.name: master-node # 设置集群名称,集群内所有节点的名称必须一致。
node.name: data-node0 # 设置节点名称,集群内节点名称必须唯一。
node.master: true # 表示该节点会不会作为主节点,true表示会;false表示不会
node.data: true # 当前节点是否用于存储数据,是:true、否:false
http.cors.enabled: true # 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin: /.*/ # “*” 表示支持所有域名
path.data: /data/elk/es-data/ # 索引数据存放的位置
network.host: 0.0.0.0 # 监听地址,用于访问该es
http.port: 9200 # es对外提供的http端口,默认 9200
transport.tcp.port: 9300 # TCP的默认监听端口,默认 9300
discovery.zen.minimum_master_nodes: 2 # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
action.destructive_requires_name: true # 安全优化:禁止披露删除可避免恶意或意外的批量删除索引
#设置密码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
discovery.seed_hosts: ["10.10.10.66", "10.10.10.67", "10.10.10.68"] # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
cluster.initial_master_nodes: ["data-node0", "data-node1","data-node2"] # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
2、node1节点
cluster.name: master-node # 设置集群名称,集群内所有节点的名称必须一致。
node.name: data-node1 # 设置节点名称,集群内节点名称必须唯一。
node.master: true # 表示该节点会不会作为主节点,true表示会;false表示不会
node.data: true # 当前节点是否用于存储数据,是:true、否:false
http.cors.enabled: true # 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin: /.*/ # “*” 表示支持所有域名
path.data: /data/elk/es-data/ # 索引数据存放的位置
network.host: 0.0.0.0 # 监听地址,用于访问该es
http.port: 9200 # es对外提供的http端口,默认 9200
transport.tcp.port: 9300 # TCP的默认监听端口,默认 9300
discovery.zen.minimum_master_nodes: 2 # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
#设置密码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
discovery.seed_hosts: ["10.10.10.66", "10.10.10.67", "10.10.10.68"] # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
cluster.initial_master_nodes: ["data-node0", "data-node1","data-node2"] # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
3.node2节点
cluster.name: master-node # 设置集群名称,集群内所有节点的名称必须一致。
node.name: data-node2 # 设置节点名称,集群内节点名称必须唯一。
node.master: true # 表示该节点会不会作为主节点,true表示会;false表示不会
node.data: true # 当前节点是否用于存储数据,是:true、否:false
http.cors.enabled: true # 是否支持跨域,是:true,在使用head插件时需要此配置
http.cors.allow-origin: /.*/ # “*” 表示支持所有域名
path.data: /data/elk/es-data/ # 索引数据存放的位置
network.host: 0.0.0.0 # 监听地址,用于访问该es
http.port: 9200 # es对外提供的http端口,默认 9200
transport.tcp.port: 9300 # TCP的默认监听端口,默认 9300
discovery.zen.minimum_master_nodes: 2 # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
#设置密码
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
discovery.seed_hosts: ["10.10.10.66", "10.10.10.67", "10.10.10.68"] # es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.zen.fd.ping_timeout: 1m
discovery.zen.fd.ping_retries: 5
cluster.initial_master_nodes: ["data-node0", "data-node1","data-node2"] # es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举master
- 修改elasticsearch的JVM内存(jvm.options)
根据实际机器配置做调整
-Xms1g
-Xmx1g
- ES集群设置密码
注意:elk集群需全部停止,清空elasticsearch所有节点下data
1、开启xpack配置
修改作为主节点的elasticsearch配置文件,添加如下命令开启x-pack
xpack.security.enabled: true
2、生成安全秘钥
执行命令:bin/elasticsearch-certutil ca -out config/elastic-certificates.p12 -pass ""
在config文件夹下面多出了文件 elastic-certificates.p12,将elastic-certificates.p12文件分别复制到另外两个节点的config目录下。
分别将如下命令配置到其他节点的elasticsearch.yml
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
3.重启elasticsearch
./elasticsearch -d
4、配置初始账号密码
手动指定密码模式:./elasticsearch-setup-passwords interactive
自动生成密码:./elasticsearch-setup-passwords auto
分别启动三台elasticsearch服务。在浏览器中输入
http://10.10.10.166:9200/_cat/nodes,执行如下图所示结果,则表示配置成功。
4、安装kibana
- 修改配置文件
vim kibana.yml
server.port: 5601
server.host: "10.10.10.66"
elasticsearch.hosts: ["http://10.10.10.66:9200","http://10.10.10.67:9200","http://10.10.10.68:9200"]
kibana.index: ".kibana"
logging.dest: stdout
i18n.locale: "zh-CN"
elasticsearch.username: "elastic"
elasticsearch.password: "*******************"
- 启动登录
./bin/kibana
http://10.10.10.66:5601
四、logstash配置
编辑logstash.conf 配置文件
input {
beats {
port => 5044
codec => "json"
}
}
filter {
mutate {
split=>["xff", ","]
add_field => {
"xff1" => "%{[xff][0]}"
"xff2" => "%{[xff][1]}"
}
convert => [ "status","integer" ]
convert => [ "size","integer" ]
convert => [ "upstreatime","float" ]
convert => ["[geoip][coordinates]", "float"]
remove_field => "message"
}
geoip {
source => "xff"
target => "geoip"
database =>"/data/elk/logstash/GeoLite2-City/GeoLite2-City.mmdb"
#database =>"/data/elk/logstash/GeoLite2-Country/GeoLite2-Country.mmdb"
#database =>["/data/elk/logstash/GeoLite2-City/GeoLite2-City.mmdb", "/data/elk/logstash-5.6.7/GeoLite2-Country/GeoLite2-Country.mmdb"]
fields => ["location","city_name", "country_code2", "country_name", "latitude", "longitude", "region_name"]
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
#useragent {
# source => "http_user_agent"
# target => "browser"
# }
if "_geoip_lookup_failure" in [tags] { drop { } }
}
output {
if [type] == "nginx1" {
elasticsearch {
hosts => "xxx.xxx.xxx.xxx:9200"
user => "elastic"
password => "******************"
index => "logstash-nginx1-%{+YYYY.MM.dd}"
}}
if [type] == "nginx2" {
elasticsearch {
hosts => "xxx.xxx.xxx.xxx:9200"
user => "elastic"
password => "********************"
index => "logstash-nginx2-%{+YYYY.MM.dd}"
}}
stdout { codec => rubydebug }
}
启动命令:
nohup ../bin/logstash -f ./logstash.conf --config.reload.automatic &
--config.reload.automatic 参数表示修改配置文件实时生效
五、nginx配置
- 修改nginx日志打印格式,修改nginx.conf,添加如下配置。
log_format json '{"@timestamp":"$time_iso8601",'
'"@source":"$server_addr",'
'"hostname":"$hostname",'
'"ip":"$remote_addr",'
'"client":"$remote_addr",'
'"request_method":"$request_method",'
'"scheme":"$scheme",'
'"domain":"$server_name",'
'"referer":"$http_referer",'
'"request":"$request_uri",'
'"args":"$args",'
'"size":$body_bytes_sent,'
'"status": $status,'
'"xff":"$http_x_forwarded_for",'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamaddr":"$upstream_addr",'
'"http_user_agent":"$http_user_agent",'
'"https":"$https"'
'}';
六、filebeat配置
filebeat-->logstash:5044 -->output elasticsearch
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/logs/nginx/nginx1_access.log
json.keys_under_root: true
json.overwrite_keys: true
json.add_error_key: true
fields_under_root: true
fields:
type: logstash-nginx1
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
output.logstash:
hosts: ["10.10.10.67:5044"]
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
本文暂时没有评论,来添加一个吧(●'◡'●)