分布式系统
分布式系统的出现是为了解决单机系统计算和存储的瓶颈,单个计算机的内存,硬盘,cpu是有上限的,并且价格也是指数级的上升。如果一台计算机只能存储10GB的数据,执行某个计算任务要20s的时间,当我们想要存储20GB的数据,想要执行计算任务的时间缩短为10s,我们就可以设计分布式系统来达到目的。总而言之,分布式系统是一种针对单机系统资源瓶颈问题的解决方案,它通过网络通信协议连接并协调多个计算机单元来共同完成计算、存储任务。
分布式系统通过软件系统来解决当下工业技术无法解决的计算和存储问题,那么相应地也会带来单机系统不存在的挑战:
透明性
分布式系统的设计相当复杂,你需要实现:服务发现,负载均很,master选举等功能,而这些对于使用者来说是透明的,最好的分布式系统就是使用者根本不会察觉的分布式的存在,给他的感觉是像使用单机系统一样。
可扩展性
可以轻松地支持水平扩展,当两台计算机不够用时,我扩展到四台计算机也很简单。
可用性与可靠性
要承诺提供的服务是可用可靠的,不能我昨天存储的数据,今天就找不到了;也不能我有时候可以访问,有时候却访问不了。
一致性
分布式数据存储中,可能会存在跨区域存储和数据备份的问题,要保证用户从任何地方读取到的数据都是一致的。
CAP理论
在分布式系统中,必然会存在C(consistency,一致性),A(availability,可用性),P(partition tolerance,分区容错性)这三个基本要求,然而分布式系统只能满足其中任意两个。这是为什么呢?
我们这三个两两组合进行分析:
CP系统:同时满足一致性和分区容错性,设想南京,北京,上海三地有三个单机组成一个分布式系统,它们通过网路相互连接协同,但分区容错性发生,及上海区域的网络连接丢失,南京和北京区域可以正常工作,此时南京区域有人写入一条数据,我们希望系统有一致性,即在北京和上海也能访问到这条数据,北京和南京网络连接正常,所以北京已经同步了这条数据;但是上海由于网络异常,无法同步,就不能保证数据一致性,我们只能告诉南京用户数据写入失败,即丧失了可用性。
AP系统:同时满可用性和分区容错性,根据上面的例子,南京用户无法把数据同步到上海,但为了保证可用性,我们告诉南京用户数据写入成功,此时上海却没有这条数据,即不存在数据一致性了。
CA系统:同时满足一致性和可用性,要知道网络是极其不稳定的因素,但是用户每次写入数据都能同步到所有节点上,说明节点不会存在网络分区,那么也就没有分区容错性了。
在实际生产应用中,我们无法保证我们的节点都在同一机房(不会存在网络分区),所以我们使用的分布式系统一般都是CP系统和AP系统,这之中就是数据一致性和服务可用性的权衡,大多数开源的分布式工具都是用户自定义配置成CP系统和AP系统,比如:Elasticsearch。