配置多個broker

前言

什麼是kafka?舉個例子,生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產一個雞蛋,消費者就消費一個雞蛋,假設消費者消費雞蛋的時候噎住了(系統宕機了),生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再好比生產者很強勁(大交易量的狀況),生產者1秒鐘生產100個雞蛋,消費者1秒鐘只能吃50個雞蛋,那要不了一會,消費者就吃不消了(消息堵塞,最終致使系統超時),消費者拒絕再吃了,」雞蛋「又丟失了,這個時候咱們放個籃子在它們中間,生產出來的雞蛋都放到籃子裏,消費者去籃子裏拿雞蛋,這樣雞蛋就不會丟失了,都在籃子裏,而這個籃子就是」kafka「。java

雞蛋其實就是「數據流」,系統之間的交互都是經過「數據流」來傳輸的(就是tcp、http什麼的),也稱爲報文,也叫「消息」。
消息隊列滿了,其實就是籃子滿了,」雞蛋「 放不下了,那趕忙多放幾個籃子,其實就是kafka的擴容。
各位如今知道kafka是幹什麼的了吧,它就是那個"籃子"。node

在kafka中,broker就是籃子了。但須要對數據進行備份時,能夠配置多個broker來解決。而broker又稱爲節點。每一個broker配置文件中都會有個id,表示節點的惟一標識。apache

單機上配置多個broker

爲每一個broker建立一個配置文件

默認的server.properties的broker.id爲0bootstrap

cp config/server.properties config/server-1.propertiestcp

cp config/server.properties config/server-2.propertieside

配置下面屬性日誌

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在同一端口上註冊和覆蓋對方的數據。code

咱們已經運行了zookeeper和剛纔的一個kafka節點,因此咱們只須要在啓動2個新的kafka節點。server

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
相關文章
相關標籤/搜索