架构

何为架构

架构是为了解决系统软件复杂度问题的;

架构的复杂度来源

高性能

集群的复杂度

1、任务分配

  1. 任务分配器;

    • 硬件网络设备(F5、交换机等)

    • 软件网络设备(LVS)

    • 负载均衡软件(Nginx、HAProxy)

  2. 任务分配器和业务服务器之间存在连接和交互,需要选择合适的连接方式

  3. 任务分配器需要增加分配算法

    • 轮询

    • 权重

    • 负载(如何按照负载来分配,那么业务服务器还要能够上报自己的状态给任务分配器)

上面的架构只是对增加一台业务机器,如果我们的QPS、TPS指标有了提高之后,那么我们的任务分配器可能就有多台,业务服务器随之也会增加,这种情况下面临的问题:

  1. 任务分配器变成多台;如何将用户分配到某一个任务分配器上;常见的方法包括:DNS轮询、智能DNS、CDN(内容分发网络)、GSLB设备(全局负载均衡)等

  2. 任务分配器和业务服务器之间的连接从简单的“一堆多”演变成了“多对多”的网状结构

  3. 机器数量也随之增加;状态管理、故障处理复杂度也会大大增加

2、任务分解

为什么需要任务分解?以及任务分解的好处?

  • 简单的系统更容易做到高性能(系统的功能越简单,影响性能的点就越少,就更容易进行有针对性的优化)

  • 可以针对单个任务进行扩展(当把任务分解到子系统的时候,这时候就更加容易发现系统的瓶颈。而且在优化的时候不需要改变整体的架构,风险响应的就会小很多)

任务分解同时也要把握拆分的粒度

高可用

什么是高可用

系统无中断的执行其功能的能力,代表系统的可用性程度,是进行系统设计时的准则之一。

系统做到绝对的“无中断”都是不太可能的事情。因为系统都是运行在硬件和软件之上的,而硬件会老化,软件会越来越复杂和庞大。而且一些自然环境也可以导致系统的中断。

所以,高可用的方案,五花八门。但是万变不离其宗,本质上都是通过【冗余】来实现高可用(就是一台机器不够就上两台,两台机器不够就上四台)。和高性能的解决方案类似,都是通过“冗余”来达到目的。但是其中又有不同之处:

高性能增加机器的目的在于“扩展”处理性能;

高可用增加机器的目的在于“冗余”处理单元。

1、计算高可用

高可用复杂度的体现,在以下几个方面:

  1. 需要增加任务分配器

  2. 任务分配器和业务服务器之间有连接和交互

  3. 任务分配器增加分配算法。如,常见的双机算法有:主备、主主;主备方案又可以细分为:温备、热备、冷备。

当高可用升级为集群的时候,分配算法更加复杂,可以是1主3备、2主2备、3主1备、四主0备,具体采用哪种,还是要根据业务的实际情况来分析和判断。

zookeeper采用的是1主多备

Memchaced采用的是全主0备

2、存储高可用

存储高可用的难点不在于如何备份数据,而是在于如何减少或者规避数据不一致对业务的影响。

CAP定理:一致性、可用性、分区容错性;只能满足其中两个。

3、高可用决策状态

独裁式:指存在一个独立的决策主体,负责收集信息然后决策;

协商式:两个个体通过交流信息,根据规则进行决策;最常用的协商式决策就是主备决策;

民主式:多个独立的个体通过投票的方式进行决策;zookeeper集群选举leader时就是采用的这种方式。

可扩展性

低成本

安全

规模

架构设计的三原则

合适

简单

演化