kafka高可用集群和高性能

DBC 1.6K 0

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
温馨提示

#客户端端口
clientPort=2181

#数据存储路径
dataDir=/tmp/zookeeper/2181

#修改AdminServer的端口:
admin.serverPort=8889
kafka高可用集群和高性能插图

复制其他两个zookeeper

cp -r zk1 zk2
cp -r zk1 zk3
结构目前如图

kafka高可用集群和高性能插图2

更改他们两个的相应配置文件

如图所示

kafka高可用集群和高性能插图4
kafka高可用集群和高性能插图6

创建文件夹

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

如图

kafka高可用集群和高性能插图8

到了这里,可以看对应的节点情况,那个是leader,哪个是follower

kafka高可用集群和高性能插图10
kafka高可用集群和高性能插图12
kafka高可用集群和高性能插图14

可能出现的问题,博主就出现了里面说的第五个问题

Zookeeper配置 Client port found: 2181. Client address: localhost. Client SSL: false. Error contacting

3年前 (2021-08-09) 0
kafka高可用集群和高性能插图16

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
配置

#内网中使用,内网部署 kafka 集群只需要用到 listeners,内外网需要作区分时 才需要用到advertised.listeners
listeners=PLAINTEXT://172.18.123.229:9092

advertised.listeners=PLAINTEXT://112.74.55.160:9092

#每个节点编号1、2、3
broker.id=1

#端口
port=9092

#配置3个
log.dirs=/tmp/kafka-logs-1

#zk地址
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183

博主示例如下

kafka高可用集群和高性能插图18
kafka高可用集群和高性能插图20
kafka高可用集群和高性能插图22
kafka高可用集群和高性能插图24

拷贝对应文件夹

cp -r kafka1 kafka2
cp -r kafka1 kafka3

继续修改对应的配置文件,具体修改如下图

vim server.properties

kafka高可用集群和高性能插图26
kafka高可用集群和高性能插图28
kafka高可用集群和高性能插图30
kafka高可用集群和高性能插图32

启动

./kafka-server-start.sh -daemon ../config/server.properties &
​
./kafka-server-start.sh ../config/server.properties &

kafka高可用集群和高性能插图34

温馨提示

到了这里,基本实现啦

3.【重点】Kafka的中的日志数据清理

  • Kafka将数据持久化到了硬盘上,为了控制磁盘容量,需要对过去的消息进行清理
  • 问题:如果让你去设计这个日志删除策略,你会怎么设计?【原理思想】很重要的体现,下面是kafka答案
    • 内部有个定时任务检测删除日志,默认是5分钟 log.retention.check.interval.ms
    • 支持配置策略对数据清理
    • 根据segment单位进行定期清理
  • 启用cleaner
    • log.cleaner.enable=true
    • log.cleaner.threads = 2 (清理线程数配置)
  • 日志删除
    • log.cleanup.policy=delete
温馨提示

#清理超过指定时间的消息,默认是168小时,7天,
#还有log.retention.ms, log.retention.minutes, log.retention.hours,优先级高到低
log.retention.hours=168

#超过指定大小后,删除旧的消息,下面是1G的字节数,-1就是没限制
log.retention.bytes=1073741824

还有基于日志起始位移(log start offset),未来社区还有更多

基于【时间删除】 日志说明

配置了7天后删除,那7天如何确定呢?

每个日志段文件都维护一个最大时间戳字段,每次日志段写入新的消息时,都会更新该字段

一个日志段segment写满了被切分之后,就不再接收任何新的消息,最大时间戳字段的值也将保持不变

kafka通过将当前时间与该最大时间戳字段进行比较,从而来判定是否过期

基于【大小超过阈值】 删除日志 说明

假设日志段大小是500MB,当前分区共有4个日志段文件,大小分别是500MB,500MB,500MB和10MB

10MB那个文件就是active日志段。

此时该分区总的日志大小是3*500MB+10MB=1500MB+10MB

如果阈值设置为1500MB,那么超出阈值的部分就是10MB,小于日志段大小500MB,故Kafka不会执行任何删除操作,即使总大小已经超过了阈值;

如果阈值设置为1000MB,那么超过阈值的部分就是500MB+10MB > 500MB,此时Kafka会删除最老的那个日志段文件

注意:超过阈值的部分必须要大于一个日志段的大小

    • 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)
    • kafka高可用集群和高性能插图36

    • 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)

发表评论 取消回复
表情 图片 链接 代码

分享