首页 > 其他分享 >docker搭建zookeeper、kafka集群

docker搭建zookeeper、kafka集群

时间:2023-01-10 14:01:35浏览次数:58  
标签:0.0 zookeeper 9092 KAFKA 2181 docker kafka

docker搭建zookeeper、kafka

安装kafka

1. 先安装zookeeper , 因为 kafka 依赖 zookeeper, 虽然目前3.0 kafka已准备抛弃zk, 不过暂不推荐在生成环境使用

docker pull bitnami/zookeeper:3.7

docker run -d --name zookeeper \
-p 2181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes \
-v /Users/eternity/tool/zookeeper/zk/data:/data \
-v /Users/eternity/tool/zookeeper/zk/datalog:/datalog \
-v /Users/eternity/tool/zookeeper/zk/logs:/logs \
-v /etc/localtime:/etc/localtime \
bitnami/zookeeper:3.7

参数说明

  1. -p 2181:2181 zk的2181端口映射为2181端口
  2. -v /etc/localtime:/etc/localtime 容器时间同步主机时间 , 其他-v为把 /data /datalog /logs 映射到主机对应的目录

2. 安装kafka

docker pull bitnami/kafka:3.2.0

docker run -d --restart=always  --name kafka1 \
-p 9092:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.3.12:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.12:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
bitnami/kafka:3.2.0

参数说明

  1. -p 9092:9092 kafka的 9092 端口映射为 9092 端口
  2. -e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka用BROKER_ID来区分自己 , 如需配置kafka集群可 修改此id 和 上述 冒号前的9092 端口号映射即可部署集群
  3. -e KAFKA_ZOOKEEPER_CONNECT=192.168.3.12:2181 配置zookeeper连接地址
  4. -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.12:9092 把kafka的地址注册给zookeeper,如果是远程访问要改成外网IP,否则可能出现无法连接
  5. -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
  6. -v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间

另外两台的部署

docker run -d --restart=always  --name kafka2 \
-p 9093:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.3.12:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.12:9093 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
bitnami/kafka:3.2.0

docker run -d --restart=always  --name kafka3 \
-p 9094:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_BROKER_ID=2 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.3.12:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.12:9094 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
bitnami/kafka:3.2.0

3. 消息发送 / 消费 测试

3.1 进入kafka容器

$ docker exec -it kafka1 bash

3.2 进入 bin 目录

$ cd /opt/kafka/bin

3.3 发送消息

> ./kafka-console-producer.sh --broker-list localhost:9092 --topic test_topic

3.4 消费消息

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_topic --from-beginning

docker-compose搭建zookeeper、kafka集群

1.前提配置,在/etc/hosts中进行配置,域名映射

192.168.3.12 zoo
192.168.3.12 zoo1
192.168.3.12 zoo2
192.168.3.12 zoo3

zookeeper的docker-compose配置文件,zookeeper.yml

version: '3.1'

services:
  zk1:
    image: 'zookeeper:3.7'
    restart: always
    hostname: zoo1
    container_name: zk1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

  zk2:
    image: 'zookeeper:3.7'
    restart: always
    hostname: zoo2
    container_name: zk2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

  zk3:
    image: 'zookeeper:3.7'
    restart: always
    hostname: zoo3
    container_name: zk3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

1、version: 版本号

  • 一般来说,和你的 Docker Engine 的版本相匹配;

  • 因为我的 Docker Engine 的版本是 20.10.5,因此我选择 3;

    点击阅读官方文档 了解版本号

2、image: 镜像版本

  • 默认使用的是latest版本,可缺省;

3、ZOO_MY_ID(环境变量):

  • 该id在集群中必须是唯一的,并且其值应介于1和255之间;
  • 请注意,如果使用已包含 myid 文件的 /data 目录启动容器,则此变量将不会产生任何影响。相当于你在zoo.cfg中指定的dataDir目录中创建文件myid,并且文件的内容就是范围为1到255的整数;

