“Kafka 集群操作”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (建立内容为“=== 1.搭建 Kafka 集群(三个 broker) === * 创建三个 server.properties文件 <syntaxhighlight lang="properties"> # 0 1 2 broker.id=0 # 9092 9093 9094…”的新页面) |
Jihongchang(讨论 | 贡献) |
||
(未显示同一用户的8个中间版本) | |||
第1行: | 第1行: | ||
=== 1.搭建 Kafka 集群(三个 broker) === | === 1.搭建 Kafka 集群(三个 broker) === | ||
− | * | + | * 准备3个 server.properties 文件<syntaxhighlight lang="shell-session"> |
− | <syntaxhighlight lang=" | + | [root@localhost ~]# cd /usr/local/kafka/kafka_2.11-2.4.0/config/ |
− | # 0 | + | [root@localhost config]# cp server.properties server1.properties |
+ | [root@localhost config]# cp server.properties server2.properties | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *server.properties<syntaxhighlight lang="apacheconf"> | ||
broker.id=0 | broker.id=0 | ||
− | |||
listeners=PLAINTEXT://192.168.137.200:9092 | listeners=PLAINTEXT://192.168.137.200:9092 | ||
− | |||
log.dirs=/usr/local/kafka/data/kafka-logs | log.dirs=/usr/local/kafka/data/kafka-logs | ||
+ | </syntaxhighlight> | ||
+ | *server1.properties<syntaxhighlight lang="apacheconf"> | ||
+ | broker.id=1 | ||
+ | listeners=PLAINTEXT://192.168.137.200:9093 | ||
+ | log.dirs=/usr/local/kafka/data/kafka-logs-1 | ||
+ | </syntaxhighlight> | ||
+ | *server2.properties<syntaxhighlight lang="apacheconf"> | ||
+ | broker.id=2 | ||
+ | listeners=PLAINTEXT://192.168.137.200:9094 | ||
+ | log.dirs=/usr/local/kafka/data/kafka-logs-2 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | * | + | *启动<syntaxhighlight lang="shell-session"> |
− | <syntaxhighlight lang="shell-session"> | ||
[root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server.properties | [root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server.properties | ||
[root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server1.properties | [root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server1.properties | ||
第18行: | 第29行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | * | + | *搭建完成后通过查看 zk 中的 /brokers/ids 是否启动成功<syntaxhighlight lang="shell-session"> |
+ | root@4ac6bd5bc9f6:/apache-zookeeper-3.8.0-bin/bin# ./zkCli.sh | ||
+ | [zk: localhost:2181(CONNECTED) 0] ls /brokers/ids | ||
+ | [0, 1, 2] | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 2.副本的概念 === | ||
+ | 在创建 topic(主题)时除了可以指明 partition(分区)数,还可以指明 replica(副本)数:<syntaxhighlight lang="shell-session"> | ||
+ | [root@localhost bin]# ./kafka-topics.sh --create --zookeeper 192.168.137.200:2181 --replication-factor 3 --partitions 2 --topic my-replicated-topic | ||
+ | Created topic my-replicated-topic. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | 查看 topic(主题)状况:<syntaxhighlight lang="shell-session"> | ||
+ | [root@localhost bin]# ./kafka-topics.sh --describe --zookeeper 192.168.137.200:2181 --topic my-replicated-topic | ||
+ | Topic: my-replicated-topic PartitionCount: 2 ReplicationFactor: 3 Configs: | ||
+ | Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1 | ||
+ | Topic: my-replicated-topic Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 | ||
+ | |||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | 两个 partition(分区)在 三个 broker 中都有: | ||
+ | [[文件:两个分区在三个Broker都存在.png|无|缩略图|1400x1400像素]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | 那么副本是一个什么概念呢? | ||
+ | |||
+ | 副本是为了给主题中的分区创建多个备份,多个副本在 kafka 集群的多个 broker 中,会有一个副本作为 leader,其他是 follower。 | ||
+ | [[文件:副本的概念.png|无|缩略图|1400x1400像素]] | ||
+ | |||
+ | *leader | ||
+ | |||
+ | Kafka 的写和读的操作,都发生在 leader 上。leader 负责把数据同步给 follower。当 leader 挂了,经过主从选举,从多个 follower 中选举产生一个新的 leader | ||
+ | |||
+ | *follower | ||
+ | |||
+ | 接收 leader 同步的数据 | ||
+ | |||
+ | *isr | ||
+ | |||
+ | 可以同步和已同步的节点会被存入到 isr 集合中。这里有一个细节:如果 isr 中的节点性能较差,会被踢出 isr 集合。 | ||
+ | |||
+ | |||
+ | |||
+ | 此时,broker、topic(主题)、partition(分区)、replica(副本)这些概念就全部展现了: | ||
+ | |||
+ | '''<big>集群中有多个 broker,创建主题时可以指明主题有多个 partition(分区)(把消息拆分到不同的分区中存储),可以为 partition(分区)创建多个 replica(副本),不同的 replica(副本)存放在不同的 broker 里</big>'''。 | ||
+ | |||
+ | ===3.关于集群消费=== | ||
+ | |||
+ | *Kafka 集群消息的发送<syntaxhighlight lang="shell-session"> | ||
+ | [root@localhost bin]# ./kafka-console-producer.sh --broker-list 192.168.137.200:9092,192.168.137.200:9093,192.168.137.200:9094 --topic my-replicated-topic | ||
+ | >java | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | *Kafka 集群消息的消费<syntaxhighlight lang="shell-session"> | ||
+ | [root@localhost bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.137.200:9092,192.168.137.200:9093,192.168.137.200:9094 --from-beginning --topic my-replicated-topic | ||
+ | java | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | *Kafka 集群消息的消费组的消费<syntaxhighlight lang="shell-session"> | ||
+ | [root@localhost bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.137.200:9092,192.168.137.200:9093,192.168.137.200:9094 --from-beginning --consumer-property group.id=testGroup1 --topic my-replicated-topic | ||
+ | java | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | *关于分区消费组消费消费者的细节 | ||
+ | |||
+ | [[文件:集群消费.png|无|缩略图|1200x1200像素]] | ||
− | + | * 一个 partition 只能被一个消费组中的一个消费者消费,目的是为了保证消费的顺序性,但是多个 partition 的多个消费者消费的总的顺序性是得不到保证的 | |
+ | * partition 的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要超过 partition 的数量,否则多的消费者消费不到消息 | ||
+ | * 如果消费者挂了,那么会触发 rebalance 机制,会让其他消费者来消费该分区 |
2022年8月24日 (三) 21:30的最新版本
1.搭建 Kafka 集群(三个 broker)
- 准备3个 server.properties 文件
[root@localhost ~]# cd /usr/local/kafka/kafka_2.11-2.4.0/config/ [root@localhost config]# cp server.properties server1.properties [root@localhost config]# cp server.properties server2.properties
- server.properties
broker.id=0 listeners=PLAINTEXT://192.168.137.200:9092 log.dirs=/usr/local/kafka/data/kafka-logs
- server1.properties
broker.id=1 listeners=PLAINTEXT://192.168.137.200:9093 log.dirs=/usr/local/kafka/data/kafka-logs-1
- server2.properties
broker.id=2 listeners=PLAINTEXT://192.168.137.200:9094 log.dirs=/usr/local/kafka/data/kafka-logs-2
- 启动
[root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server.properties [root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server1.properties [root@localhost bin]# ./kafka-server-start.sh -daemon ../config/server2.properties
- 搭建完成后通过查看 zk 中的 /brokers/ids 是否启动成功
root@4ac6bd5bc9f6:/apache-zookeeper-3.8.0-bin/bin# ./zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls /brokers/ids [0, 1, 2]
2.副本的概念
在创建 topic(主题)时除了可以指明 partition(分区)数,还可以指明 replica(副本)数:
[root@localhost bin]# ./kafka-topics.sh --create --zookeeper 192.168.137.200:2181 --replication-factor 3 --partitions 2 --topic my-replicated-topic
Created topic my-replicated-topic.
查看 topic(主题)状况:
[root@localhost bin]# ./kafka-topics.sh --describe --zookeeper 192.168.137.200:2181 --topic my-replicated-topic
Topic: my-replicated-topic PartitionCount: 2 ReplicationFactor: 3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 2 Replicas: 2,0,1 Isr: 2,0,1
Topic: my-replicated-topic Partition: 1 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2
两个 partition(分区)在 三个 broker 中都有:
那么副本是一个什么概念呢?
副本是为了给主题中的分区创建多个备份,多个副本在 kafka 集群的多个 broker 中,会有一个副本作为 leader,其他是 follower。
- leader
Kafka 的写和读的操作,都发生在 leader 上。leader 负责把数据同步给 follower。当 leader 挂了,经过主从选举,从多个 follower 中选举产生一个新的 leader
- follower
接收 leader 同步的数据
- isr
可以同步和已同步的节点会被存入到 isr 集合中。这里有一个细节:如果 isr 中的节点性能较差,会被踢出 isr 集合。
此时,broker、topic(主题)、partition(分区)、replica(副本)这些概念就全部展现了:
集群中有多个 broker,创建主题时可以指明主题有多个 partition(分区)(把消息拆分到不同的分区中存储),可以为 partition(分区)创建多个 replica(副本),不同的 replica(副本)存放在不同的 broker 里。
3.关于集群消费
- Kafka 集群消息的发送
[root@localhost bin]# ./kafka-console-producer.sh --broker-list 192.168.137.200:9092,192.168.137.200:9093,192.168.137.200:9094 --topic my-replicated-topic >java
- Kafka 集群消息的消费
[root@localhost bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.137.200:9092,192.168.137.200:9093,192.168.137.200:9094 --from-beginning --topic my-replicated-topic java
- Kafka 集群消息的消费组的消费
[root@localhost bin]# ./kafka-console-consumer.sh --bootstrap-server 192.168.137.200:9092,192.168.137.200:9093,192.168.137.200:9094 --from-beginning --consumer-property group.id=testGroup1 --topic my-replicated-topic java
- 关于分区消费组消费消费者的细节
- 一个 partition 只能被一个消费组中的一个消费者消费,目的是为了保证消费的顺序性,但是多个 partition 的多个消费者消费的总的顺序性是得不到保证的
- partition 的数量决定了消费组中消费者的数量,建议同一个消费组中消费者的数量不要超过 partition 的数量,否则多的消费者消费不到消息
- 如果消费者挂了,那么会触发 rebalance 机制,会让其他消费者来消费该分区