本文来自网易云社区

作者:王健

摘要

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

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

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

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

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

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

1. 多机房部署

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

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

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

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

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

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

2. 跨机房数据复制

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

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

基本逻辑是:

  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跨机房灾备需要考虑上传下载等多种情况:

如图:

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

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

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

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

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

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

3.2. 灾备切换

灾备切换逻辑如下:

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

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

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

3.3. 使用建议

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

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

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

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

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

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

NOS跨分区灾备设计与实现的更多相关文章

  1. vitess元数据跨机房灾备解决方案

    测试使用vitess的时候发现vitess元数据的实现有多种方案,etcd, etcd2, zk,zk2, 由于刚开始测试的时候使用的是基于k8s集群+etcd的,以下就分步说明灾备实现方案: 1. ...

  2. 基于Ceph快照的异地灾备设计

    作者:吴香伟 发表于 2017/02/06 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 喜欢请点击右边打赏,谢谢支持! 引子 技术改变生活. 越来越方便的手机 ...

  3. Linux实战教学笔记48:openvpn架构实施方案(一)跨机房异地灾备

    第一章VPN介绍 1.1 VPN概述 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者 ...

  4. 基于Cloudera Search设计数据灾备方案

    当实际项目上线到生产环境中,难以避免一些意外情况,如数据丢失.服务器停机等.对于系统的搜索服务来说,当遇到停机的情况意味着在停机这段时间内,用户都不能通过搜索的相关功能进行访问数据,停机意味着将这一段 ...

  5. 云区域(region),可用区(AZ),跨区域数据复制(Cross-region replication)与灾备(Disaster Recovery)(部分1)

    本文分两部分:部分1 和 部分2.部分1 介绍 AWS,部分2 介绍阿里云和OpenStack云. 1. AWS 1.1 AWS 地理组件概况 AWS 提供三种地理性组件: Regions:区域,即A ...

  6. 理解 OpenStack 高可用(HA)(1):OpenStack 高可用和灾备方案 [OpenStack HA and DR]

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  7. openStack灾备方案说明

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1) OpenStack 高可用方案概述 (2) Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3 ...

  8. openStack高可用性和灾备方案

    1. 基础知识 1.1 高可用 (High Availability,简称 HA) 高可用性是指提供在本地系统单个组件故障情况下,能继续访问应用的能力,无论这个故障是业务流程.物理设施.IT软/硬件的 ...

  9. 如何守护数据安全? 这里有一份RDS灾备方案为你支招

    当今世界是一个充满着数据的互联网世界,生活的方方面面都在不断产生着数据,比如出行记录.消费记录.浏览的网页.发送的消息等等.除了文本类型的数据,图像.音乐.声音都是数据.对于企业而言,数据更是重要的生 ...

随机推荐

  1. 开机启动+Linux发送邮件

    需求:检测Linux上Tomcat是否允许,挂了的话给运维发送邮件通知 实现:编写脚本一直检测Tomcat进程是否存活,否则给运维发送邮件,脚本设置开机时自动启动 1.Linux发送邮件 vim /e ...

  2. Java微信公众平台开发(七)--多媒体消息回复之图片回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...

  3. docker命令自动安装

    docker命令自动安装 操作 操作就是执行两句脚本 curl -fsSL get.docker.com -o get-docker.sh 这句命令会在当前文件夹下下载一个get-docker.sh的 ...

  4. jQuery中jQuery.extend() 和 jQuery.fn.extend()的功能和区别

    昨天下午和今天上午断断续续的一直在看jQuery中jQuery.extend() 和 jQuery.fn.extend()两个函数的功能及区别,现在自认为是掌握的差不多了.好记性不如烂笔头,这里一方面 ...

  5. Azure 进阶攻略 | 关于Java 和事件中心的那不得不说的事

    物联网技术辣么火,虽然之前有说过不少,但今天,仍有一个憋在我心里已久,不得不说的话题:基于Azure 的物联网平台必不可少,你可能已经在使用,但也许并没有意识到的服务:Azure 事件中心. 啊?事件 ...

  6. static心得

    TextClass text; 吉晨   static注意 只要显式调用一个类的某一个static变量,那么就会连带static块,所有static变量一起调用,哪怕不去new一个对象,这时候已经对这 ...

  7. tomcat+nginx 横向扩展

    1.分别在电脑上部署两个tomcat tomcat1  tomcat2 2.不是nginx 并启动 输入 localhost 并进入nginx欢迎界面,证明部署成功 3.修改nginx 配置 ngin ...

  8. POJ 3133 Manhattan Wiring (插头DP,轮廓线,经典)

    题意:给一个n*m的矩阵,每个格子中有1个数,可能是0或2或3,出现2的格子数为2个,出现3的格子数为2个,要求将两个2相连,两个3相连,求不交叉的最短路(起终点只算0.5长,其他算1). 思路: 这 ...

  9. 状态压缩---状态压缩dp第一题

    标签: ACM 题目: Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...

  10. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 长时间没连接mysql断开了, ...