4、ZOO_SERVERS(环境变量):

  • 此变量允许您指定Zookeeper集群的计算机列表;

  • 每个条目都应该这样指定:

    server.id=<address1>:<port1>:<port2>[:role];[<client port address>:]<client port>
    
    • id 是一个数字,表示集群中的服务器ID;
    • address1表示这个服务器的ip地址;
    • 集群通信端⼝: port1 表示这个服务器与集群中的 Leader 服务器交换信息的端口;
    • 集群选举端⼝: port2 表示万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口;
    • role: 默认是 participant,即参与过半机制的⻆⾊,选举,事务请求过半提交,还有⼀个是observer, 观察者,不参与选举以及过半机制。
    • client port address 是可选的,如果未指定,则默认为 “0.0.0.0” ;
    • client port 位于分号的右侧。从3.5.0开始,zoo.cfg中不再使用clientPort和clientPortAddress配置参数。作为替代,client port 用来表示客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个
      端口,接受客户端的访问请求。
  • 请注意,如果使用已包含zoo.cfg文件的/conf目录启动容器,则此变量不会产生任何影响。换句话说,zoo.cfg文件中包含集群的计算机列表,此时该环境变量不生效。

2. 启动集群

打开命令行提示符,进入 docker-compose.yml 所在的目录,接着执行

docker-compose -f docker-compose.yml up -d

最后检查一下运行情况:

docker ps

如图所示,容器 zoo1,zoo2,zoo3 都在运行中。

3. 检测集群状态

检测集群状态的命令是 zkServer.sh status /conf/zoo.cfg。使用该命令的前提是要先登入容器中,可以使用 docker exec -it zoo1 bash 登入 zoo1 中。

4. ZooKeeper 集群角色介绍

Zookeeper 集群模式⼀共有三种类型的⻆⾊:

角色 职责
Leader 处理所有的事务请求(写请求),可以处理读请求,集群中只能有⼀个Leader
Follower 只能处理读请求,同时作为 Leader的候选节点,即如果Leader宕机,Follower节点要参与到新的Leader选举中,有可能成为新的Leader节点。
Observer 只能处理读请求。不能参与选举

5. 不宕机动态扩容和缩容

ZooKeeper 支持通过修改 zoo.cfg 并重启来改变ZooKeeper集群中的服务器 阅读,但是这种方式,不是很方便,上线一台服务器或者下线一台服务器需要对所有的服务器进行重启。

ZooKeeper 3.5.0 提供了⽀持动态扩容/缩容的 新特性。但是通过客户端 API可以变更服务端集群状态是件很危险的事情,所以在ZooKeeper 3.5.3 版本要⽤动态配置,需要开启超级管理员身份验证模式 ACLs。

关于ZooKeeper的ACL权限控制,可以 点击此处阅读

Step1: 我为 super:qwer1234 生成了 digest 为 super:YjJhp1/a1jnzeGTDN7nAUxFcep8=

Step2: docker-compose -f docker-compose.yml down 停掉并删除原来的容器;

Step3: 修改 docker-compose.yml 的内容,在environment下额外添加:

environment:  
  ZOO_CFG_EXTRA: "reconfigEnabled=true"
  JVMFLAGS: "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:YjJhp1/a1jnzeGTDN7nAUxFcep8="
  • ZOO_CFG_EXTRA: "reconfigEnabled=true" 开启了默认关闭的客户端 reconfig API
  • JVMFLAGS: "-Dzookeeper.DigestAuthenticationProvider.superDigest=super:YjJhp1/a1jnzeGTDN7nAUxFcep8=" 设置了超级管理员账号为 super,明文密码为 qwer1234

Step4: 重启集群
docker-compose.yml 所在目录执行以下命令:

docker-compose -f docker-compose.yml up -d

Step5: 登录客户端

接下来就是使用ZooKeeper客户端的reconfig命令了。

5.1 查看当前集群信息

get /zookeeper/config

执行结果如下:

[zk: localhost:2181(CONNECTED) 0] get /zookeeper/config
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.3=zoo3:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=0

5.2 扩缩容前的认证超级管理员身份

addauth digest super:qwer1234

5.3 移除集群中的一台服务器

reconfig -remove <id>

比如说,从集群中移除ID为3的ZooKeeper服务:

[zk: localhost:2181(CONNECTED) 2] reconfig -remove 3
Committed new configuration:
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=100000003

5.4 为集群新增一台服务器

