当前位置:   article > 正文

容器部署ELK7.10,适用于生产

生产elk7.8二进制部署

一、elk架构简介

  • 首先 logstash 具有日志采集、过滤、筛选等功能,功能完善但同时体量也会比较大,消耗系统资源自然也多。filebeat作为一个轻量级日志采集工具,虽然没有过滤筛选功能,但是仅仅部署在应用服务器作为我们采集日志的工具可以是说最好的选择。但我们有些时候可能又需要logstash的过滤筛选功能,所以我们在采集日志时用filebeat,然后交给logstash过滤筛选。

  • 其次,logstash的吞吐量是有限的,一旦短时间内filebeat传过来的日志过多会产生堆积和堵塞,对日志的采集也会受到影响,所以在filebeat与logstash中间又加了一层kafka消息队列来缓存或者说解耦,当然redis也是可以的。这样当众多filebeat节点采集大量日志直接放到kafka中,logstash慢慢的进行消费,两边互不干扰。

  • 至于zookeeper,分布式服务管理神器,监控管理kafka的节点注册,topic管理等,同时弥补了kafka集群节点对外界无法感知的问题,kafka实际已经自带了zookeeper,这里将会使用独立的zookeeper进行管理,方便后期zookeeper集群的扩展。

二、环境

  • 阿里云ECS:5台部署ES节点,3台分别部署logstash、kafka、zookeeper和kibana等服务。

  • 阿里云ECS配置:5台 4核16G SSD磁盘。3台 4核16G SSD磁盘。都是 Centos7.8系统

  • 安装 docker 和 docker-compose

  • ELK版本7.10.1;zookeeper版本3.6.2;kafka版本2.13-2.6.0;

IP地址主机名称用途
172.20.166.25es-master1es master 和 es 数据节点
172.20.166.24es-master2es master 和 es 数据节点
172.20.166.22es-master3es master 和 es 数据节点
172.20.166.23es-data1es数据节点
172.20.166.26es-data2es数据节点
172.20.166.27logstash1logstash、kafka、zookeeper
172.20.166.28logstash2logstash、kafka、zookeeper
172.20.166.29logstash3logstash、kafka、kafa-manager、zookeeper、kibana、curator

三、系统参数优化

  1. # 最大用户打开进程数
  2. $ vim /etc/security/limits.d/20-nproc.conf
  3. *           soft   nproc       65535
  4. *           hard   nproc       65535
  5. # 优化内核,用于 docker 支持
  6. $ modprobe br_netfilter
  7. $ cat <<EOF >  /etc/sysctl.d/k8s.conf
  8. net.bridge.bridge-nf-call-ip6tables = 1
  9. net.bridge.bridge-nf-call-iptables = 1
  10. net.ipv4.ip_forward = 1
  11. EOF
  12. $ sysctl -p /etc/sysctl.d/k8s.conf
  13. # 优化内核,对 es 支持
  14. $ echo 'vm.max_map_count=262144' >> /etc/sysctl.conf
  15. # 生效配置
  16. $ sysctl -p

四、部署 docker 和 docker-compose

