cap p 肯定,选择 A 就会导致又一致性问题.
同时,讲究 A,多备份的前提下. 在主备切换的时候就会导致脑裂问题.
主备切换的流程抽象为:
选主(认为主挂了)+对自身操作
两个问题:
主是提供别人调用,还是调用别人? 如果调用别人,可能重复掉.如果别人调用,可能调用错. arp 也可能失败,导致闹裂.
主是否还需要将后续数据通知从决定? 如果是,即使主脑裂,也不影响数据.
DBproxy 的写库如何决定?
1.proxy 之间决策讨论出主节点. 讨论出后续就用这个节点.
节点变更后,可能有的从还没了解到主节点挂了.可能还是访问主节点.
故只能是通过虚拟 ip 的变更决定.
heartbeat 通过 ping. 修改虚拟 ip
keepalive 通过路由器轮播选举协议 选举+ 选举后修改虚拟 ipVRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议
也可以通过 zk 进行选举? 但是更复杂了. 不够简单.