kafka基础学习

一、何为Kafka

1.Kafka的主题与分区

主题:类似于数据库的表,或者文件系统里的文件夹。

主题分为若干个分区,一个分区就是一个提交日志。

消息追加写入,先入先出。能保证单个分区的顺序。

通过分区实现里数据冗余与伸缩。

2.生产者与消费者

Kafka的客户端分为:生产者(producer)和消费者(consumer)。及其他高级客户端Kafka Connect API 和用于流式处理的Kafka Streams。

生产者:默认会把消息均衡的分布到主题的所以分区。通过消息键和分区器实现把消息写到指定的分区。

消费者:订阅一个或多个主题,按生成顺序读取它们。消费者通过检查消费的偏移量带区分已经读取过的信息,offset。它创建消息时就会添加到消息里,给定的分区里它时唯一的。消费者会把没个分区最后读取的消息偏移量保存在Zookeeper或Kafka上,消费者关闭或重启,都不会丢。

消费者群组: 消费者是其中一员,群组保证多个消费者读取一个主题时,每个分区只能被一个消费者使用,一个消费者可以读取多个分区。一个消费者也能读取多个主题!好比客户(consumer)可以去任何店(topic)撩任何妹子(分区),不与他人共享。

3.broker和集群

broker顾名思义,我觉得像丰巢快递的箱子?。负责接收生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。

为消费者服务,对读取分区请求作出响应,返回已经提交到磁盘上的消息

one broker deal thounds part and minlion Millions messages!

每个集群都有一个leader broker——就是自动从集群活跃成员选出来的大佬。搞管理,分配分区给broker然后监控它。

一个分区可以分配给多个broker,分区复制机制提供了消息冗余,如果一个broker挂了,其他接盘!不过相关的消费者生产者都要重连到接盘侠。

Kafka有保留消息的特性,默认为保留一段时间,或者大小。过了就干掉。这个可配置。

4.Kafka多集群

  • 数据类型分离
  • 安全需求隔离
  • 多数据中心应对灾难恢复

Kafka提供了MirrorMaker来实现集群间消息复制。

这就是中间商,从A集群读,读了再把消息发送到B集群上。思考?如此简单类似与复制粘贴,肯定性能不咋的!

Kafka的优势:

  1. 多生产者。创建单独主题,大家一起以相同消息格式往主题里写!
  2. 多消费者。多人从一个单独的消息流读取数据,互不影响。其他队列系统,消息一旦被一个客户端读取,其他客户端就无法读取它。多个消费者组成一个群组,共享消费一个信息流,并保证整个群组对每个给定的消息处理一次。
  3. 基于磁盘的数据存储。由于保留特性,消息被提交到磁盘。每个主题可以设置单独的保留规则,满足不同的消费者需求,可以设置各个主题保留不同数量的消息。突然出事 处理不过来时就存磁盘,消息不会丢失。下次接着消费~
  4. 伸缩性。多个broker,个别失效也能继续战斗!要提高集群的容错能力,需要配置较高的复制系数。
  5. 高性能。

Kafka使用Zookeeper保存集群的元数据信息和消费者信息。

Zookeeper集群被称为 群组。不建议一个群组超过7个节点,因为Zookeeper使用了一致性协议,节点过多会降低整个群组点性能。

群组公共配置文件:

tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=20
syncLimit=5
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

服务器地址格式:server.X=hostname:peerPort:leaderPort

X与服务器id一致为dataDir下的myid文件内容,hostname主机名or Ip,peePort节点间通信点TCP端口,leaderPort首领选举的TCP端口

客户端用clientPort连接到群组,而群组节点间的通信则需要同是用到 peePort、leaderPort、clientPort

每个服务器必须在dataDir目录中创建一个myid的文件,包含服务器ID,这个ID要与配置文件里的ID一致。

由于我没有租云服务器(穷),所以晚上回家打算用docker搭建一个zookeeper集群。

如下:

用docker撸个zk,kafka集群

二、Kafka的配置相关

1.broker.id=0: 默认为0,可设置为任一整数,在集群中必须唯一。

2.port: 默认启动Kafka会监听9092端口。可修改为其他。

3.zookeeper.connect: 用于保存broker元数据的Zookeeper地址由它来指定。该参数为冒号分隔hostname:port/path的一组列表。

  • hostname是Zookeeper服务器名,或IP
  • port为Zookeeper的客户端连接端口
  • /path是可选的Zookeeper路径,作为kafka集群的chroot环境。不指定就默认根路径。不存在chroot路径就创建。在配置文件指定一组Zookeeper服务器,用 ‘  ; ’分号隔开,一个zk挂掉,broker就会连接到Zookeeper群组到另一个节点上。(容错)

4.log.dirs

Kafka把所有消息都保存在磁盘上,用它来指定存放日志片段的目录,它是用逗号分隔的本地文件系统路径。broker往分区数目最少的地方添加~

