版本说明

当前版本的elk使用相关的中间件对应的版本如下:

中间件名称 版本号
zookeeper 3.7.0
kafka 2.7.1
kafka-manager/cmak 3.0.0.4
elasticsearch 7.13.2
logstash 7.13.2
kibana 7.13.2

中间件对应镜像

zookeeper

zookeeper可以使用官方的镜像库,地址:

https://registry.hub.docker.com/_/zookeeper

kafka

kafka这里我们选择第三方封装的镜像库,也有超过10w+下载量(由于官方没有对应的docker镜像),地址如下:

https://registry.hub.docker.com/r/wurstmeister/kafka

kafka-manager

kafka-manager的Docker镜像可以使用官方的镜像库(更新较慢,非最新版本),地址:

https://registry.hub.docker.com/r/kafkamanager/kafka-manager

除此之外,可以使用如下的个人镜像库,拥有最新版本和最常用版本:

https://registry.hub.docker.com/r/wangxiansen/kafka-manager

https://registry.hub.docker.com/r/rongmazhong/kafka-manager

elk

elk有独立几个中间件的镜像,这里我们使用一个第三方聚合好的elk镜像,下载量有10w+,地址:

https://registry.hub.docker.com/r/sebp/elk

搭建Elk

准备完毕后,我们开始正式构建elk服务,搭建之前需要准备超过3.5G运行内存,以及4G以上的存储空间

下载相关镜像

  1. #zookeeper
  2. docker pull zookeeper:3.7.0;
  3. #kafka
  4. docker pull wurstmeister/kafka:2.13-2.7.1
  5. #kafka-manager
  6. docker pull kafkamanager/kafka-manager:3.0.0.4
  7. #elk
  8. docker pull sebp/elk:7.13.2

安装zk + kafka + kafka-manager

kafka目前版本,运行需要依赖zookeeper,因此我们需要先有一个zookeeper(后续kafka想要移除zookeeper依赖,自建服务注册中心),接着我们将zookeeper运行起来

  1. #创建一个zookeeper文件存储目录,用于存放elk相关zookeeper信息
  2. mkdir -p /opt/data/zk/elk
  3. #运行zookeeper
  4. docker run --name zookeeper -v /opt/data/zk/elk:/data -p 12181:2181 -e ZOO_LOG4J_PROP="INFO,ROLLINGFILE" -d zookeeper:3.7.0

zookeeper运行完毕后,接着我们运行kafka,其中KAFKA_ADVERTISED_HOST_NAME参数指定的是外网地址(纯内网就是宿主机的ip),KAFKA_ADVERTISED_PORT参数指定的是外网映射端口(宿主机映射端口)

  1. docker run -d --name kafka -p 19092:9092 --link zookeeper:zk --env KAFKA_BROKER_ID=999 --env HOST_IP=0.0.0.0 --env KAFKA_ZOOKEEPER_CONNECT=zk:2181 --env KAFKA_ADVERTISED_HOST_NAME=121.43.231.10 --env KAFKA_ADVERTISED_PORT=19092 --volume /etc/localtime:/etc/localtime wurstmeister/kafka:2.13-2.7.1
  2. #进入kafka容器内,开启kafka的监听者 用于接受消息测试
  3. docker exec -it kafka sh;
  4. cd opt/kafka_2.13-2.7.1/bin/;
  5. ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic demo --from-beginning
  6. #再去启动一个窗口,进入容器,开启kafka发送者发送消息
  7. docker exec -it kafka sh;
  8. cd opt/kafka_2.13-2.7.1/bin/;
  9. ./kafka-console-producer.sh --broker-list localhost:9092 --topic demo;
  10. #用发送者发几个消息测试一下,看看监听者是否收到消息,确认无误后,退出容器 ctrl + c exit

最后启动kafka-manager绑定zk和kafka,用于web页面查看

  1. docker run -d --name kafka-manager --link zookeeper:zk --link kafka:kafka --env ZK_HOSTS=zk:2181 -p 29000:9000 kafkamanager/kafka-manager:3.0.0.4

我们去访问外网开放的地址,http://192.168.1.171:29000,初始化看到的界面是空白的,这个时候我们需要手动add一下:

image-20210916181819180.png

添加完成后,再去list查看,如下:

image-20210916181847241.png

说明当前我们从容器zk上找到了kafka的信息,接着点进去,查看一下topic,看看是否有刚刚发送消息的demo

image-20210916181943632.png

至此,说明前面的zk + kafka + kafak-manager都查找到了

注:

kafka-manager的github下载地址: https://github.com/yahoo/CMAK

elk + ik分词器插件文件配置

我们在构建es的时候,会配置ik中文分词器搭配使用,因此,我们在确定了elk镜像每个中间件的版本以后,我们需要提前准备下载对应版本的ik分词器,在github的下载地址如下:

https://github.com/medcl/elasticsearch-analysis-ik/releases

将对应的

image-20210917101143522.png

下载到本地,首先在服务器上创建目录,然后上传到目录下(/usr/local/bin/elk)

  1. mkdir -p /usr/local/bin/elk;
  2. mkdir -p /usr/local/bin/elk/logstash;

