一、kafka的副本机制
由于Producer和Consumer都只会与Leader角色的分区副本相连,所以kafka需要以集群的组织形式提供主题下的消息高可用。kafka支持主备复制,所以消息具备高可用和持久性。
一个分区可以有多个副本,这些副本保存在不同的broker上。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Leader,再其他副本中选一个作为新的Leader。
在通常情况下,增加分区可以提供kafka集群的吞吐量。然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。
关于副本的更多信息,请参考链接:
https://ily.iteye.com/admin/blogs/2524579
二、概述
目前的kakfa集群有3个节点,server.properties 关于topic的配置为:
offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1
目前的设置为1个副本,这样不健全。如果有一台服务器挂掉了,那么就会造成数据丢失!
因此,需要将副本数改为3,也就是每台服务器都有一个副本,这样才是稳妥的!
三、动态扩容
kafka-topics.sh 不能用来增加副本因子replication-factor。实际应该使用kafka bin目录下面的kafka-reassign-partitions.sh
查看topic详情
首先查看kafka的所有topic
/kafka/bin/kafka-topics.sh --zookeeper zookeeper-1.default.svc.cluster.local:2181 --list
输出:
test ...
查看topic为test的详细信息
/kafka/bin/kafka-topics.sh --describe --zookeeper zookeeper-1.default.svc.cluster.local:2181 --topic test
输出:
Topic:test PartitionCount:3 ReplicationFactor:1 Configs: Topic: test Partition: 0 Leader: 1 Replicas: 1 Isr: 1 Topic: test Partition: 1 Leader: 2 Replicas: 2 Isr: 2 Topic: test Partition: 2 Leader: 3 Replicas: 3 Isr: 3
可以看到test的副本数为1
扩容副本
kafka-reassign-partitions.sh 执行时,依赖一个json文件。
创建 test.json
{ "version": 1, "partitions": [ { "topic": "test", "partition": 0, "replicas": [ 1, 2, 3 ] }, { "topic": "test", "partition": 1, "replicas": [ 1, 2, 3 ] }, { "topic": "test", "partition": 2, "replicas": [ 1, 2, 3 ] } ] }
注意:这个json文件和上面查看的test详情,是有关联的!否则会导致执行失败
关系图
正式执行脚本
/kafka/bin/kafka-reassign-partitions.sh --zookeeper zookeeper-1.default.svc.cluster.local:2181 --reassignment-json-file test.json --execute
参数解释:
--reassignment-json-file 带有分区的JSON文件
--execute 按规定启动重新分配通过---重新分配JSON文件选择权。
执行输出:
Current partition replica assignment {"version":1,"partitions":[{"topic":"test","partition":2,"replicas":[1],"log_dirs":["any"]},{"topic":"test","partition":1,"replicas":[3],"log_dirs":["any"]},{"topic":"test","partition":0,"replicas":[2],"log_dirs":["any"]}]}
出现 Successfully 表示成功了!
再次查看topic为test的partition详情
/kafka/bin/kafka-topics.sh --describe --zookeeper zookeeper-1.default.svc.cluster.local:2181 --topic test
输出:
Topic:test PartitionCount:3 ReplicationFactor:3 Configs: Topic: test Partition: 0 Leader: 2 Replicas: 1,2,3 Isr: 2,3,1 Topic: test Partition: 1 Leader: 3 Replicas: 1,2,3 Isr: 3,1,2 Topic: test Partition: 2 Leader: 1 Replicas: 1,2,3 Isr: 1,3,2
可以发现,副本已经改为3了!
默认配置
在java代码或者python代码中,是直接发送生产者消息。topic的名字是动态生成的(当kafka发现topic不存在时,会自动创建),那么它的partitions和replication-factor的数量是由服务端决定的
因为kafka集群有3个节点,所有需要改成3个
offsets.topic.replication.factor=3 transaction.state.log.replication.factor=3 transaction.state.log.min.isr=3
num.partitions=1
default.replication.factor=3
参数解释:
offsets.topic.replication.factor 用于配置offset记录的topic的partition的副本个数
transaction.state.log.replication.factor 事务主题的复制因子
transaction.state.log.min.isr 覆盖事务主题的min.insync.replicas配置
num.partitions 新建Topic时默认的分区数
default.replication.factor 自动创建topic时的默认副本的个数
注意:这些参数,设置得更高以确保高可用性!
其中 default.replication.factor 是真正决定,topi的副本数量的
关于kafka配置文件的更多解释,请参考链接:
https://blog.csdn.net/memoordit/article/details/78850086
那么默认参数,如何测试呢?
很简单,由于在应用代码,是不会主动创建topic的,由kafka集群自动创建topic。
那么由代码进行一次,生产者和消费者,就可以了!
Python测试
这个脚本是普通版的kafka消息测试,没有ACL配置!
test.py
这里指定的topic为 test_xxx
执行Python脚本,然后到服务器上面,查看topic为test_xxx的详细信息
/kafka/bin/kafka-topics.sh --describe --zookeeper zookeeper-1.default.svc.cluster.local:2181 --topic test_xxx
输出如下:
Topic:test_xxx PartitionCount:3 ReplicationFactor:3 Configs: Topic: test_xxx Partition: 0 Leader: 2 Replicas: 1,2,3 Isr: 2,3,1 Topic: test_xxx Partition: 1 Leader: 3 Replicas: 1,2,3 Isr: 3,1,2 Topic: test_xxx Partition: 2 Leader: 1 Replicas: 1,2,3 Isr: 1,3,2
可以发现副本为3,说明默认配置生效了!
相关推荐
SUSE 12 gcc-c++ 离线安装 虚拟机系统:Linux version 3.12.49-11-default (geeko@buildhost) (gcc version 4.8.5 (SUSE Linux) ) #1 SMP Wed Nov 11 20:52:43 UTC 2015 (8d714a0)
在Ubuntu系统中,为了实现多台虚拟机之间的文件共享,我们常常会采用网络文件系统(NFS)。NFS是一种协议,允许一个系统(服务器)通过网络共享目录给其他系统(客户端),使得它们能够像访问本地文件一样访问远程...
在Ubuntu这样的Linux发行版中,QEMU可以方便地用于创建和管理虚拟机。 离线安装QEMU通常适用于没有网络连接或者网络环境受限的情况。以下是一个详细的离线安装步骤: 1. **下载QEMU离线安装包**:首先,你需要在有...
【基于Ubuntu下Yolov5的目标识别】保姆级教程 | 虚拟机安装 - Ubuntu安装 - 环境配置(Anaconda/Pytorch/Vscode/Yolov5) |全过程图文by.Akaxi 全文8686字102图 包含YoloV5源码
VMware虚拟机安装-Ubuntu配置VScode开发环境.md
cloud-init离线安装包,包含所有rpm包,完全可以离线安装。因私有云环境不一定可以访问外网,特提供本安装包。 cloud-init是专为云环境中虚拟机的初始化而开发的工具,它从各种数据源读取相关数据并据此对虚拟机进行...
虚拟机 VMware - 安装详细步骤(保姆级教程)虚拟机 VMware - 安装详细步骤(保姆级教程)虚拟机 VMware - 安装详细步骤(保姆级教程)虚拟机 VMware - 安装详细步骤(保姆级教程)虚拟机 VMware - 安装详细步骤(保姆级教程)...
VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机...
1.open-vm-tools_12.1.5-3~ubuntu0.22.04.4_amd64.deb 2.open-vm-tools-desktop_12.1.5-3~ubuntu0.22.04.4_amd64.deb 3.libmspack0_0.10.1-2_amd64.deb 4.libxmlsec1-openssl_1.2.33-1build2_amd64.deb
在Ubuntu 20.04系统中离线安装GCC 9.3.0是一个具有挑战性的任务,因为通常我们依赖于apt-get或者apt等包管理器在线获取并安装软件及其依赖。然而,在没有网络连接或者网络环境受限的情况下,我们需要提前准备所有...
虚拟机nfs离线安装包,下载之后依次按照解压出来的安装包进行安装
离线安装字体是不依赖网络的一种方法,尤其适用于没有网络连接或者网络环境不稳定的情况。下面将详细介绍如何在Linux系统中离线安装字体以及相关的命令行操作。 首先,你需要下载所需的字体文件,通常字体文件的...
安装VMWare软件和虚拟机ubuntu-基于14.04.zip
在Ubuntu操作系统上安装g++是开发C++程序的第一步。本教程将详细指导如何在Ubuntu 14.04及更高版本上安装g++ 4.4,这是一个基础且重要的版本,对于许多早期的C++项目依然适用。 首先,打开终端(Terminal)以便执行...
本教程将详细介绍如何在Ubuntu 14.04上进行Docker的离线安装。 首先,我们需要了解Docker的基础知识。Docker基于Google的golang语言编写,它通过容器技术实现了轻量级的隔离,使得每个应用都在自己的环境中运行,...
本文将详细介绍如何在基于飞腾处理器的系统上,结合麒麟V10 SP1操作系统,进行离线安装OpenJDK 8并调试MariaDB,同时涉及与openssl 1.0.0 arm64版本的安装。 首先,让我们关注"飞腾+麒麟V10sp1-离线安装openjdk8"这...
这个"getLoader离线包"是针对Cobbler 2.8.5 版本的一个工具,用于在没有互联网连接的情况下进行Cobbler的安装和配置。 在离线环境中,通常需要预先下载所有必要的软件包和依赖,以便在目标系统上进行安装。...
### SNMP在CentOS 7上离线安装及配置详解 #### 一、概述 在网络管理领域,简单网络管理协议(SNMP)是一种广泛使用的标准协议,用于收集和组织网络管理信息,并更改网络设备的配置。本文档将详细介绍如何在CentOS 7...
网络上没有一篇文章是如此详细描述了安装MAC虚拟机到Delphi XE进行IOS开发的 MAC虚拟机安装 ----> MAC系统升级 ---->VMWare Tools安装 ---->获取证书 ---->加载开发者设备 ---->下载安装XCode ---->Delphi XE...
### 虚拟机下安装Ubuntu的关键知识点 #### 一、虚拟机软件的选择与安装 - **软件选择**:本文选择了VMware Workstation作为虚拟化工具。它是一款广泛使用的虚拟机软件,支持多种操作系统,包括Linux发行版如Ubuntu...