Ansible + Docker 部署 Apache Kafka 3.9 集群

news/2025/9/25 18:34:02/文章来源:https://www.cnblogs.com/dataverse/p/19111753

Ansible + Docker 部署 Apache Kafka 3.9 集群

1. 准备工作

1.2 主机列表

IP 主机名 内存(GB) CPU核数 磁盘 操作系统 CPU 架构
10.0.0.13 arc-pro-dc01 my.registry.com 16 1 500GB CentOS 7.9.2009 x86_64
10.0.0.14 arc-pro-dc02 16 1 500GB CentOS 7.9.2009 x86_64
10.0.0.15 arc-pro-dc03 16 1 500GB CentOS 7.9.2009 x86_64

1.3 已安装服务

版本 arc-pro-dc01 arc-pro-dc02 arc-pro-dc03
Ansible 2.9.27
Harbor v2.13.2
Docker 28.1.1
Docker Compose v2.39.2

说明:

  • 每个服务器的 IP 均是静态的
  • 每个服务器的防火墙都已关闭
  • 每个服务器的 SELINUX 已经禁用
  • 每个服务器均存在一个管理员用户 admin,该用户可以免密码执行 sudo 命令;
  • 在 arc-pro-dc01 机器上,可以使用 admin 用户免密码 ssh 到其他机器;
  • 服务器之间的时间同步;
  • 所有操作均使用 admin 用户完成,Kafka 集群的所属用户为 admin;
  • 私有镜像仓库地址:https://my.registry.com:10443。

为使集群满足以上要求,参考下列文章进行配置:

  • 使用 VMware Workstation 安装 CentOS-7 虚拟机
  • 用 Ansible 批量完成 CentOS 7 操作系统基础配置
  • 使用 Ansible 批量安装 Docker
  • Docker 私有镜像仓库 Harbor 安装部署带签名认证

1.3 Kafka 集群规划

版本 arc-pro-dc01 arc-pro-dc02 arc-pro-dc03
Kafka 3.9.1 Kafka Broker Kafka Broker Kafka Broker

1.4 镜像准备

找一个可以连接互联网的、已经安装了 docker 的服务器,下载镜像

docker pull apache/kafka:3.9.1
docker image save apache/kafka:3.9.1 -o kafka.3.9.1.tar.gz

将 kafka.3.9.1.tar.gz 上传到本集群任意一台服务器,导入镜像:

docker load -i kafka.3.9.1.tar.gz
docker tag apache/kafka:3.9.1 my.registry.com:10443/library/apache/kafka:3.9.1
# 上传到私服
docker push my.registry.com:10443/library/apache/kafka:3.9.1

2. Ansible 文件

2.1 Ansible 目录结构

说明:在 arc-pro-dc01 机器上,执行 ansible 命令的基础目录为 /home/admin/ansible

$ tree /home/admin/ansible/
/home/admin/ansible/
├── ansible.cfg
├── hosts
└── kafka├── docker-compose.yml.j2└── start-kafka-container.yml

2.2 ansible.cfg

[defaults]
inventory=./hosts
host_key_checking=False

2.3 hosts

[kafka]
arc-pro-dc01 broker_id=1
arc-pro-dc02 broker_id=2
arc-pro-dc03 broker_id=3

2.4 docker-compose.yml.j2

services:kafka:image: my.registry.com:10443/library/apache/kafka:3.9.1restart: unless-stoppedcontainer_name: kafkahostname: {{ inventory_hostname }}network_mode: hostenvironment:KAFKA_NODE_ID: {{ broker_id }}KAFKA_PROCESS_ROLES: broker,controllerKAFKA_LISTENERS: PLAINTEXT://{{ inventory_hostname }}:9092,CONTROLLER://{{ inventory_hostname }}:9093KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://{{ inventory_hostname }}:9092,CONTROLLER://{{ inventory_hostname }}:9093KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXTKAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLERKAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXTKAFKA_CONTROLLER_QUORUM_VOTERS: >-{% for host in groups['kafka'] -%}{{ hostvars[host]['broker_id'] }}@{{ host }}:9093{% if not loop.last %},{% endif %}{%- endfor %}KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 3000KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2KAFKA_NUM_PARTITIONS: 3KAFKA_LOG_DIRS: /var/lib/kafka/datavolumes:- {{ kafka_data_dir }}:/var/lib/kafka/data- {{ kafka_log_dir }}:/opt/kafka/logs- {{ kafka_conf_dir }}:/opt/kafka/config

