ELK 是什么?
一般来说, 为了提高服务可用性, 服务器需要部署多个实例, 每个实例都是负载均衡转发的后的, 如果还用老办法登录服务器去 tail -f xxx.log, 有很大可能错误日志未出现在当前服务器中, 还需要重复这个过程直到找到日志才能进行问题定位. 两三台还好, 成百上千个实例呢? 人力有时穷. 此时 ELK 闪亮登场了, 那么 ELK 是什么?
ELK 是全文本分布式日志搜索系统, 包含 Elasticsearch(索引库)/Logstash (过滤日志保存到索引库)/ Kibana (查看日志的前端工具)
本文内容说明
本文选用单体架构, 多个组件都是单体形式进行部署, 包含的组件有 ELK(Elasticsearch,Logstash,Kibana),Zookeeper,Kafka 还有一个基于 Kafka Client 的客户端 (logback 接口的实现), 通过这些组件的整合完成单体日志系统的搭建, 这里使用的是下载的 tar.gz, 而不是直接安装的, 配置部分可参考
系统架构图如下
这里用 Kafka 做的缓冲层, 防止日志写入量过大, logstash 和 Elasticsearch 两者写入速率跟不上导致的数据丢失
后续会给大家带来点 docker-compose 版的 demo 级的 elk 集群, 敬请期待!
环境准备
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 问题均已解决
Kafka 外网无法连接的问题请参考
搭建过程
以下的相对位置均为下载文件的目录, 请注意. 另文中使用了 nohup 方式后台, 每次执行命令后使用 ctrl +c 来结束不会影响进程, 使用 tail -f xxx.out 查看日志
配置 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.YAML # 进入配置文件夹, 修改 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 集群之间通信
当日志中提示
- 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 进行限制, 如果仍未能解决问题, 请参考 https://www.cnblogs.com/hellxz/p/11009634.html
浏览器访问 http://192.168.87.133:9200/ (自行替换 ip)
可选用 Elasticsearch-head 查看, GitHub 上最新版只到了 5, 个人维护版有 6 的, 还是没有 7, 给官方提 issue, 官方人员表示暂时没有意愿升级, 因为大体可用, 除了每个 ES 的分片等信息匹配不到了... 看他们兴趣缺缺的样子, 就不使用插件安装到 es 中了, 改用的 google-Chrome 插件, 如图
配置 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.YAML
- #kibana.YAML 以下配置均为解开注释, 修改而成, 使用搜索修改
- # 指定 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.YAML
启动 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