reconfig -add server.id=<address1>:<port1>:<port2>[:role];[<client port address>:]<client port>

比如说,把刚才移除的服务器再添加回来:

[zk: localhost:2181(CONNECTED) 3] reconfig -add server.3=zoo3:2888:3888;2181
Committed new configuration:
server.1=zoo1:2888:3888:participant;0.0.0.0:2181
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.3=zoo3:2888:3888:participant;0.0.0.0:2181
server.4=zoo4:2888:3888:participant;0.0.0.0:2181
version=100000004

6. 过半机制

participant ⻆⾊能够形成集群(过半机制),如果集群内的 participant 有一半及以上都宕机了,此时客户端将不再可用。

https://www.cnblogs.com/kendoziyu/p/15012631.html

https://blog.csdn.net/qq_25955145/article/details/125945635

kafka集群

version: '2'

services:
  k1:
    image: 'bitnami/kafka:3.2.0'
    restart: always
    container_name: k1
    ports:
      - 9096:9092
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_BROKER_ID=1
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://zoo:9096
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092

  k2:
    image: 'bitnami/kafka:3.2.0'
    restart: always
    container_name: k2
    ports:
      - 9097:9092
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_BROKER_ID=2
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://zoo:9097
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092

  k3:
    image: 'bitnami/kafka:3.2.0'
    restart: always
    container_name: k3
    ports:
      - 9098:9092
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2182,zoo3:2183
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_BROKER_ID=3
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://zoo:9098
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092

标签:0.0,zookeeper,9092,KAFKA,2181,docker,kafka
From: https://www.cnblogs.com/eternityz/p/17040113.html

相关文章

  • Docker系列(4)--Docker上基于Centos部署自定义Tomcat环境
    一、实验环境:[root@docker1tomcat9]#cat/etc/redhat-releaseCentOSLinuxrelease7.7.1908(Core)[root@docker1tomcat9]#uname-r3.10.0-1062.el7.x86_64二、实验准......
  • Docker基础知识 (23) - 使用 Docker 部署 Nginx + Php/Laravel + MariaDB 项目 (2) -
    本文在“Docker基础知识(12)-使用Docker部署Nginx+Php/Laravel+MariaDB项目”基础上,修改Nginx的配置文件和docker-compose.yml,配置phpMyAdmin目录密码保......
  • docker启动elasticsearch和kibana
    首先执行通过docker将以下镜像进行拉取:dockerpullelasticsearch:7.4.2用于存储和检索数据(版本可以自定义,两者版本需要统一)dockerpullkibana:7.4.2用于可视化检索数......
  • docker安装mysql
    搜索镜像名字dockersearchmysql 在网页端搜索版本列表:https://hub.docker.com/  点击标题,在下面选出需要的版本号拉取镜像 dockerpullmysql:8.0 ......
  • NetCore 集成 Kafka 基本使用
    .NetCore集成Kafka基本使用我们先部署Kafka的镜像可参考DockerHub我们这里直接创建一个docker-compose.yml文件创建以后执行docker-composeup-dversion:'3......
  • 处理docker中中文显示方框问题
    docker中使用aspose-words来天赐数据,然后生成pdf,本地测试没有问题,发布到测试服务器docker中,中文就变成了方框。这种情况一般都是字体缺失造成的。把字体拷贝到文件夹fonts......
  • 第8章 ZooKeeper操作
    目录​8.1集群环境搭建​​​1.上传ZooKeeper安装文件​​​​2.编写配置文件​​​​3.拷贝ZooKeeper安装信息到其它节点​​​​4.修改其它节点配置​​​​5.启动ZooKe......
  • ZooKeeper核心概念和架构
    ZooKeeper简介ZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题。它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监......
  • Jenkins+Docker 实现一键自动化部署项目!
    博主分享的非常好:https://mp.weixin.qq.com/s/a0JOuiqLsUMcQSEjZ4uGTg 本文章实现最简单全面的Jenkins+docker+springboot一键自动部署项目,步骤齐全,少走坑路。环境:cen......
  • mysql 安装部署(Docker - Centos7)
    mysql安装部署(Docker-Centos7) 1.下载镜像                    参考:https://blog.csdn.net/weixin_43830765/article/det......