? ? ? ? 因為最近要搞微服務(wù)畸悬,日志分析部分需要使用kafka趴生,今天抽了點時間參考了一下網(wǎng)絡(luò)上的文章在虛機上安裝了一下茅郎,現(xiàn)記錄如下:
1.下載kafka
Apache官網(wǎng):http://kafka.apache.org/downloads.html
最新版下載:下載Binary壓縮包
放置路徑:/opt
tar -xzf kafka_2.10-0.8.2.2.tgz
cd kafka_2.10-0.8.2.2
啟動zk有兩種方式患雏,第一種是使用kafka自己帶的一個zk茅茂。
bin/zookeeper-server-start.sh config/zookeeper.properties &
另一種是使用其它的zookeeper捏萍,可以位于本機也可以位于其它地址。這種情況需要修改config下面的sercer.properties里面的zookeeper地址 玉吁。例如zookeeper.connect=localhost:2181
bin/kafka-server-start.sh config/server.properties &
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test &
創(chuàng)建一個名為test的topic照弥,只有一個副本,一個分區(qū)进副。
通過list命令查看剛剛創(chuàng)建的topic
bin/kafka-topics.sh -list -zookeeper 10.202.4.179:2181
5.啟動producer并發(fā)送消息啟動producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
啟動之后就可以發(fā)送消息了
比如
test
hello boy
按Ctrl+C退出發(fā)送消息
bin/kafka-console-consumer.sh --zookeeper 10.202.4.179:2181 --topic test --from-beginning
啟動consumer之后就可以在console中看到producer發(fā)送的消息了
可以開啟兩個終端,一個發(fā)送消息,一個接受消息影斑。
下面的沒有驗證:
7.搭建一個多個broker的集群
剛才只是啟動了單個broker给赞,現(xiàn)在啟動有3個broker組成的集群,這些broker節(jié)點也都是在本機上的:
首先為每個節(jié)點編寫配置文件:
> cp config/server.properties config/server-1.properties
> cp config/server.properties config/server-2.properties
在拷貝出的新文件中添加以下參數(shù):
config/server-1.properties:
broker.id=1
port=9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
port=9094
log.dir=/tmp/kafka-logs-2
broker.id在集群中唯一的標(biāo)注一個節(jié)點矫户,因為在同一個機器上片迅,所以必須制定不同的端口和日志文件,避免數(shù)據(jù)被覆蓋皆辽。
We already have Zookeeper and our single node started, so we just need to start the two new nodes:
剛才已經(jīng)啟動可Zookeeper和一個節(jié)點柑蛇,現(xiàn)在啟動另外兩個節(jié)點:
>bin/kafka-server-start.sh config/server-1.properties &...>bin/kafka-server-start.sh config/server-2.properties &...
創(chuàng)建一個擁有3個副本的topic:
>bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
現(xiàn)在我們搭建了一個集群,怎么知道每個節(jié)點的信息呢驱闷?運行“"describe topics”命令就可以了:
>bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topicTopic:my-replicated-topic? ? ? PartitionCount:1? ? ? ? ReplicationFactor:3? ? Configs:? ? ? ? Topic: my-replicated-topic? ? ? Partition: 0? ? Leader: 1? ? ? Replicas: 1,2,0 Isr: 1,2,0
下面解釋一下這些輸出耻台。第一行是對所有分區(qū)的一個描述,然后每個分區(qū)都會對應(yīng)一行空另,因為我們只有一個分區(qū)所以下面就只加了一行盆耽。
leader:負(fù)責(zé)處理消息的讀和寫,leader是從所有節(jié)點中隨機選擇的.
replicas:列出了所有的副本節(jié)點扼菠,不管節(jié)點是否在服務(wù)中.
isr:是正在服務(wù)中的節(jié)點.
在我們的例子中摄杂,節(jié)點1是作為leader運行。
向topic發(fā)送消息:
>bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic...my test message 1my test message 2^C
消費這些消息:
>bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic...my test message 1my test message 2^C
測試一下容錯能力.Broker 1作為leader運行循榆,現(xiàn)在我們kill掉它:
>ps | grep server-1.properties7564ttys002? ? 0:15.91 /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java...>kill -9 7564
另外一個節(jié)點被選做了leader,node 1 不再出現(xiàn)在 in-sync 副本列表中:
>bin/kafka-topics.sh --describe --zookeeper localhost:218192 --topic my-replicated-topicTopic:my-replicated-topic? ? ? PartitionCount:1? ? ? ? ReplicationFactor:3? ? Configs:? ? ? ? Topic: my-replicated-topic? ? ? Partition: 0? ? Leader: 2? ? ? Replicas: 1,2,0 Isr: 2,0
雖然最初負(fù)責(zé)續(xù)寫消息的leader down掉了析恢,但之前的消息還是可以消費的:
>bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic...my test message 1my test message 2^C
看來Kafka的容錯機制還是不錯的。