分布式系统中常见技术解决的问题是什么?

引言

在分布式系统中,常常会碰到的技术名词通常有Replication、Partition、Consensus、Transaction等等,这些技术在分布式系统设计中都是很是重要的,本文经过对分布式系统的Reliability、Scalability和Maintainability特性的讨论,描述这些技术解决的问题。算法

Reliability

Reliability,指的是在任何状况下,系统正常工做的能力。若是一个系统在发生任何异常时,都能正常的工做,那么系统是彻底可靠的。现实中,异常种类不少,有的每每难以事先避免,所以,了解可能的异常并分析如何在异常发生时快速恢复是很是重要的。通常地,异常包括硬件异常,软件异常和人为异常。服务器

硬件异常

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

软件异常

软件异常通常指的是系统的bug,这里面不只包括本身写的系统的bug,也包括依赖的服务系统的bug。软件异常一样也是不能彻底避免的,所以,在发生软件异常时,也须要有快速恢复的手段,一般有三种方法:架构

  1. 经过调整软件已有的配置参数,规避问题
  2. 重启软件或者依赖的服务,消除异常状态
  3. 直接修复bug,并升级版本

在没有发生致命性问题时,通常采用方法1或2来恢复,当发生的问题比较严重,而且没有已知的方法能绕过期,通常才使用方法3,方法3自己风险也是比较大的,由于修复bug的同时可能会产生新的bug。负载均衡

人为异常

不论是软件自己,仍是软件所运行的服务器,都是由人来管理的,但人是会犯错误的,有时候会执行错误的命令致使系统不能正常工做,其中比较致命的错误可能就是删掉某台服务器的数据了,在这种状况下为了能快速地恢复,一般也是采用Replication的思路,来避免问题。运维

Scalability

系统的工做负载一般不是一成不变的,当工做负载增长时,每每能够经过增长机器资源来保持性能不变,而须要增长机器数量的多少是由系统的扩展性来决定的,扩展性越好的系统,须要增长的机器资源越少。最完美的扩展性是线性扩展性,即工做负载扩大为原来N倍的时候,只须要加N倍的机器,就可以保持性能不变,最差的扩展性则是没有扩展性,即工做负载扩大为原来N倍时,即便加再多的机器,也没法保持性能和原来同样。分布式

对于不一样的系统,负载所表明的含义一般是不同的,对于基础架构系统,一般每秒读和每秒写的次数,对于业务系统,一般有本身的指标,例如每秒交易建立的笔数。一样地,对于不一样的系统,其使用的性能指标一般也是不相同的,对于批处理系统,一般强调的是吞吐量,即每秒完成的任务数量,而对于在线处理系统,一般强调的是响应时间。性能

在明确一个系统的工做负载指标和性能指标以后,咱们才能讨论在该系统下如何实现扩展。扩展一般是两种思路,一是垂直扩展,即便用更好的机器替换现有的机器,二是水平扩展,即便用更多的机器。学习

对于垂直扩展,其优势是对业务是无影响的,缺点是更好的机器是很贵的,一般是一分钱一分货,而十分钱只能买到两分货,且现实中总有单机装不下的数据量,此时垂直扩展天然就没法实施了。设计

对于水平扩展,一般须要软件层面的配合,对于无状态的系统,一般只要在新加的机器上部署上须要扩展的系统,而对于有状态的系统,通常指的是存储系统,一般会将数据分红Partition(分区),这样新加的机器才能经过迁移Partition的方式,从老的机器上迁移数据以及对应的工做负载出来。水平扩展的优势是使用的都是相对廉价的服务器,能节约成本,但在软件层面须要作大量的工做,包括Partition的管理,迁移,负载均衡等等。

Maintainability

可维护性的好坏决定了系统是否可以长久的发展,一个可维护性很差的系统,会给运维和开发人员带来不少不便。对于运维人员来说,可维护性指的是系统是否支持经常使用的运维手段,良好的文档等等。而对于开发人员来说,主要分为内核开发以及使用该系统的业务开发,对于业务开发,维护性指的是系统是否有良好的接口,方便业务使用,例如,Transaction就是底层系统提供给业务的一种接口,它保证了在一个事务中执行的语句具备ACID性质,从而业务只须要关注业务逻辑的开发,而不须要关心底层的具体实现;对于内核开发,维护性指的是系统的代码质量,主要包括代码的可阅读性和是否易于修改,主要和系统内核开发人员的代码设计能力相关。

总结

为了能达到较好的可靠性(Reliability)、可扩展性(Scalability)和可维护性(Maintainability),分布式系统设计中一般会使用多副本(Replication)、数据分区(Partition)、一致性算法(Consensus)、事务(Transaction)等技术,理解它们要解决的问题,深刻了解每种技术背后可能的实现方案,有助于评价某个系统的设计好坏,这对于多个竞品系统的选型和深刻学习系统原理都是很是有必要的。

本博客更新会在第一时间推送到微信公众号,欢迎你们关注。

qocde_wechat

参考文献

  • Design Data Intensive Applications
相关文章
相关标签/搜索