系统配置:CentOS7.6 4核4G
ELK版本:7.7.1
elastic官网地址:https://www.elastic.co/cn/
elastic产品地址:https://www.elastic.co/cn/elastic-stack
yum源地址:https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum
前言
日志主要包括系统日志和应用程序日志,运维和开发人员可以通过日志了解服务器中软硬件的信息,检查应用程序或系统的故障,了解故障出现的原因,以便解决问题。分析日志可以更清楚的了解服务器的状态和系统安全状况,从而可以维护服务器稳定运行。
ELK简介
ELK主要由ElasticSearch、Logstash和Kibana三个开源工具组成,还有其他专门由于收集数据的轻量型数据采集器Beats。
Elasticsearch :分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 是用Java 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。
在elasticsearch中,所有节点的数据是均等的。
Logstash :数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。
Kibana :可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。
Filebeat:轻量级数据收集引擎。相对于Logstash所占用的系统资源来说,Filebeat 所占用的系统资源几乎是微乎及微。它是基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择。
版本说明:
Elasticsearch、Logstash、Kibana、Filebeat安装的版本号必须全部一致,不然会出现kibana无法显示web页面。
ELK常见的几种架构:
1 Elasticsearch + Logstash + Kibana
这是一种最简单的架构。这种架构,通过logstash收集日志,Elasticsearch分析日志,然后在Kibana(web界面)中展示。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。
2 Elasticsearch + Logstash + filebeat + Kibana
与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。
3 Elasticsearch + Logstash + filebeat + redis(也可以是其他中间件,比如RabbitMQ) + Kibana
这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。
架构图:
yum安装
ELK安装需要以非root用户安装。
1.配置JDK环境
自行下载jdk-11.0.7_linux-x64_bin.rpm
1.安装jdk
>rpm -ivh jdk-11.0.7_linux-x64_bin.rpm
2.配置环境变量
>vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk-11.0.7
export PATH=$JAVA_HOME/bin:$PATH
3.执行脚本
>source /etc/profile.d/java.sh
2.配置ELK yum源
>vim /etc/yum.repo.d/ELK.repo
[ELK]
name=ELK-Elasticstack
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-7.x/
gpgcheck=0
enabled=1
3.部署elasticsearch
3.1.安装elasticsearch
>yum install -y elasticsearch-7.7.1
3.2.修改配置文件
vi /etc/elasticsearch/elasticsearch.yml
cluster.name: my-es
node.name: node-1
path.data: /data/elk/es/data
path.logs: /data/elk/es/logs
network.host: 127.0.0.1
http.port: 9200
3.3.创建目录
#创建数据库及日志目录
>mkdir -p /data/elk/es/data
>mkdir -p /data/elk/es/logs
#修改目录权限
>chown -R elasticsearch:elasticsearch /data/elk/es
3.4.限制资源使用
>vim /etc/security/limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
3.5.添加防火墙
#对于elasticsearch端口,需要限制IP访问
>firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="指定IP" port protocol="tcp" port="9200" accept"
>firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="指定IP" port protocol="tcp" port="9300" accept"
>firewall-cmd --reload
3.6.启动elasticsearch
#启动
>systemctl restart elasticsearch.service
#查看端口监听
>netstat -anpt
#查看是否已运行,若出现如下数据,则安装成功
>curl http://localhost:9200
{
"name" : "node-1",
"cluster_name" : "my-es",
"cluster_uuid" : "Q7svyfAVQPmLtXsfHXoFDw",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
"build_date" : "2020-05-28T16:30:01.040088Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
3.7.elasticsearch部分配置说明
属性名 | 说明 |
---|---|
cluster.name | 配置elasticsearch的集群名称。 |
node.name | 节点名,es会默认随机指定一个名字,用户可自行配置。 |
path.data | 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号分隔。 |
path.logs | 设置日志文件的存储路径,默认是es根目录下的logs文件夹。 |
path.conf | 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearch。 |
path.plugins | 设置插件的存放路径,默认是es根目录下的plugins文件夹。 |
bootstrap.memory_lock | 设置为true可以锁住ES使用的内存,避免内存进行swap。 |
network.host | 设置bind_host和publish_host,设置为0.0.0.0允许所有外网访问。 |
http.port | 设置对外服务的http端口,默认为9200。 |
transport.tcp.port | 集群结点之间通信端口,默认为9300。 |
discovery.zen.ping.timeout | 设置ES自动发现节点连接超时的时间,默认为3S。 |
discovery.zen.minimum_master_nodes | 主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2。 |
discovery.seed_hosts | 集群发现,配置该节点会与哪些候选地址进行通信,hostname,ip,ip+port,比如:[“127.0.0.1:9300”]。 |
cluster.initial_master_nodes | 当你第一次启动全新的Elasticsearch集群时,会有一个集群引导(cluster bootstrapping)步骤,这个步骤会确定一个在第一次选举中投票被计数的、并且可以成为master节点的集合。在开发模式,如果没有配置 discovery settings,该步骤由节点自身自动执行。因为这种自动引导本质上是不安全的,当您在生产模式下启动一个全新的集群时,你必须显式指定那些可以成为master节点的名称或者IP地址,这些节点应该在第一次选举中计算选票数。 |
4.部署kibana
Kibana是node.js 编写的,不需要java环境。直接安装即可。
4.1.安装kibana
>yum install -y kibana-7.7.1
4.2.修改配置文件
vi /etc/kibana/kibana.yml
server.port: 5601
server.host: “0.0.0.0”
elasticsearch.hosts: [“http://localhost:9200”]
kibana.index: “.kibana”
4.3.添加防火墙
firewall-cmd --add-port=5601/tcp --permanent
firewall-cmd --reload
4.4.启动kibana
>systemctl restart kibana.service
4.5.访问
浏览器上输入:http://ip:5601,出现以下界面,则安装成功。同时由于启动较慢,可多刷新几次。
5.部署logstash
由于直接使用yum install -y logstash-7.7.1,无法启动,所以这里使用rpm安装方式。
5.1.下载安装包
>wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/yum/elastic-7.x/7.7.1/logstash-7.7.1.rpm
5.2.安装logstash
>sudo rpm -ivh logstash-7.7.1.rpm
5.3.修改配置文件
vim /etc/logstash/logstash.yml
http.host: “0.0.0.0”
http.port: 9600-9700
5.4.增加配置
cp /etc/logstash/logstash-sample.conf /etc/logstash/conf.d/logstash.conf
根据实际需求来配置该文件。比如:
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => [“ES地址:9200”]
index => “logstash-%{+YYYY.MM.dd}”
}
}
5.5.添加防火墙
firewall-cmd --add-port=5044/tcp --permanent
firewall-cmd --add-port=9600/tcp --permanent
firewall-cmd --reload
5.6.启动logstash
>systemctl restart logstash.service
5.7.查看是否启动成功
>netstat -anpt
6.部署filebeat
在需要收集日志的服务器上安装filebeat。、
6.1.安装filebeat
>wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.1-x86_64.rpm
>rpm -ivh filebeat-7.7.1-x86_64.rpm
6.2.修改配置文件
vi /etc/filebeat/filebeat.yml
#配置需要采集的日志paths:
‘- /usr/local/应用/logs/*.log’#配置采集日志输出位置
#输出到屏幕
#output.console:
#enable: true#输出到logstash
output.logstash:
#The Logstash hosts
hosts: [“logstash服务器IP:5044”]
6.3.启动filebeat
>systemctl restart filebeat.service
6.4.查看filebeat是否运行正常
>journalctl -u filebeat.service
6.5.在kibana中创建索引
6.6.查看日志
至此,所有安装完成。
Docker安装
1.部署elasticsearch
1.1.查看是否安装docker
>docker version
若出现类似如下信息,则表示已安装,否则,未安装,需要先安装docker.
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-161.git64e9980.el7_8.x86_64
Go version: go1.10.3
Git commit: 64e9980/1.13.1
Built: Tue Apr 28 14:43:01 2020
OS/Arch: linux/amd64Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-161.git64e9980.el7_8.x86_64
Go version: go1.10.3
Git commit: 64e9980/1.13.1
Built: Tue Apr 28 14:43:01 2020
OS/Arch: linux/amd64
Experimental: false
安装docker.
>yum install -y docker
1.2.查找elasticsearch镜像
>docker search elasticsearch
安装指定的elasticsearch版本,以7.7.1为例。
1.3.安装elasticsearch
>docker pull elasticsearch:7.7.1
等待安装完成。
查看elasticsearch镜像是否已加载。
>docker images
1.4.创建挂载目录
>mkdir -p /data/elk/es/config
>mkdir -p /data/elk/es/data
>mkdir -p /data/elk/es/logs
1.5.赋予权限
docker中elasticsearch的用户UID是1000.
>chown -R 1000:1000 /data/elk/es
1.6.创建挂载用配置
>cd /data/elk/es/config
>touch elasticsearch.yml
-----------------------配置内容----------------------------------
cluster.name: "my-es"
network.host: 127.0.0.1
http.port: 9200
-----------------------配置内容----------------------------------
1.7.运行elasticsearch
通过镜像,启动一个容器,并将9200和9300端口映射到本机(elasticsearch的默认端口是9200,我们把宿主环境9200端口映射到Docker容器中的9200端口)。
>docker run -it -d -p 9200:9200 -p 9300:9300 --name es -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -e "discovery.type=single-node" --restart=always -v /data/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/es/data:/usr/share/elasticsearch/data -v /data/elk/es/logs:/usr/share/elasticsearch/logs elasticsearch:7.7.1
1.8.验证安装是否成功
>curl http://localhost:9200
1.9.添加防火墙端口
#对于elasticsearch端口,需要限制IP访问
>firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="指定IP" port protocol="tcp" port="9200" accept"
>firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="指定IP" port protocol="tcp" port="9300" accept"
>firewall-cmd --reload
2.部署kibana
1.1.安装kibana
>docker pull kibana:7.7.1
等待安装完成。
查看kibana镜像是否已加载。
>docker images
1.2.获取elasticsearch容器ip
>docker inspect --format '{{ .NetworkSettings.IPAddress }}' es
1.3.配置文件
在服务器上新建配置文件,用于docker文件映射。
比如:
>vi /data/elk/kibana/kibana.yml
#Default Kibana configuration for docker target
server.name: kibana
server.host: “0”
elasticsearch.hosts: [“http://172.17.0.2:9200”]
xpack.monitoring.ui.container.elasticsearch.enabled: true
1.4.运行kibana
>docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kibana -p 5601:5601 -v /data/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.7.1
此处将kibana的配置文件映射到docker中,但实际测试中发现,映射的配置文件并未生效。
1.5.添加防火墙
firewall-cmd --add-port=5601/tcp --permanent
firewall-cmd --reload
1.6.访问
浏览器上输入:http://ip:5601,由于启动较慢,可多刷新几次。发现页面出现该提示:
这是由于映射的配置文件并没有生效,还是需要在kibana容器中修改配置。
1.7.配置kibana容器配置文件
将配置文件中elasticsearch.hosts地址修改为elasticsearch容器地址。
>docker exec -it kibana /bin/bash
>vi config/kibana.yml
重启kibana:
docker restart kibana
1.8.重新访问
浏览器上输入:http://ip:5601,由于启动较慢,可多刷新几次。
3.部署logstash
3.1.获取logstash镜像
>docker pull logstash:7.7.1
3.2.编辑logstash.yml配置文件
>vi /data/elk/logstash/logstash.yml
path.config: /data/elk/logstash/conf.d/*.conf
path.logs: /var/log/logstash
3.3.编辑logstash.conf文件
>vi /data/elk/logstash/conf.d/logstash.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => [“172.17.0.2:9200”]
index => “logstash-%{+YYYY.MM.dd}”
}
}
3.4.运行logstash
>docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 -p 5044:5044 --name xinyar-logstash -v /data/elk/logstash/logstash.yml:/data/docker/logstash/config/logstash.yml -v /data/elk/logstash/conf.d/:/data/docker/logstash/conf.d/ logstash:7.7.1
3.5.修改logstash配置
>docker exec -it logstash /bin/bash
>vi config/logstash.yml
http.host: “0.0.0.0”
xpack.monitoring.elasticsearch.hosts: [ “http://172.17.0.2:9200” ]
path.config: /data/docker/logstash/conf.d/*.conf
3.6.重启logstash
>docker restart logstash
3.7.查看数据
filebeat依然使用上在上一章节中的安装方法,并指定上报内容。
同时在kibana中创建索引。
至此,所有安装完成。