es + logstash + kibana实现分布式集群
最近因为公司技术需要,需要收集日志采集,因此搭建了一套分布式的ELK集群,从零开始搭建一套简单的高可用案例,废话不多说,开始准备
该架构基于springboot 2.x版本,使用的es + logstash + kibana需要三者的版本一致!一致!一致!!下载包的时候一定要注意版本一致,不然会浪费很多时间,本文统一使用7.5.1,需要的可以去百度云去下载
版本链接: https://pan.baidu.com/s/1hY0-_ZkhE733_j4ZM7NSmQ 提取码: aai6 复制这段内容后打开百度网盘手机App,操作更方便哦
1.搭建es集群
为什么一开始就搞集群?因为单节点和集群搭建过程都是一样的,而且在今后开发中集群的占比更大,高可用,何乐而不为呢?
将压缩包解出3份,分为3个节点,可用下面命令进行解压缩和复制。
tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz elasticsearch-7.5.1-node1cp elasticsearch-7.5.1-node1 elasticsearch-7.5.1-node2cp elasticsearch-7.5.1-node1 elasticsearch-7.5.1-node3
为什么是3个节点?因为2个节点可能会出现脑裂。
那又为什么会脑裂?脑裂就是当前master节点假死状态,slave节点晋升为master,此时上任master又活了过来,造成集群中存在两个master节点,但是master节点负责写数据,那两个master谁负责?所以数据就混乱了(大致这个意思,当节点之间网络传输出现问题,相互不能访问,也是脑裂)
首先进入第一个节点的conf文件夹,编辑elasticsearch.yml文件,添加一下配置
# 集群名称cluster.name: shaun-es# 节点名称node.name: node-1# 主节点node.master: true# 数据节点node.data: true# 确保外网和内网均能访问network.host: 0.0.0.0# http协议,用户外部通讯http.port: 9200# Tcp协议,用于节点间的数据传输transport.port: 9300# 最大节点数量node.max_local_storage_nodes: 3#三个节点discovery.seed_hosts: ["172.17.0.8:9300", "172.17.0.8:9301", "172.17.0.8:9302"]# 确保当前节点是主节点cluster.initial_master_nodes: ["node-1"]http.cors.enabled: truehttp.cors.allow-origin: "*"
进入第二个节点的conf文件夹,编辑elasticsearch.yml文件,添加一下配置
cluster.name: shaun-esnode.name: node-2node.master: falsenode.data: truenetwork.host: 0.0.0.0http.port: 9201transport.port: 9301node.max_local_storage_nodes: 3discovery.seed_hosts: ["172.17.0.8:9300", "172.17.0.8:9301","172.17.0.8:9302"]cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]http.cors.enabled: truehttp.cors.allow-origin: "*"
进入第三个节点的conf文件夹,编辑elasticsearch.yml文件,添加一下配置
cluster.name: shaun-esnode.name: node-3node.master: falsenode.data: truenetwork.host: 0.0.0.0http.port: 9202transport.port: 9302discovery.seed_hosts: ["172.17.0.8:9300", "172.17.0.8:9301","172.17.0.8:9302"]cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]http.cors.enabled: truehttp.cors.allow-origin: "*"
然后配置就ok了,然后开放服务器对应的端口
现在创建一个维护ES对应的用户,使用该用户开启动es服务
ES默认禁止使用root用户对es维护,如果非得想root用户的话,启动的时候加上 -allow-root 参数
不过还是建议遵循es的建议,创建一个子用户来启动es
然后依次进入每个节点的bin目录,启动es
./elasticsearch -d
记得加上-d参数,后台运行
现在一个简单的es集群就部署好了,可通过ps命令查看es的进程
ps -ef | grep elasticsearch
启动可能会遇到的坑
1、max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
每个进程最大同时打开文件数太小,可通过下面2个命令查看当前数量
ulimit -Hnulimit -Sn修改/etc/security/limits.conf文件,增加配置,用户退出后重新登录生效* soft nofile 65536* hard nofile 65536
2、max number of threads [3818] for user [es] is too low, increase to at least [4096]
问题同上,最大线程个数太低。修改配置文件/etc/security/limits.conf(和问题1是一个文件),增加配置
* soft nproc 4096* hard nproc 4096ulimit -Huulimit -Su
3、max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
修改/etc/sysctl.conf文件,
vi /etc/sysctl.conf#增加配置vm.max_map_count=262144执行命令sysctl -p生效
4、Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/elasticsearch/elasticsearch-6.2.2-1/config/jvm.options
elasticsearch用户没有该文件夹的权限,执行命令#添加用户useradd -m es#创建授权目录chown -R es:es /usr/local/elasticsearch/
2.项目引入
es部署好,那就服务添加下面pom依赖,咱先使用springboot封装的,简单明了
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
配置文件application.yml,使用集群模式连接es,注意集群名称,需要和每个节点的统一对应
spring:data:elasticsearch:cluster-nodes: ip:9300,ip:9301,ip:9302cluster-name: shaun-es
二、logstash
1.安装
还是一样,下载logstash包,官网有,确定7.5.1版本
然后解压,修改配置
tar -zxvf logstash-7.5.1.tar.gz
编辑logstash.conf,添加以下配置,该配置通过logstash不仅存储了项目运行日志,同时还将mysql和elasticsearch的日志一起插入到es中
编辑conf目录中logstash.conf或者logstash-simple.conf文件
# 输入我这定义来两种方式,一种是tcp,另一种是file文件
# 第一个tcp是将项目日志通过4560端口数据
# 其他的则是指定的日志文件
input {tcp{port=>4560type=>"elk"codec=>json_lines}file{path=>"/home/es/testdemo"type=>"demo"start_position=>"beginning"}file{path=>"/var/log/mysqld.log"type=>"mysql"start_position=>"beginning"}file{path=>"/home/es/elasticsearch-node1/logs/shaun-es.log"type=>"elastic"start_position=>"beginning"}}# 这里通过input中定义的type来匹配,指定索引名称和格式output {if[type] == "elk"{elasticsearch{hosts=>["127.0.0.1:9200"]index=>"elk-%{+yyyy.MM.dd}"}}if[type] =="elastic"{elasticsearch {hosts => ["127.0.0.1:9200"]index => "elastic-%{+YYY.MM.dd}"}}if[type] =="mysql"{elasticsearch{hosts=>["127.0.0.1:9200"]index=>"mysql-%{+yyyy.MM.dd}"}}if[type] =="demo"{elasticsearch{hosts=>["127.0.0.1:9200"]index=>"test-%{+yyyy.MM.dd}"}}}
启动logstash
../bin/logstash -f logstash-sample.conf --config.reload.automatic//指定logstash.conf文件,启动logstash,后面跟自动reload配置,可以不加该参数
2.1项目集成springboot+logstash 配置.
引入pom依赖
<dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>5.1</version></dependency>
添加logback.xml文件,项目使用的是springboot默认的日志系统,logback,在logback.xml中添加配置
<configuration><appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"><!-- 这里指定logstash部署服务器的地址和端口 --><destination>ip:4560</destination><encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" /></appender><include resource="org/springframework/boot/logging/logback/base.xml"/><root level="INFO"><appender-ref ref="LOGSTASH" /><appender-ref ref="CONSOLE" /></root></configuration>
然后就ok了啊,这时候启动项目,输出的日志就会通过logback.xml配置指向的logstash服务存储到es中,日志的存储过程已经实现了,现在把日志内容显示出来就完成了
2.2项目集成springboot+log4j 配置
引入pom
<dependency><groupId>biz.paluch.logging</groupId><artifactId>logstash-gelf</artifactId><version>1.12.0</version></dependency><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.4.2</version></dependency></appenders><Socket name="logstash" host="172.17.125.76" port="4560" protocol="TCP"><PatternLayout pattern="${LOG_PATTERN}" /><!--<JsonLayout properties="true"/>--></Socket></appenders><loggers><AsyncLogger name="com.glodon" level="debug" includeLocation="false" ><!--<appender-ref ref="Console"/>--><appender-ref ref="logstash" /></AsyncLogger></loggers>
三、kibana
解压,修改conf文件中kibana.yml文件
tar -zxvf kibana-7.5.1-linux-x86_64.tar.gz
server.port: 5601 #默认端口 server.host: "0.0.0.0" #可通过外网访问,默认只支持localhost, elasticsearch.hosts: ["http://ip:9200","http://ip:9201","http://ip:9202"] #指定es集群,这里只指向一个节点也ok
最后一步, 使用nohup后台启动
这里同样不建议使用root用户来启动,非要使用root,加上-allow-root参数
nohup ./kibana &
成功后效果
