1.Kafka高可用集群之zookeeper集群搭建环境
解压zookeeper
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
改名
mv apache-zookeeper-3.7.0-bin zk1
复制配置文件
cd zk1 cd conf cp zoo_sample.cfg zoo.cfg
修改配置文件
vim zoo.cfg
复制其他两个zookeeper
cp -r zk1 zk2 cp -r zk1 zk3
更改他们两个的相应配置文件
创建文件夹
mkdir /tmp/zookeeper
进入文件夹
cd /tmp/zookeeper
继续创建文件夹
mkdir 2181 mkdir 2182 mkdir 2183
进入相应文件夹,执行如下代码
cd 2181 echo 1 > myid cd 2182 echo 2 > myid cd 2183 echo 3 > myid
配置集群
cd /usr/local/software/zk1/conf cd /usr/local/software/zk2/conf cd /usr/local/software/zk3/conf # server.服务器id=服务器IP地址:服务器直接通信端口:服务器之间选举投票端口 server.1=127.0.0.1:2881:3881 server.2=127.0.0.1:2882:3882 server.3=127.0.0.1:2883:3883
启动zk
/usr/local/software/zk1/bin /usr/local/software/zk2/bin /usr/local/software/zk3/bin #启动zk ./zkServer.sh start #查看节点状态 ./zkServer.sh status #停止节点 ./zkServer.sh stop
可看日志
cd .. cd logs tail -f zookeeper-root-server-VM-8-13-centos.out
如图
到了这里,可以看对应的节点情况,那个是leader,哪个是follower
可能出现的问题,博主就出现了里面说的第五个问题
2.Kafka高可用集群搭建-环境准备
解压
cd /usr/local/software tar -zxvf kafka_2.13-2.8.0.tgz
重命名
mv kafka_2.13-2.8.0 kafka1
修改配置文件
cd kafka1 cd config/ vim server.properties
博主示例如下
拷贝对应文件夹
cp -r kafka1 kafka2 cp -r kafka1 kafka3
继续修改对应的配置文件,具体修改如下图
vim server.properties
启动
./kafka-server-start.sh -daemon ../config/server.properties & ./kafka-server-start.sh ../config/server.properties &
3.【重点】Kafka的中的日志数据清理
- Kafka将数据持久化到了硬盘上,为了控制磁盘容量,需要对过去的消息进行清理
- 问题:如果让你去设计这个日志删除策略,你会怎么设计?【原理思想】很重要的体现,下面是kafka答案
- 内部有个定时任务检测删除日志,默认是5分钟 log.retention.check.interval.ms
- 支持配置策略对数据清理
- 根据segment单位进行定期清理
- 启用cleaner
- log.cleaner.enable=true
- log.cleaner.threads = 2 (清理线程数配置)
- 日志删除
- log.cleanup.policy=delete
-
- log.retention.bytes和log.retention.minutes任意一个达到要求,都会执行删除
- 日志压缩
- log.cleanup.policy=compact 启用压缩策略
- 按照消息key进行整理,有相同key不同value值,只保留最后一个
4.【重点】Kafka的高性能原理分析-ZeroCopy
零拷贝ZeroCopy(SendFile)
- 例子:将一个File读取并发送出去(Linux有两个上下文,内核态,用户态)
- File文件的经历了4次copy
- 调用read,将文件拷贝到了kernel内核态
- CPU控制 kernel态的数据copy到用户态
- 调用write时,user态下的内容会copy到内核态的socket的buffer中
- 最后将内核态socket buffer的数据copy到网卡设备中传送
- 缺点:增加了上下文切换、浪费了2次无效拷贝(即步骤2和3)
- File文件的经历了4次copy
- ZeroCopy:
- 请求kernel直接把disk的data传输给socket,而不是通过应用程序传输。Zero copy大大提高了应用程序的性能,减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和减少了kernel和user模式的上下文切换,达到性能的提升
- 对应零拷贝技术有mmap及sendfile
- mmap:小文件传输快
- sendfile:大文件传输比mmap快
- 应用:Kafka、Netty、RocketMQ等都采用了零拷贝技术
5.【重点】Kafka的高性能原理分析归纳总结
kafka高性能
- 存储模型,topic多分区,每个分区多segment段
- index索引文件查找,利用分段和稀疏索引
- 磁盘顺序写入
- 异步操作少阻塞sender和main线程,批量操作(batch)
- 页缓存Page cache,没利用JVM内存,因为容易GC影响性能
- 零拷贝ZeroCopy(SendFile)
本文作者为DBC,转载请注明。