发送,消费消息
从官方这里下载Kafka的压缩包并解压
> tar -xzf kafka_2.12-2.2.0.tgz
> cd kafka_2.12-2.2.0
复制代码
启动Kafka自带的ZooKeeper,如果启动有问题,尝试sudo
> bin/zookeeper-server-start.sh config/zookeeper.properties
复制代码
启动Kafka一个broker,默认启动端口是9092
> bin/kafka-server-start.sh config/server.properties
复制代码
创建一个叫test
的topic,只包含一个分区,一个副本(分区的备份)
> bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
复制代码
我们通过命令行启动一个消费者,指定刚刚创建叫test的topic。执行完可以看到等待输出
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
复制代码
启动一个生产者,同样指定test主题。这个脚本允许我们从控制台输入,一行即一条消息
> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
复制代码
可以看到命令行停住,我们在控制台输入几句话
This is a message
Another message
复制代码
可以看到消费者控制台出现我们输入的信息,类似一个聊天室的小程序
多broker集群
Kafka是一个分布式集群系统,上面我们只是开了一个broker,下面来尝试开三个broker
首先,复制多两份配置文件
> 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.dirs=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dirs=/tmp/kafka-logs-2
复制代码
broker.id
:标识每个节点的唯一值listeners
:这个broker启动监听的地址端口log.dirs
:日志路径
在之前已经启动了9092端口的broker基础上,我们用这两份配置文件启动多两个broker
> bin/kafka-server-start.sh config/server-1.properties &
> bin/kafka-server-start.sh config/server-2.properties &
复制代码
然后我们创建一个分区为3,副本为3的主题
> bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic my-replicated-topic
复制代码
可以用看一下这个topic的情况
> bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
复制代码
可以看到输出
Topic:my-replicated-topic PartitionCount:3 ReplicationFactor:3 Configs:segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: my-replicated-topic Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
Topic: my-replicated-topic Partition: 2 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
复制代码
可以看到,Kafka把分区平均地分到每个broker上,每个分区都有一个Leader以及3个副本。可以尝试连接不同broker进行发送,消费消息,这里不再演示
容灾
我们先用broker0发布几条消息
> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
This is a 3-replicated message
333333
复制代码
接着我们可以"掐断"broker0,看一下会怎样
> ps aux|grep server.properties
root 1202 0.2 2.4 7047864 394736 s001 S.....
> sudo kill -9 1202
复制代码
然后看一下这个topic的情况
> bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
复制代码
Topic:my-replicated-topic PartitionCount:3 ReplicationFactor:3 Configs:segment.bytes=1073741824
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
Topic: my-replicated-topic Partition: 1 Leader: 1 Replicas: 0,1,2 Isr: 1,2
Topic: my-replicated-topic Partition: 2 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
复制代码
可以看到分区0的Leader已经变成broker1,这时候如果我们尝试消费test,会发现消费不了,因为test只有一个副本在broker0上,然后broker0已经断线了
> bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test
[2019-05-15 21:44:05,436] WARN [AdminClient clientId=adminclient-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
...
复制代码
但是如果我们连接broker1去重新消费,依然可以消费到broker0被"掐断"前发送的消息
> bin/kafka-console-consumer.sh --bootstrap-server localhost:9093 --topic test --from-beginning
This is a 3-replicated message
333333
复制代码