昨日内容回顾:
- ES的加密及客户端的连接方式,比如logstash,filebeat,curl,es-head,postman...
- zk单点部署
- kafka单点部署
- kafka的集群扩容
- kafka集群架构
- kafka的堆内存调优
- kafka的集群宏观架构
Q1: 为什么需要配置"dvertised.listeners".
因为没有配置主机名解析导致的问题。
Q2: 一个分区数写入数据是有序的,但为什么多个分区数写入就是无序的呢?
因为消费者是从多个分区读取的,顺序无法确定。
Q3: leader同步follower是如何同步的?
follower主动去leader拉取数据。
Q4: leader挂掉之后发生了哪些事,请说明?
leader挂掉后,follower会成为新的leader,需要借助zookeeper实现。
Q5: follower挂掉之后如何解决,会发生哪些问题?
leader会根据replica.lag.time.max.ms定义的间隔时间,超出该范围leader就会将其剔除ISR列表。
Q6: 当follower数据和leader不同时,又会发生啥事?
leader会根据replica.lag.time.max.ms定义的间隔时间,超出该范围leader就会将其剔除ISR列表。
Q7: 当消费者数据延迟时如何解决问题?请说明原因。
将多个消费者加入到同一个消费者组进行消费,但是要注意消费者数量不能大于分区数数量。
Q8: 请问多副本,例如一个分区3个副本,kafka会存在数据丢失的风险吗?请说明原因。
会,还是ISR的存在。
相关术语:
Log End Offset (简称"LEO"):
每个partition的最后一个日志的偏移量。
High Water(简称"HW"):
所有ISR列表中最小的LEO。
所有的消费者只能读取到HW之前的偏移量数据。
ISR:
和leader数据同步的所有副本集合。
OSR:
和leader数据不同的所有副本集合。
AR:
是ISR+OSR,指的是所有副本集合。
replica.lag.time.max.ms: 30000ms ---> 30s
当follower节点超过30秒没有向leader发送fetch请求或者follower的LEO不等于leader的LEO时,leader会将follower踢出ISR列表。
zookeeper的基础操作:
1.简介
zookeeper是一个分布式协调服务,其扮演的是辅助的功能。本身并不支持存储大量数据,每个znode默认可以存储大约2M的数据。
2.什么是znode
所谓的znode指的是zookeeper node,相当于Linux的目录,只不过znode下不仅仅可以存储子znode,其本身也能够存数据。
3.znode的基础管理
登录:
# zkCli.sh
增:
create /test
创建一个"/test"的znode。
create /test/b
支持多级路径创建,但要求父路径是必须存在的。
删:
delete /test/a
删除"/test/a"的znode,要求znode为空。
deleteall /test
删除"/test"的所有内容,可以删除非空znode。
改:
set /test/c/1111 bbbbbbbbbb
修改"/test/c/1111"的znode存储数据。
查: *****
ls /
查看/的znode下有哪些子znode。
ls /test -R
递归查看"/test"子路径下的所有znode。
get /test
查看数据。
kafka 0.8.0 多实例部署:
1.解压软包包
tar xf kafka_2.8.0-0.8.0.tar.gz -C /oldboyedu/softwares/
2.修改配置文件
vim /oldboyedu/softwares/kafka_2.8.0-0.8.0/config/server.properties
...
broker.id=101
# kafka的监听端口
port=19092
log.dirs=/oldboyedu/data/kafka080
zookeeper.connect=10.0.0.101:2181/oldboyedu-linux82-kafka080
3.101节点同步数据
data_rsync.sh /oldboyedu/softwares/kafka_2.8.0-0.8.0/
4.102节点修改broker.id
vim /oldboyedu/softwares/kafka_2.8.0-0.8.0/config/server.properties
...
broker.id=102
5.103节点修改broker.id
vim /oldboyedu/softwares/kafka_2.8.0-0.8.0/config/server.properties
...
broker.id=102
6.zookeeper创建znode
create /oldboyedu-linux82-kafka080
7.启动kafka
cd /oldboyedu/softwares/kafka_2.8.0-0.8.0 && ./bin/kafka-server-start.sh config/server.properties &>/dev/null &
8.检查zookeeper集群的ids信息
ls /oldboyedu-linux82-kafka080/brokers/ids
早期kafka 0.9之前的offset存储在zookeeper:
1.查看topic信息
./bin/kafka-list-topic.sh --zookeeper 10.0.0.101:2181/oldboyedu-linux82-kafka080
2.启动生产者
./bin/kafka-console-producer.sh --broker-list 10.0.0.101:19092,10.0.0.102:19092,10.0.0.103:19092 --topic oldboyedu-linux82
3.启动消费者
./bin/kafka-console-consumer.sh --zookeeper 10.0.0.101:2181/oldboyedu-linux82-kafka080 --topic oldboyedu-linux82
4.查看偏移量,注意"console-consumer-78441"根据您的环境适当改变即可
get /oldboyedu-linux82-kafka080/consumers/console-consumer-78441/offsets/oldboyedu-linux82/0
从kafka 0.9之后的版本之后支持将offset存储在kafka的"__consumer_offsets"内置topic中:
1.查看kafka内置"__consumer_offsets"的方式
kafka-console-consumer.sh --bootstrap-server 10.0.0.101:9092 --topic __consumer_offsets --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --from-beginning | grep oldboyedu-linux82
....
# [消费者组,消费的topic,分区数]::OffsetAndMetadata(偏移量,...)
[linux82-elk,oldboyedu-linux82,4]::OffsetAndMetadata(offset=5, leaderEpoch=Optional[0], metadata=, commitTimestamp=1661498621467, expireTimestamp=None)
[linux82-elk,oldboyedu-linux82,1]::OffsetAndMetadata(offset=4, leaderEpoch=Optional[0], metadata=, commitTimestamp=1661498621467, expireTimestamp=None)
[linux82-elk,oldboyedu-linux82,2]::OffsetAndMetadata(offset=3, leaderEpoch=Optional[0], metadata=, commitTimestamp=1661498621467, expireTimestamp=None)
[linux82-elk,oldboyedu-linux82,0]::OffsetAndMetadata(offset=4, leaderEpoch=Optional[0], metadata=, commitTimestamp=1661498621467, expireTimestamp=None)
[linux82-elk,oldboyedu-linux82,3]::OffsetAndMetadata(offset=3, leaderEpoch=Optional[0], metadata=, commitTimestamp=1661498621467, expireTimestamp=None)
2.查看消费者组信息,注意观察"linux82-elk"的消费者组是否有消息延迟!
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 --describe --group linux82-elk
...
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
linux82-elk oldboyedu-linux82 4 5 6 1 - - -
linux82-elk oldboyedu-linux82 1 4 4 0 - - -
linux82-elk oldboyedu-linux82 2 3 4 1 - - -
linux82-elk oldboyedu-linux82 0 4 5 1 - - -
linux82-elk oldboyedu-linux82 3 3 5 2 - - -
3.修改配置文件
vim /oldboyedu/softwares/kafka_2.13-3.2.1/config/consumer.properties
...
group.id=linux82-elk
4.基于配置文件启动消费者
kafka-console-consumer.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --topic oldboyedu-linux82 --from-beginning --consumer.config /oldboyedu/softwares/kafka_2.13-3.2.1/config/consumer.properties
5.再次查看消费者信息
kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --describe --group linux82-elk
kafka生产环境应该监控哪些指标:
(1)监控kafka的程序是否正常运行;
(2)数据是否有延迟;
(3)是否频繁涉及到ISR列表的变化;
(4)iops;
(5)其他参数可参考<
安装开源工具监控kafka集群:
1.安装MySQL数据库并授权
1.1 部署mariadb
yum -y install mariadb-server
systemctl start mariadb
1.2 修改配置文件
vim /etc/my.cnf
...
[mysqld]
# 跳过名称解析。
skip-name-resolve
1.3 重启服务并测试链接
systemctl restart mariadb
mysql -u linux82 -poldboyedu -h 10.0.0.103
1.4 创建数据库
CREATE DATABASE oldboyedu_linux82 DEFAULT CHARACTER SET utf8mb4;
1.5 授权
CREATE USER linux82 IDENTIFIED BY 'oldboyedu';
GRANT ALL ON oldboyedu_linux82.* TO linux82;
SHOW GRANTS FOR linux82;
2.修改kafka开启JMX
2.1 修改启动脚本
vim /oldboyedu/softwares/kafka_2.13-3.2.1/bin/kafka-server-start.sh
...
# 大概在30行左右
export KAFKA_HEAP_OPTS="-Xmx256m -Xms256m"
export JMX_PORT="8888"
2.2 同步启动脚本到其他节点
data_rsync.sh /oldboyedu/softwares/kafka_2.13-3.2.1/bin/kafka-server-start.sh
2.3 所有重启kafka服务
kafka-server-stop.sh
kafka-server-start.sh $KAFKA_HOME/config/server.properties &>/dev/null &
3.启动zookeeper的JMX端口
3.1 修改启动脚本
vim /oldboyedu/softwares/apache-zookeeper-3.8.0-bin/bin/zkServer.sh +77
...
# 大概是在77行左右
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"
3.2 重启zookeeper服务
zkServer.sh restart
4.安装kafka eagle监控工具
4.1 解压软件包
unzip kafka-eagle-bin-2.0.8.zip
tar xf efak-web-2.0.8-bin.tar.gz -C /oldboyedu/softwares/
4.2 修改kafka eagle启动脚本的堆内存大小
vim /oldboyedu/softwares/efak-web-2.0.8/bin/ke.sh
...
export KE_JAVA_OPTS="-server -Xmx256m -Xms256m -XX:MaxGCPauseMillis=20 -XX:+UseG1GC -XX:MetaspaceSize=128m -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"
4.3 修改配置文件
cat > /oldboyedu/softwares/efak-web-2.0.8/conf/system-config.properties <
linux82.zk.list=10.0.0.101:2181/oldboyedu-linux82-kafka3.2.1
cluster2.zk.list=10.0.0.101:2181/oldboyedu-linux82-kafka080
linux82.efak.broker.size=20
kafka.zk.limit.size=32
efak.webui.port=8048
linux82.efak.offset.storage=kafka
cluster2.efak.offset.storage=zk
linux82.efak.jmx.uri=service:jmx:rmi:///jndi/rmi://%s/jmxrmi
efak.metrics.charts=true
efak.metrics.retain=15
efak.sql.topic.records.max=5000
efak.sql.topic.preview.records.max=10
efak.topic.token=keadmin
efak.driver=com.mysql.cj.jdbc.Driver
efak.url=jdbc:mysql://10.0.0.103:3306/oldboyedu_linux82?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
efak.username=linux82
efak.password=oldboyedu
EOF
4.4 配置环境变量
cat > /etc/profile.d/kafka_eagle.sh <
export KE_HOME=/oldboyedu/softwares/efak-web-2.0.8
export PATH=$PATH:$KE_HOME/bin
EOF
4.5 启动kafka eagle服务,第一次需要等一会,可能有点漫长哈!大概30s~1分钟左右
ke.sh start
kafka集群压力测试:
1.简介
所谓压力测试就是对一个集群的处理能力的上限做一个评估。为将来集群扩容提供有效的依据。
2.为什么要进行压力测试
(1)压力测试可以了解当前集群的处理能力上限;
(2)当修改集群的配置参数后,压力测试可以协助运维人员去参考本次调优的效果;
(3)压力测试的结果以后可以作为参考扩容集群的有效依据;
3.实战案例
install -d /tmp/kafka-test/
cat > oldboyedu-kafka-test.sh <<'EOF'
# 创建topic
kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --topic oldboyedu-kafka-2022 --replication-factor 1 --partitions 10 --create
# 启动消费者消费数据
nohup kafka-consumer-perf-test.sh --broker-list 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --topic oldboyedu-kafka-2022 --messages 100000000 &>/tmp/kafka-test/oldboyedu-kafka-consumer.log &
# 启动生产者写入数据
nohup kafka-producer-perf-test.sh --num-records 100000000 --record-size 1000 --topic oldboyedu-kafka-2022 --throughput 1000000 --producer-props bootstrap.servers=10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 &> /tmp/kafka-test/oldboyedu-kafka-producer.log &
EOF
bash oldboyedu-kafka-test.sh
参数说明:
kafka-consumer-perf-test.sh
---messages:
指定消费消息的数量。
--broker-list:
指定broker列表。
--topic:
指定topic主体。
kafka-producer-perf-test.sh
-num-records
生产消息的数量。
--record-size:
每条消息的大小,单位是字节。
--topic:
指定topic主体。
--throughput
设置每秒发送的消息数量,即指定最大消息的吞吐量,若设置为-1代表不限制!
--producer-props bootstrap.servers
指定broker列表。
温馨提示:
本案例测试大约会生成93GB( echo "100000000 * 1000/1024/1024/1024" | bc)的数据,如果硬盘资源不足的小伙伴可以暂时不用测试了,或者该小上面提到的参数。
今日内容回顾:
- kafka的ISR工作机制原理 *****
- ZK的znode基础操作 ***
- kafka多实例部署
- kafka eagle监控工具
- kafka集群压力测试 ***
下次课程:
- kafka优化
- kafka配合elk使用案例
- zk的ACL
- zk的监控工具
- zk调优
- ES8集群环境搭建