天声音响

资讯分类

首页 > 信息资讯 > 阅读资讯

都在谈“分布式系统”,你知道其中几大常见技术解决的问题是什么吗?

发布时间:2019/11/5 1:05:45

       在分布式系统中,经常会碰到的技术名词一般有多副本、数据分区、一致性算法、事务等,这些技术在分布式系统设计中都是非常重要的,CEOPA想通过本文对分布式系统的可靠性、可扩展性和可维护性特性的讨论,描述这些技术解决的问题,希望能够帮到大家。


可靠性
       指的是在任何情况下,系统正常工作的能力。如果一个系统在发生任何异常时,都能正常的工作,那么系统是完全可靠的。现实中,异常种类很多,有的往往难以事先避免,因此,了解可能的异常并分析如何在异常发生时快速恢复是非常重要的。一般地,异常包括硬件异常,软件异常和人为异常。

硬件异常
       硬件异常种类很多,硬盘,电源等任意一个部件的损坏,都可能导致服务器不能正常的工作。通常这类异常难以避免,但是,我们可以通过一些技术手段来实现异常发生后的快速恢复,不管是从软件角度还是硬件角度,基本的解决思路都是冗余。
       从硬件角度来讲,我们可以通过单机冗余多份硬件,当其中某个硬件发生异常时,可以快速地用好的硬件替换掉故障的硬件,这种方式的硬件冗余对于数据中心级的故障是没有作用的;
       从软件角度来讲,我们可以通过多副本(Replication)来实现快速恢复,当某台服务器硬件异常时,可以在软件层面将流量导入到新的副本上(实际上也有硬件冗余,但这种方式更为灵活)
       除了Replication之外,有时候为了减少单台服务器故障对所有用户的影响,可以对用户数据做分区(Partition)。单台服务器只存某一部分用户的数据,这样单机故障就只会影响一部分用户了。引入多副本(Replication)后,如何保证多副本的数据的一致性又成了一个问题。Paxos和Raft算法就是为了解决这类问题。


软件异常
       软件异常一般指的是系统的bug,这里面不仅包括自己写的系统的bug,也包括依赖的服务系统的bug。软件异常同样也是不能完全避免的,因此,在发生软件异常时,也需要有快速恢复的手段,通常有三种方法:
1. 通过调整软件已有的配置参数,规避问题
2. 重启软件或者依赖的服务,消除异常状态
3. 直接修复bug,并升级版本

人为异常
       不管是软件本身,还是软件所运行的服务器,都是由人来管理的,但人是会犯错误的,有时候会执行错误的命令导致系统不能正常工作,其中比较致命的错误可能就是删掉某台服务器的数据了。在这种情况下为了能快速地恢复,通常也是采用多副本(Replication)的思路,来避免问题。


扩展性
       系统的工作负载通常不是一成不变的,当工作负载增加时,往往可以通过增加机器资源来保持性能不变。需要增加机器数量的多少是由系统的扩展性来决定的,扩展性越好的系统,需要增加的机器资源越少。
       最完美的扩展性是线性扩展性,即工作负载扩大为原来N倍的时候,只需要加N倍的机器,就能够保持性能不变,最差的扩展性则是没有扩展性,即工作负载扩大为原来N倍时,即使加再多的机器,也无法保持性能和原来一样。
       扩展通常是两种思路,一是垂直扩展,即使用更好的机器替换现有的机器,二是水平扩展,即使用更多的机器。
       对于垂直扩展,其优点是对业务是无影响的,缺点是更好的机器是很贵的。通常是一分钱一分货,而十分钱只能买到两分货,且现实中总有单机装不下的数据量,此时垂直扩展自然就无法实施了。
       对于水平扩展,通常需要软件层面的配合。对于无状态的系统,通常只要在新加的机器上部署上需要扩展的系统;对于有状态的系统,一般指的是存储系统,通常会将数据分区Partition。这样新加的机器才能通过迁移Partition的方式,从老的机器上迁移数据以及对应的工作负载出来。水平扩展的优点是使用的都是相对廉价的服务器,能节约成本,但在软件层面需要做大量的工作,包括Partition的管理,迁移,负载均衡等。


可维护性
       可维护性的好坏决定了系统是否能够长久的发展,一个可维护性不好的系统,会给运维和开发人员带来很多不便。对于运维人员来讲,可维护性指的是系统是否支持常用的运维手段,良好的文档等等。而对于开发人员来讲,主要分为内核开发以及使用该系统的业务开发,对于业务开发,维护性指的是系统是否有良好的接口,方便业务使用。