部署 docker

  1. # 安装必要的一些系统工具
  2. $ yum install -y yum-utils device-mapper-persistent-data lvm2
  3. # 添加软件源信息
  4. $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. # 更新并安装 Docker-CE
  6. $ yum makecache fast
  7. $ yum -y install docker-ce
  8. # 配置docker
  9. $ systemctl enable docker
  10. $ systemctl start docker
  11. $ vim /etc/docker/daemon.json
  12. {"data-root""/var/lib/docker""bip""10.50.0.1/16""default-address-pools": [{"base""10.51.0.1/16""size"24}], "registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "log-opts": {"max-size":"500m""max-file":"3"}}
  13. $ sed  -i '/ExecStart=/i ExecStartPost=\/sbin\/iptables -P FORWARD ACCEPT' /usr/lib/systemd/system/docker.service
  14. $ systemctl enable docker.service
  15. $ systemctl daemon-reload
  16. $ systemctl restart docker

部署 docker-compose

  1. # 安装 docker-compose
  2. $ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  3. $ chmod +x /usr/local/bin/docker-compose

五、部署 ES

es-master1 操作

  1. # 创建 es 目录
  2. $ mkdir /data/ELKStack
  3. $ mkdir elasticsearch elasticsearch-data elasticsearch-plugins
  4. # 容器es用户 uid 和 gid 都是 1000
  5. $ chown 1000.1000 elasticsearch-data elasticsearch-plugins
  6. # 临时启动一个es
  7. $ docker run --name es-test -it --rm docker.elastic.co/elasticsearch/elasticsearch:7.10.1 bash
  8. # 生成证书,证书有效期10年,证书输入的密码这里为空
  9. $ bin/elasticsearch-certutil ca --days 3660
  10. $ bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --days 3660
  11. # 打开新的窗口,拷贝生成的证书
  12. $ cd /data/ELKStack/elasticsearch
  13. $ mkdir es-p12
  14. $ docker cp es-test:/usr/share/elasticsearch/elastic-certificates.p12 ./es-p12
  15. $ docker cp es-test:/usr/share/elasticsearch/elastic-stack-ca.p12 ./es-p12
  16. $ chown -R 1000.1000 ./es-p12
  17. # 创建 docker-compose.yml
  18. $ vim docker-compose.yml
  19. version: '2.2'
  20. services:
  21.   elasticsearch:
  22.     image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
  23.     container_name: es01
  24.     environment:
  25.       - cluster.name=es-docker-cluster
  26.       - cluster.initial_master_nodes=es01,es02,es03
  27.       - bootstrap.memory_lock=true
  28.       - "ES_JAVA_OPTS=-Xms10000m -Xmx10000m"
  29.     ulimits:
  30.       memlock:
  31.         soft: -1
  32.         hard: -1
  33.       nofile:
  34.         soft: 65536
  35.         hard: 65536
  36.     mem_limit: 13000m
  37.     cap_add:
  38.       - IPC_LOCK
  39.     restart: always
  40.     # 设置 docker host 网络模式
  41.     network_mode: "host"
  42.     volumes:
  43.        - /data/ELKStack/elasticsearch-data:/usr/share/elasticsearch/data
  44.        - /data/ELKStack/elasticsearch-plugins:/usr/share/elasticsearch/plugins
  45.        - /data/ELKStack/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
  46.        - /data/ELKStack/elasticsearch/es-p12:/usr/share/elasticsearch/config/es-p12
  47. # 创建 elasticsearch.yml 配置文件
  48. $ vim elasticsearch.yml
  49. cluster.name: "es-docker-cluster"
  50. node.name: "es01"
  51. network.host: 0.0.0.0
  52. node.master: true
  53. node.data: true
  54. discovery.zen.minimum_master_nodes: 2
  55. http.port: 9200
  56. transport.tcp.port: 9300
  57. # 如果是多节点es,通过ping来健康检查
  58. discovery.zen.ping.unicast.hosts: ["172.20.166.25:9300""172.20.166.24:9300""172.20.166.22:9300""172.20.166.23:9300""172.20.166.26:9300"]
  59. discovery.zen.fd.ping_timeout: 120s
  60. discovery.zen.fd.ping_retries: 6
  61. discovery.zen.fd.ping_interval: 10s
  62. cluster.info.update.interval: 1m
  63. indices.fielddata.cache.size:  20%
  64. indices.breaker.fielddata.limit: 40%
  65. indices.breaker.request.limit: 40%
  66. indices.breaker.total.limit: 70%
  67. indices.memory.index_buffer_size: 20%
  68. script.painless.regex.enabled: true
  69. # 磁盘分片分配
  70. cluster.routing.allocation.disk.watermark.low: 100gb
  71. cluster.routing.allocation.disk.watermark.high: 50gb
  72. cluster.routing.allocation.disk.watermark.flood_stage: 30gb
  73. # 本地数据分片恢复配置
  74. gateway.recover_after_nodes: 3
  75. gateway.recover_after_time: 5m
  76. gateway.expected_nodes: 3
  77. cluster.routing.allocation.node_initial_primaries_recoveries: 8
  78. cluster.routing.allocation.node_concurrent_recoveries: 2
  79. # 允许跨域请求
  80. http.cors.enabled: true
  81. http.cors.allow-origin: "*"
  82. http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
  83. # 开启xpack
  84. xpack.security.enabled: true
  85. xpack.monitoring.collection.enabled: true
  86. # 开启集群中https传输
  87. xpack.security.transport.ssl.enabled: true
  88. xpack.security.transport.ssl.verification_mode: certificate
  89. xpack.security.transport.ssl.keystore.path: es-p12/elastic-certificates.p12
  90. xpack.security.transport.ssl.truststore.path: es-p12/elastic-certificates.p12
  91. # 把 es 配置使用 rsync 同步到其它 es 节点
  92. $ rsync -avp -e ssh /data/ELKStack 172.20.166.24:/data/
  93. $ rsync -avp -e ssh /data/ELKStack 172.20.166.22:/data/
  94. $ rsync -avp -e ssh /data/ELKStack 172.20.166.23:/data/
  95. $ rsync -avp -e ssh /data/ELKStack 172.20.166.26:/data/
  96. # 启动 es
  97. $ docker-compose up -d
  98. # 查看 es
  99. $ docker-compose ps

es-master2 操作

  1. $ cd /data/ELKStack/elasticsearch
  2. # 修改 docker-compose.yml elasticsearch.yml 两个配置
  3. $ sed -i 's/es01/es02/g' docker-compose.yml elasticsearch.yml
  4. # 启动 es
  5. $ docker-compose up -d

es-master3 操作

  1. $ cd /data/ELKStack/elasticsearch
  2. # 修改 docker-compose.yml elasticsearch.yml 两个配置
  3. $ sed -i 's/es01/es03/g' docker-compose.yml elasticsearch.yml
  4. # 启动 es
  5. $ docker-compose up -d

es-data1 操作

  1. $ cd /data/ELKStack/elasticsearch
  2. # 修改 docker-compose.yml elasticsearch.yml 两个配置
  3. $ sed -i 's/es01/es04/g' docker-compose.yml elasticsearch.yml
  4. # 不做为 es master 节点,只做数据节点
  5. $ sed -i 's/node.master: true/node.master: false/g' elasticsearch.yml
  6. # 启动 es
  7. $ docker-compose up -d

es-data2 操作

  1. $ cd /data/ELKStack/elasticsearch
  2. # 修改 docker-compose.yml elasticsearch.yml 两个配置
  3. $ sed -i 's/es01/es05/g' docker-compose.yml elasticsearch.yml
  4. # 不做为 es master 节点,只做数据节点
  5. $ sed -i 's/node.master: true/node.master: false/g' elasticsearch.yml
  6. # 启动 es
  7. $ docker-compose up -d

设置 es 访问账号

  1. # es-master1 操作
  2. $ docker exec -it es01 bash
  3. # 设置 elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user 等密码
  4. # 密码都设置为 elastic123,这里只是举例,具体根据需求设置
  5. $ ./bin/elasticsearch-setup-passwords interactive

六、部署 Kibana

logstash3 操作

  1. $ mkdir -p /data/ELKStack/kibana
  2. $ cd /data/ELKStack/kibana
  3. # 创建 kibana 相关目录,用于容器挂载
  4. $ mkdir config data plugins
  5. $ chown 1000.1000 config data plugins
  6. # 创建 docker-compose.yml
  7. $ vim docker-compose.yml
  8. version: '2'
  9. services:
  10.   kibana:
  11.     image: docker.elastic.co/kibana/kibana:7.10.1
  12.     container_name: kibana
  13.     restart: always
  14.     network_mode: "bridge"
  15.     mem_limit: 2000m
  16.     environment:
  17.       SERVER_NAME: kibana.example.com
  18.     ports:
  19.       - "5601:5601"
  20.     volumes:
  21.        - /data/ELKStack/kibana/config:/usr/share/kibana/config
  22.        - /data/ELKStack/kibana/data:/usr/share/kibana/data
  23.        - /data/ELKStack/kibana/plugins:/usr/share/kibana/plugins
  24. # 创建 kibana.yml
  25. $ vim config/kibana.yml
  26. server.name: kibana
  27. server.host: "0"
  28. elasticsearch.hosts: ["http://172.20.166.25:9200","http://172.20.166.24:9200","http://172.20.166.22:9200"]
  29. elasticsearch.username: "kibana"
  30. elasticsearch.password: "elastic123"
  31. monitoring.ui.container.elasticsearch.enabled: true
  32. xpack.security.enabled: true
  33. xpack.encryptedSavedObjects.encryptionKey: encryptedSavedObjects12345678909876543210
  34. xpack.security.encryptionKey: encryptionKeysecurity12345678909876543210
  35. xpack.reporting.encryptionKey: encryptionKeyreporting12345678909876543210
  36. i18n.locale: "zh-CN"
  37. # 启动 kibana
  38. $ docker-compose up -d

七、部署 Zookeeper

logstash1 操作

  1. # 创建 zookeeper 目录
  2. $ mkdir /data/ELKStack/zookeeper
  3. $ cd /data/ELKStack/zookeeper
  4. $ mkdir data datalog
  5. $ chown 1000.1000 data datalog
  6. # 创建 docker-compose.yml
  7. $ vim docker-compose.yml
  8. version: '2'
  9. services:
  10.   zoo1:
  11.     image: zookeeper:3.6.2
  12.     restart: always
  13.     hostname: zoo1
  14.     container_name: zoo1
  15.     network_mode: "bridge"
  16.     mem_limit: 2000m
  17.     ports:
  18.       - 2181:2181
  19.       - 3888:3888
  20.       - 2888:2888
  21.     volumes:
  22.       - /data/ELKStack/zookeeper/data:/data
  23.       - /data/ELKStack/zookeeper/datalog:/datalog
  24.       - /data/ELKStack/zookeeper/zoo.cfg:/conf/zoo.cfg
  25.     environment:
  26.       ZOO_MY_ID: 1  # 表示 ZK服务的 id, 它是1-255 之间的整数, 必须在集群中唯一
  27.       ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=172.20.166.28:2888:3888;2181 server.3=172.20.166.29:2888:3888;2181
  28.       # ZOOKEEPER_CLIENT_PORT: 2181
  29. # 创建 zoo.cfg 配置
  30. $ vim zoo.cfg
  31. tickTime=2000
  32. initLimit=10
  33. syncLimit=5
  34. dataDir=/data
  35. dataLogDir=/datalog
  36. autopurge.snapRetainCount=3
  37. autopurge.purgeInterval=1
  38. maxClientCnxns=60
  39. server.10.0.0.0:2888:3888;2181
  40. server.2172.20.166.28:2888:3888;2181
  41. server.3172.20.166.29:2888:3888;2181
  42. # 拷贝配置到 logstash2 logstash3 机器上
  43. $ rsync -avp -e ssh /data/ELKStack/zookeeper 172.20.166.28:/data/ELKStack/
  44. $ rsync -avp -e ssh /data/ELKStack/zookeeper 172.20.166.29:/data/ELKStack/
  45. # 启动 zookeeper
  46. $ docker-compose up -d

logstash2 操作

  1. $ cd /data/ELKStack/zookeeper
  2. # 修改 docker-compose.yml 文件
  3. $ vim docker-compose.yml
  4. version: '2'
  5. services:
  6.   zoo2:
  7.     image: zookeeper:3.6.2
  8.     restart: always
  9.     hostname: zoo2
  10.     container_name: zoo2
  11.     network_mode: "bridge"
  12.     mem_limit: 2000m
  13.     ports:
  14.       - 2181:2181
  15.       - 3888:3888
  16.       - 2888:2888
  17.     volumes:
  18.       - /data/ELKStack/zookeeper/data:/data
  19.       - /data/ELKStack/zookeeper/datalog:/datalog
  20.       - /data/ELKStack/zookeeper/zoo.cfg:/conf/zoo.cfg
  21.     environment:
  22.       ZOO_MY_ID: 2  # 表示 ZK服务的 id, 它是1-255 之间的整数, 必须在集群中唯一
  23.       ZOO_SERVERS: server.1=172.20.166.27:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=172.20.166.29:2888:3888;2181
  24.       # ZOOKEEPER_CLIENT_PORT: 2181
  25. # 修改 zoo.cfg
  26. $ vim zoo.cfg
  27. tickTime=2000
  28. initLimit=10
  29. syncLimit=5
  30. dataDir=/data
  31. dataLogDir=/datalog
  32. autopurge.snapRetainCount=3
  33. autopurge.purgeInterval=1
  34. maxClientCnxns=60
  35. server.1172.20.166.27:2888:3888;2181
  36. server.20.0.0.0:2888:3888;2181
  37. server.3172.20.166.29:2888:3888;2181
  38. # 启动 zookeeper
  39. $ docker-compose up -d

logstash3 操作

  1. $ cd /data/ELKStack/zookeeper
  2. # 修改 docker-compose.yml 文件
  3. $ vim docker-compose.yml
  4. version: '2'
  5. services:
  6.   zoo3:
  7.     image: zookeeper:3.6.2
  8.     restart: always
  9.     hostname: zoo3
  10.     container_name: zoo3
  11.     network_mode: "bridge"
  12.     mem_limit: 2000m
  13.     ports:
  14.       - 2181:2181
  15.       - 3888:3888
  16.       - 2888:2888
  17.     volumes:
  18.       - /data/ELKStack/zookeeper/data:/data
  19.       - /data/ELKStack/zookeeper/datalog:/datalog
  20.       - /data/ELKStack/zookeeper/zoo.cfg:/conf/zoo.cfg
  21.     environment:
  22.       ZOO_MY_ID: 3  # 表示 ZK服务的 id, 它是1-255 之间的整数, 必须在集群中唯一
  23.       ZOO_SERVERS: server.1=172.20.166.27:2888:3888;2181 server.2=172.20.166.28:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
  24.       # ZOOKEEPER_CLIENT_PORT: 2181
  25. # 修改 zoo.cfg
  26. $ vim zoo.cfg
  27. tickTime=2000
  28. initLimit=10
  29. syncLimit=5
  30. dataDir=/data
  31. dataLogDir=/datalog
  32. autopurge.snapRetainCount=3
  33. autopurge.purgeInterval=1
  34. maxClientCnxns=60
  35. server.1172.20.166.27:2888:3888;2181
  36. server.2172.20.166.28:2888:3888;2181
  37. server.30.0.0.0:2888:3888;2181
  38. # 启动 zookeeper
  39. $ docker-compose up -d
  40. # 操作 zookeeper
  41. $ docker run -it zoo3 bash
  42. $ zkCli.sh -server 172.20.166.27:2181,172.20.166.28:2181,172.20.166.29:2181

八、部署 Kafka

logstash1 操作

  1. # 创建 kafka 目录
  2. $ mkdir -p /data/ELKStack/kafka
  3. $ cd /data/ELKStack/kafka
  4. # 创建数据目录,用于存储kafka容器数据
  5. $ mkdir data
  6. # 把kafka配置拷贝到宿主机上
  7. $ docker run --name kafka-test -it --rm wurstmeister/kafka:2.13-2.6.0 bash
  8. $ cd /opt/kafka
  9. $ tar zcvf /tmp/config.tar.gz config
  10. # 打开一个新的窗口
  11. $ docker cp kafka-test:/tmp/config.tar.gz ./
  12. # 解压配置文件
  13. $ tar xf config.tar.gz
  14. # 创建 docker-compose.yml
  15. $ vim docker-compose.yml
  16. version: '2'
  17. services:
  18.   kafka1:
  19.     image: wurstmeister/kafka:2.13-2.6.0
  20.     restart: always
  21.     hostname: kafka1
  22.     container_name: kafka1
  23.     network_mode: "bridge"
  24.     mem_limit: 5120m
  25.     ports:
  26.     - 9092:9092
  27.     - 9966:9966
  28.     environment:
  29.       KAFKA_BROKER_ID: 1
  30.       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.20.166.27:9092       # 宿主机的IP地址而非容器的IP,及暴露出来的端口
  31.       KAFKA_ADVERTISED_HOST_NAME: 172.20.166.27                        # 外网访问地址
  32.       KAFKA_ADVERTISED_PORT: 9092                                      # 端口
  33.       KAFKA_ZOOKEEPER_CONNECT: 172.20.166.27:2181,172.20.166.28:2181,172.20.166.29:2181           # 连接的zookeeper服务及端口
  34.       KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.20.166.27 -Dcom.sun.management.jmxremote.rmi.port=9966"
  35.       JMX_PORT: 9966 # kafka需要监控broker和topic的数据的时候,是需要开启jmx_port的
  36.       KAFKA_HEAP_OPTS: "-Xmx4096M -Xms4096M"
  37.     volumes:
  38.     - /data/ELKStack/kafka/data:/kafka                    # kafka数据文件存储目录
  39.     - /data/ELKStack/kafka/config:/opt/kafka/config
  40. # 优化 kafka server.properties 配置
  41. $ vim config/server.properties
  42. # 调大socket,防止报错
  43. socket.send.buffer.bytes=1024000
  44. socket.receive.buffer.bytes=1024000
  45. socket.request.max.bytes=1048576000
  46. # topic 数据保留多久,默认168小时(7day)
  47. log.retention.hours=72
  48. log.cleanup.policy=delete
  49. # 拷贝配置到 logstash2 logstash3 机器上
  50. $ rsync -avp -e ssh /data/ELKStack/kafka 172.20.166.28:/data/ELKStack/
  51. $ rsync -avp -e ssh /data/ELKStack/kafka 172.20.166.29:/data/ELKStack/
  52. # 启动 kafka
  53. $ docker-compose up -d

logstash2 操作

  1. $ cd /data/ELKStack/kafka
  2. # 修改 docker-compose.yml 文件
  3. $ vim docker-compose.yml
  4. version: '2'
  5. services:
  6.   kafka2:
  7.     image: wurstmeister/kafka:2.13-2.6.0
  8.     restart: always
  9.     hostname: kafka2
  10.     container_name: kafka2
  11.     network_mode: "bridge"
  12.     mem_limit: 5120m
  13.     ports:
  14.     - 9092:9092
  15.     - 9966:9966
  16.     environment:
  17.       KAFKA_BROKER_ID: 2
  18.       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.20.166.28:9092       # 宿主机的IP地址而非容器的IP,及暴露出来的端口
  19.       KAFKA_ADVERTISED_HOST_NAME: 172.20.166.28                        # 外网访问地址
  20.       KAFKA_ADVERTISED_PORT: 9092                                      # 端口
  21.       KAFKA_ZOOKEEPER_CONNECT: 172.20.166.27:2181,172.20.166.28:2181,172.20.166.29:2181           # 连接的zookeeper服务及端口
  22.       KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.20.166.28 -Dcom.sun.management.jmxremote.rmi.port=9966"
  23.       JMX_PORT: 9966  # kafka需要监控broker和topic的数据的时候,是需要开启jmx_port的
  24.       KAFKA_HEAP_OPTS: "-Xmx4096M -Xms4096M"
  25.     volumes:
  26.     - /data/ELKStack/kafka/data:/kafka                    # kafka数据文件存储目录
  27.     - /data/ELKStack/kafka/config:/opt/kafka/config
  28. # 启动 kafka
  29. $ docker-compose up -d

logstash3 操作

  1. $ cd /data/ELKStack/kafka
  2. # 修改 docker-compose.yml 文件
  3. $ vim docker-compose.yml
  4. version: '2'
  5. services:
  6.   kafka3:
  7.     image: wurstmeister/kafka:2.13-2.6.0
  8.     restart: always
  9.     hostname: kafka3
  10.     container_name: kafka3
  11.     network_mode: "bridge"
  12.     mem_limit: 5120m
  13.     ports:
  14.     - 9092:9092
  15.     - 9966:9966
  16.     environment:
  17.       KAFKA_BROKER_ID: 3
  18.       KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.20.166.29:9092       # 宿主机的IP地址而非容器的IP,及暴露出来的端口
  19.       KAFKA_ADVERTISED_HOST_NAME: 172.20.166.29                        # 外网访问地址
  20.       KAFKA_ADVERTISED_PORT: 9092                                      # 端口
  21.       KAFKA_ZOOKEEPER_CONNECT: 172.20.166.27:2181,172.20.166.28:2181,172.20.166.29:2181           # 连接的zookeeper服务及端口
  22.       KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.20.166.29 -Dcom.sun.management.jmxremote.rmi.port=9966"
  23.       JMX_PORT: 9966  # kafka需要监控broker和topic的数据的时候,是需要开启jmx_port的
  24.       KAFKA_HEAP_OPTS: "-Xmx4096M -Xms4096M"
  25.     volumes:
  26.     - /data/ELKStack/kafka/data:/kafka                    # kafka数据文件存储目录
  27.     - /data/ELKStack/kafka/config:/opt/kafka/config
  28. # 启动 kafka
  29. $ docker-compose up -d
  30. # 部署 kafka-manager 管理 kafka 平台
  31. $ mkdir /data/ELKStack/kafka-manager
  32. $ cd /data/ELKStack/kafka-manager
  33. $ vim docker-compose.yml
  34. version: '3.6'
  35. services:
  36.   kafka_manager:
  37.     restart: always
  38.     container_name: kafa-manager
  39.     hostname: kafka-manager
  40.     network_mode: "bridge"
  41.     mem_limit: 1024m
  42.     image: hlebalbau/kafka-manager:3.0.0.5-7e7a22e
  43.     ports:
  44.       - "9000:9000"
  45.     environment:
  46.       ZK_HOSTS: "172.20.166.27:2181,172.20.166.28:2181,172.20.166.29:2181"
  47.       APPLICATION_SECRET: "random-secret"
  48.       KAFKA_MANAGER_AUTH_ENABLED: "true"
  49.       KAFKA_MANAGER_USERNAME: admin
  50.       KAFKA_MANAGER_PASSWORD: elastic123
  51.       JMX_PORT: 9966
  52.       TZ: "Asia/Shanghai"
  53. # 启动 kafka-manager
  54. $ docker-compose up -d
  55. # 访问 http://172.20.166.29:9000 ,把上面创建的三台 kafka 加入管理,这里不在阐述,网上很多配置教程

九、部署 logstash

logstash1 操作

  1. $ mkdir /data/ELKStack/logstash
  2. $ cd /data/ELKStack/logstash
  3. $ mkdir config data
  4. $ chown 1000.1000 config data
  5. # 创建 docker-compose.yml
  6. $ vim docker-compose.yml
  7. version: '2'
  8. services:
  9.   logstash1:
  10.     image: docker.elastic.co/logstash/logstash:7.10.1
  11.     container_name: logstash1
  12.     hostname: logstash1
  13.     restart: always
  14.     network_mode: "bridge"
  15.     mem_limit: 4096m
  16.     environment:
  17.       TZ: "Asia/Shanghai"
  18.     ports:
  19.       - 5044:5044
  20.     volumes:
  21.       - /data/ELKStack/logstash/config:/config-dir
  22.       - /data/ELKStack/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
  23.       - /data/ELKStack/logstash/data:/usr/share/logstash/data
  24.       - /etc/localtime:/etc/localtime
  25.     user: logstash
  26.     command: bash -c "logstash -f /config-dir --config.reload.automatic"
  27. # 创建 logstash.yml
  28. $ vim logstash.yml
  29. http.host: "0.0.0.0"
  30. # 指发送到Elasticsearch的批量请求的大小,值越大,处理则通常更高效,但增加了内存开销
  31. pipeline.batch.size: 3000
  32. # 指调整Logstash管道的延迟,过了该时间则logstash开始执行过滤器和输出
  33. pipeline.batch.delay: 200
  34. # 创建 logstash 规则配置
  35. $ vim config/01-input.conf
  36. input {                                        # 输入组件
  37.     kafka {                                    # 从kafka消费数据
  38.         bootstrap_servers => ["172.20.166.27:9092,172.20.166.28:9092,172.20.166.29:9092"]
  39.         #topics => "%{[@metadata][topic]}"     # 使用kafka传过来的topic
  40.         topics_pattern => "elk-.*"             # 使用正则匹配topic
  41.         codec => "json"                        # 数据格式
  42.         consumer_threads => 3                  # 消费线程数量
  43.         decorate_events => true                # 可向事件添加Kafka元数据,比如主题、消息大小的选项,这将向logstash事件中添加一个名为kafka的字段
  44.         auto_offset_reset => "latest"          # 自动重置偏移量到最新的偏移量
  45.         group_id => "logstash-node"            # 消费组ID,多个有相同group_id的logstash实例为一个消费组
  46.         client_id => "logstash1"               # 客户端ID
  47.         fetch_max_wait_ms => "1000"            # 指当没有足够的数据立即满足fetch_min_bytes时,服务器在回答fetch请求之前将阻塞的最长时间
  48.   }
  49. }
  50. $ vim config/02-output.conf
  51. output {                                       # 输出组件
  52.     elasticsearch {
  53.         # Logstash输出到es
  54.         hosts => ["172.20.166.25:9200""172.20.166.24:9200""172.20.166.22:9200""172.20.166.23:9200""172.20.166.26:9200"]
  55.         index => "%{[fields][source]}-%{+YYYY-MM-dd}"      # 直接在日志中匹配,索引会去掉elk
  56.         # index => "%{[@metadata][topic]}-%{+YYYY-MM-dd}"  # 以日期建索引
  57.         user => "elastic"
  58.         password => "elastic123"
  59.     }
  60.     #stdout {
  61.     #    codec => rubydebug
  62.     #}
  63. }
  64. $ vim config/03-filter.conf
  65. filter {
  66.    # 当非业务字段时,无traceId则移除
  67.    if ([message] =~ "traceId=null") {          # 过滤组件,这里只是展示,无实际意义,根据自己的业务需求进行过滤
  68.       drop {}
  69.    }
  70. }
  71. # 拷贝配置到 logstash2 logstash3 机器上
  72. $ rsync -avp -e ssh /data/ELKStack/logstash 172.20.166.28:/data/ELKStack/
  73. $ rsync -avp -e ssh /data/ELKStack/logstash 172.20.166.29:/data/ELKStack/
  74. # 启动 logstash
  75. $ docker-compose up -d

logstash2 操作

  1. $ cd /data/ELKStack/logstash
  2. $ sed -i 's/logstash1/logstash2/g' docker-compose.yml
  3. $ sed -i 's/logstash1/logstash2/g' config/01-input.conf
  4. # 启动 logstash
  5. $ docker-compose up -d

logstash3 操作

  1. $ cd /data/ELKStack/logstash
  2. $ sed -i 's/logstash1/logstash3/g' docker-compose.yml
  3. $ sed -i 's/logstash1/logstash3/g' config/01-input.conf
  4. # 启动 logstash
  5. $ docker-compose up -d

十、部署 filebeat

  1. # 配置 filebeat yum源,这里以 centos7 为例
  2. $ rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  3. $ vim /etc/yum.repos.d/elastic.repo
  4. [elastic-7.x]
  5. name=Elastic repository for 7.x packages
  6. baseurl=https://artifacts.elastic.co/packages/7.x/yum
  7. gpgcheck=1
  8. gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
  9. enabled=1
  10. autorefresh=1
  11. type=rpm-md
  12. $ yum install -y filebeat-7.10.1
  13. $ systemctl enable filebeat
  14. # 配置
  15. $ cd /etc/filebeat/
  16. $ cp -a filebeat.yml filebeat.yml.old
  17. $ echo > filebeat.yml
  18. # 以收集nginx访问日志为例
  19. $ vim filebeat.yml
  20. filebeat.inputs:                   # inputs为复数,表名type可以有多个
  21. type: log                        # 输入类型
  22.   access:
  23.   enabled: true                    # 启用这个type配置
  24.   json.keys_under_root: true       # 默认这个值是FALSE的,也就是我们的json日志解析后会被放在json键上。设为TRUE,所有的keys就会被放到根节点
  25.   json.overwrite_keys: true        # 是否要覆盖原有的key,这是关键配置,将keys_under_root设为TRUE后,再将overwrite_keys也设为TRUE,就能把filebeat默认的key值给覆盖
  26.   max_bytes: 20480                 # 单条日志的大小限制,建议限制(默认为10M,queue.mem.events * max_bytes 将是占有内存的一部分)
  27.   paths:
  28.     - /var/log/nginx/access.log    # 监控nginx 的access日志
  29.   fields:                          # 额外的字段
  30.     source: nginx-access-prod      # 自定义source字段,用于es建议索引(字段名小写,我记得大写好像不行)
  31. # 自定义es的索引需要把ilm设置为false
  32. setup.ilm.enabled: false
  33. output.kafka:            # 输出到kafka
  34.   enabled: true          # 该output配置是否启用
  35.   hosts: ["172.20.166.27:9092""172.20.166.28:9092""172.20.166.29:9092"]  # kafka节点列表
  36.   topic: "elk-%{[fields.source]}"   # kafka会创建该topic,然后logstash(可以过滤修改)会传给es作为索引名称
  37.   partition.hash:
  38.     reachable_only: true # 是否只发往可达分区
  39.   compression: gzip      # 压缩
  40.   max_message_bytes: 1000000  # Event最大字节数。默认1000000。应小于等于kafka broker message.max.bytes值
  41.   required_acks: 1  # kafka ack等级
  42.   worker: 1  # kafka output的最大并发数
  43.   bulk_max_size: 2048    # 单次发往kafka的最大事件数
  44. logging.to_files: true   # 输出所有日志到file,默认true, 达到日志文件大小限制时,日志文件会自动限制替换,详细配置:https://www.cnblogs.com/qinwengang/p/10982424.html
  45. close_older: 30m         # 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h
  46. force_close_files: false # 这个选项关闭一个文件,当文件名称的变化。只在window建议为true
  47. # 没有新日志采集后多长时间关闭文件句柄,默认5分钟,设置成1分钟,加快文件句柄关闭
  48. close_inactive: 1m
  49. # 传输了3h后荏没有传输完成的话就强行关闭文件句柄,这个配置项是解决以上案例问题的key point
  50. close_timeout: 3h
  51. # 这个配置项也应该配置上,默认值是0表示不清理,不清理的意思是采集过的文件描述在registry文件里永不清理,在运行一段时间后,registry会变大,可能会带来问题
  52. clean_inactive: 72h
  53. # 设置了clean_inactive后就需要设置ignore_older,且要保证ignore_older < clean_inactive
  54. ignore_older: 70h
  55. # 限制 CPU和内存资源
  56. max_procs: 1 # 限制一个CPU核心,避免过多抢占业务资源
  57. queue.mem.events: 256 # 存储于内存队列的事件数,排队发送 (默认4096)
  58. queue.mem.flush.min_events: 128 # 小于 queue.mem.events ,增加此值可提高吞吐量 (默认值2048)
  59. # 启动 filebeat
  60. $ systemctl start filebeat

十一、部署 curator,定时清理es索引

logstash3 机器操作

  1. # 参考链接:https://www.elastic.co/guide/en/elasticsearch/client/curator/current/yum-repository.html
  2. # 安装 curator 服务,以 centos7 为例
  3. $ rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
  4. $ vim /etc/yum.repos.d/elk-curator-5.repo
  5. [curator-5]
  6. name=CentOS/RHEL 7 repository for Elasticsearch Curator 5.x packages
  7. baseurl=https://packages.elastic.co/curator/5/centos/7
  8. gpgcheck=1
  9. gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
  10. enabled=1
  11. $ yum install elasticsearch-curator -y
  12. # 创建 curator 配置文件目录与输出日志目录
  13. $ mkdir -p /data/ELKStack/curator/logs
  14. $ cd /data/ELKStack/curator
  15. $ vim config.yml
  16. ---
  17. # Remember, leave a key empty if there is no value.  None will be a string,
  18. # # not a Python "NoneType"
  19. client:
  20.   hosts: ["172.20.166.25""172.20.166.24""172.20.166.22""172.20.166.23""172.20.166.26"]
  21.   port: 9200
  22.   url_prefix:
  23.   use_ssl: False
  24.   certificate:
  25.   client_cert:
  26.   client_key:
  27.   ssl_no_validate: False
  28.   http_auth: elastic:elastic123
  29.   timeout: 150
  30.   master_only: False
  31. logging:
  32.   loglevel: INFO
  33.   logfile: /data/ELKStack/curator/logs/curator.log
  34.   logformat: default
  35.   blacklist: ['elasticsearch''urllib3']
  36. $ vim action.yml
  37. ---
  38. # Remember, leave a key empty if there is no value.  None will be a string,
  39. # not a Python "NoneType"
  40. #
  41. # Also remember that all examples have 'disable_action' set to True.  If you
  42. # want to use this action as a template, be sure to set this to False after
  43. # copying it.
  44. actions:
  45.   1:
  46.     action: delete_indices
  47.     description: >-
  48.       Delete indices older than 30 days. Ignore the error if the filter does not result in an actionable list of indices (ignore_empty_list) and exit cleanly.
  49.     options:
  50.       ignore_empty_list: True
  51.       disable_action: False
  52.     filters:
  53.     - filtertype: pattern
  54.       kind: regex
  55.       value: '^((?!(kibana|json|monitoring|metadata|apm|async|transform|siem|security)).)*$'
  56.     - filtertype: age
  57.       source: creation_date
  58.       direction: older
  59.       #timestring: '%Yi-%m-%d'
  60.       unit: days
  61.       unit_count: 30
  62.   2:
  63.     action: delete_indices
  64.     description: >-
  65.       Delete indices older than 15 days. Ignore the error if the filter does not result in an actionable list of indices (ignore_empty_list) and exit cleanly.
  66.     options:
  67.       ignore_empty_list: True
  68.       disable_action: False
  69.     filters:
  70.     - filtertype: pattern
  71.       kind: regex
  72.       value: '^(nginx-).*$'
  73.     - filtertype: age
  74.       source: creation_date
  75.       direction: older
  76.       #timestring: '%Yi-%m-%d'
  77.       unit: days
  78.       unit_count: 15
  79. # 设置定时任务清理es索引
  80. $ crontab -e
  81. 0 0 * * * /usr/bin/curator --config /data/ELKStack/curator/config.yml /data/ELKStack/curator/action.yml

十二、参考链接

  • es证书配置:https://cloud.tencent.com/developer/article/1549834

  • es忘记密码找回:https://www.cnblogs.com/woshimrf/p/docker-es7.html

  • es设置密码:https://blog.csdn.net/extraordinarylife/article/details/107917764?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242

  • elk-kafka部署 1:https://www.codenong.com/cs106056710/

  • elk-kafka部署 2:https://www.cnblogs.com/lz0925/p/12061293.html

  • elk优化:https://www.clxz.top/2020/06/19/elk-kafka-optimization/

  • es7索引分片:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

  • filebeat优化:https://www.jianshu.com/p/389702465461

  • kafka数据与日志清理:https://blog.csdn.net/VIP099/article/details/106257561

热门文章推荐

最后

  • 后台回复 【列表】,可获取本公众号所有文章列表

  • 欢迎您加我微信【ypxiaozhan01】,拉您进技术群,一起交流学习

  • 欢迎您关注【YP小站】,学习互联网最流行的技术,做个专业的技术人


  【文章让您有收获,????  或者 在看 支持我吧】
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/569450
推荐阅读
相关标签
  

闽ICP备14008679号