Kafak是如何实现高可用:
1.zk部署2n+1个节点,形成zk集群,保证高可用。
2.Kafak Broker部署集群,每一个Kafak节点就是一个Broker。每个Topic的partition,基于副本机制,在broker集群中复制。形成replica副本,保证消息存储的可靠性。每个Replica副本都会选出一个leader分区(Partition),提供给客户端进行读写。
3.Kafak Producer无需考虑集群,因为和业务服务器部署在一起。Producer从zk拉取到Topic的元数据,选择对应的Partiton的leader分区,进行消息写入。
而Borker根据producer的request.acquire.acks配置,判断是写入自己成功就响应producer成功还是写入所有broker(broker上的partition)成功在响应。
4.Kafak Consumer集群部署 每个Consumer分配对应的Topic partition,根据对应的分配策略。并且Consumer从leader分区拉取消息,另外当有consmuer加入或者减少,都会将Topic partition再均衡,重新分配给Consumer。
消息可靠保证
1.消费端的保证消息可靠 取消自动确认,消费完成调用ack,同时做好消息处理冥等处理。
唯一可能导致消息丢失的情况,在消费端获取到了消息,自动提交了offset,让borker以为已经消费好了这个消息,实际上才开始准备消费这条消息,可能存在消费过程中消费者挂了,这条消息就会丢掉。这和Rabbit差不多,Kafak会自动提交offset,那么只要关闭自动提交offset,处理完成之后手动提交ack。就可以保证消息不丢失。可能消费完了,提交ack过程发生失败,在消费端做好幂等性处理。
2.Borker弄丢了数据
比较常见的一个场景,某个broker挂了,然后重新选举Partition的leader。此时其他follower刚好有数据没有同步,结果此时leader挂了,然后选举某个follower成为leader之后,这样就导致有些数据丢失了。
要设置4个参数:
1.给Topic设置replication.factor参数:这个值必须大于1,要求每个partition至少有2个副本。
2.在Kafak服务端设置min.insync.replicas参数:这个值必须大于1,这个要求leader至少感知到至少一个follower还跟自己保持联系
3.在producer端设置acks=all:这个要求每条数据,必须写入所有的replicas,才能确认写入成功。
4.在producer端设置retries=MAX,这个要求一旦写入失败,就无限重试。
3.生产者producer保证消息不丢失
按照上述思路设置了acks=all,一定不会消失。要求是消息写入了leader后,所有的follower都同步到了消息才确认。如果不满足这个条件,生产者就会不断的重试。
Kafak如何保证消息的顺序消费
kafak本身不像Rocket一样,提供顺序性的消息。所以提供的方案都是相对有损的。这里的顺序消息,我们更多指的是,单个partition的消息,被顺序消费
方式一:Consumer,对每个parttion内部单线程消费,单线程吞吐量太低,一般不会用。
方式二:Consumer拉取到message,写到N个内存queue,具有相同key的数据都存到同一个内存queue。然后对于n个线程,每个线程分别消费一个内存queue即可,这样能保证顺序性。
如何快速的处理故障引发的大量积压数据:
1.恢复当前的consumer程序,然后将consumer都停掉。
2.创建一个topic,parition是原来的十倍。或者临时建立好原来的10倍,20倍的queue数量。
3.然后写一个临时分发数据的consumer一个,这个consumer用来消费原来积压的数据,把数据写入临时建立的10倍的queue。
4.准备临时临时部署10倍的consumer,消费临时queue的数据。
来源:oschina
链接:https://my.oschina.net/u/3126880/blog/3063535