配置多个broker
前言
什么是kafka?举个例子,生产者消费者,生产者生产鸡蛋,消费者消费鸡蛋,生产者生产一个鸡蛋,消费者就消费一个鸡蛋,假设消费者消费鸡蛋的时候噎住了(系统宕机了),生产者还在生产鸡蛋,那新生产的鸡蛋就丢失了。再比如生产者很强劲(大交易量的情况),生产者1秒钟生产100个鸡蛋,消费者1秒钟只能吃50个鸡蛋,那要不了一会,消费者就吃不消了(消息堵塞,最终导致系统超时),消费者拒绝再吃了,”鸡蛋“又丢失了,这个时候我们放个篮子在它们中间,生产出来的鸡蛋都放到篮子里,消费者去篮子里拿鸡蛋,这样鸡蛋就不会丢失了,都在篮子里,而这个篮子就是”kafka“。
鸡蛋其实就是“数据流”,系统之间的交互都是通过“数据流”来传输的(就是tcp、http什么的),也称为报文,也叫“消息”。
消息队列满了,其实就是篮子满了,”鸡蛋“ 放不下了,那赶紧多放几个篮子,其实就是kafka的扩容。
各位现在知道kafka是干什么的了吧,它就是那个"篮子"。
在kafka中,broker就是篮子了。但需要对数据进行备份时,可以配置多个broker来解决。而broker又称为节点。每个broker配置文件中都会有个id,表示节点的唯一标识。
单机上配置多个broker
为每个broker创建一个配置文件
默认的server.properties的broker.id为0
cp config/server.properties config/server-1.properties
cp config/server.properties config/server-2.properties
配置下面属性
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2
broker.id是集群中每个节点的唯一且永久的名称,我们修改端口和日志分区是因为我们现在在同一台机器上运行,我们要防止broker在同一端口上注册和覆盖对方的数据。
我们已经运行了zookeeper和刚才的一个kafka节点,所以我们只需要在启动2个新的kafka节点。
bin/kafka-server-start.sh -daemon config/server-1.properties
bin/kafka-server-start.sh -daemon config/server-2.properties
创建一个topic,备份设为3
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
查看该topic的信息
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,3,0 Isr: 2,3,0
上面表示my-replicated-topic的leader是节点2,备份节点是2,3,0,当前正在活动的节点是2,3,0
发布消息
bin/kafka-console-producer.sh --topic my-replicated-topic --broker-list localhost:9092
>hahaha
>1111111
>
消费消息
bin/kafka-console-consumer.sh --topic my-replicated-topic --zookeeper localhost:2181 --from-beginning
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
hahaha
1111111
kafka容错校验
1)如果将leader杀掉后,指定topic对应的消息没有丢失,则说明kafka在消费消息上存在容错性
2)如果将某个broker杀掉后,生产者还能正常发布消息,说明kafka在生产消息上存在容错性
消费消息容错性
从上面可知my-replicated-topic的leader是节点2,所以将该节点2kill掉:kill -9 15888
ps -def | grep server-2.properties
root 3335 23061 0 17:35 pts/2 00:00:00 grep --color=auto server-2.properties
root 15888 1 1 16:51 pts/5 00:00:44 java -Xmx1G -Xms1G -se……
重新从my-replicated-topic消费消息
bin/kafka-console-consumer.sh --topic my-replicated-topic --zookeeper localhost:2181 --from-beginning
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
hahaha
1111111
可见消费消息时没有受到影响,说明kakfa存在容错性。
通过查看topic的信息,我们可以知道此时的leader为节点3,而节点2已经不再Isr中了。当从Replicas可知,节点2仍有my-repicated-topic的数据
bin/kafka-topics.sh --describe --topic my-replicated-topic --zookeeper localhost:2181
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 3 Replicas: 2,3,0 Isr: 3,0
生产消息容错性
生产消息时,需要指定broker。所以如果只指定了一个broker,那么当这个broker挂掉后就没法正常生产消息了。这时可以指定多个broker
bin/kafka-console-producer.sh --topic my-replicated-topic --broker-list localhost:9093,localhost:9092,localhost:9094
>test1
[2018-04-09 10:41:54,184] WARN [Producer clientId=console-producer] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
>test2
>test3