ELK介绍
Elasticsearch是一款开源的分布式搜索引擎,提供搜集、分析、存储数据。
特点:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源等
Logstash:作用于日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。
基于c/s架构,Client端(FileBeat)部署在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作再发往elasticsearch。
Kibana 实现数据可视化。在 Elastic Stack 中进行导航,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好Web 界面,汇总、分析和搜索重要数据日志。
Beats:收集、解析和传输数据等常用beat有:Filebeat,Packetbeat,Metricbeat,Auditbeat,Winlogbeat 此次我们将用Filebeat做Client端
注: Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全
ELK整体架构图:
一、 ELK部署环境准备
1、 服务器环境准备
10.0.60.191 elk-master 部署Role:Logstash, ES, Kibana
10.0.60.192 Elasticsearch-n1 部署Role:Elasticsearch
10.0.60.193 Elasticsearch-n2 部署Role:Elasticsearch
10.0.60.195 ELK-Client 部署Role:Filebeat
2、 安装JDK
Elasticsearch、Logstash的部署都需要JDK环境的支持,分别在10.0.60.191-193上进行安装部署在oracle官方下载8版本以上的JDK版本
这里选择JDK14
官方下载地址:
https://download.oracle.com/otn-pub/java/jdk/14.0.2+12/205943a0976c4ed48cb16f1043c5c647/jdk-14.0.2_linux-x64_bin.tar.gz
tar -zxvf jdk-14.0.2_linux-x64_bin.tar.gz -C /usr/local/
#解压完毕后将JDK路径增加到环境变量中
vim /etc/profile #文件定位到PATH处新增一行进行增加环境变量
export JAVA_HOME=/usr/jdk-14.0.2/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
3、 部署ELK之前需对操作系统调优设置否则会提示报错
#修改 limits.conf文件
vi /etc/security/limits.conf
#增加以下内容
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 8192
#修改系统文件20-nproc.conf
vi /etc/security/limits.d/20-nproc.conf
优化以下参数配置:
* soft nproc 4096
root soft nproc unlimited
#调整内核参数
vi /etc/sysctl.conf
vm.max_map_count=262144 #限制一个进程可以拥有的VMA数量
fs.file-max=655360 #系统中可以同时打开的文件数目
#调整完毕需要重新加载内核参数
sysctl -p
4、配置hosts记录主机名解析工作(三台主机都需要添加)
vi /etc/hosts
10.0.60.191 elk-master
10.0.60.192 Elasticsearch-n1
10.0.60.193 Elasticsearch-n2
5、关闭linux firewall、Selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
6、创建普通用户用于启动elk使用这里我们就以elk为用户名进行创建
useradd elk #默认会创建同步用户组
7、 创建ELK安装目录:
mkdir /usr/local/elk
chown -R elk:elk /usr/local/elk
8、通过elastic官网下载elk所需安装包
下载完毕后解压至/usr/local/elk下
#master
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /usr/local/elk && \
tar -zxvf logstash-7.8.0.tar.gz -C /usr/local/elk && \
tar -zxvf kibana-7.8.0-linux-x86_64.tar.gz -C /usr/local/elk
#将elasticsearch-7.8.0-linux-x86_64.tar.gz利用scp复制到其他两台node上
二、部署Elasticsearch集群
2.1、 切换到刚创建的elk用户环境下配置elasticsearch
su - elk
2.2、创建Elasticsearch数据目录、日志目录
mkdir /usr/local/elk/elasticsearch-7.8.0/data #此操作需在三台服务器操作
mkdir /usr/local/elk/elasticsearch-7.8.0/logs #此操作需在三台服务器操作
2.3、编辑ES-Master节点配置文件:
vi /usr/local/elk/elasticsearch-7.8.0/config/elasticsearch.yml
# ES集群名称
cluster.name: escluster
# ES节点名称
node.name: elk-master
# 存放数据目录
path.data: /usr/local/elk/elasticsearch-7.8.0/data
# 存放日志目录
path.logs: /usr/local/elk/elasticsearch-7.8.0/logs
# 节点IP
network.host: 10.0.60.191
# tcp端口
transport.tcp.port: 9300
# http端口
http.port: 9200
# ES节点列表,Master节点IP须在seed_hosts中
discovery.seed_hosts: ["10.0.60.191:9300","10.0.60.192:9300","10.0.60.193:9300"]
# Master节点列表,若有多个Master节点,则Master节点进行配置
cluster.initial_master_nodes: ["10.0.60.191:9300"]
# 是否允许作为Master节点
node.master: true
# 是否保存数据
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
# 是否开启跨域功能
http.cors.enabled: true
http.cors.allow-origin: "*"
2.4、编辑ES-Node01节点配置文件:
vi /usr/local/elk/elasticsearch-7.8.0/config/elasticsearch.yml
# ES集群名称
cluster.name: escluster
# ES节点名称
node.name: elasticsearch-n1
# 存放数据目录
path.data: /usr/local/elk/elasticsearch-7.8.0/data
# 存放日志目录
path.logs: /usr/local/elk/elasticsearch-7.8.0/logs
# 节点IP
network.host: 10.0.60.192
# tcp端口
transport.tcp.port: 9300
# http端口
http.port: 9200
# ES节点列表,Master节点IP须在seed_hosts中
discovery.seed_hosts: ["10.0.60.191:9300","10.0.60.192:9300","10.0.60.193:9300"]
# Master节点列表,若有多个Master节点,则Master节点进行配置
cluster.initial_master_nodes: ["10.0.60.191:9300"]
# 是否允许作为Master节点
node.master: false
# 是否保存数据
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
# 是否开启跨域功能
http.cors.enabled: true
http.cors.allow-origin: "*"
2.5、编辑ES-Node02节点配置文件:
vi /usr/local/elk/elasticsearch-7.8.0/config/elasticsearch.yml
# ES集群名称
cluster.name: escluster
# ES节点名称
node.name: elasticsearch-n2
# 存放数据目录
path.data: /usr/local/elk/elasticsearch-7.8.0/data
# 存放日志目录
path.logs: /usr/local/elk/elasticsearch-7.8.0/logs
# 节点IP
network.host: 10.0.60.193
# tcp端口
transport.tcp.port: 9300
# http端口
http.port: 9200
# ES节点列表,Master节点IP须在seed_hosts中
discovery.seed_hosts: ["10.0.60.191:9300","10.0.60.192:9300","10.0.60.193:9300"]
# Master节点列表,若有多个Master节点,则Master节点进行配置
cluster.initial_master_nodes: ["10.0.60.191:9300"]
# 是否允许作为Master节点
node.master: false
# 是否保存数据
node.data: true
node.ingest: false
node.ml: false
cluster.remote.connect: false
# 是否开启跨域功能
http.cors.enabled: true
http.cors.allow-origin: "*"
2.6、 配置完之后开始启动ES
/usr/local/elk/elasticsearch-7.8.0/bin/elasticsearch -d
2.7、 启动ES后利用curl检查启动情况也是通常部署时常用的检查方法
[root@elk-master ~]# curl -X GET 'http://10.0.60.191:9200/_cluster/health?pretty'
{
"cluster_name" : "escluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 12,
"active_shards" : 24,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
#状态值:Green代表服务正常
三、安装kibana
3.1 修改Kibana配置文件
cd /usr/local/elk/kibana-7.8.0-linux-x86_64/config
vim kibana.yml
# 指定kibana端口
server.port: 5601
# 监听地址
server.host: "10.0.60.191"
# 指定ES集群的Master服务器ip地址。
elasticsearch.hosts: "http://10.0.60.191:9200/"
# 指定kibana存放日志文件路径
logging.dest:/home/app/elk/kibana-7.8.0-linux-x86_64/logs/kibana.log
3.2、启动kibana
nohup /usr/local/elk/kibana-7.8.0-linux-x86_64/bin/kibana & #启动过程中可通过tail -f nohup.out启动是否存在报错日志
四、 安装filebeat
在10.0.60.195上面已经安装了nginx服务并运行,后面我们利用filebeat采集nginx请求日志
4.1、官网下载filebeat:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.0-linux-x86_64.tar.gz
tar -zxvf filebeat-7.8.0-linux-x86_64.tar.gz -C /usr/local
4.2、配置filebeat.yml
vim /usr/local/filebeat-7.8.0/filebeat.yml
#=========================== Filebeat inputs =============================
filebeat.inputs:
- type: log
paths:
- /usr/local/nginx/logs/access.log
fields:
log_source: nginx-access
- type: log
paths:
- /usr/local/nginx/logs/error.log
fields:
log_source: nginx-error
#============================== Dashboards =====================================
setup.dashboards.enabled: false
#============================== Kibana =====================================
#添加到libana
setup.kibana:
host: "10.0.60.191:5601"
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["10.0.60.191:5044"]
4.3、 启动filebeat
cd /usr/local/filebeat-7.8.0/ && nohup ./filebeat -c filebeat.yml &
五、 安装logstash角色:-------Master
5.1、创建logstash.conf文件
vim /usr/local/elk/logstash-7.8.0/config/logstash.conf
input {
beats {
port => 5044 #指定端口5044,filebeat配置中一致
}
}
filter {
if [fields][log_source]=="nginx-access"{
grok {
match => {
"message" => '%{IP:clientip}\s*%{DATA}\s*%{DATA}\s*\[%{HTTPDATE:requesttime}\]\s*"%{WORD:requesttype}.*?"\s*%{NUMBER:status:int}\s*%{NUMBER:bytes_read:int}\s*"%{DATA:requesturl}"\s*%{QS:ua}'
}
overwrite => ["message"]
}
}
if [fields][log_source]=="nginx-error"{
grok {
match => {
"message" => '(?<time>.*?)\s*\[%{LOGLEVEL:loglevel}\]\s*%{DATA}:\s*%{DATA:errorinfo},\s*%{WORD}:\s*%{IP:clientip},\s*%{WORD}:%{DATA:server},\s*%{WORD}:\s*%{QS:request},\s*%{WORD}:\s*%{QS:upstream},\s*%{WORD}:\s*"%{IP:hostip}",\s*%{WORD}:\s*%{QS:referrer}'
}
overwrite => ["message"]
}
}
}
output {
if [fields][log_source]=="nginx-access"{
elasticsearch {
hosts => ["http://10.0.60.191:9200"]
action => "index"
index => "nginx-access-%{+YYYY.MM.dd}"
}
}
if [fields][log_source]=="nginx-error"{
elasticsearch {
hosts => ["http://10.0.60.191:9200"]
action => "index"
index => "nginx-error-%{+YYYY.MM.dd}"
}
}
stdout { codec => rubydebug }
}
#这里我们自定义Index,elk中logstash-*是为elk自带索引可以试用一下
5.2、 启动logstash
nohup /usr/local/elk/logstash-7.8.0/bin/logstash -f /usr/local/elk/logstash-7.8.0/config/logstash.conf &
到目前为止elk环境已经部署完毕,接下来验证一次