ELK是什么?
通常来讲,为了提升服务可用性,服务器须要部署多个实例,每一个实例都是负载均衡转发的后的,若是还用老办法登陆服务器去tail -f xxx.log,有很大可能错误日志未出如今当前服务器中,还须要重复这个过程直到找到日志才能进行问题定位。两三台还好,成百上千个实例呢?人力有时穷。此时ELK闪亮登场了,那么ELK是什么?html
ELK是全文本分布式日志搜索系统,包含Elasticsearch(索引库)/Logstash (过滤日志保存到索引库)/ Kibana (查看日志的前端工具)前端
本文内容说明
本文选用单体架构,多个组件都是单体形式进行部署,包含的组件有ELK(Elasticsearch
、Logstash
、Kibana
)、Zookeeper
、Kafka
还有一个基于Kafka Client的客户端(logback接口的实现),经过这些组件的整合完成单体日志系统的搭建,这里使用的是下载的tar.gz
,而不是直接安装的,配置部分可参考node
系统架构图以下linux
这里用Kafka作的缓冲层,防止日志写入量过大,logstash和elasticsearch二者写入速率跟不上致使的数据丢失git
后续会给你们带来点docker-compose版的demo级的elk集群,敬请期待!github
环境准备
- Ubuntu Server 18.04.2 (可替换为Centos 7, 由于都是Systemd的),请确保有足够的内存与硬盘空间
- ELK 7.1.1
- Kafka_2.12-2.2.0
- Zookeeper使用Kafka自带的
- 生成日志的demo,代码见https://github.com/HellxZ/LogDemo
出现的问题汇总
问题汇总请参考ELK搭建过程当中出现的问题与解决方法汇总,基本上我测试过程当中的ELK问题均已解决spring
Kafka外网没法链接的问题请参考chrome
搭建过程
如下的相对位置均为下载文件的目录,请注意。另文中使用了nohup方式后台,每次执行命令后使用ctrl +c 来结束不会影响进程,使用tail -f xxx.out查看日志docker
配置Elasticsearch
tar zxvf elasticsearch-7.1.1-linux-x86_64.tar.gz # 解压 mkdir single-elk # 建立目录更名移动 mv elasticsearch-7.1.1 single-elk/elasticsearch cd single-elk/elasticsearch && vim config/elasticsearch.yml # 进入配置文件夹,修改es配置文件 # 要修改的内容有 # 1.放开node.name注释,节点名可DIY node.name: node-1 # 2.放开network.host,修改ip为当前服务器ip或0.0.0.0,供外部访问 network.host: 0.0.0.0 # 3.放开cluster.initial_master_nodes,指定当前node.name名称便可 cluster.initial_master_nodes: ["node-1"] #与node.name保持一致 bootstrap.memory_lock: true #锁内存,防止内存占用过大,官方推荐使用系统内存的一半,但不要达到32GB # 保存退出 ES_JAVA_OPTS="-Xms512m -Xmx512m" bin/elasticsearch -d # 后台启动es,默认绑定端口号9200和9300,接口访问9200测试,9300为es集群之间通讯
当日志中提示npm
ERROR: [1] bootstrap checks failed [1]: memory locking requested for elasticsearch process but memory is not locked若是当前主机能够分配给Es的超过1G,能够不设置
bootstrap.memory_lock: true
,这里天然说的是测试环境;正式环境仍是须要限制内存,如上方的-Xmx -Xms等,官方推荐是占用系统内存的50%,但不要超过32G。能够经过ES_JAVA_OPTS进行限制,若是仍未能解决问题,请参考http://www.javashuo.com/article/p-rahqeszd-bz.html
浏览器访问http://192.168.87.133:9200/ (自行替换ip)
可选用elasticsearch-head查看,github上最新版只到了5,我的维护版有6的,仍是没有7,给官方提issue,官方人员表示暂时没有意愿升级,由于大致可用,除了每一个ES的分片等信息匹配不到了。。。看他们兴趣缺缺的样子,就不使用插件安装到es中了,改用的google-chrome插件,如图
已经给官方提issue了,官方回应如今在github上最新代码已经改了,若有须要,可使用npm启动,支持es7.x
配置Zookeeper与Kafka
tar -zxvf kafka_2.12-2.2.0.tgz mv kafka_2.12-2.2.0 single-elk/kafka cd single-elk/kafka; vim config/zookeeper.properties #修改下data-dir就能够了,保存退出 vim config/server.properties #修改kafka配置 #须要修改内容以下 listeners=PLAINTEXT://kafka:9092 advertised.listeners=PLAINTEXT://kafka:9092 #保存退出 #编辑/etc/hosts,在hosts文件中追加kafka映射,注意是内网ip须要替换 192.168.87.133 kafka #其实写127.0.0.1也行 == nohup bin/zookeeper-server-start.sh config/zookeeper.properties > zookeeper.out & #启动zookeeper,出现绑定端口号即成功 nohup bin/kafka-server-start.sh config/server.properties > kafka.out & #启动kafka #日志中出现started即成功
这里写kafka是由于外网访问的时候须要去用域名换ip,注册到zookeeper中的key包含了域名,因此本文中使用的是修改/etc/hosts的方式,我不知道其余人是怎么解决这个问题的,若是您有更好的方式,欢迎下方评论!
配置Logstash
tar zxvf logstash-7.1.1.tar.gz # 解压 mv logstash-7.1.1 single-elk/logstash cd single-elk/logstash vim config/logstash.conf # 建立配置文件,设置参数可参考logstash.sample.conf,详情见官网
使用自定义的配置文件须要在启动时指定。
# logstash.conf # 本人配置的是使用kafka作了一层缓冲层,这个不用我多说了,请按需配置 input { kafka { bootstrap_servers => "192.168.87.133:9092" topics => ["all_logs"] group_id => "logstash" codec => json } } # 过滤器我没有配置,目前只是先看看效果 filter { } output { elasticsearch { hosts => ["192.168.87.133:9200"] index => "all-logs-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" } stdout { codec => rubydebug } }
保存退出
nohup bin/logstash -f config/logstash.conf > logstash.out & #后台启动Logstash
看到日志中出现Successfully started Logstash API endpoint {:port=>9600}
,即启动成功
配置Kibana
# Kibana是基于node.js的前端项目,不过我测试服务器没装node.js也正常启动,看来ELK这些都自带了依赖环境 tar zxvf kibana-7.1.1-linux-x86_64.tar.gz mv kibana-7.1.1-linux-x86_64 single-elk/kibana cd single-elk/kibana && vim config/kibana.yml
#kibana.yml 如下配置均为解开注释,修改而成,使用搜索修改 # 指定kibana占用端口号,如无其它端口须要,能够不开启,默认5601 server.port: 5601 # 指定kibana绑定的ip地址,这里写kibana所在的ip便可 server.host: "192.168.87.133" # es节点的ip地址 elasticsearch.hosts: ["http://192.168.87.133:9200"] # kibana.index是kibana在es中建立的索引,会保存搜索记录,无需改变 kibana.index: ".kibana" # 设置查询es超时时间,单位为milliseconds必须为整数 elasticsearch.requestTimeout: 30000 # 其他按需配置 # 中文化 i18n.locale: "zh-CN" #保存退出
nohup bin/kibana > kibana.out & # 后台启动kibana
出现Server running at http://192.168.87.133:5601"
相似字样,启动完成,访问看看
配置测试代码
使用代码的环境须要设置hosts文件,映射到kafka为刚才的ip,个人是192.168.87.133 kafka
项目是springboot的直接启动DemoApplication就好,还能够经过访问TestController中的方法来生产日志。
Connection to node -1 could not be established. Broker may not be available.
出现这个问题请参考【Kafka问题解决】Connection to xxx could not be established. Broker may not be available.检查配置文件。
如需修改kafka的映射名称,记得修改logback-spring.xml中的<producerConfig>bootstrap.servers=your-kafka-domain:kafka-port</producerConfig>
查看效果
使用Elasticsearch-head
进入google-chrome的Elasticsearch-head插件,链接项目咱们能够简单看到多出了几个绿色的0
固然了,因为这个插件官方没有对Elasticsearch 7.X进行优化支持,显示的图并不许确,好在咱们能够看到索引和数据浏览
个人虚拟机没内存了。。因此集群状态变成yellow了,仅为只读状态,你们能够经过在配置文件中限制es的内存,默认是1G的。官方建议设置内存为系统内存的一半,但不要超过32GB,且最大内存与最小内存最好相等防止常常GC,参考自config/elasticsearch.yml
启动es的时候就须要指定内存参数, 如
ES_JAVA_OPTS="-Xms512m -Xmx512m" bin/elasticsearch -d
使用kibana
此时我已经修复了内存不够的问题,配置文件也在上边更新了,你们能够放心测试
访问<你的kibana-ip:5601> 个人是<192.168.87.133:5061>
Kibana默认是不会给咱们添加展现的索引的,须要咱们去匹配,这里咱们去添加
下一步,选择@timestamp或者其它,我这里选择@timestamp,而后建立索引模式便可
索引建立完成,咱们去仪表盘查看下,点这个Discover
结束
最近在作ELK日志系统这块,还作了个demo级的docker-compose的ELK集群,由于生产环境咱们是不会将多个es和多个kafka放在同一台机器上的。稍后我会整理下发上来,供你们借鉴。
原文出处:https://www.cnblogs.com/hellxz/p/11059360.html