本文来自网易云社区

作者:王健

摘要

NOS(网易对象存储)在实现多机房(杭州机房,北京机房等)部署后,允许一个用户在建桶时选择桶所属机房。在此基础上,我们实现了跨机房的数据复制,进一步实现了跨机房的数据灾备方案。用户可以:

  1. 通过简单的配置,即可让自己上传的数据异步准实时地同步到另一个机房,实现跨机房的数据复制

  2. 在发生重大灾难导致整个机房无法访问时,可以将桶的上传下载操作切换到灾备机房,极大提升服务可用性

  3. 灾备恢复服务切回主机房后,灾备期间所有上传到灾备机房的数据都会同步回主机房,主机房有用户全量的数据

  4. 通过接入NOS的子服务NCDN和WanProxy,整个灾备过程可以对用户完全透明

本文主要讨论NOS多机房部署、跨机房数据复制以及跨机房灾备的设计与实现。

1. 多机房部署

NOS实现多机房部署的出发点有两个:

  1. 可以让用户自主选择将桶创建在哪个机房(杭州机房,北京机房等)。用户可以根据自己服务器的地址就近选择桶所属机房,提高上传下载速度;

  2. 可以进一步实现跨机房的数据灾备,提高灾难情况下的系统可用性

NOS多机房部署图如下所示:

NOS跨分区灾备设计与实现-LMLPHP

如图,两个机房间除了极少量的信息(桶信息)需要同步外,各自都相当于一套独立的NOS集群。

多机房部署情况下,CDN的回源地址也需要根据桶所属的分区来进行配置,如下图所示:

NOS跨分区灾备设计与实现-LMLPHP

2. 跨机房数据复制

跨机房的数据复制是跨机房灾备的基础,通过实现数据的机房间冗余,才能在一个机房故障时,将服务切到另一个机房并继续提供读写服务。

跨机房数据复制的核心设计如下图:

NOS跨分区灾备设计与实现-LMLPHP

基本逻辑是:

  1. 当一个桶配置了跨分区灾备的属性后,该桶的所有更新操作,均会记录在NOS_Sync表中(为了保证主从分区数据的一致性,写入NOS_Sync表必须同原更新操作放在一个事务中)

  2. NosSyncer同步程序定期将NOS_Sync表中的数据读出,进行聚合处理后,将数据同步到指定的分区

跨分区数据复制有一些问题值得讨论:

  1. 为什么选择将同步信息放在数据库中?
    其实,最初想到的办法并不是将同步信息写到数据库中,而是在更新操作完成后,记录一条日志,并通过日志收集,日志处理,处理结果上传到队列服务,再由NosSyncer从队列服务中获得待同步的任务并执行数据复制。这种实现方式的好处是,整个数据同步的逻辑是离线的,线上的服务只需要输出一条日志即可,跨分区数据复制逻辑不会对当前的线上业务产生影响。
    而该方案有两个明显的问题:
    1)NOS支持覆盖写操作,例如两个用户可以同时上传一个名为A的对象,后上传成功的会覆盖先上传的。因此,同步信息的顺序应该同实际插入的顺序一致,才能保证同步到灾备分区时也是同样的操作顺序,保证主从分区的数据一致性。而采用日志这种方式,多个NOS服务器上的日志收集顺序是无法保证先后的(即使日志带时间戳)。该问题可以通过抓取binlog日志来保证顺序性。
    2)该方案需要依赖日志收集,日志处理,队列等一系列外部的服务,需要的部署和运维精力较大。同时,在我们设计该系统时,这些服务的可靠性还有待验证,暂时不适用于我们的服务。

  2. 为什么将插入NOS_Sync表的操作同更新操作放在同一个事务里?
    这主要是为了保证所有的更新操作和NOS_Sync表中的同步信息一一对应,而同步信息按顺序插入,同步程序只需要顺序读取同步信息并以此执行即可,这可以保证复制操作的执行顺序和实际更新顺序一致。

  3. 数据复制的逻辑可以进行什么优化?
    数据复制优化有两个方向:1) 并发复制; 2)减少复制数据量;
    具体做法是,在取出一组同步信息后,首先在内存中对同步信息进行处理:
    1)过滤不必要的同步操作(例如:上传A(file1),上传A(file2),上传A(file3) 可以合并为 上传A(file3))
    2)确认哪些操作可以并发执行(例如:上传A(file1),上传B(file2)直接可以并发执行)
    在进行数据复制时,首先调用去重操作,如果可以去重上传,则不传输数据。

3. 跨机房数据灾备

3.1. 灾备情况分析

从用户的视角来看,NOS跨机房灾备需要考虑上传下载等多种情况:

NOS跨分区灾备设计与实现-LMLPHP

如图:

  1. 下行灾备情况一:用户过CDN下载,灾备时直接切换CDN回源地址,灾备过程对客户端透明(灾备切换时间约5分钟)

  2. 下行灾备情况二:有逻辑的客户端,在感知到主分区故障后,主动切换访问到灾备分区,灾备过程需要客户端配合

  3. 下行灾备情况三:无逻辑的客户端(如浏览器),若要灾备则需要切换域名,由于切换域名生效时间过久,线上基本不会操作

  4. 上行灾备情况一:用户过WanProxy进行上传,灾备时WanProxy自动将上传切换到灾备机房,灾备过程对用户透明

  5. 上行灾备情况二、情况三:客户端依赖产品的上传服务器来进行上传,当发生灾备时,需要上传服务器切换(或通知用户切换)上传地址,灾备过程需要上传服务器配合

基于以上的讨论,我们未来推荐的方式将是,客户端通过WanProxy进行上传,通过CDN进行下载,将灾备的逻辑统统交给NOS来做。

3.2. 灾备切换

灾备切换逻辑如下:

NOS跨分区灾备设计与实现-LMLPHP

如图,涉及灾备的主要是两个数据库字段:

  1. 灾备分区 —— 主机房发生灾难时服务切到哪里,正常状态下,数据从主机房复制到灾备机房

  2. 是否切换 —— 主机房发生灾难时,通过该字段设置主备切换

3.3. 使用建议

如果用户对自己的数据有极高的可用性要求,可以尝试开启灾备服务,此处有几个建议:

  1. 由于硬件条件限制(机房间无专线,数据传输走公网),因此不建议对大对象(如视频)实施灾备服务。

  2. 用户可以将自己的数据按照重要程度放在多个桶中(如视频,图片,重要文件等),并对最重要的桶开启灾备服务,保证灾难状态时可以提供最基本的服务。

  3. 逐渐将产品的上传切到WanProxy上传服务,将下载切到NCDN服务,从而透明地实现跨机房灾备。

网易云对象存储服务NOS 支持标准 RESTful API 接口,并提供丰富的数据在线处理服务,一站式解决互联网时代非结构化数据管理难题。

相关文章:
【推荐】 收集、分析线上日志数据实战——ELK

04-13 16:10