kafka 总结

https://developer.aliyun.com/article/980757
1.Kafka 吞吐量为何很高?
broker维度:
 
1.分区实现
 
每个分区一个线程维护一个文件,并发写
 
2.磁盘顺序写入
 
3.多节点机器
 
分布式架构,均衡负载
 
4.零拷贝:
 
零拷贝指的是在数据传输过程中避免不必要的数据拷贝,减少CPU的参与,提高系统的性能。Kafka的零拷贝主要体现在Kafka的后台存储使用了Java NIO的内存映射文件(Memory-mapped Files),以及Sender线程的Batch物理分批写入。
 
  1. 内存映射文件:Kafka的日志文件(log files)通过内存映射文件的方式被映射到内存中,这样就可以直接在内存中对文件进行操作,而不需要将数据从操作系统中的内存拷贝到Java堆中。
  2. 批量写入:Kafka的消息是以Batch的形式进行写入的,每个Batch中的消息会被组织成一个大的字节数组,然后通过一次系统调用的sendfile方法写入到物理磁盘中。这样就避免了在循环中多次调用write方法导致的性能问题。
生产者:
 
5. 分批发送batch.size、linger.ms ,压缩
 
6.都是异步写入(可以指定ack)
 
 
2.数据如何保证不丢失
 
  • 生产环节:
1.发送失败:返回失败可以重试, ack机制
 
  • 存储环节:
1.节点挂掉(出异常):多副本, 设置min.insync.replicas>1, 这样 isr只有一个的时候也不算成功
 
min.insync.replicas, 该参数控制的是消息至少被写入到多少个副本才算是 “真正写入”, 该值默认值为 1,生产环境设定为一个大于 1 的值可以提升消息的持久性. 因为如果同步副本的数量低于该配置值,则生产者会收到错误响应,从而确保消息不丢失.
 
2.设置unclean.leader.election.enable=false:这样不在 isr的也不能成为leader
 
数据丢失太多的副本不能选举为leader副本,防止落后太多的消息数据而引起丢失;
 
3.刷盘尽快
 
4.均衡负载尽量不挂
 
 
  • 消费环节
手动提交offset,设置幂等性性消费
 
 
 
3.Kafka 分区数越多性能就越好吗?为什么?
 
  1. 客户端会为每个分区调用一条线程处理,多线程并发地处理分区消息,分区越多,意味着处理的线程数也就越多,到一定程度后,会造成线程切换开销大;
  2. 其中一个 broker 挂掉后,如果此时分区特别多,Kafka 分区 leader 重新选举的时间大大增加;
  3. 每个分区对应都有文件句柄,分区越多,系统文件句柄就越多;
  4. 客户端在会为每个分区分配一定的缓冲区,如果分区过多,分配的内存也越大。
 
实际测试也是有一个最优值,高于这个值的话会下降
 
 
yum install librdkafka
 
python3 -m pip install confluent-kafka==1.5.0
 
 
wget https://github.com/apache/rocketmq-client-cpp/releases/download/2.0.0/rocketmq-client-cpp-2.0.0-centos7.x86_64.rpm
sudo rpm -ivh rocketmq-client-cpp-2.0.0-centos7.x86_64.rpm
ln -s /usr/local/lib/librocketmq.so /usr/lib
sudo ldconfig
 
python3 -m pip install rocketmq-client-python
 
安装python
sudo yum groupinstall -y "Development Tools"
sudo yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
 
#下载python3 源码包 附件提供了一个版本示例
wget https://www.python.org/ftp/python/3.7.17/Python-3.7.17.tar.xz (比较慢可以直接用下面的附件)
 
 
tar xvf Python-3.7.17.tgz
cd Python-3.7.17/
./configure --enable-optimizations
make altinstall
sudo ln -s /usr/local/bin/python3.7 /usr/bin/python3
 
 
 
posted on 2025-07-02 15:29  paulgeo  阅读(10)  评论(0)    收藏  举报