写在前面
在当今信息爆炸的时代,单台计算机已经无法负载日益增长的业务发展,虽然也有性能强大的超级计算机,但是这种高端机不仅费用高昂,也不灵活,一般的企业是负担不起的,而且也损失不起,那么将一群廉价的普通计算机组合起来,让它们协同工作就像一台超级计算机一样地对外提供服务,就成了顺其自然的设想,但是这又增加了软件的复杂度,要求开发的软件需要具备横向扩展能力,比如:Kafka、Elasticsearch、Zookeeper等就属于这一类软件,它们天生都是"分布式的",即可以通过添加机器节点来共同地分摊数据存储和负载压力。
为什么需要集群?
分布在不同区域的计算机,彼此之间通过网络建立通信,相互协作作为一个整体对外提供服务,这就是集群,如果我们开发的系统具备这样的能力,那么理论上就具备无限横向扩容的能力,系统的吞吐量就会随着机器数增加而增长,那么未来当系统出现高负载的时候,就可以很好地应对这种情况。
为什么CAP不能同时满足?
通过上面分析,我们知道实现集群,其实就是采用多台计算机来共同承担和负载系统压力,那么就涉及到多台计算机需要参与一起处理数据,为了保证可用性,一般都会在每台计算机上备份一份数据,这样只要有一个节点保持同步状态,那么数据就不会丢失,比如kafka分区多副本、Elasticsearch的副本分片,由于同一数据块及其副本位于不用的机器,随着时间的推移,再加上不可靠的网络通信,所有机器上的数据必然会不完全一致,这个时候假如发生一种极端情况,所有的机器宕机了,又如何保证数据不丢失呢(其实只有两种方法)?
- 保证可用性:选择第一台恢复正常服务的机器(不一定拥有全部数据)作为可信的数据来源,快速恢复集群,即停机时间优于同步。
- 保证数据一致性:等待第一台拥有全部数据的机器恢复正常,再恢复集群,即同步优于停机时间,比如禁用kafka的unclean leader选举机制就是这种策略。
其实当大多数机器不可用时&#