最近看了一下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了,除非所有节点部署在同一台机器上。