MQ的工作模式:
一对一(点对点):
一个生产者对应一个消费者,生产者写入数据,消费者消费数据后,数据将在MQ中被删除。
一对多(发布订阅):
一个生产者可以对应多个消费者,生产者写入数据,消费者消费数据后,数据不会在MQ中被删除。
kafka的常用术语:
kafka cluster(broker list):
kafka集群。
kafka Server (broker):
指的是kafka集群的某个节点。
Producer:
生产者,即往kafka集群写入数据的角色。
Consumer:
消费者,即从kafka集群中读取数据的角色。一个消费者隶属于一个消费者组。
Concumer Group:
消费者组,里面有一个或多个消费者。
Topic:
主题,是一个逻辑概念,用于区分业务,一个主题最少要有1个分区和一个副本。
Partition:
分区,分区可以暂时理解为分区编号。
replica:
副本,副本是实际存储数据的地方,分为两种角色,即leader和follower。
leader:
负责读写。
follower:
负责从leader节点同步数据,无法对集群外部提供任何服务。当leader无法访问时,follower会接管leader的角色。
AR:
所有的副本,包含leader和follower副本。
ISR:
表示和leader同步的所有副本集合。
OSR:
表示和leader不同步的所有副本集合。
zookeeper集群:
kafka 0.9之前的版本维护消费者组的offset,之后kafka内部的topic进行维护。
协调kafka的leader选举,控制器协调者选举等....
Q1: 分区和副本有啥区别?
分区可以暂时理解为分区编号,它包含该分区编号的所有副本,和磁盘的分区没关系。
副本是实际存储数据的地方,
Q2: offset存储在kafka集群,客户端在kafka集群任意一个节点如何获取偏移量。
通过内部的消费者组的偏移量读取即可。("__consumer_groups")
部署单点zookeeper节点:
1.解压软件包
tar xf apache-zookeeper-3.8.0-bin.tar.gz -C /oldboyedu/softwares/
2.拷贝配置文件
cp /oldboyedu/softwares/apache-zookeeper-3.8.0-bin/conf/{zoo_sample.cfg,zoo.cfg}
3.配置环境变量
cat > /etc/profile.d/kafka.sh <<'EOF'
#!/bin/bash
export ZK_HOME=/oldboyedu/softwares/apache-zookeeper-3.8.0-bin
export PATH=$PATH:$ZK_HOME/bin
EOF
source /etc/profile.d/kafka.sh
4.启动zookeeper服务
zkServer.sh start
zkServer.sh status
5.连接zookeeper服务
zkCli.sh
ss -ntl | grep 2181
温馨提示:
如果出错了请查看日志拍错即可。
部署kafka单点:
1.解压软件包
tar xf kafka_2.13-3.2.1.tgz -C /oldboyedu/softwares/
2.配置环境变量
cat > /etc/profile.d/kafka.sh <<'EOF'
#!/bin/bash
export ZK_HOME=/oldboyedu/softwares/apache-zookeeper-3.8.0-bin
export KAFKA_HOME=/oldboyedu/softwares/kafka_2.13-3.2.1
export PATH=$PATH:$ZK_HOME/bin:$KAFKA_HOME/bin
EOF
source /etc/profile.d/kafka.sh
3.修改配置文件
vim /oldboyedu/softwares/kafka_2.13-3.2.1/config/server.properties
...
# 修改kafka的唯一标识ID
broker.id=101
# 指定数据存储路径
log.dirs=/oldboyedu/data/kafka3.2.1
# 指定kafka的源数据在zookeeper节点的存储路径
zookeeper.connect=10.0.0.101:2181/oldboyedu-linux82-kafka3.2.1
4.启动kafka服务
kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties
5.检查kafka节点是否启动
ss -ntl | grep 9092
6.查看zookeeper的源数据信息
ls /oldboyedu-linux82-kafka3.2.1/brokers/ids
7.停止服务
kafka-server-stop.sh
topic管理:
创建:
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux82 --create
创建默认的分区数和副本数.
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux83 --create --partitions 3
创建3个分区数的topic。
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux84 --create --partitions 5 --replication-factor 2
创建5个分区数和2个副本。
查看:
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --list
查看所有topic的名称列表信息。
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --describe
查看所有topic的详细信息。
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --describe --topic oldboyedu-linux83
查看指定的topic的详细信息。
修改:
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --alter --topic oldboyedu-linux82 --partitions 5
修改分区数量,将分区数调大。
彩蛋: kafka是否支持将分区数量调小呢?为什么?
答案是否定的,如果将分区数调小,那么多余的数据就很难处理。
删除:
kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --delete --topic oldboyedu-linux83
生产者和消费者组:
生产者:
kafka-console-producer.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux82
向"oldboyedu-linux82"交互式写入数据。
消费者:
kafka-console-consumer.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux82
从最新的偏移量开始消费。
kafka-console-consumer.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux82 --from-beginning
从最开始的偏移量开始消费。
kafka-console-consumer.sh --bootstrap-server 10.0.0.101:9092 --topic oldboyedu-linux82 --consumer-property group.id=linux82-elk
将消费者指定加入到哪个消费者组。
消费者组维护:
kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --list
查看现有的消费者组列表。
kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --describe --group console-consumer-44622
查看指定的消费者组详细信息。
kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --describe --all-groups
查看所有消费者组的详细信息。
kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --delete --group console-consumer-44622
删除指定的消费者组。
kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --delete --all-groups
删除所有的消费者组。
彩蛋1: 消费者组的消费者分区的策略有哪些?
rr:
基于轮询的方式分区。
range:
基于范围的方式分区,使用"partition / consumer ",使用该值进行范围分配。如果有余数,剩下的是随机分配。
彩蛋2: 同一个消费者组有没有可能消费者分配不到partition呢?请说明原因?
在同一个消费者组内的消费者数量大于分区数量,就有可能有的消费者分配不到partition的情况。
彩蛋3: 为什么要将多个consumer加入到同一个consumer group呢?
1)防止消费者挂点,提高冗余;
2)提高读取效率,能够解决数据延迟的问题;
调优KAFKA的堆内存大小:
1)修改启动脚本
vim /oldboyedu/softwares/kafka_2.13-3.2.1/bin/kafka-server-start.sh
...
# 修改默认的堆内存大小,生产环境中推荐设置6GB
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
# export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
export KAFKA_HEAP_OPTS="-Xmx256m -Xms256m"
fi
2)重启kafka服务
kafka-server-stop.sh
kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties
3)查看对内存大小验证。
jmap -heap `jps | grep -i kafka | awk '{print $1}'`
KAFKA集群扩容:
1)安装kafka环境
data_rsync.sh /oldboyedu/softwares/kafka_2.13-3.2.1/
data_rsync.sh /etc/profile.d/kafka.sh
2)102节点修改kafka的配置文件
vim /oldboyedu/softwares/kafka_2.13-3.2.1/config/server.properties
...
broker.id=102
3)103节点修改kafka的配置文件
vim /oldboyedu/softwares/kafka_2.13-3.2.1/config/server.properties
...
broker.id=103
4)各节点启动kafka环境
source /etc/profile.d/kafka.sh ; kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties