配置多个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
posted @ 2018-04-08 17:47  游云浪天  阅读(1200)  评论(0编辑  收藏  举报