假如Kafka集群中一个broker宕机无法恢复, 应该如何处理?

今天面试时遇到这个问题, 网上资料说添加新的broker, 是不会自动同步旧数据的.

笨办法

环境介绍

三个broker的集群, zk,kafka装在一起

  1. | broker | IP | broker.id |
  2. |---------|---------------|-----------|
  3. | broker1 | 172.18.12.211 | 211 |
  4. | broker2 | 172.18.12.212 | 212 |
  5. | broker3 | 172.18.12.213 | 213 |

创建测试topic

  1. #./bin/kafka-topics.sh --zookeeper 172.18.12.212:2181 --create --topic test1 --replication-factor 3 --partitions 1
  2. Created topic "test1".

查看

  1. #./bin/kafka-topics.sh --zookeeper 172.18.12.212:2181 --describe --topic test1
  2. Topic:test1 PartitionCount:1 ReplicationFactor:3 Configs:
  3. Topic: test1 Partition: 0 Leader: 213 Replicas: 213,212,211 Isr: 213,212,211

注意当前

Replicas: 213,212,211

Isr: 213,212,211

造一些消息

  1. #./bin/kafka-console-producer.sh --broker-list 172.18.12.212:9092 --topic test1
  2. >1
  3. >2
  4. >3

kill broker2

  1. [root@node024212 ~]# ps -ef| grep kafka
  2. root 17633 1 1 Feb17 ? 00:55:18 /usr/local/java/bin/java -server -Xmx2g - ...
  3. [root@node024212 ~]# kill -9 17633
  4. [root@node024212 ~]# ps -ef| grep kafka
  5. root 21875 21651 0 11:27 pts/2 00:00:00 grep --color=auto kafka

稍等一会, 再次describe test1

  1. #./bin/kafka-topics.sh --zookeeper 172.18.12.212:2181 --describe --topic test1
  2. Topic:test1 PartitionCount:1 ReplicationFactor:3 Configs:
  3. Topic: test1 Partition: 0 Leader: 213 Replicas: 213,212,211 Isr: 213,211

可看到副本仍然是Replicas: 213,212,211

ISR已经变为Isr: 213,211

在212启动新broker

创建一份新的配置文件, 自动一个新的broker

  1. # cp server.properties server2.properties
  2. # vim server2.properties
  3. 只修改这两个参数
  4. broker.id=218
  5. log.dirs=/DATA21/kafka/kafka-logs,/DATA22/kafka/kafka-logs,/DATA23/kafka/kafka-logs,/DATA24/kafka/kafka-logs

创建相应目录

  1. mkdir -p /DATA21/kafka/kafka-logs
  2. mkdir -p /DATA22/kafka/kafka-logs
  3. mkdir -p /DATA23/kafka/kafka-logs
  4. mkdir -p /DATA24/kafka/kafka-logs

启动新broker

  1. ./bin/kafka-server-start.sh -daemon config/server2.properties

稍等, 查看 test1 状态

  1. #./bin/kafka-topics.sh --zookeeper 172.18.12.212:2181 --describe --topic test1
  2. Topic:test1 PartitionCount:1 ReplicationFactor:3 Configs:
  3. Topic: test2 Partition: 0 Leader: 213 Replicas: 213,212,211 Isr: 213,218,211

可以看到 test1 副本仍然是Replicas: 213,212,211

ISR为Isr: 213,218,211. 也就是说缺失的副本不会自动迁移到新broker上.

使用kafka-reassign-partitions.sh重分配分区

将212删除,添加218

  1. [root@node024211 12:04:48 /usr/local/kafka]
  2. #echo '{"version":1,"partitions":[{"topic":"test1","partition":0,"replicas":[211,213,218]}]}' > increase-replication-factor.json
  3. [root@node024211 12:58:30 /usr/local/kafka]
  4. #./bin/kafka-reassign-partitions.sh --zookeeper 172.18.12.211:2181 --reassignment-json-file increase-replication-factor.json --execute
  5. Current partition replica assignment
  6. {"version":1,"partitions":[{"topic":"test1","partition":0,"replicas":[213,212,211],"log_dirs":["any","any","any"]}]}
  7. Save this to use as the --reassignment-json-file option during rollback
  8. Successfully started reassignment of partitions.
  9. [root@node024211 12:58:49 /usr/local/kafka]
  10. #./bin/kafka-reassign-partitions.sh --zookeeper 172.18.12.211:2181 --reassignment-json-file increase-replication-factor.json --verify
  11. Status of partition reassignment:
  12. Reassignment of partition test1-0 completed successfully

查看topic信息

  1. #./bin/kafka-topics.sh --zookeeper 172.18.12.212:2181 --describe --topic test1
  2. Topic:test1 PartitionCount:1 ReplicationFactor:3 Configs:
  3. Topic: test1 Partition: 0 Leader: 213 Replicas: 211,213,218 Isr: 213,211,218

验证218是否有全部数据

虽然看副本信息中已经有了218, 但是218是否包含旧消息呢?

我的办法是, kill 211,213, 然后–from-beginning 消费218数据, 实际测试也是可以的

  1. #./bin/kafka-console-consumer.sh --bootstrap-server 172.18.12.212:9092 --topic test1 --from-beginning
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 11

看了下211 218的log文件大小也是一样的

  1. [2019-02-21 13:29:19]#ls -l /DATA22/kafka/kafka-logs/test1-0/
  2. [2019-02-21 13:29:19]total 8
  3. [2019-02-21 13:29:19]-rw-r--r--. 1 root root 10485760 Feb 21 12:58 00000000000000000000.index
  4. [2019-02-21 13:29:19]-rw-r--r--. 1 root root 381 Feb 21 13:00 00000000000000000000.log
  5. [2019-02-21 13:29:19]-rw-r--r--. 1 root root 10485756 Feb 21 12:58 00000000000000000000.timeindex
  6. [2019-02-21 13:29:19]-rw-r--r--. 1 root root 16 Feb 21 13:00 leader-epoch-checkpoint

