副本机制的好处
- 提供数据冗余:即使系统部分组件失效,系统依然能够继续运转,增加了整体可用性以及数据持久性
- 提供高伸缩性:支持横向扩展,能够通过增加机器的方式来提升读性能,进而提高读操作吞吐量
- 改善数据局部性:允许将数据放入与用户地理位置相近的地方,从而降低系统延时
kafka只具备提供数据冗余的好处
kafka基于领导者的副本机制
- 副本分为Leader,follower
- 只有leader对外提供读写,follwoer的任务是从leader异步拉取消息,并写入到自己的提交日志中
- leader挂了,或者leader所在的broker宕机了,kafka依托 zk提供的监控功能实时感知到,并立即开启新一轮的leader选举,从follower中选一个新的leader,老leader副本重启回来后,只能作为follower加入到集群中
kafka为什么设计只有leader可读写?
- 方便实现“Read-your-writes”:当使用生产者API向kafka成功写入消息后,马上使用消费者API去读取刚才生产的消息
- 方便实现单调读(Monotonic Reads):对于一个消费者用户,在多次消费时,不会看到某条消息一会存在一会不存在
- In-sync Replicas(ISR):ISR 中的副本都是与 Leader 同步的副本,相反,不在 ISR 中的追随者副本就被认为是与 Leader 不同步的
能够进入到ISR的追随者副本要满足一定的条件:
Broker 端参数 replica.lag.time.max.ms:这个参数的含义是follower副本能够落后leader副本的最长时间间隔,默认值10s,意思是只要一个follower副本落后Leader副本的时间不连续超过10s,那kafka就认为该Fllower和Leader是同步的,即使此时Follower副本中保存的消息明显少于Leader副本中的消息,倘若follower被认为是与leader副本不同步,就不能再放入ISR,kafka会自动收缩ISR集合,将该副本提出ISR,倘若该副本后面慢慢追上了Leader的进度,它能够重新被加回ISR,ISR是一个动态调整的集合,而非静态不变的
Unclean 领导者选举(Unclean Leader Election):kafka把所有不在ISR中的存活副本都成为非同步副本
非同步副本落后 Leader 太多,因此,如果选择这些副本作为新 Leader,就可能出现数据的丢失,在 Kafka 中,选举这种副本的过程称为 Unclean 领导者选举。Broker 端参数
unclean.leader.election.enable 控制是否允许 Unclean 领导者选举。开启 Unclean 领导者选举可能会造成数据丢失,但好处是,它使得分区 Leader 副本一直存在,不至于停止对外提供服务,因此提升了高可用性。
CAP理论:一个分布式系统通常只能同事满足一致性(Consistency),可用性(Availability),分区容错性(Partition tolerance)中的两个,kafka赋予了选择C或者A的权利