Kakfa学习笔记(二)——体验Kafka

1,365 阅读3分钟

发送,消费消息

从官方这里下载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

下一篇:Kakfa学习笔记(三)——Java API发送消费消息