什麼是kafka?舉個例子,生產者消費者,生產者生產雞蛋,消費者消費雞蛋,生產者生產一個雞蛋,消費者就消費一個雞蛋,假設消費者消費雞蛋的時候噎住了(系統宕機了),生產者還在生產雞蛋,那新生產的雞蛋就丟失了。再好比生產者很強勁(大交易量的狀況),生產者1秒鐘生產100個雞蛋,消費者1秒鐘只能吃50個雞蛋,那要不了一會,消費者就吃不消了(消息堵塞,最終致使系統超時),消費者拒絕再吃了,」雞蛋「又丟失了,這個時候咱們放個籃子在它們中間,生產出來的雞蛋都放到籃子裏,消費者去籃子裏拿雞蛋,這樣雞蛋就不會丟失了,都在籃子裏,而這個籃子就是」kafka「。java
雞蛋其實就是「數據流」,系統之間的交互都是經過「數據流」來傳輸的(就是tcp、http什麼的),也稱爲報文,也叫「消息」。
消息隊列滿了,其實就是籃子滿了,」雞蛋「 放不下了,那趕忙多放幾個籃子,其實就是kafka的擴容。
各位如今知道kafka是幹什麼的了吧,它就是那個"籃子"。node
在kafka中,broker就是籃子了。但須要對數據進行備份時,能夠配置多個broker來解決。而broker又稱爲節點。每一個broker配置文件中都會有個id,表示節點的惟一標識。apache
默認的server.properties的broker.id爲0bootstrap
cp config/server.properties config/server-1.properties
tcp
cp config/server.properties config/server-2.properties
ide
配置下面屬性日誌
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
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-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
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