系统复杂度的另一个原因是高可用性,即无间断的提供服务。业内一半用几个9来表达服务的可用程度,即如下公式:
服务年度可用性=(服务年度可用时间/年度总时间) x 100%
知名大型网站要达到99.99%(俗称4个9),也是很难的,支付宝还会被挖断光缆,百度DNS解析也会出现问题呢!
任何软件和硬件都会出现问题,磁盘会坏,软件有bug,按理说每50行代码就有可能产生一个bug,windows系统bug是修改不完的 ,所以一直在打patch啊!如何实现系统的高可用,通过冗余,就是增加机器的方式,这里增加机器和高性能增加机器不同,高性能中增加机器是为了提供计算性能,这里的是为了提供冗余服务。如:数据存储通过提供备份方案,来实现数据存储的高可用,通常的主备方案就是一种选择,Redis集群的主备方案,Mysql的主备方案等等。服务高可用可以通过集群方式来搭建服务集群,当一台服务出现问题时自动切换到另外一台提供服务。
下面从2个场景来阐述高可用的复杂性。
- 业务服务高可用
通过把业务服务部署在多态机器上提供服务,就需要改服务为无状态的,即每次请求不管落在那台服务器上,返回结果都是一样的。同样需要一个负载均衡服务器,进行分发任务,这里和上一讲说的高性能复杂度一样,同样引入了连接管理,轮询算法等额外的工作量。而随着集群规模越来越大,复杂度就会越来越高。比如,集群规模增大时,我们使用Zookeeper来进行状态协调各种资源,而其选举算法ZAB就是