一、安装前准备
1、组件介绍:
*Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读)*Redis是非关系型数据库,是存储热数据使用的。*Logstash是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端;与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供里很多功能强大的滤网以满足你的各种应用场景*ElasticSearch它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口*Kibana是ElasticSearch的用户界面Elastic的技术架构可以简单,也可以高级,它是很具有扩展性的,最简单的技术架构就是使用Beats进行数据的收集,Beats是一种抽象的称呼,具体的可以是使用FileBeat收集数据源为文件的数据或者使用TopBeat来收集系统中的监控信息,可以说类似Linux系统中的TOP命令,当然还有很多的Beats的具体实现,再使用logstash进行数据的转换和导入到Elasticsearch中,最后使用Kibana进行数据的操作以及数据的可视化等操作。
当然,在生产环境中,我们的数据可能在不同的地方,例如关系型数据库Postgre,或者MQ,再或者Redis中,我们可以统一使用Logstash进行数据的转换,同时,也可以根据数据的热度不同将ES集群架构为一种冷温热架构,利用ES的多节点,将一天以内的数据称谓热数据,读写频繁,就存放在ES的热节点中,七天以内的数据称之为温数据,就是偶尔使用的数据存放在温节点中,将极少数会用到的数据存放在冷节点中。
3、本次架构
4、环境准备的机器
主机角色,配置(内存不要低于8核16G):
5、软件版本下载
注意:这边根据实际情况
jdk 1.8.0_171 #jdk安装这边就不说了 elasticsearch-7.5.1-x86_64.rpm kibana-7.5.1-x86_64.rpm logstash-7.5.1-x86_64.rpm filebeat-7.5.1-x86_64.rpm
安装包下载:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-x86_64.rpm wget https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-x86_64.rpm wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.rpm wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-x86_64.rpm
这边要说明一下,由于elk是国外的网站,所以下载特别的慢,建议使用迅雷下载。
三、安装elasticsearch
1、安装elasticsearch
rpm -ivh elasticsearch-7.5.1-x86_64.rpm
2、配置elasticsearch.yml
#配置JVM参数,最大不要超过32G,并且留一半内存给操作系统,默认是1g [root@es-node1 config]# vim jvm.options -Xms4g -Xmx4g #配置elastic信息,其他节点需要修改node.name和network.host的值 [root@es-node1 config]# cd /etc/elasticsearch [root@es-node1 config]# cp elasticsearch.yml elasticsearch.yml-bak [root@es-node1 config]# vim elasticsearch.yml [root@es-node1 config]# grep "^[a-z]" elasticsearch.yml cluster.name: my-es node.name: node-1 #当前节点名 path.data: /data/es path.logs: /var/log/elasticsearch network.host: 172.168.201.76 #本地ip地址 http.port: 9200 discovery.seed_hosts: ["172.168.201.76","172.168.201.77","172.168.201.78"] #集群使用,如果单台的话,就直接是 ["172.168.201.76"] cluster.initial_master_nodes: ["node-1","node-2","node-3"] # 集群使用,如果是单台的话则是["node-1"]
如果是挂存储的时候(NFS方式),则:(参考:https://www.cnblogs.com/zhangqigao/p/8818783.html)
[192.168.201.76@~ ]mount -t nfs 172.168.201.20:/data/esnode01 /data [192.168.201.77@~ ]mount -t nfs 172.168.201.20:/data/esnode02 /data [192.168.201.78@~ ]mount -t nfs 172.168.201.20:/data/esnode03 /data
在存储的机器上,赋予所有权限
[172.168.201.20@~] chmod 777 /data/*
如果不挂存储,则在本地创建data目录:
[root@es-node1 ~]# mkdir -pv /data/es/ mkdir: 已创建目录 "/data" mkdir: 已创建目录 "/data/es/" [root@es-node1 ~]# chown -R elastic:elastic /data/es/
3、启动服务
~]# systemctl daemon-reload ~]# systemctl start elasticsearch ~]# systemctl status elasticsearch
如需加入开机启动的话:
~]#systemctl enable elasticsearch
检查是否启动:
[elastic@es-node1 elasticsearch]$ netstat -tnlp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 172.168.201.76:9200 0.0.0.0:* LISTEN 2072/java #9200是http协议的RESTful接口 tcp 0 0 172.168.201.76:9300 0.0.0.0:* LISTEN 2072/java #9300是tcp通讯端口,集群间和TCPClient都走的它 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp6 0 0 :::22 :::* LISTEN -
4、配置集群中的另外节点node-2 和 node 3
其他节点配置和node-1是一模一样的,只需要改动配置文件中的节点名和本地IP地址即可:
如:node-2和node-3节点配置修改地方:
#节点node-2的修改: node.name: node-2 #节点名修改为node-2 network.host: 192.168.201.77 #本机ip地址 #节点node-3的修改: node.name: node-3 #节点名修改为node-3 network.host: 192.168.201.78 #本机ip地址
然后启动方式跟node-1是一样的。
在浏览器中访问: http://172.9.201.76:9200
name "node-76" cluster_name "my-es" cluster_uuid "FhxctUHqTz6eJZCkDuXwPQ" version number "7.5.1" build_flavor "default" build_type "rpm" build_hash "65b6179" build_date "2019-05-15T20:06:13.172855Z" build_snapshot false lucene_version "7.7.0" minimum_wire_compatibility_version "5.6.0" minimum_index_compatibility_version "5.0.0" tagline "You Know, for Search"
5、ES的集群的相关查询
查询集群的状态的方法(第1种):
~]# curl -XGET 'http://192.168.201.76:9200/_cat/nodes' //随意一台es中可执行,也可更换其中的 ip(这里可22或23)
这边还需注意的是:如果三个节点中有一个节点挂不上,则清理一下 数据文件夹。即:rm -fr /data/es/data下的数据,然后再重启es
四、搭建Kibana
1、安装kibana
[root@shtw-kibana01 ~]# rpm -ivh kibana-7.5.1-x86_64.rpm
2、配置kibana
说明:虽然我们搭建了三台es的集群,但是我们在kibana.yml的elasticsearch.hosts只能配置一台es的主机,所以我们这边一般配置master这一台。
[root@shtw-kibana01 ~]# cd /etc/kibana [root@shtw-kibana01 ~]# cp kibana.yml kibana.yml-bak [root@shtw-kibana01 ~]# vim kibana.yml server.port: 5601 #监听的端口 server.host: "172.168.201.83" #监听的地址 elasticsearch.hosts: ["http://172.168.201.76:9200"] #elasticsearch访问的URL地址 i18n.locale: "zh-CN" #改成简体中文方式
3、启动kibana
systemctl start kibana systemctl enable kibana #加入开启启动
查看kibana报错:
journalctl -xe
我们可以看到启动后服务监听的地址,访问这个URL:172.9.201.83:5601
kibana主页面,大致意思就是告诉我们kibana可以做哪些事
点击Monitoring标签可以开启监控设置
4、安装head
安装head同elasticsearch6 参考 https://www.cnblogs.com/minseo/p/9117470.html
五、配置SSL并启用X-pack
X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES7.0+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。
自6.8以及7.1+版本之后,基础级安全永久免费。
基础版本安全功能列表如下:
X-Pack安全配置的核心三步骤:
- 第一:设置:xpack.security.enabled: true。
- 第二:生成TLS证书。
- 第三:配置加密通信。
- 第四:设置密码。
5.2、单节点ES X-pack安全如何配置?
5.2.1、安全配置
默认情况下,拥有安全免费许可证时,Elasticsearch安全功能被禁用。 要启用安全功能,需要设置xpack.security.enabled。
在每个节点(包括node-1、node-2、node-3)的elasticsearch.yml配置文件中,新增:
xpack.security.enabled: true
5.2.2、为节点间通信配置传输层安全性(TLS/SSL)
使用范围:配置传输层安全性适用于具有多个节点的集群以及需要外网通信访问的单节点ES。
使用环回地址127.0.0.1的单节点ES可以不用配置。
5.2.2.1、加密通信
Elasticsearch节点可能存储是机密的数据,而无处不在的网络攻击对这些数据垂涎欲滴。
网络攻击包括对数据的嗅探,对数据的操纵,以及试图获得对服务器的访问权限,进而访问存储数据的文件。
保护节点的安全有助于降低来自网络的攻击的风险。
5.2.2.2、生成节点证书
1、证书实现加密通信的原理
TLS需要X.509证书(X.509 证书是一个数字证书,它使用 X.509 公有密钥基础设施标准将公有密钥与证书中包含的身份相关联。X.509 证书由一家名为证书颁发机构 (CA) 的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书,它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书)才能对与之通信的应用程序执行加密和身份验证。 为了使节点之间的通信真正安全,必须对证书进行验证。
在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。这样,只需要使用由同一CA签名的证书,即可自动允许该节点加入集群。
2、借助elasticsearch-certutil命令生成证书
[root@shtw-esnode01 ~]# cd /usr/share/elasticsearch/ [root@shtw-esnode01 ~]# ./elasticsearch-certutil ca -out /etc/elasticsearch/elastic-certificates.p12 -pass "" [root@shtw-esnode01 ~]# chown -R elasticsearch :elasticsearch /etc/elasticsearch/elastic-certificates.p12 [root@shtw-esnode01 ~]# ll /etc/elasticsearch/ -rw------- 1 elasticsearch elasticsearch 2524 Feb 27 14:45 elastic-certificates.p12 -rw-rw---- 1 root elasticsearch 199 Feb 27 13:58 elasticsearch.keystore -rw-rw---- 1 root elasticsearch 3138 Feb 27 15:14 elasticsearch.yml -rw-rw---- 1 root elasticsearch 2276 Feb 27 14:09 jvm.options -rw-rw---- 1 root elasticsearch 17545 Dec 17 07:10 log4j2.properties -rw-rw---- 1 root elasticsearch 473 Dec 17 07:10 role_mapping.yml -rw-rw---- 1 root elasticsearch 197 Dec 17 07:10 roles.yml -rw-rw---- 1 root elasticsearch 0 Dec 17 07:10 users -rw-rw---- 1 root elasticsearch 0 Dec 17 07:10 users_roles
将证书拷贝到其他节点,放入 /etc/elasticsearch 目录下
[elastic@es-node1 config]$ cd /etc/elasticsearch/ [elastic@es-node1 config]$ scp elastic-certificates.p12 172.168.201.77:/etc/elasticsearch/ [elastic@es-node1 config]$ scp elastic-certificates.p12 172.168.201.78:/etc/elasticsearch/
3、配置加密通信
启用安全功能后,必须使用TLS来确保节点之间的通信已加密。
在elasticsearch.yml中心新增配置如下:(其他节点相同配置)
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
重启elasticsearch服务,这个时候发现登录用户还是不行,不要着急,这边还需要配置kibana使用用户名密码登录
5.2.3、设置集群密码
因为你上面已经做了SSL通信,所以只需要在第一台es(master)上设置用户名和密码就可以了,其他的2台es就会是相同的用户名密码
[elastic@es-node1 bin]$ cd /usr/share/elasticsearch/bin [elastic@es-node1 bin]$ ./elasticsearch-setup-passwords -h #查看命令帮助 Sets the passwords for reserved users Commands -------- auto - Uses randomly generated passwords #主要命令选项,表示系统将使用随机字符串设置密码 interactive - Uses passwords entered by a user #主要命令选项,表示使用用户输入的字符串作为密码 Non-option arguments: command Option Description ------ ----------- -h, --help show help -s, --silent show minimal output -v, --verbose show verbose output [elastic@es-node1 bin]$ ./elasticsearch-setup-passwords auto #为了演示效果,这里我们使用系统自动创建 Initiating the setup of passwords for reserved users elastic,kibana,logstash_system,beats_system. The passwords will be randomly generated and printed to the console. Please confirm that you would like to continue [y/N]y #选择y Changed password for user kibana #kibana角色和密码 PASSWORD kibana = 4VXPRYIVibyAbjugK6Ok Changed password for user logstash_system #logstash角色和密码 PASSWORD logstash_system = 2m4uVdSzDzpt9OEmNin5 Changed password for user beats_system #beast角色和密码 PASSWORD beats_system = O8VOzAaD3fO6bstCGDyQ Changed password for user elastic #elasticsearch角色和密码 PASSWORD elastic = 1TWVMeN8tiBy917thUxq
可以先将以上用户和密码保存下来,具体的用户介绍见最后,这边最好保存在有道云笔记中,方便记录。
核心:
auto - 随机生成密码。
interactive - 自定义不同用户的密码。
注意:必须配置好xpack之后,才能设置密码。否则会报错。
配置kibana添加elasticsearch用户认证:
[root@kb-kibana1 ~]# vim /etc/kibana/kibana.yml [root@kb-kibana1 ~]# grep "^elastic" kibana.yml elasticsearch.username: "elastic" elasticsearch.password: "1TWVMeN8tiBy917thUxq" #就是上一步创建的elastic的账号和密码
重启kibana,重启后打开kibana web页面:
可以使用用户名和密码登录了(使用之前创建的用户名和密码登录即可),这里我们选择elastic用户登录
以上认证参考博客:https://blog.csdn.net/laoyang360/article/details/102877770
这边redis的安装我就不说了,参考:https://www.cnblogs.com/zhangqigao/p/12331543.html
定时清理es上的索引日志的脚本:
[root@shtw-esnode01 ~]# mkdir -p /script
[root@shtw-esnode01 ~]# vim delelk.sh
#!/bin/bash
#定时清除elk索引,2天
DATE=$(date -d "2 days ago" +%Y.%m.%d)
echo "curl -XDELETE "http://10.10.201.76:9200/*-${DATE}" -u elastic:43tYibP5ldN88ND2Vxci"
curl -XDELETE "http://192.168.201.76:9200/*-${DATE}" -u elastic:43tYibP5ldN88ND2Vxci
[root@shtw-esnode01 ~]# chmod +x delelk.sh
[root@shtw-esnode01 ~]# crontab -e
0 0 * * * /script/delelk.sh >> /var/log/elk.log 2>&1
五、安装logstash收集日志
1、安装logstash
[root@shtw-logstash01 ~]# rpm -ivh logstash-7.5.1.rpm
2、配置logstash
[root@shtw-logstash01 logstash]# cd /etc/logstash [root@shtw-logstash01 logstash]# vim logstash.yml path.data: /data/logstash #配置数据路径 http.host: "172.9.201.82" #配置主机名 path.logs: /var/log/logstash
新增日志数据文件夹:
mkdir /data/logstash -p chown -R logstash:logstash /data/logstash
3、配置conf文件
[~#]cd /etc/logstash/ [~#]cp logstash-sample.conf logstash.conf [~#]vim logstash.conf
配置如下:
# Sample Logstash configuration for creating a simple # Beats -> Logstash -> Elasticsearch pipeline. input { redis { host => "172.168.202.236" port => "6379" data_type => "list" key => "elk" type => "redis-input" batch_count => 1 } redis { host => "172.168.202.236" port => "6379" data_type => "list" key => "propertyCustomer" #这个key的值是在filebeat的那边设置的 type => "redis-input" tags => ["propertyCustomer"] #设置tags threads => 16 } } filter { if [fields][level] == "error" and "[ip]" not in [message] { throttle { period => 600 #统计周期600秒 max_age => 1200 #最大有效周期1200秒 before_count => -1 #最小值 after_count => 5 #最大值 key => "%{[fields][host]}" #要统计的字段 add_tag => "throttled" #打tag } } if "propertyCustomer" in [tags] { grok { match => { "message" => "\[ip\]|登陆过期|节点的权限|该流程已结束" } add_tag => "dingding" } grok{ match => { #截取log4j2的时间戳 "message" => "(?<itime_str>\[[0-9]{4}[-][0-9]{1,2}[-][0-9]{1,2}[ ][0-9]{1,2}[:][0-9]{1,2}[:][0-9]{1,2}[.][0-9]{1,3}\])" } } grok{ match => { #截取时间 "itime_str" => "(?<itime>[0-9]{4}[-][0-9]{1,2}[-][0-9]{1,2}[ ][0-9]{1,2}[:][0-9]{1,2}[:][0-9]{1,2}[.][0-9]{1,3})" } } date{ match=>["itime","yyyy-MM-dd HH:mm:ss.SSS"] target=>"timestamp" } ruby { code => "event.set('@timestamp',event.get('timestamp'))" } mutate { remove_field => ['itime_str','itime','timestamp'] } } } output { if "throttled" not in [tags] and "dingding" not in [tags] and [fields][level] == "error" and "propertyCustomer" in [tags] { if [fields][app] == "rsp-ce" { exec { command => "/usr/local/elk/propertyCustomer/bin/alarm-ce.sh %{[fields][app]} %{[fields][env]} %{[fields][host]}" } } else if [fields][app] == "customer" or [fields][app] == "property" or [fields][app] == "estate" { exec { command => "/usr/local/elk/propertyCustomer/bin/alarm-estate.sh %{[fields][app]} %{[fields][env]} %{[fields][host]}" } } else if "案源状态" not in [message] { exec { command => "/usr/local/elk/propertyCustomer/bin/alarm.sh %{[fields][app]} %{[fields][env]} %{[fields][host]}" } } } if "propertyCustomer" in [tags] { elasticsearch { hosts => ["10.10.202.247:9200"] index => "%{[fields][app]}-%{[fields][env]}-%{+yyyy.MM.dd}" user => "elastic" password => "tw.1234" } } elasticsearch { hosts => ["10.10.201.76:9200","10.10.201.77:9200","10.10.201.78:9200"] index => "%{[fields][app]}-%{[fields][env]}-%{+yyyy.MM.dd}" user => "elastic" password => "43tYibP5ldN88ND2Vxci" } }