一致性(consensus)
何为一致性问题?简单而言,一致性问题就是相互独立的节点之间如何达成一项决议的问题。分布式系统中,进行数据库事务提交(commit transaction)、Leader选举、序列号生成等都会遇到一致性问题。
假设一个具有 N 个节点的分布式系统,当其满足以下条件时,我们说这个系统满足一致性:
- agreement(全认同): 所有N个节点都认同一个结果;
- valdity(值合法):该结果必须由 N 个节点中的节点提出;
- termination(可结束): 决议过程在一定时间内结束,不会无休止地进行下去;
分布式系统实现一致性的难点:
- asynchronous(消息传递异步无序):现实网络不是一个可靠的信道,存在消息延时、丢失,节点间消息传递做不到同步有序(synchronous);
- fail-stop (节点宕机):节点持续宕机,不会恢复;
- fail-recover(节点宕机恢复): 节点宕机一段时间后恢复,在分布式系统中最常见;
- network partition(网络分化):网络链路出现问题,将N个节点隔离成多个部分;
- byzantine failure(拜占庭将军问题):节点或宕机或逻辑失败,甚至不按套路出牌抛出干扰决议的信息;
一致性还具备两个属性:
- safety(强一致),它要求所有节点状态一致、共进退;