创建一个三个broker的集群
修改副本默认值,KAFKA_DEFAULT_REPLICATION_FACTOR=3,默认是1,没有副本。设置为和broker数量一样
docker run -d --name kafka01 -p 9092:9092 -p 9999:9999 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.18.5:2181 -e KAFKA_ADVERTISED_HOST_NAME=192.168.18.5 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.18.5:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e JMX_PORT=9999 -e KAFKA_DEFAULT_REPLICATION_FACTOR=3 -e KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.18.5 -Dcom.sun.management.jmxremote.rmi.port=9999" wurstmeister/kafka:0.11.0.0 docker run -d --name kafka02 -p 9092:9092 -p 9999:9999 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.18.5:2181 -e KAFKA_ADVERTISED_HOST_NAME=192.168.18.249 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.18.249:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e JMX_PORT=9999 -e KAFKA_DEFAULT_REPLICATION_FACTOR=3 -e KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.18.249 -Dcom.sun.management.jmxremote.rmi.port=9999" wurstmeister/kafka:0.11.0.0 docker run -d --name kafka02 -p 9092:9092 -p 9999:9999 -e KAFKA_BROKER_ID=3 -e KAFKA_ZOOKEEPER_CONNECT=192.168.18.5:2181 -e KAFKA_ADVERTISED_HOST_NAME=192.168.21.166 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.21.166:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e JMX_PORT=9999 -e KAFKA_DEFAULT_REPLICATION_FACTOR=3 -e KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.21.166 -Dcom.sun.management.jmxremote.rmi.port=9999" wurstmeister/kafka:0.11.0.0
概念理解
复制系数 replication.factor
topic的复制系数=3,就是每个分区会被3个不同的broker复制3次。数据容量就是3倍,可以容忍2个broker宕机或进入维护状态。官方推荐至少3个brokers。
分区副本的leader和follower
分区副本中,有一个副本会被选举为leader,leader负责处理producer 和 consume的请求,而副本机器只负责sync leader收到的消息。
leader所在broker宕机,则有一个follower会被选举为leader。
创建带副本的topic
手动创建一个topic,复制系数设为3,分区为2,就是每个broker上一个副本。
查看可见,副本=3,brokers总数=3,brokers for topic = 3,就是每个broker上一个副本。
这个topic是2分区,可见,每个broker上都有2分区。
分区信息,可见,分区0的leader副本在broker1上,分区1的副本在broker3上。
故障测试:broker挂掉
现在杀掉broker1,可见,分区0的leader副本到了broker2上,在同步中的副本信息中,没有了broker1。
同时生产和消费正常。
重启broker1,broker1又回来了。
查看broker的信息,broker1上拥有大量的数据rw