软件系统架构设计中,对于数据存储的设计也是一个重点话题,存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题因此,对任何一个高可用存储方案,我们需要从数据如何复制、各节点的职责、如何应对复制延时、如何应对复制终端这几个方面去进行思考和分析,今天小编就来聊一聊关于数据处理和存储系统设计?接下来我们就一起去研究一下吧!

数据处理和存储系统设计(软件系统架构设计中的高可用数据存储方案)

数据处理和存储系统设计

软件系统架构设计中,对于数据存储的设计也是一个重点话题,存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此,对任何一个高可用存储方案,我们需要从数据如何复制、各节点的职责、如何应对复制延时、如何应对复制终端这几个方面去进行思考和分析。

在存储高可用的双机架构中,最主要的目的是为了解决数据库的单点故障问题,如何解决这个问题?主要采用数据多节点存储的方式进行处理,数据的多节点存储,要考虑的是数据如何复制,双机架构中常用的的复制方案有主备复制、主从复制、双机切换、主主复制。下面分别说一下这几种复制方案的优缺点。

    主备复制

主备复制是最常见也是最简单的一种存储高可用方案,几乎所有的存储系统都提供了主备复制的功能,例如MySQL、Redis、MongoDB等。其整体架构比较简单,主备架构中的备机主要还是起到一个备份作用,并不承担实际的业务读写操作,如果要把备机改为主机,需要人工操作。

优点:

    对于客户端来说,不需要感知备机的存在,即使灾难恢复后,原来的备机被人工修改为主机后,对于客户端来说,只是认为主机的地址换了而已,无须知道是原来的备机升级为主机。

    对于主机和备机来说,双方只需要进行数据复制即可,无须进行状态判断和主备切换这类复杂的操作。

缺点:

    备机仅仅只为备份,并没有提供读写操作,硬件成本上有浪费。

    发生故障后需要人工干预,无法自动恢复。人工处理的效率是很低的,可能打电话找到能够操作的人就耗费了10分钟,甚至如果是深更半夜,出了故障都没人知道。人工在执行恢复操作的过程中也容易出错,因为这类操作并不常见,可能1年就2、3次,实际操作的时候很可能遇到各种意想不到的问题。

二、主从复制

主从复制和主备复制只有一字之差,“从”意思是“随从、仆从”,“备”的意思是备份。我们可以理解为仆从是要帮主人干活的,这里的干活就是承担“读”的操作。也就是说,主机负责读写操作,从机只负责读操作,不负责写操作。

优点:

    主从复制在主机故障时,读操作相关的业务可以继续运行。

    主从复制架构的从机提供读操作,发挥了硬件的性能。

缺点:

    主从复制架构中,客户端需要感知主从关系,并将不同的操作发给不同的机器进行处理,复杂度比主备复制要高。

    主从复制架构中,从机提供读业务,如果主从复制延迟比较大,业务会因为数据不一致出现问题。

    故障时需要人工干预。

三、双机切换

双机切换在主从复制的基础上做了优化,解决了主机故障后无法进行写操作或者主机出现故障无法恢复时,可以通过人工指定新的主机的问题。双机切换包括主备切换和主从切换两种方案。简单来说,这两个方案就是在原有方案的基础上增加切换功能,即系统自动决定主机角色,并完成角色切换。要实现一个双机切换,必须考虑主备间状态判断、切换策略、数据中途解决这几个方面的问题。常见的双机切换方案有以下几种。

互联式

互联式,顾名思义,就是指主备机直接建立状态传递的渠道,这个是在主备架构的基础上,主机和备机多了一个状态传递的通道,这个通道就是用来传递状态信息的。其架构图如下:

优点:

    通过网络连接或非网络连接(串口线连接)。

    通过主机发送状态给备机,或者备机到主机来获取状态信息。

    状态传递通道可以和数据复制通道共用,也可以独立一条通道。

缺点:

    若状态通道发生故障,备机从而将自己升为主机,而此时主机并没有故障,最终可能出现两个主机。

    虽然可增加多个通道来增强状态传递的可靠性,但是通道越多,状态决策就越复杂,因为对备机来说,可能从不同的通道收到了不同甚至矛盾的状态信息。

中介式

中介式指的是在主备两者之外引入第三方中介,主备机之间不直接连接,而都去连接中介,并且通过中介来传递状态信息,其架构图如下:

由上图我们可以看到,主机和备机之间不再通过互联通道传递状态信息,而是都将状态上报给中介这个角色,单纯从架构上看,这一架构模式似乎比互联式更加复杂了,首先要引入中介,然后要各自上报状态,然而事实上,中介式在状态传递和决策上却更加简单了。

优点:

    无论是主机还是备机,初始状态都是备机,并且只要与中介断开连接,就将自己降级为备机,因此可能出现双备机的情况。

    主机与中介断连后,中介能够立刻告知备机,备机将自己升级为主机。

    如果是网络中断导致主机与中介断连,主机自己会降级为备机,网络恢复后,旧的主机以新的备机身份向中介上报自己的状态。

    如果是掉电重启或者进程重启,旧的主机初始状态为备机,与中介恢复连接后,发现已经有主机了,保持自己备机状态不变。

    主备机与中介连接都正常的情况下,按照实际的状态决定是否进行切换。例如,主机响应时间超过3秒就进行切换,主机降级为备机,备机升级为主机即可。

缺点:

    中介本身的高可用是一个需要考虑的问题。

    如果中介自己宕机了,整个系统就进入了双备的状态,写操作相关的业务都不可用了。

四、主主复制

主主复制指的是两台机器都是主机,互相将数据复制给对方,客户端可以任意挑选其中一台机器进行读写操作。

优点:

    两台都是主机,不存在切换的概念。

    客户端无须区分不同角色的主机,随便将读写操作发送给哪台主机都可以。

缺点:

    主主复制架构,必须保证数据能够双向复制,而实际在很多业务场景中,很多数据是不能双向复制的。

    主主复制架构对数据的设计有严格的要求,一般适合于那些临时性、可丢失、可覆盖的数据场景。例如,用户登录产生的session数据(可以重新登录生成)、用户行为的日志数据(可以丢失)、论坛的草稿数据(可以丢失)等。

上面介绍了不同复制方案,如何选取合理的方案,还需要从业务的角度出发进行考虑,比如读多写少的情况下一般采用主从复制,像论坛、BBS、新闻网站这类业务系统。最后给大家推荐一个比较成熟的MYSQL高可用方案,叫MHA,感兴趣的同学可以去找找相应的教程。

今天就分享到这里,感兴趣的同学别忘了加关注,持续分享更多软件架构设计方面的知识。