2.4 start-kafka-container.yml

---
- name: Start Kafka Containerhosts: kafkabecome: truegather_facts: falsevars:kafka_owner: adminkafka_group: admincompose_file_dir: /opt/app/kafkakafka_conf_dir: /etc/kafkakafka_log_dir:  /data/kafka/logskafka_data_dir: /data/kafka/datatasks:- name: Remove old kafka container if existscommand: docker rm -f kafkaignore_errors: true- name: Remove kafka directories if they existfile:path: "{{ item }}"state: absentloop:- "{{ compose_file_dir }}"- "{{ kafka_conf_dir }}"- "{{ kafka_log_dir }}"- "{{ kafka_data_dir }}"- name: Create kafka directoriesfile:path: "{{ item }}"state: directoryowner: "{{ kafka_owner }}"group: "{{ kafka_group }}"mode: '0755'loop:- "{{ compose_file_dir }}"- "{{ kafka_conf_dir }}"- "{{ kafka_log_dir }}"- "{{ kafka_data_dir }}"- name: Deploy docker-compose.ymltemplate:src: docker-compose.yml.j2dest: "{{ compose_file_dir }}/docker-compose.yml"owner: "{{ kafka_owner }}"group: "{{ kafka_group }}"mode: '0644'- name: Start kafka containercommand: docker-compose -f {{ compose_file_dir }}/docker-compose.yml up -d

3. 部署

在 Ansible (arc-pro-dc01) 管理机执行

$ pwd
/home/admin/ansible$ ansible-playbook kafka/start-kafka-container.yml

4. 测试

[admin@arc-pro-dc01 ~]$ docker exec kafka \/opt/kafka/bin/kafka-topics.sh \--bootstrap-server arc-pro-dc01:9092,arc-pro-dc02:9092,arc-pro-dc03:9092 \--topic test-topic \--partitions 3 \--replication-factor 2 \--create
Created topic test-topic.# 查看每台服务器的数据目录
[admin@arc-pro-dc01 ~]$ ll /data/kafka/data | grep test-topic
drwxr-xr-x 2 admin admin 167 Sep 25 18:05 test-topic-0
drwxr-xr-x 2 admin admin 167 Sep 25 18:05 test-topic-2
[admin@arc-pro-dc02 ~]$ ll /data/kafka/data | grep test-topic
drwxr-xr-x 2 admin admin 167 Sep 25 18:05 test-topic-0
drwxr-xr-x 2 admin admin 167 Sep 25 18:05 test-topic-1
[admin@arc-pro-dc03 ~]$ ll /data/kafka/data | grep test-topic
drwxr-xr-x 2 admin admin 167 Sep 25 18:05 test-topic-1
drwxr-xr-x 2 admin admin 167 Sep 25 18:05 test-topic-2[admin@arc-pro-dc02 ~]$ docker exec kafka \/opt/kafka/bin/kafka-console-consumer.sh \--bootstrap-server arc-pro-dc01:9092,arc-pro-dc02:9092,arc-pro-dc03:9092 \--topic test-topic \--from-beginning[admin@arc-pro-dc03 ~]$ docker exec --workdir /opt/kafka/bin/ -it kafka sh
/opt/kafka/bin $ ./kafka-console-producer.sh \--bootstrap-server arc-pro-dc01:9092,arc-pro-dc02:9092,arc-pro-dc03:9092 \--topic test-topic>hello# arc-pro-dc02 的终端输出 hello

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解一波JVM内存模型

深入了解一波JVM内存模型 JDK体系结构与跨平台特性介绍通过官方的结构图看出,JVM提供底层的平台支持,JRE提供运行环境所必须的类,在这个基础上去跑我们的java程序。JVM为我们屏蔽了操作系统的差异性,使java程序得以…

完整教程:K230基础-PWM控制介绍及应用

完整教程:K230基础-PWM控制介绍及应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

什么是UDFScript用户自定义脚本

本文分享自天翼云开发者社区《什么是UDFScript用户自定义脚本》.作者:郭****迎 UDFScript介绍 用户自定义脚本(User Defined Script,简称UDFScript)是一个可供您快速实现CDN定制化配置的工具箱,当CDN的标准配置无…

高端网站设计中的微交互:细节如何决定用户体验

