首先,感谢半兽人,他把kafka官方文档翻译成中文文档,所以不用浪费多余的时间来翻译,再次感谢,给大家他的地址:kafka安装和启动,我以后的文章基本上都需要参考上面的,顺便推荐他的命令行大全:kafka命令大全
不能只参考一家,所以推荐另一个命令大全,只是他是旧版的,自己多仔细一点Kafka集群消息发送和消费的相关命令
上一篇基本上可以启动单个broker(代理)集群,现在我们要开多个broker,但是因为机器原因,咱只能在同一个虚拟机上开多个broker了,
而且下面都是单个分区的前提下
zookeeper按正常开启就可以,主要是修改kafka的配置文件
在kafka的config下复制两次server.properties重新定义新的名称
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.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2
解释我复制下下来了:
broker.id
是集群中每个节点的唯一且永久的名称,我们修改端口和日志目录是因为我们现在在同一台机器上运行,我们要防止broker在同一端口上注册和覆盖对方的数据。
我这用的是后台运行,前台一点也不输出
nohup bin/kafka-server-start.sh config/server的配置文件 >/dev/null 2>&1 &
再提醒一次,kafka启动前一定先启动zookeeper
上面的执行三次,因为我们开了三个broker,只是配置文件不一样
查看kafka 是否启动成功
[root@bogon ~]# lsof -i:9092
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8440 root 162u IPv6 49047 0t0 TCP *:XmlIpcRegSvc (LISTEN)
java 8440 root 178u IPv6 57863 0t0 TCP bogon:47208->bogon:XmlIpcRegSvc (CLOSE_WAIT)
[root@bogon ~]# lsof -i:9093
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8440 root 187u IPv6 57866 0t0 TCP bogon:34562->bogon:copycat (CLOSE_WAIT)
java 9101 root 111u IPv6 50506 0t0 TCP *:copycat (LISTEN)
[root@bogon ~]# lsof -i:9094
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 8440 root 182u IPv6 57864 0t0 TCP bogon:54714->bogon:9094 (CLOSE_WAIT)
java 10703 root 111u IPv6 57844 0t0 TCP *:9094 (LISTEN)
三个broker 都启动成功了
[root@bogon kafka]# bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
Created topic my-replicated-topic.
创建成功,在创建的时候如果的broker小于3,会报错,所以仔细一点
查看集群在干什么,其实就是集群的属性
[root@bogon kafka]# 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,0,1 Isr: 2,0,1
输出的解释也是剪切的,我感觉人家解释的挺好的,不用再修饰了
输出解释:第一行是所有分区的摘要,其次,每一行提供一个分区信息,因为我们只有一个分区,所以只有一行。
生产者
[root@bogon kafka]# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
>my message 1
>my message 2
>my message 3
这你连接备份端口9092或者Leader的端口9094都是一样的,最后都是从Leader端口读写消息
消费者
[root@bogon kafka]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-replicated-topic --from-beginning
my message 1
my message 2
my message 3
消费者可以把 - -from-beginning,只是读取了以前的消息
生产者末尾可以加上这个配置
--producer.config config/producer.properties
消费者可以加上这个配置
--consumer.config config/consumer.properties
主要是消费者和生产者的配置文件,目前用不用都一样
查看集群的Leader的进程
[root@bogon kafka]# ps aux | grep server-2.properties
root 10703 0.9 12.0.......
杀死这个进程并查看集群的状态
[root@bogon kafka]# kill -9 10703 //杀死进程
root@bogon kafka]# 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: 0 Replicas: 2,0,1 Isr: 0,1
现在再看这个进程:Leader已经换了,换成0服务器了,
Kafka通过Zookeeper管理集群配置,选举Leader
现在broker.id=2
不在集群的同步列表了,就算再重启broker2的服务也是以备份的身份在集群里,
(1) 在杀死Leader的时候,因为我生产者和消费者都运行着,
: 期间如果生产者不生产消息就不会返回错误,生产消息肯定会返回错误
WARN [Producer clientId=console-producer] Connection to node 2 (bogon/192.168.43.236:9094) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
而消费者肯定会返回错误
WARN [Consumer clientId=consumer-1, groupId=console-consumer-21645] Connection to node 2 (bogon/192.168.43.236:9094) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
翻译:无法建立到节点2(Bogon/IP地址:9094)的连接。代理可能不可用。
而我们消费者一开始连接的是端口为9092的备份节点,所以回答了上面的为什么消费者连接哪个端口都可以,最后都会到Leader端口上进行读写
但是消息队列还在进行,等kafka备份节点经过zookeeper进行选举出新Leader后错误信息就消失了,就能正常进行,消费者不用重新进入Topic就能继续消费消息(而在这期间就会返回错误信息)
在杀死Leader的时候我的生产者一直在输入,也就是消息一直在发送,而消费者在报错(在这期间不能所有的节点都死掉,都死了就肯定连生产者都不能工作了,又怎么来的消息呢?),等重启一个服务用 - -from-beginning 就可以得到以前的全部信息,
[root@bogon kafka]# bin/kafka-console-consumer.sh --bootstrap-server localhost:9094 --topic my-replicated-topic --from-beginning
my message 1
my message 2
my message 3
mymessage 4
my message 5
my message 6
my message 7
my message 8
my message 9
sss
sss
ddd
message 0
message11
message
xin message
mess
ssss
mess
生产者的消息还存在,
(2)上面都是杀死Leader,如果要是杀死备份节点呢?
删除备份节点,生产者不会有错误信息,可以继续生产消息,但是消费者就会报错误,而且不会再接受生产者的消息,等备份节点恢复后就返回从记录的消息开始到恢复正常的消息的全部,消费者等待备份节点恢复期间生产者生产的消息也会一并返回