kafka集群架构
1、Topic的分区和副本机制
分区的作用
1-解决了单台节点容量有限的问题: 每一台服务器上的硬盘资源始终是有上限的。一个Topic分成多个分区后,可以使用多个服务器节点的存储资源,提供更多的数据存放能力。
2-增加Topic对数据的吞吐量:通过分区操作,将一个Topic分成了多个分区,多个分区分布在不同的节点上面,从而提供更加高效的数据读写请求。
分区的数量是没有限制的,与集群中的Broker节点也没有关系。但是实际工作中,推荐分区数量不要超过集群总结点个数的3倍。
副本的作用
提高数据的可靠性:副本数越多,数据越安全,容错性高,但是读写效率会变低。
副本的数量是有限制的,最多和集群中Broker的节点个数一致,但是实际工作中,根据数据的重要程度,推荐副本的数量为1-3之间。
2、消息存储和查询机制
消息存储
1-kafka中数据的存放位置:在server.properties中配置的log.dirs=/export/server/kafka/data
2-data目录下,文件夹的命名规则如下:Topic名称-分区编号
3-segment中文件名称命名规则如下:文件名称中的数字,表示该文件中第一条数它的offset(偏移量)。
问题:消息数据是不断的往一个log文件写呢,还是会分成多个文件夹来存储?
答:会分成多个文件存储,当log文件的大小达到1GB的时候,就会滚动形成新的文件,同时配套的index文件也会跟着滚动生成。
问题:为什么要分成不同的文件存储?
答:
1.一个文件过大,打开和关闭文件需要消耗大量的系统资源。
2.一个文件过大,在里面查找具体数据的时候,非常耗时。
3.kafka只是对数据做临时的存储,而不是永久存储,所以kafka会定时的将过期数据删除掉,当消息超过一定时间后,kafka会认为数据失效,就会被kafka删除。数据默认的保留时间是168小时(7天),可以在server.propereties中通过log.retention.hours=168配置参数指定。
index文件内容的基本结构:
查询机制
查询步骤:
1-首先先确定要读取的这个offset(偏移量)在哪个segment片段中。
2-查询这个segment片段的index文件,根据offset确定这个消息在log文件的什么位置,也就是确定消息的物理偏移量。
3-读取log文件,查询对应范围内的数据即可(底层是基于磁盘顺序查询)。
4-获取最终的消息数据。
3、Kafka中生产者数据分发策略
1-随机分发策略:在python的客户端支持,但是在Java中不支持。
2-指定分区策略:发送数据的时候,直接明确指定要将数据发到哪个分区。支持
3-Hash取模策略:对数据按照Key进行Hash取模,然后分发。支持
4-轮询策略:在2.4及以上版本,已经更改位粘性分发策略。只在Java中支持
5-自定义分区策略:支持