ELK日志管理系统搭建文档
ELK 是Elasticsearch Logstash kibana 三个开源软件的组合来进行搭建.
jianyi1jianyijianyi1
建议架构:
节点 |
服务器 |
部署程序 |
备注 |
节点1 node-1 |
10.10.183.211 |
Elasticsearch、kibana、head |
主节点 |
节点2 node-2 |
10.10.183.188 |
Elasticsearch、logstash+kafka |
|
节点3 node-3 |
10.10.183.187 |
Elasticsearc、logstash+kafka |
生产架构
节点 |
服务器 |
部署程序 |
备注 |
elk-es1 |
10.110.61.10 |
Elasticsearch、Kibina |
双ES备份集群 |
elk-es2 |
10.110.61.11 |
Elasticsearch |
双ES备份集群 |
elk-lkz1 |
10.110.61.12 |
logstash、kafka+zookeeper |
Kafka+LogStash集群 |
elk-lkz2 |
10.110.61.13 |
logstash、kafka+zookeeper |
Kafka+LogStash集群 |
elk-lkz3 |
10.110.61.14 |
logstash、kafka+zookeeper |
Kafka+LogStash集群 |
安装Elasticsearch程序
Elasticsearch7.4 安装部署,三台均部署,服务器均需添加所有服务器的host。
初始化操作
操作系统使用centos7版本 Java版本是1.8.0_111
下载elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-linux-x86_64.tar.gz
selinux和firewalld防火墙都要关闭掉
systemctl status/stop/disabled firewalld
2、安装命令
cd /opt/app
tar zvxf elasticsearch-linux-x86_64.tar.gz -C /opt/app
mv elasticsearch elasticsearch
3、创建elk用户
useradd elk
groupadd elk
useradd elk -g elk
passwd elk
elk
4、设置环境变量
创建java环境的目录
解压tar -zxvf jdk-8u131-linux-x64.tar.gz -C /opt/app/jdk/
su - elk
vim .bash_profile
export JAVA_HOME=/opt/app/jdk/jdk1.8.0_111
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
source .bash_profile
查看java版本: java –version
which java 看到的路径信息是 /opt/app/jdk/jdk1.8.0_111/bin/java
6、修改系统参数
vim /etc/sysctl.conf
#添加参数
vm.max_map_count=655360
vm.swappiness=0
重新载入配置:
sysctl -p
7、修改资源参数
vim /etc/security/limits.conf
#修改
* soft nofile 65536
* hard nofile 131072
设置用户资源参数
vim /etc/security/limits.d/20-nproc.conf
#添加
elk soft nproc 65536
8、修改相关的配置文件信息
切换至root
cd /opt/app/elasticsearch
rm config/elasticsearch.yml
修改配置 vim config/elasticsearch.yml的配置
#集群的名称,集群中所有节点的 cluster.name 的值必须要相同。
cluster.name: my-application
#集群中每个Elasticsearch的节点名称,不可以重复。
node.name: node-1
node.master: true #允许成为主节点
node.data: true #数据节点
#存放Elasticsearch索引文件数据和日志目录需要手动创建
path.data: /opt/app/elasticsearch/custom/data
path.logs: /opt/app/elasticsearch/custom/logs
#ES监听地址任意IP都可访问
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300 #集群服务的端口
#配置所有Elasticsearch节点绑定的IP地址
discovery.seed_hosts: ["10.10.183.211", "10.10.183.228", "10.10.183.218"]
#配置那些节点可以有资格被选为主节点
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
path.repo: ["/opt/app/elasticsearch/es_backup"] #备份目录
http.cors.enabled: true #允许head插件访问es
http.cors.allow-origin: "*"
#centos7以下系统配置
xpack.ml.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
将配置复制到每个节点并修改node.name,
修改配置 vim config/jvm.options 修改内存的大小(内存的一半)
-Xms8g
-Xmx8g
scp -r opt/app/elasticsearch/ 10.10.183.228:/opt/app/elasticsearch/
scp -r opt/app/elasticsearch/ 10.10.183.218:/opt/app/elasticsearch/
创建数据和日志目录并修改目录权限
三台同时执行
mkdir -pv /opt/app/elasticsearch/custom/{data,logs}
mkdir -p /opt/app/elasticsearch/es_backup
chown -R elk:elk /opt/app/elasticsearch
9、启动
切换用户并后台启动ES:(elk用户修改了资源参数,如不切位elk用户启动会暴毙)
su - elk
启动: cd /opt/app/elasticsearch/
./bin/elasticsearch -d
访问:
10、查看ES状况
方法一、
curl 'http://[ES IP]:9200/_search?pretty'
方法二、
#网页访问:
http://[ES IP]:9200/_search?pretty
安装head程序(node-1)
- 安装head程序
介绍:head插件是ES的一个可视化插件,类似于navicat和mysql的关系。head插件是一个用来浏览、与ES数据进行交互的web前端展示插件,是一个用来监视ES状态的客户端插件。
由于head插件本质上还是一个nodejs的工程,因此需要安装node,使用npm来安装依赖的包。(npm其实是Node.js的包管理工具,可以理解为maven)
#下载 wget https://github.com/mobz/elasticsearch-head/archive/master.zip #解压 unzip master.zip
mv elasticsearch-head-master/ /opt/app
- 下载安装NodeJS
#下载解压
wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz
yum -y install xz
xz -d node-v8.11.4-linux-x64.tar.xz
tar xvf node-v8.11.4-linux-x64.tar -C /data/
#配置环境变量
vim /etc/profile
export NODE_HOME=/data/node-v8.11.4-linux-x64
export PATH=$NODE_HOME/bin:$PATH
#刷新配置
source /etc/profile
- 使用npm安装grunt
设置npm的代理镜像,由于国外的下载较慢,所以设置为国内的,进入到elasticsearch-head-master内执行以下命令
cd /data/elasticsearch-head-master
npm config set registry https://registry.npm.taobao.org
执行npm install,grunt是基于Node.js的项目构建工具,可以进行打包压缩,测试,执行等等的工作,head插件就是通过grunt启动
#安装
npm install -g grunt
npm install [email protected] --ignore-scripts
npm install #
版本确认: node -v
npm -v
grunt -version
由于head的代码直接执行有很多限制,比如无法跨机器访问。因此需要用户修改两个地方:
(4)修改Head源码
a、修改 elasticsearch-head-master/Gruntfile.js 文件,红色部分为添加的,原来没有,设置hostname属性,设置为0.0.0.0
connect: {
server: {
options: {
hostname: '0.0.0.0',
port: 9100,
base: '.',
keepalive: true
}
}
}
b、修改跨域请求配置
修改连接的状态如下,修改之后才能连上,这样head插件才可以访问elasticsearch。
修改文件为elasticsearch/config/elasticsearch.yml,添加如下两行
http.cors.enabled: true
http.cors.allow-origin: "*"
普通用户重启elasticsearch
(5)启动head
cd /opt/app/elasticsearch-head-master
nohup grunt server &
页面访问,默认端口9100,绿色为健康,黄色为警告,输入http://10.10.183.211:9200/连接查看集群
如果设置了密码访问方式为
http://10.10.183.211:9100/?auth_user=elastic&auth_password=123456
kibana安装
1、简介
Kibana是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作。Kibana 提供搜索、查看和与存储在
Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据
2、下载解压
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.4.0-linux-x86_64.tar.gz
tar zxvf kibana-7.4.0-linux-x86_64.tar.gz -C /opt/app
mv /opt/app/ kibana-7.4.0-linux-x86_64 /opt/app/kibana
3、 修改配置文件
cd /opt/app/kibana/config
rm kibana.yml
vim kibana.yml
server.port: 5601 #监听端口
server.host: "0.0.0.0" #监听IP
elasticsearch.hosts: ["http://10.10.183.211:9200","http://10.10.183.188:9200","http://10.10.183.187:9200"] #集群es地址
logging.dest: /opt/app/kibana/logs/kibana.log #日志路径
kibana.index: ".kibana" #默认索引
i18n.locale: "zh-CN"
mkdir /opt/app/kibana/logs/
touch /opt/app/kibana/logs/kibana.log
chown elk:elk -R /opt/app/kibana/
4、 启动Kibana
cd /opt/app/kibana/bin
nohup ./kibana &
访问:http://10.10.183.211:5601/app/kibana
配置SLL并启用X-pack
4.1、X-pack是什么?
X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES7.0+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。
自6.8以及7.1+版本之后,基础级安全永久免费。
基础版本安全功能列表如下:
X-Pack安全配置的核心三步骤:
- 第一:设置:xpack.security.enabled: true。
- 第二:生成TLS证书。
- 第三:配置加密通信。
- 第四:设置密码。
4.2、单节点ES X-pack安全如何配置?
4.2.1、安全配置
默认情况下,拥有安全免费许可证时,Elasticsearch安全功能被禁用。 要启用安全功能,需要设置xpack.security.enabled。启用安全功能后,必须使用TLS来确保节点之间的通信已加密。
在elasticsearch.yml中心新增配置如下:(其他节点相同配置)
在每个节点(包括node-1、node-2、node-3)的elasticsearch.yml配置文件中,新增:
1 |
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 #不添加无法使用head连接es,连接时在http:ip:port/?auth_user=elastic&auth_password=密码 http.cors.allow-headers: Content-Type,Accept,Authorization, x-requested-with |
4.2.2、为节点间通信配置传输层安全性(TLS/SSL)
使用范围:配置传输层安全性适用于具有多个节点的集群以及需要外网通信访问的单节点ES。
使用环回地址127.0.0.1的单节点ES可以不用配置。
4.2.2.1、加密通信
Elasticsearch节点可能存储是机密的数据,而无处不在的网络攻击对这些数据垂涎欲滴。
网络攻击包括对数据的嗅探,对数据的操纵,以及试图获得对服务器的访问权限,进而访问存储数据的文件。
保护节点的安全有助于降低来自网络的攻击的风险。
4.2.2.2、生成节点证书
1、证书实现加密通信的原理
TLS需要X.509证书(X.509 证书是一个数字证书,它使用 X.509 公有密钥基础设施标准将公有密钥与证书中包含的身份相关联。X.509 证书由一家名为证书颁发机构 (CA) 的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书,它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书)才能对与之通信的应用程序执行加密和身份验证。 为了使节点之间的通信真正安全,必须对证书进行验证。
在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。这样,只需要使用由同一CA签名的证书,即可自动允许该节点加入集群。
- 借助elasticsearch-certutil命令生成证书
cd /opt/app/elasticsearch/bin
./elasticsearch-certutil ca -out /opt/app/elasticsearch/config/elastic-certificates.p12 -pass "" (密码可以为空)
chown -R elk:elk /opt/app/elasticsearch/config/elastic-certificates.p12
ll /opt/app/elasticsearch/config/
- 将证书拷贝到其他节点,放入 /etc/elasticsearch/config目录下
scp /opt/app/elasticsearch/config/elastic-certificates.p12 [email protected]:/opt/app/elasticsearch/config
scp /opt/app/elasticsearch/config/elastic-certificates.p12 [email protected]:/opt/app/elasticsearch/config
- 重启elasticsearch服务,这个时候发现登录用户还是不行,不要着急,这边还需要配置kibana使用用户名密码登录
4.2.3设置集群密码
因为你上面已经做了SSL通信,所以只需要在第一台es(master)上设置用户名和密码就可以了,其他的2台es就会是相同的用户名密码。注意:必须配置好xpack之后,才能设置密码。否则会报错。
cd /opt/app/elasticsearch/bin
./elasticsearch-setup-passwords interactive
#核心:
auto - 随机生成密码。
interactive - 自定义不同用户的密码。
修改密码:
curl -H "Content-Type:application/json" -XPOST -u elastic 'http://127.0.0.1:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'
配置kibana添加elasticsearch用户认证:
vim /opt/app/kibana/config/kibana.yml
添加:
elasticsearch.username: "elastic"
elasticsearch.password: "rGmWTpJM50z1ydbpFoqa"
随机生成记录的密码如下:
Changed password for user apm_system
PASSWORD apm_system = 5qA8azfdx99Clc2Gm9Sq
Changed password for user kibana
PASSWORD kibana = aIM2tSC1kqpdvmt9kYKO
Changed password for user logstash_system
PASSWORD logstash_system = ZGySXZE3WLMfdA1ZsI5z
Changed password for user beats_system
PASSWORD beats_system = DrdkY3f4Hteivpa9WxAp
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = PLc4vPz7VgniAYYqmMCN
Changed password for user elastic
PASSWORD elastic = rGmWTpJM50z1ydbpFoqa
安装kafka集群
下载解压
1)从官网获取装包,下载地址:https://kafka.apache.org/downloads
2)解压
tar -zxvf kafka_2.12-3.2.0.tgz -C /opt/app
mv /opt/app/kafka_2.12-3.2.0 /opt/app/kafka
配置Zookeeper
1)配置Zookeeper集群,修改配置文件
cd /opt/app/kafka/config
vim zookeeper.properties
配置如下:
dataDir=/opt/app/kafka/zookeeperDir
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=1024
tickTime=2000
initLimit=20
syncLimit=10
server.2=10.10.183.211:2888:3888
server.3=10.10.183.187:2888:3888
server.4=10.10.183.188:2888:3888
# 说明:
tickTime : 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
2888 端口:表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
3888 端口:表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader ,而这个端口就是用来执行选举时服务器相互通信的端口。
2)创建目录
创建目录zookeeperDir
mkdir /opt/app/kafka/zookeeperDir
在zookeeperDir目录下创建myid文件,里面的内容为数字,用于标识主机,如果这个文件没有的话,zookeeper是没法启动的
echo 2 > /opt/app/kafka/zookeeperDir/myid
配置kafka
- 配置kafka集群,修改配置文件
cd /opt/app/kafka/config
vim server.properties
修改内容如下:
broker.id=2 # 唯一,填数字,本文中分别为 2 / 3 / 4
prot=9092 # 这个 broker 监听的端口
host.nome=10.10.183.187 # 唯一,填服务器 IP
zookeeper.connect=10.10.183.211:2181,10.10.183.188:2181,10.10.183.187:2181 # 这个就是 zookeeper 的 ip 及端口
num.partitions=16 # 需要配置较大 分片影响读写速度
log.dirs=/opt/app/kafka/kafka-logs # 数据目录也要单独配置磁盘较大的地方
log.retention.hours=168 # 时间按需求保留过期时间 避免磁盘满
拷贝至其它节点
将kafka整个目录拷贝至其它两个节点
chown umpay:umpay -R /opt/app/kafka/
scp -r /opt/app/kafka/ 10.10.183.187:/opt/app/
scp -r /opt/app/kafka/ 10.10.183.188:/opt/app/
修改其它节点(umpay用户)
注意这里除了以下两点不同外,都是相同的配置
- zookeeper配置
echo "x" >/opt/app/kafka/zookeeperDir/myid # “x”这里是3或者4,前面已经使用过2了
- kafka 的配置
- broker.id = x # “x”这里是3或者4,前面已经使用过2了(和myid一致)
- host.name = 10.10.183.187 # ip改为183.187或者183.188
启动zookeeper
1)启动
按照顺序来,kafka1 –> kafka2 –>kafka3
#zookeeper启动命令
cd /opt/app/kafka
./bin/zookeeper-server-start.sh ./config/zookeeper.properties &
./bin/zookeeper-server-stop.sh #zookeeper停止的命令
#无日志启动
nohup ./bin/zookeeper-server-start.sh ./config/zookeeper.properties >/dev/null 2>&1 &
后面两台执行相同操作,在启动过程当中会出现以下报错信息
WARN Cannot open channel to 4 at election address /10.10.183.187:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)
由于zookeeper集群在启动的时候,每个结点都试图去连接集群中的其它结点,先启动的肯定连不上后面还没启动的,所以上面日志前面部分的异常是可以忽略的。通过后面部分可以看到,集群在选出一个Leader后,最后稳定了。
其他节点也可能会出现类似的情况,属于正常。
- zookeeper服务检查
netstat -nlpt | grep -E "2181|2888|3888"
显示如下端口和信息,说明Zookeeper运行正常
如果哪台是Leader,那么它就拥有2888这个端口
启动kafka
依次按照顺序启动,kafka1 –> kafka2 –>kafka3
cd /opt/app/kafka
./bin/kafka-server-start.sh ./config/server.properties & #启动Kafka服务
./bin/kafka-server-stop.sh # 停止Kafka服务
#无日志启动
nohup ./bin/kafka-server-start.sh ./config/server.properties >/dev/null 2>&1 &
测试kafka集群
建立一个topic(在2888端口服务器)
./bin/kafka-topics.sh --create --bootstrap-server 10.10.183.187:9092 --replication-factor 3 --partitions 1 --topic test1test2test
# 注意:factor大小不能超过broker的个数
查看创建的topic
./bin/kafka-topics.sh --list --bootstrap-server 10.10.183.187:9092
ps -ef |grep /opt/app/kafka/bin/ |grep /logs/zookeeper-gc.log|wc -l
ps -ef |grep /opt/app/kafka/bin/ |grep kafkaServer-gc.log |wc -l
删除topic
bin/kafka-topics.sh --delete --bootstrap-server 10.110.61.12:9092 --topic lxt-ICE-ZH95566-133
(六)安装logstash
1、 下载解压
wget https://artifacts.elastic.co/downloads/logstash/logstash-7.4.0.tar.gz
tar zxf logstash-7.4.0.tar.gz -C /opt/app
mv /opt/app/logstash-7.4.0 /opt/app/logstash
2 、创建配置文件
cd /opt/app/logstash
mv config/logstash.yml config/logstash.yml.bak
vim config/logstash.yml
http.host: "10.10.183.188"
http.port: 9600
3、安装beat input插件
#进入bin目录
cd /opt/app/logstash/bin
#构建离线插件包:
./logstash-plugin prepare-offline-pack logstash-input-beats
#安装离线插件包:
../bin/logstash-plugin install file:///opt/app/logstash/logstash-offline-plugins-7.4.0.zip
#配置 5044 端口作为 Filebeat 的连接和创建 ES 索引。新建 logstash.conf 配置文件
cd /opt/app/logstash/
vim config/logstash.conf
kafka配置:
input{
kafka {
bootstrap_servers => "10.10.183.211:9092,10.10.183.187:9092,10.10.183.188:9092"
topics_pattern => "lxt-.*"
consumer_threads => 10 #设置消费kafka数据时开启的线程数,一个partition对应一个消费者消费,设置多了不影响,在kafka中一个进程对应一个线程
decorate_events => true #此属性会将当前topic,offset,group,partition等信息>也带到message中
codec => "json"
auto_offset_reset => "latest" #从最新的偏移量开始消费
}
}
filter {
ruby {
code => "event.timestamp.time.localtime"
}
mutate {
remove_field => ["beat"]
}
grok {
match => {"message" => "\[(?<time>\d+-\d+-\d+\s\d+:\d+:\d+)\] \[(?<level>\w+)\] (?<thread>[\w|-]+) (?<class>[\w|\.]+) (?<lineNum>\d+):(?<msg>.+)"
}
}
}
output {
elasticsearch {
hosts => [ "10.10.183.211:9200","10.10.183.188:9200","10.10.183.187:9200" ]
index => "%{[@metadata][topic]}-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
stdout {
codec => "rubydebug"
}
}
#Logstash 使用该配置使用 ES 的索引,和 Filebeat 做的事情是一样的,不过拥有了额外的缓存以及强大丰富的插件库。
#启动 logstash
nohup ./bin/logstash -f config/logstash.conf >/dev/null 2>&1 &
(七)filebeat安装
1、配置host
需要配置kafka集群的host
vim /et c/hosts
10.110.61.12 elk-lkz1
10.110.61.13 elk-lkz2
10.110.61.14 elk-lkz3
2、下载安装(客户端应用服务器)
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.0-linux-x86_64.tar.gz
tar zxf filebeat-7.4.0-linux-x86_64.tar.gz -C /opt/app/
mv /opt/app/filebeat-7.4.0-linux-x86_64 /opt/app/filebeat
3、 编辑filebeat.yml
cd /opt/app/filebeat
vim filebeat.yml
filebeat.inputs:
- input: log
enabled: true
paths:
- /DataBase/para/log/dat
- /DataBase/para/log/log
- /DataBase/para/log/rocketmqdata
- /DataBase/para/log/error
- /DataBase/para/log/mon
exclude_files: ['.gz$']
fields_under_root: true
fields:
serverip: ${SERVER_IP}
app_id: para
logtopic: paralog
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}\s(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d\.'
multiline.negate: true
multiline.match: after
- input: log
enabled: true
paths:
- /DataBase/adapter/log/dat
- /DataBase/adapter/log/log
- /DataBase/adapter/log/rocketmqdata
- /DataBase/adapter/log/error
- /DataBase/adapter/log/mon
exclude_files: ['.gz$']
fields_under_root: true
fields:
serverip: ${SERVER_IP}
app_id: adapter
logtopic: adapterlog
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}\s(20|21|22|23|[0-1]\d):[0-5]\d:[0-5]\d\.'
multiline.negate: true
multiline.match: after
output.kafka:
enabled: true
hosts: ["10.10.183.211:9092","10.10.183.187:9092","10.10.183.188:9092"]
topic: 'lxt-%{[logtopic]}'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
3、 启动filebeat
#启动 nohup ./filebeat -c filebeat.yml >/dev/null 2>&1 &
- 访问kibana
创建索引
标签:opt,ELK,app,kibana,kafka,elasticsearch,10.10,文档,日志 From: https://www.cnblogs.com/xiaobaijin/p/18503671