Docker极简部署Kafka+Zookeeper+ElasticStack

理论上此配置支持ElasticStack 7.x所有版本

本文对应博客园:https://www.cnblogs.com/hellxz/p/quick-deploy-kafka-elk.html

测试环境

  • Ubuntu 18.04 LTS
  • Docker 18.09.7
  • docker-compose 1.24.0
  • 主机IP:192.168.87.139
  • ElasticStack 7.5.2

端口号占用表

服务名称 默认端口号
elasticsearch 9200
logstash 9600
kibana 5601
zookeeper 2181
kafka 9090
kafka-manager 9001(防止与cerebro冲突)

以上端口号本来想再提供自定义配置到 .env 文件中的,有过度设计的嫌疑,所以就不放上去了

部署ElasticStack的主机的配置

为ES修改内存限制

$ sudo vim /etc/security/limits.conf
#添加如下内容并保存退出
* soft memlock unlimited
* hard memlock unlimited

修改系统限制文件打开数、线程数等

$ sudo vim /etc/systemd/system.conf
#最下方添加,参数值可以更大些
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity

重启主机执行命令systemctl daemon-reexec

修改vm.map计数的操作系统限制 并 禁用swap

$ sudo vim /etc/sysctl.conf
#添加如下内容,如有配置,请修改
vm.max_map_count=262144
vm.swappiness=0
#保存退出
$ sudo sysctl -p
#立即永久生效

有兴趣的可以写Shell脚本自动配置,本人觉得这些配置最好还是对系统管理员或部署人员可见为好

Clone 仓库到本地

git clone https://github.com/hellxz/QuickDeployElasticStack.git
cd QuickDeployElasticStack

文件结构如下

.
├── docker-compose.yml
├── .env
├── logstash-pipeline
│   └── logstash.conf
└── README.md

修改配置文件.env

按需修改.env文件

#docker-compose.yml引用变量,便于单机部署ElasticStack
#Author: Hellxz

#=========================== 宿主机 配置项 ===================================
#宿主机ip
LOCALHOST_IP=192.168.87.139

#=========================== ElasticStack 共用配置 ===========================
#ELK Docker镜像版本号
ELASTIC_STACK_VERSION=7.5.2

#=========================== Elasticsearch 配置项 ============================
#Elastsearch JVM设置, Xms与Xmx保持相同,最大不要超过32G
ES_JVM_OPTS=-Xms8g -Xmx8g

#Elastsearch数据持载目录与日志目录,需要映射到主机上
ES_DATA_DIR=/data/elk/es-data
ES_LOGS_DIR=/data/elk/es-logs

#=========================== Logstash 配置项 =================================
#Logstash 流水线工作线程数
LOGSTASH_PIPELINE_WORKERS=5

#Logstash JVM设置
LS_JAVA_OPTS=-Xms4g -Xmx4g

#=========================== Kafka 配置项 ====================================
#Kafka主机名
#外部访问kafka时,只需将客户端主机hosts添加Kafka宿主机ip与此主机名的映射
#例如,"10.2.6.63 kafka1"
KAFKA_HOSTNAME=kafka1

#Kafka数据目录
KAFKA_DATA_DIR=/data/elk/kafka-data

#Kafka JVM设置
KAFKA_JVM_OPTS=-Xms4g -Xmx4g

#Kafka启动时创建的Topics
#格式为"topic名称:分区数:副本数[:清理策略]", 多个topic以','分开
KAFKA_BOOTSTRAP_CREATE_TOPICS=logsTopic:5:1:compact

#=========================== KafkaManager 配置项 =============================
#自定义KafkaManager端口号
KAFKA_MANAGER_PORT=9001

#============================ 自定义参数 =====================================

修改logstash-pipeline/logstash.conf

input {
  kafka {
    bootstrap_servers => "kafka1:9090" #替换为kafka映射hosts名称
    topics => ["logsTopic"]
    consumer_threads => 3
    group_id => "logstash"
    decorate_events => true
    codec => json
  }
}

filter {
	#这里留给大家自由发挥
}

output {
  elasticsearch {
    hosts => ["192.168.87.139:9200"] #es地址
    index => "logs-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
  stdout {
    codec => rubydebug
  }
}

快速部署

配置完前边的部分后,只需要在docker-compose.yml的文件夹下执行一行命令即可启动

docker-compose up -d

部署后修改配置

部署后修改配置的问题再所难免,处理也较简单

修改 docker-compose.yml 的话,执行部署命令会检测变更

docker-compose up -d

非上述文件的话,需要判断变动配置会影响哪些容器,如:

  • Kafka依赖Zookeeper

  • Logstash依赖Es与Kafka

  • Kibana依赖Es

分别按依赖关系重启容器即可(被依赖的如果变动需要先重启)不被依赖的直接重启

docker restart 容器ID或Name