本文来自网易云社区

作者:王健

摘要

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. auth_basic 认证

    shell > yum -y install httpd-tools # 安装 htpasswd 工具 shell > cd /usr/local/nginx-/conf shell &g ...

  2. python flask学习(3)

    这次主要学习web表单.学了下,很像是Django的form表单验证.不过有许多的不同.可以说是功能更加碎块化.Django的验证方式是很固定和严谨的,风格完全不同. 尽管Flask的请求对象提供的对 ...

  3. SpringBoot学习笔记-Chapter2(hello word)

    开篇 第一次在博客园上写博客,初衷是想记录一下学习笔记,以往都是用笔去记录下学习笔记,现在来看在效率.检索速度上以及可可复制性都不好.作为一名Java开发人员 不会Spring Boot一定会被鄙视的 ...

  4. IOSButton自定义

    + (APCCustomBackButton *)customBackButtonWithTarget:(id)aTarget action:(SEL)anAction tintColor:(UICo ...

  5. shell流程语句使用介绍

    1)使用if.case.read例子1:#!/bin/bash#读取终端输入的字符read -p "Please input a Number:" nn1=`echo $n|sed ...

  6. HDU 3033 I love sneakers! 我爱运动鞋 (分组背包+01背包,变形)

    题意: 有n<=100双鞋子,分别属于一个牌子,共k<=10个牌子.现有m<=10000钱,问每个牌子至少挑1双,能获得的最大价值是多少? 思路: 分组背包的变形,变成了相反的,每组 ...

  7. C++类构造函数、析构函数运行机理

    http://blog.sina.com.cn/s/blog_6fd68d5f0100n60h.html 前言--构造函数.析构函数的简单理解:1)构造函数---对象被创建时候调用的函数:2)析构函数 ...

  8. 签名ipa,让其它手机也安装

    开发的时候,需要将app让其它人装上测试,虽然通过xcode可以使用编译进去,但是仍显不方便. 网上有个工具, http://code.google.com/p/iresign/ 通过这个工具,使用自 ...

  9. vue2.0动画

    相对于vue1.0来说,vue2.0的动画变化还是挺大的, 在1.0中,直接在元素中加 transition ,后面跟上名字. 而在vue2.0中,需要把设置动画的元素.路由放在<transit ...

  10. 数据库web项目对数据库的操作

    1.0.JSTL与jsp实现对数据库的操作 MySql 数据库: create database if not exists CommodityDB; use CommodityDB; drop ta ...