1. 简介
Elastic Stack:原来是ELK Stack(Elasticsearch,Logstash,Kibana),加上Beats后升级为Elastic Stack
- ElasticSearch:分布式搜索引擎,可以自动发现,izdong嗯片
- Kibana:可视化工具
- Logstash:日志采集,把日志转换为json并交给ElasticSearch,可以自定义字段等等.
- Beats:日志采集,比上面的轻量诶长多
- Stack eatures(原来的X-pack):安全套件,收费
2. 安装和搭建
准备:3台机器,最好每台2g,1g非常勉强,容易卡死
- 主节点:30
- jdk
- es
- logstash
- kibana
- 数据节点:31,32
- jdk
- es
通用:
官方文档,非常详细:https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
sudo systemctl stop firewalld
sudo setenforce 0
sudo yum install -y java-1.8.0-openjdk
# 直接下载安装
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.1-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.1-linux-x86_64.tar.gz.sha512
shasum -a 512 -c elasticsearch-7.0.1-linux-x86_64.tar.gz.sha512
tar -xzf elasticsearch-7.0.1-linux-x86_64.tar.gz
cd elasticsearch-7.0.1/
# 使用yum安装
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo vim /etc/yum.repos.d/elsticsearch-7.x.repo
#内容如下
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
sudo yum install -y elasticsearch
# 或者直接下载rpm
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.1-x86_64.rpm
主节点:
sudo vi /etc/elasticsearch/elasticsearch.yml
# 更改,最好是按照配置的分类来写
cluster.name: test
node.name: master30
node.master: true
#意思是该节点为主节点
node.data: false
network.host: 0.0.0.0
# 绑定IP,绑定本机的内网IP
# 如果有多个网卡,最好还是绑定一下
http.port: 9200
# 以下是es6的用法, 可以是主机名
discovery.zen.ping.unicast.hosts: ["192.168.10.30", "192.168.10.31", "192.168.10.32"]
# 7 的
discovery.seed_hosts: ["192.168.10.30", "192.168.10.31", "192.168.10.32"]
cluster.initial_master_nodes: ["master30"]
# 只需要配置master的node.name即可.
# 开机启动:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
# 首先启动主节点
# 会在/var/log/elasticsearch/你的cluster名.log
# 测试
curl '192.168.10.30:9200/_cluster/health?pretty'
# 这里的localhost,就是你绑定的IP
# 健康检查
# 返回的json status:green 表示一切ok
curl '192.168.10.30:9200/_cluster/state?pretty'
# 集群详细信息
# Curl命令操作ES:<http://zhaoyanblog.com/archives/732.html>
# 安装kibana
# 如果前面已经配置过yum源
sudo yum install -y kibana
# 直接下载rpm
sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-7.0.1-x86_64.rpm
# 配置kibana
sudo vi /etc/kibana/kibana.yml
# 打开注释即可
server.port: 5601
server.host: "192.168.10.30"
# 监听IP
# 6
elasticsearch.url: "http://192.168.10.30:9200"
# 7
elasticsearch.hosts: ["http://192.168.10.30:9200"]
logging.dest: /var/log/kibana.log
# 默认是输出到 /var/log/message下
# 创建log文件
sudo touch /var/log/kibana.log &&sudo chmod 777 /var/log/kibana.log
sudo systemctl restart kibana
# 浏览器里访问http://192.168.10.30:5601/
# 用户名elastic,密码为之前你设置过的密码,默认是不需要密码
# 若无法输入用户名密码,查日志/var/log/kibana.log
# 出现错误 Status changed from uninitialized to red - Elasticsearch is still initializing the kibana index.
# 解决办法:curl -XDELETE http://192.168.10.30:9200/.kibana -uelastic
数据节点:
sudo vi /etc/elasticsearch/elasticsearch.yml
# 更改
cluster.name: test
node.name: data31
# 另外一个data32
node.master: false
node.data: true
network.host: 0.0.0.0
# 指定IP
http.port: 9200
# 以下是es6的用法
discovery.zen.ping.unicast.hosts: ["192.168.10.30", "192.168.10.31", "192.168.10.32"]
# 以下是7的用法
discovery.seed_hosts: ["192.168.10.30", "192.168.10.31", "192.168.10.32"]
# 开机启动:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service
# 然后启动数据节点
# 安装logstash, logstash目前不支持java9
# yum
sudo yum install -y logstash
sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm
# 测试
sudo vi /etc/logstash/logstash.yml
# 修改绑定ip
http.host: "192.168.10.32"
# 同理31
# 配置要收集的日志,以下是系统日志
sudo vi /etc/logstash/conf.d/syslog.conf
# 需要收集的都放到conf.d中以.conf结尾
# 加入如下内容,删除注释
input {
syslog {
# 把日志输出到10514端口==>用于远程传输,原来是直接输出到/var/log/message
type => "system-syslog"
port => 10514
}
}
# 用于下面的测试
#output {
# # 输出到当前屏幕
# stdout {
# codec => rubydebug
# }
#}
# 以下是用于输入到es,测试完成后才使用如下配置
output {
elasticsearch {
# 由于是分布式的,随便指向其中一台即可.由于资源问题,这里只开master30
hosts => ["192.168.10.30:9200"]
index => "system-syslog-%{+YYYY.MM}"
}
}
# 后台服务会监听两个端口,一个是10514自己定义的.一个是9600
# 检测配置文件是否有错
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit
# 如果提示内存不足,先把elasticsearch关闭
# 其启动特别耗费资源
# 成功会输出 ok
# 如果使用root用户,会造成日志等的身份都是root.以logstash用户后台启动不成功
# 测试是否能够正常收集
# 前台形式启动logstash
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
# 这样可以在屏幕上查看到日志输出
# 再开一个终端, 检测是否开启10514端口:
netstat -lnp |grep 10514
# 修改系统日志输出
sudo vi /etc/rsyslog.conf
# 在#### RULES下面增加一行
*.* @@192.168.10.32:10514
# 由于是本机,可以直接127.0.0.1:10514
# 还有31机器
# 日志输出到10514端偶
sudo systemctl restart rsyslog
# 可以通过登录,yum等来生成日志
# 会在logstash终端,以json形式输出
# 结束logstash,在前台的那个终端上按ctrl c
sudo chown -R logstash:logstash /var/lib/logstash/
sudo chown logstash:logstash /var/log/logstash/logstash-plain.log
# 可以排查上面的日志
# 测试完成,没有问题后,重新修改配置文件,让其输出到es.并以服务形式启动
# 可能需要安装systemd
sudo /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd
sudo systemctl enable logstash
sudo systemctl start logstash
# 启动时间很长,直到出现9600和10514端口后才算启动成功
# 然后再尝试启动es,实在不行就算了.
# 把master30上的seed_hosts关闭
相关知识点:
- /etc/sysconfig/elasticsearch:es整体服务配置
- /etc/elasticsearch/elasticsearch.yml:集群配置,IP,端口等
- 9200端口:ES通信
- 9300端口:数据传输
- /usr/share/elastic这些软件的目录:安装目录
3. 通过Kibana查看日志
主节点:
curl '192.168.10.30:9200/_cat/indices?v'
# 可以获取索引信息
curl -XGET '192.168.10.30:9200/system-syslog-2019.05?pretty'
# 可以获指定索引详细信息
# system-syslog-2019.05 是上面output定义的
curl -XDELETE '192.168.10.30:9200/索引名'
# 可以删除指定索引
elasticsearch的索引加入到kibana:
- 浏览器访问192.168.10.30:5601,到kibana配置索引
- 左侧点击"Managerment"-> “Index Patterns”-> “Create Index Pattern”
- 勾选右边的 Include system indices
- 如果没有的话,再yum或登录一下来生成
- Index pattern这里需要根据前面curl查询到的索引名字来写,否则下面的按钮是无法点击的
system-syslog-*
- filter随便即可
- 勾选右边的 Include system indices
discover:选择你上面创建的名i,即可看到图表
4. 收集Nginx的日志
在32数据节点上配置,31还是系统日志
# 按装nginx
sudo yum install -y epel-release && sudo yum install -y nginx
# 配置虚拟主机
sudo vi /etc/nginx/conf.d/es.conf
# 写入如下内容
server {
listen 80;
server_name es.test.com;
# 代理
location / {
proxy_pass http://192.168.10.30:5601;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /tmp/es_access.log main2;
}
# 增加日志格式
sudo vim /etc/nginx/nginx.conf
# http中增加如下内容
log_format main2 '$http_host $remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$upstream_addr" $request_time';
sudo nginx -t
sudo systemctl start nginx
# 访问几次
sudo vi /etc/logstash/conf.d/nginx.conf
# 加入如下内容
input {
# 使用文件
file {
path => "/tmp/es_access.log"
start_position => "beginning"
# 从头开始收集
type => "nginx"
}
}
filter {
grok {
# 如果定义了match,对应的要抓取的日志格式也是需要定义的
match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"}
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["192.168.10.30:9200"]
index => "nginx-test-%{+YYYY.MM.dd}"
}
}
# 检查配置文件
cd /usr/share/logstash/bin
./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx.conf --config.test_and_exit
# 修改真机hosts,
192.168.10.32 es.test.com
# 因为是32代理了30上的kibana
# 访问32 ,32的nginx产生日志,并发送给30的es
#浏览器访问,检查是否有日志产生
sudo systemctl restart logstash
- 添加索引
- discover查看
5. 使用Beats来收集日志
强烈推荐使用beats.
把31上的logstash关闭,使用beats来收集
beats是一个套件,有很多,如filebeat(日志文件),packetbeat(网络)等:https://www.elastic.co/cn/products/beats,可扩展
# 同样的yum或下载
sudo wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.0.1-x86_64.rpm
#再编辑配置文件
sudo vim /etc/filebeat/filebeat.yml
# 修改
filebeat.prospectors:
- type:log
enabled: true
paths:
- /var/log/*.log
- /var/log/messages
output.elasticsearch:
hosts: ["192.168.10.30:9200"]
sudo systemctl start filebeat
- kibana添加filebeat-*
- discover查看
6. 其他参考资料
- Elastic stack演进:http://70data.net/1505.html
- 基于kafka和elasticsearch,linkedin构建实时日志分析系统 http://t.cn/RYffDoE
- ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台https://www.cnblogs.com/delgyd/p/elk.html
- 关于elk+zookeeper+kafka 运维集中日志管理: http://www.jianshu.com/p/d65aed756587
- x-pack 收费,免费http://www.jianshu.com/p/a49d93212eca,https://www.elastic.co/subscriptions
- x-pack已经没了,保存一下