前言
ELK可以理解为由各种beat或其他类似组件去收集各类型日志通过logstash管道(logstash自身也可以收集日志,同时也可以接收beat发送来的数据)output丢给ElasticSearch存储引擎,再由Kibana获取存储引擎数据成图呈现给用户。
为什么需要ELK? -- ELK是一套完整的开源解决方案,可帮助在运维工作过程用于快速故障排查、日志审计、综合展示、监控报警、关联统计信息等。
ELK基本组件
1、ElasticSearch 基于lucene(信息检索组件)的分布式文件存储,支持横向扩展、自动发现、索引自动分片以及Restfull的全文本搜索引擎,此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索,还是一个带实时分析功能的分布式引擎,能够扩展至数以百计的节点实时处理PB级数据。
2、Logstash 是重量级的,支持多数据获取机制,通过TCP/UDP协议、文件、syslog、windows Eventlogs及STDIN等;获取到数据后,它支持对数据执行过滤、编码、修改等操作。使用JRuby语言,需要JVM下运行。
3、Kibana 为日志分析提供一个可视并友好的图形界面,并且可以绝大多数的汇总、分析需求。
4、Beat 目前ELK官方提供了比较多元化的beat类型 。
Filebeat轻量级的日志收集组件。
Metricbeat用于收集系统CPU、RAM、IO、volume等性能指标。
Packetbeat是一个轻量级的网络数据包分析组件。
Winlogbeat是一个轻量级Windows Event收集组件。
Auditbeat轻量型审计日志采集器收集Linux 审计框架的数据,监控文件完整性。
Heartbeat轻量级状态监测,可以对一个URL列表进行可用性监控对响应时间、状态、IP进行记录。
Functionbeat面向云端数据的无服务器采集,例如你使用阿里云或者AWS的一些SAAS服务,这些服务的运行主机并不在你的掌握中,但它们也非常重要此时可以将Fucationbeat作为一个功能放入Lambda去搜集指标和日志然后发送给ELK进行分析展示。
5、XPACK 一般用于安全角色认证,付费后有更多的图表、监控等功能扩展。
本次使用两台服务器作为ELK STACK
austyn-test-001 --> ElasticSearch Master + logstash + kibana + beat + ElasticHQ(为ElasticSearch集群提供一个监控和管理平台的组件)
austyn-test-002 --> ElasticSearch Slave + logstash + beat
环境准备
涉及到服务器集群应该先对时间、时区进行同步
ntpdate time.windows.com #偷个懒
下载相应软件包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.1-x86_64.rpm
wget https://artifacts.elastic.co/downloads/beats/winlogbeat/winlogbeat-7.3.1-windows-x86_64.zip
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.3.1-x86_64.rpm
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.1.rpm
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-windows-x86_64.zip
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
wget https://artifacts.elastic.co/downloads/beats/auditbeat/auditbeat-7.3.1-windows-x86_64.zip
wget https://artifacts.elastic.co/downloads/beats/auditbeat/auditbeat-7.3.1-x86_64.rpm
wget https://artifacts.elastic.co/downloads/beats/packetbeat/packetbeat-7.3.1-windows-x86_64.zip
wget https://artifacts.elastic.co/downloads/beats/packetbeat/packetbeat-7.3.1-x86_64.rpm
两台服务器部署java环境
rpm -qa |grep *jdk* #查询是否有老的JDK版本,有的话就卸载
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
java -version #测试
安装ES,两台都安装配置
rpm -ivh elasticsearch-7.3.1-x86_64.rpm
ElasticHQ需要 python3.4环境,但是pytest5 需要3.5以上版本,所以使用的是python3.7
wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
tar xf Python-3.7.4.tar.xz
cd Python-3.7.4/
yum install sqlite-* openssl openssl-devel libffi-devel -y #不同的环境可能缺少一些编译组件,需要装上
./configure
make
make install
python3.7 -V #测试
mkdir hq && cd hq
git clone https://github.com/ElasticHQ/elasticsearch-HQ.git
cd elasticsearch-HQ/
pip3.7 install --upgrade pip #pip3.7 --default-timeout=100 install 如果网速比较慢的可以加上此参数
pip3.7 install --upgrade setuptools
pip3.7 install --upgrade distribute
pip3.7 install -r requirements.txt
vim /etc/elasticsearch/elasticsearch.yml
austyn-test-001:
cluster.name: austyn-elk #集群名,各节点应该保持一致
node.name: node-130 #节点名
path.data: /var/lib/elasticsearch #数据存放路径
path.logs: /var/log/elasticsearch #日志存放路径
network.host: 0.0.0.0 #侦听IP,注释代表侦听所有可用IP
http.port: 9200 #侦听端口TCP
discovery.seed_hosts: ["192.168.2.130", "192.168.2.131"] #主机发现,各节点主机的列表
cluster.initial_master_nodes: ["node-130"] #手动选举master节点
http.cors.enabled: true #支持跨域访问,允许HQ访问
http.cors.allow-origin: "*" #跨域访问范围
austyn-test-002:
cluster.name: austyn-elk
node.name: node-131
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.2.130", "192.168.2.131"]
cluster.initial_master_nodes: ["192.168.2.130"]
http.cors.enabled: true
http.cors.allow-origin: "*"
service elasticsearch start #启动两个节点的ElasticSearch
安装Kibana
rpm -ivh kibana-7.3.1-x86_64.rpm
vim /etc/kibana/kibana.yml
server.port: 5601 #监听端口
server.host: "0.0.0.0" #监听IP
elasticsearch.hosts: ["http://192.168.2.130:9200","http://192.168.2.131:9200"] #ElasticSearch节点列表
i18n.locale: "zh-CN" #中文支持
service kibana start
两台都安装logstash、nginx
rpm -ivh logstash-7.3.1.rpm
vim /etc/logstash/logstash.yml
path.data: /var/lib/logstash #数据存储路径
http.host: "192.168.2.130" #根据实际情况,注意开头不能有空格
http.port: 9600 #支持范围 9600-9700 会选择第一个可用的端口
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
./configure --prefix=/usr/local/nginx
make
make install
vim /usr/local/nginx/conf/nginx.conf
增加日志类型在http段定义
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
server {
listen 8999;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://192.168.2.130: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;
#root html;
#index index.html index.htm;
access_log /var/log/nginx/elk_access.log access_json;
}
echo '
input {
file {
path => "/var/log/nginx/elk_access.log"
start_position => "beginning"
type => "nginx"
codec => "json"
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["192.168.2.130:9200"]
index => "nginx-test-%{+YYYY.MM.dd}"
}
}' >> /etc/logstash/conf.d/nginx_access.conf
mkdir /var/log/nginx
touch /var/log/nginx/elk_access.log
/usr/local/nginx/sbin/nginx
nohup /usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/nginx_access.conf & #推荐使用screen
启动ElasticseachHQ
cd /root/elkdownload/hq/elasticsearch-HQ/
python3.7 application.py #启动后,http形式访问5000端口,为了有测试数据应该先访问一下8999端口
Kibana端口为5601 http://$ip:5601,也可以使用8999用Nginx做了反向代理,在Kibana上添加数据,到此已经完成ELK的部署