更简单的办法

通过阅读文档发现

https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-Howtoreplaceafailedbroker

How to replace a failed broker?

When a broker fails, Kafka doesn’t automatically re-replicate the data on the failed broker to other brokers. This is because in the common case, one brings down a broker to apply code or config changes, and will bring up the broker quickly afterward. Re-replicating the data in this case will be wasteful. In the rarer case that a broker fails completely, one will need to bring up another broker with the same broker id on a new server. The new broker will automatically replicate the missing data.

这上面说的,如果服务器真的坏了, 只需要新启动一个broker, 把broker.id设置为 损坏的那个broker的id, 就会自动复制过去丢失的数据。

实际测试了一下, 确实可以恢复。

假如Kafka集群中一个broker宕机无法恢复,应该如何处理?的更多相关文章

  1. 另类--kafka集群中jmx端口设置

    # 监控kafka集群 # 有一个问题,需要在kafka-server-start.sh文件中配置端口,有如下三种办法 # 第一种:复制并修改kafka目录,比如kafka-1,kafka-2,kaf ...

  2. Kafka集群中 topic数据的分区 迁移到其他broker

    前言 kafka集群扩容后,新的broker上面不会数据进入这些节点,也就是说,这些节点是空闲的:它只有在创建新的topic时才会参与工作.除非将已有的partition迁移到新的服务器上面:所以需要 ...

  3. kafka集群中常见错误的解决方法:kafka.common.KafkaException: Should not set log end offset on partition

    问题描述:kafka单台机器做集群操作是没有问题的,如果分布多台机器并且partitions或者备份的个数大于1都会报kafka.common.KafkaException: Should not s ...

  4. kafka 集群--3个broker 3个zookeeper创建实战

    准备工作: 1. 准备3台机器,IP地址分别为:192.168.0.10,192.168.0.11,192.168.0.12 2. 下载kafka稳定版本,我的版本为:kafka_2.9.2-0.8. ...

  5. docker下部署kafka集群(多个broker+多个zookeeper)

    网上关于kafka集群的搭建,基本是单个broker和单个zookeeper,测试研究的意义不大.于是折腾了下,终于把正宗的Kafka集群搭建出来了,在折腾中遇到了很多坑,后续有时间再专门整理份搭建问 ...

  6. kafka集群中jmx端口设置

    jmx端口主要用来监控kafka集群的. 在启动kafka的脚本kafka-server-start.sh中找到堆设置,添加export JMX_PORT="9999" if [ ...

  7. openstack高可用集群20-openstack计算节点宕机迁移方案

    openstack计算节点宕机迁移方案   情景一:/var/lib/nova/instances/ 目录不共享的处理方法(类似手动迁移云主机到其他节点)

  8. CentOS6安装各种大数据软件 第五章:Kafka集群的配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  9. 数据源管理 | Kafka集群环境搭建,消息存储机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Kafka集群环境 1.环境版本 版本:kafka2.11,zookeeper3.4 注意:这里zookeeper3.4也是基于集群模式部 ...

随机推荐

  1. [CSP-S模拟测试]:蛋糕(区间DP)

    题目传送门(内部题34) 输入格式 第一行,一个正整数$n$.第二行,$n$个正整数$a_i$,保证$a_i$互不相等. 输出格式 一行一个整数表示间宫卓司得到的蛋糕大小总和的最大值. 样例 样例输入 ...

  2. python读取数据库mysql报错

    昨天在学习PYTHON读取数据库的知识时,一直在报错,找不到原因. 最后同事说是语法错误. import sysreload(sys)sys.setdefaultencoding('gb18030') ...

  3. find php.ini 和 php的执行目录 bin目录

    有的时候一台新服务器,有些软件的目录和文件的位置我们不知道在哪里,我们可以用find来寻找 找php.ini find / -name php.ini 找php的执行目录 find / -name p ...

  4. Notepad++ 连接 FTP 实现编辑 Linux文件

    下载并安装插件 github 下载 :https://github.com/ashkulz/NppFTP/releases/ 安装过程 将下载后解压的文件夹中的 NppFTP.dll 文件,拷贝到 n ...

  5. pat甲级题目1001 A+B Format详解

    pat1001 A+B Format (20 分) Calculate a+b and output the sum in standard format -- that is, the digits ...

  6. Rust <5>:测试

    测试运行顺序:单元测试(同处于源文件中,以 #[cfg(tests)] 标记 mod,以 #[test] 标记 function).集成测试(位于项目根路径下的 tests 目录下,不需要 #[cfg ...

  7. Leetcode代码复盘_分治法相关

    分治法 1.二分搜索(算法时间复杂度O(log n)) 输出:如果x=A[j],则输出j,否则输出0. 1.binarysearch(1,n) 过程:binarysearch(low,high) 1. ...

  8. jenkins中的pipeline学习

    Jenkins pipeline 升级打怪攻略(二): http://haurqb42j0gnc7zyxam.exp.bcevod.com/mda-jg9eq66184z5manh/mda-jg9eq ...

  9. mac 密码重置

    首先请开机或重新启动系统,在电脑刚启动时,请按下键盘上的 command+S 组合键不动, 接下来会在屏幕上看到一串串的命令字符显示,当进入安全模式以后,会看到 一个 root 开始的命令行输入端口. ...

  10. linux下samba共享服务器搭建详解

    这两天业务需求搭了一台服务器.要求samba共享文件. 葡萄美酒月光杯的前戏就省了,我们直接上干货. 1.yum方式安装samba yum  -y  install samba 2.将/etc/sam ...