5.num.recovery.threads.per.data.dir

Kafka使用线程池来处理日志片段。每个日志目录所用的线程默认为1。 如为3 且由3个日志目录 就需要9个线程。

6.auto.create.topics.enable

7.num.partitions 指定新创建的主题有多少个分区。创建时默认。如需指定则要手动创建是指定。

8.log.retention.ms 决定数据保留时间。默认使用log.retention.hours 168h

9.log.retention.bytes 通过字节数来过期,作用在每个分区上。如设为1GB 一个含有8个分区的主题最多就可以保存8GB的数据。

分区增加,主题就能多存。  

        8.9都存在的情况下,|| 满足其一就删

10.log.segment.ms  控制日志片段关闭时间

11.log.segment.bytes 控制日志片段关闭

       10.11都对性能有影响,对于 某些难以达到空间上满对就用时间去限制,不然对于那些数据量小的分区,日志片段的关闭操作总是同时发生。

12.message.max.bytes 单个消息大小默认1MB,如果(压缩后的)消息大于此,消息不会接收还会报错。

这个值越大,负责处理网络连接和请求的线程就需要越多的时间来处理这些请求。它还会增加磁盘写入块的大小,从而影响IO吞吐量。

三、Kafka的硬件相关

1.磁盘吞吐量。机械硬盘(HDD) \固态硬盘(SSD).

2.磁盘容量。取决于需要保留的消息数量与时间。

3.内存。磁盘影响写入的生产者,内存影响消费者。消费者一般从分区的尾部读取消息,如生产者存在,就紧跟其后,消费者读取的消息会直接放到系统的页面缓存里,这样比从磁盘上读快多了。正在使用的日志片段也可缓存。

4.网络。决定了最大数据流量。

5.cpu。为了优化网络和磁盘空间做计算。压缩消息。对消息批量解压,设置偏移量,然后从新批量压缩,再保存磁盘。

四、Kafka的性能优化相关

1.操作系统优化

  • 虚拟内存、网络子系统、用来存储日志片段的磁盘挂载点有关。配置在/etc/sysctl.conf,参考操作系统文档修改。
  • 虚拟内存中 内存页和磁盘之间的交换 ,Kafka大量用系统页面缓存,如果虚拟内存被交换到磁盘,就没多余的内存分配给页面缓存了~。设置vm.swappiness较小,比如1。(为0意味着任何情况下都不要发生交换。)该参数指明虚拟机子系统如何使用交换分区,而不是只把内存页从页面缓存中移除。要优先考虑减小页面缓存,而不是进行内存交换。
  • 调整内核对脏页面对处理,脏页面会冲刷到磁盘上。将vm.dirty_backgroud_ratio设置为小于10,一般为5,不应该为0,那样内核频繁的刷新页面,从而降低内核为底层设备的磁盘写入提供缓冲的能力。/proc/vmstat可以查看当前脏页数量。cat /proc/vmstat | egrep "dirty|writeback"
  • 磁盘。EXT4第四代可扩展文件系统和 XFS。不管那种文件系统来储存日志片段,最好要对挂载点的noatime参数设置合理。文件元数据包含3个时间戳:创建时间(ctime)、最后修改时间(mtime)、最后访问时间(atime)。每次访问都要用到atime,懒得记录没用,不如禁掉。
  • 网络。首先对分配给socket读写缓冲区的内存大小作出调整,可以显著提升网络性能。参数为net.core.wmem_default和net.core.rmem_default,合理的数值为131072 (128KB)。读写缓冲区最大值由net.core.wmem_max和net.core.rmem_max设置,为2097152(2MB);
    TCP socket读写缓冲区,参数为net.ipv4.tcp_wmem和net.ipv4.tcp_rmem。由最小4KB,默认64KB,最大组成2MB。eg: "4096 65536 2048000" ;
    net.ipv4.tcp_window_scaling=1可提升客户端传输数据的效率,传输的数据可以在服务器缓冲;
    net.ipv4.tcp_max_syn_backlog默认1024可以开大点~ ,接受更多并发。
    net.core.netdev_max_backlog默认1000,开发有助于网络流量爆发,允许更多的数据包排队等待内核处理。

五、Kafka的垃圾回收相关

    G1垃圾回收器

  • MaxGCPauseMills: 指定每次垃圾回收默认的停顿时间。默认200ms。
  • InitiatingHeapOccupancyPercent: G1启动新一轮垃圾回收前可以使用的堆内存百分比,默认45。堆内存(老年代+新生代)使用在<45%,不会GC。

   Kafka启动脚本没启动G1回收器,默认用的Parallel New 和CMS(Concurrent Mark-Sweep 并发标记和清除) 垃圾回收器。

  • export KAFKA_JVM_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true"
  • 在./kafka-server-start.sh -daemon $KAFKA_JVM_OPTS ../conf/server.properties 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值