Friday, October 16, 2015

RabbitMQ Cluster & CAP

最近看了一下RabbitMQ对于分布式部署的问题,整理了一下关于CAP的问题

C是说数据完全一致,任意时刻任意节点数据一致
A是指任意时刻任意节点都可以读写成功
P是指在网络出现分区的情况下,可以操作数据

CA是指任意时刻,任意节点读写完全一致切一定可用,但如果出现分区则不能保证C
CP是指如果出现分区,则更小规模一些的分区直接下线,不可访问,放弃了A
AP是指每个分区可以独立活动,恢复的时候再同步,最终一致性,放弃了C

在rabbitmq中的cluster模式,默认是CA模式,其中
  • 元数据的C和A由erlang提供
  • queue中message的C和A由mirrored queue提供

但是一旦出现分区,则以上的C无法提供

其中cluster的模式:
  • ignore (默认): 提供CA模式,如果出现分区,则C无法保证,且分区中的节点会各自为政,分区结束后不得不放弃一部分数据(元数据及queue中的message),且无法merge
  • pause-minority: 提供CP模式,即如果出现分区,则部分节点不可用,但可以保证数据一致性

会比较糟心的一点是,如果你把运行rabbitmq的虚拟机suspend的话,这台rabbitmq服务器无法感知到自己已宕机,也不知道其他机器已把自己列为无法访问的机器,也不会判定其他机器已宕机。

真正的CA是不存在的,因为出现P就没有C了,除非所有节点部署在同一台机器上。


No comments:

Post a Comment