Kafka和Zookeeper关系:
- Kafka使用Zookeeper保存broker的元数据、消费者元数据
- Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance
Kafka集群:
- 最大的好处是可以跨服务器实现负载均衡
- 其次是使用复制机制,避免单点故障造成的数据丢失,提供系统的可用性
Kafka部署到生产环境需要考虑的问题
-为垃圾回收器调参
可以更改Kafka启动的垃圾回收器为G1
对G1的停顿时间设置为比默认200ms更短一点。
对G1触发新一轮垃圾回收占用的堆内存百分比设置比默认的45%更低点。
总之,由于Kafka对堆内存的使用频率比较高,容易产生垃圾对象,故要让垃圾回收比默认的早一点启动。
Kafka发送消息的主要过程(生产者组件)
- 先创建一个ProducerRecord对象,该对象包含主题、值,也可以包含键、分区
- 然后将键和值对象序列化成字节数组,这样才能在网络中传输
- 数据传给分区器,指定分区的话,分区器直接返回指定的分区;没有的话分区器根据键选取分区
- 将该记录添加到一个记录批次中,同一个批次表示同一个主题和同一个分区,批次可以作为一个缓冲区理解,减少数据传输次数。
- 服务器收到这些批次消息后,成功会返回一个RecordMetaData对象,包含主题、分区、偏移量信息;失败返回一个错误,生产者会再尝试多次。
Kafka生产者创建的三个必设置的属性:
- bootstrap-servers:指定broker的地址,hostname:port形式,可以指定多个
- key-serializer:序列化器类型,Kafka默认的提供有String/Integer/ByteArray类型,自定义的序列化器需要实现Serializer接口
- value-serializer:同理
Kafka生产者发送消息的三种方式:
- 发送并忘记(fire-and-forget):调用send(),不关心是否发送成功
- 同步发送:调用send(),返回一个Future对象,调用get()进行等待,可知消息是否发送成功
- 异步发送:调用send(),并指定一个回调函数,服务器在响应的时候调用该函数
Kafka生产者的其余部分影响性能的配置:
- acks:表示有多少分区副本接收到消息,生产者就认为写入成功
0:只要消息发出去了,不等服务器响应,不在乎是否发送成功,都认为成功。
1:只要首领结点收到了,生产者就会收到服务器的一个写入成功的消息
all:顾名思义
Kafka消费者部分概念理解:
- 消费者群组的目的是为了对消费者进行横向扩展,加强消费者读取消息的能力,对消息进行分流。所以一个主题内的一个分区只能被同一个消费组中的一个消费者接收,也就不难理解了。
再均衡的理解:
- 分区所有权变更时的行为即称为再均衡。比如新增主题,消费者挂了,新增消费者,新增分区
- 再均衡期间,整个消费者群组都无法读取消息。
- 消费者通过向群组协调器(某个broker)发送心跳,来维持自己和群组之间的从属关系以及对分区的所有权。
- 消费者在轮询消息(获取消息)或提交偏移量的时候提交心跳
- 分配分区时,群主(消费者组中的一个消费者,一般为第一个入组的)负责实际进行分配,它从群组协调器中拿到成员列表,分配的结果由群组协调器进行分发给所有消费者。