需要注意的是,我们需要将其解压,然后文件夹改名为ik目录

  1. cd /usr/local/bin/elk;
  2. unzip elasticsearch-analysis-ik-7.13.2.zip;
  3. mv elasticsearch-analysis-ik-7.13.2 ik/;
  4. rm -rf elasticsearch-analysis-ik-7.13.2.zip;

接着,我们需要编写一个kafka.conf文件,用于在启动elk的时候,将其加载映射到logstash的配置文件中去,让其可以从kafka中找到数据源

  1. cd /usr/local/bin/elk/logstash;
  2. vim kafka.conf;
  3. input {
  4. kafka {
  5. bootstrap_servers => ["52.82.98.209:9103"]
  6. group_id => "logstash"
  7. topics => ["mylog"]
  8. add_field => {"channel" => "kafka"}
  9. codec => json {
  10. charset => "UTF-8"
  11. }
  12. }
  13. }
  14. filter {
  15. }
  16. output {
  17. elasticsearch {
  18. hosts => "localhost:9200"
  19. index => "mylog"
  20. }
  21. stdout {
  22. }
  23. }

将其配置修改为对应kafka的外网ip端口,以及指定的topic,一切做好后,我们就可以正式配置elk了,不过需要注意的是,我们之前下载的镜像—sebp/elk:7.13.2里面默认不是自带ik插件的,因此,我们需要基于这个镜像,以及我们的ik目录,重新构建一个新的elk镜像,使其内部拥有对中文分词过滤的能力,因此我们需要在 /usr/local/bin/elk目录下编写Dockerfile文件

  1. cd /usr/local/bin/elk;
  2. vim Dockerfile;
  3. FROM sebp/elk:7.13.2
  4. ADD ik/ /opt/elasticsearch/plugins/ik/
  5. RUN chown -R elasticsearch:elasticsearch /opt/elasticsearch/plugins/ik/

接着我们进行编译构建新的镜像,语法docker build -t 镜像名:tag 目录,这里我们是在当前目录的Dockerfile文件,目录直接为.

  1. docker build -t elk-ik:7.13.2 .

等待镜像构建完成即可,需要注意的是,在运行elk之前,我们需要在宿主机配置一下vm.max_map_count参数,否则,运行elk以后,会出现max virtual memory areas vm.max_map_count [65530] is too low, increase to错误,主要是因为elasticsearch需要需要的jvm内存和文件map映射有大小规定,因此我们需要在宿主机上先执行 sudo sysctl -w vm.max_map_count=262144

接着我们就可以使用当前镜像,而不是之前的elk镜像了,然后我们开始启动elk

  1. docker run -d -v /usr/local/bin/elk/logstash:/etc/logstash/conf.d -p 15044:5044 -p 15601:5601 -p 19200:9200 -p 19300:9300 -p 15044:5044 -p 19600:9600 --link kafka:kafka -e ES_MIN_MEM=128m -e ES_MAX_MEM=1024m -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -it --name elk-dev elk-ik:7.13.2

启动完成后,我们可以输入 http://192.168.1.72:15601查看kibana控制台,当然,为了验证ik分词器效果,我们需要用curl或者postman,先发个测试的数据,查看分词效果:

  1. curl http://localhost:9200/_analyze -X POST -H 'Content-
  2. Type:application/json' -d '{"text":"test elasticsearch 测试分词效
  3. 果","analyzer": "ik_smart"}'

如果看到结果:

  1. {
  2. "tokens": [
  3. {
  4. "token": "test",
  5. "start_offset": 0,
  6. "end_offset": 4,
  7. "type": "ENGLISH",
  8. "position": 0
  9. },
  10. {
  11. "token": "elasticsearch",
  12. "start_offset": 5,
  13. "end_offset": 18,
  14. "type": "ENGLISH",
  15. "position": 1
  16. },
  17. {
  18. "token": "测试",
  19. "start_offset": 19,
  20. "end_offset": 21,
  21. "type": "CN_WORD",
  22. "position": 2
  23. },
  24. {
  25. "token": "分词",
  26. "start_offset": 21,
  27. "end_offset": 23,
  28. "type": "CN_WORD",
  29. "position": 3
  30. },
  31. {
  32. "token": "效果",
  33. "start_offset": 23,
  34. "end_offset": 25,
  35. "type": "CN_WORD",
  36. "position": 4
  37. }
  38. ]
  39. }

说明ik分词已经生效,接着,我们可以再次进入kafka容器内,发送几条消息到elk监听的topic上,测试一下,是否能监测到数据

  1. docker exec -it kafka sh;
  2. cd opt/kafka_2.13-2.7.1/bin/;
  3. ./kafka-console-producer.sh --broker-list localhost:9092 --topic mylog;

最终效果大概如下,即说明elk搭建完成:

image-20210917104418239.png

image-20210917104515102.png

扩展

只保留10天的elk数据日志
  1. vim delelk.sh;
  2. #!/bin/bash
  3. #定时清除elk索引,10天
  4. DATE=date -d "10 days ago" +%Y.%m.%d
  5. curl -XDELETE "http://127.0.0.1:9400/*-${DATE}"

接着需要用的时候 sh delelk.sh即可