高端网站设计中的微交互:细节如何决定用户体验在高端网站设计的语境下,“视觉审美”已经不再是唯一的竞争点。真正能打动用户、建立长期信任的,是那些嵌入在每一次操作、点击、过渡中的细节优化。微交互(Microinte…

合肥建设干部学校网站首页凡科 做网站

[原创]好买财富接口测试自动化实践

安徽建设工程信息网站广西建设工程协会网站

项目hbase数据库出现很诡异的assignment ,region移动的src和dest都是同一台regionserver,不过时间戳不同,启动的只有一个regionserver, 不知道怎么出现了两个时间戳 分析下源码解决一下 loadbalance只有一个实现 org.apache.hado…

软件开发公司如何通过 UI 设计服务打造差异化竞争力

软件开发公司如何通过 UI 设计服务打造差异化竞争力在数字化浪潮推动下,软件开发行业的竞争越来越激烈。功能上的差异化正逐渐缩小,技术壁垒也因开源生态与低代码平台而降低。在这种背景下,UI设计服务逐渐成为软件开…

CCPC2024-Zhengzhou G Same Sum(线段树)

CCPC2024-Zhengzhou G Same Sum 给一个序列。两种操作:区间加;查询一个偶数长区间,其中的值是否可以两两配对得到和相等。首先知道区间内的值两两配对得到的相等的和值为区间的平均数 m 。 可以转化为,这个区间的值…

短剧小程序开发全攻略:从技术选型到核心实现(前端+后端+运营干货) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Openwrt-DDNS 配置详解

在家庭或小型办公网络环境中,我们通常使用的是动态IP地址,这意味着每次重新连接互联网时,ISP可能会分配一个新的IP地址。这对于需要远程访问家庭网络中的设备(如NAS、监控摄像头或自建服务器)的用户来说是个问题。…

实用指南:Metal - 2. 3D 模型深度解析

实用指南:Metal - 2. 3D 模型深度解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

【2025.9.16】关于举办PostgreSQL数据库管理人才研修与评测班的通知

证书实图考核通过后,由工信部人才交流中心颁发证书,并纳入工信人才数据库 报名方式工信部人才交流中心组织的PostgreSQL认证,从2021起已经运营四年多时间,且获得行业高度认可,人大金仓、金蝶集团、迪思杰、用友、…

Java锁相关问题

1.Java中有那些锁,区别是什么 1.java中的锁主要分为乐观锁和悲观锁,其中CAS是乐观锁,synchronized、Lock是悲观锁。2.乐观锁认为我在操作的时候不会有其余的线程竞争,如果有竞争就自旋等待(CAS)或异常结束(数据…

CDN中使用边缘函数实现自定义编程

本文分享自天翼云开发者社区《CDN中使用边缘函数实现自定义编程》.作者:郭****迎 为什么选择边缘函数千人千面,个性化定制,源站计算成本高: 企业网站为了提升用户转化率,往往需要在源站服务器根据用户历史数据,计…

第一次课程中的所有动手动脑的问题以及课后实验性的问题

第一次课程中的所有动手动脑的问题以及课后实验性的问题 (我将其以压缩包的形式上传到了博客的文件中) https://files.cnblogs.com/files/blogs/848082/第一次课程.zip?t=1758794756&download=true (一)枚举类…

敏捷开发的几个阶段

目录阶段1:认知启蒙期(入门)——“知道敏捷是什么”阶段特征:阶段2:实践落地期(初级)——“能用敏捷做项目”阶段特征:阶段3:问题优化期(中级)——“能解决敏捷中的坑”阶段特征:阶段4:体系化期(高级)—…

公司网站开发怎么做账wordpress更新网站内容

python脚本查找文件是否存在的方法:1、使用os模块os模块中的os.path.exists()方法用于检验文件是否存在。判断文件是否存在import osos.path.exists(test_file.txt)#Trueos.path.exists(no_exist_file.txt)#False2、使用Try语句可以在程序中直接使用open()方法来检查…

网站建设一年600js做的网站

java微服务面试题 Q:为什么要用微服务?微服务有哪些优势? 单体应用把所有功能都堆放在一起,改动影响大,风险高。 微服务具有以下优势: 针对特定服务发布,影响小,风险小,成本低。 频…

青岛seo网站建设公司软件网页制作

面向对象编程特征:抽象化,讲究对象,集成,封装,多态。 类:一类事物,苹果,梨,香蕉都是水果,都是一类。 类的特征:构造函数,字段属性和方…

实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程

实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…