存储高可用的本质就是通过冗余来实现,这就必然涉及到数据之间的复制,如下四点是我们做设计的时候必须要考虑到的问题:
1.数据如何复制
2.各个节点的职责
3.如何应对复制延迟
4.如何应对复制中断
以下针对业界一些通用的方案做一些整理
主备复制:
主备的优点就是设计简单,无需考虑状态。几乎所有的存储系统都提供了主备复制策略,缺点就备机只有在故障的时候才有用,浪费硬件成本。故障后还需要人工干预恢复,无法自动恢复。
主从复制:
和主备的区别就是从机提供读操作。对外提供查询服务,因为从机也对外提供服务那么我们就必须在数据复制时候进行一定的监控,当延迟过高时候,需要人工干涉解决。
主从与主备相比具有如下优势:
1.主从复制在主机故障时,读的相关业务不受影响。
2.从机也对外提供服务,发挥了硬件性能
但是也存在缺点,就是引入了新的复杂度,主要体现在客户端需要感知主从关系,并将不同的操作发给不同的机器进行处理(mybatis插件)
主备倒换与主存倒换:
主备和主从方案存在两个共性问题:
1.主机故障后,无法提供写服务
2.如果主机无法恢复,需要人工指定新的主机角色。
要实现一个完善的倒换方案,我们需要考虑如下几个关键的设计点:
(1)主备状态判断:
状态传递的渠道,是相互连接还是三方仲裁
状态检测的内容,如机器是否掉电,进程是否存在,响应是否缓慢等
(2)倒换决策:
倒换时机-什么情况下备机或从机升级为主机(三分钟连续重启三次,响应超过三秒等等策略)
倒换策略-原来的主机恢复后是做从机还是继续倒换为主机?
自动程度-是否需要人工确认
(3)数据冲突解决:
比如新增数据的主键冲突,必须要分析现有的业务场景做出一定的应对
常见的架构
1.互联式
相比主备架构在此基础上多了状态传递的通道,客户端为了在倒换后正常访问,因为主备之间共享一个对客户端来说唯一的IP地址,比如虚拟IP。这种策略的劣势主要表现在如果主机没有故障,但是状态通道故障了,那么备机会升级为主机,那么就有可能出现双主机的情况。
2.中介式
通常的zookeeper是比较常用的中介
3.模拟式
核心思想就是主机和备机之间模拟读写操作来探测主机的状态,这种方案实现起来较为简单,成本低,因为基于HTTP连接所以状态信息比较匮乏,比如不能检测cpu负载、i/o负载等。
主主复制
这种方案两台机器都提供读写服务,这种方案一般处理业务上可以覆盖,可丢失的数据,比如session,论坛的草稿数据等。
数据分区
指将数据按照一定的规则进行分区,不同分区分布在不同的地理位置上,规避地理灾害造成的数据丢失问题。通常有如下三种策略
1.集中式(北京,上海,广州)-----西安备份中心 特点扩展容易,成本高
2.互备式(北京-上海,上海-----广州) 特点设计扩展麻烦,成本低
3.独立式(北京-天津,上海-杭州) 特点扩展容易,成本高
存储高可用主要面临的是数据一致性如何保障的问题。分布式事务算法主要的目的是为了保证分散在多个节点的数据统一提交或回滚,以满足ACID的要求;而分布式一致性算法主要的目的是为了保证同一份数据在多个节点上的一致性,以满足CAP中的CP要求。了解这些算法可以参考笔者所写的《从零开始学架构、从paxos到zookeeper》读书笔记五:分布式系统基本理论一文。