如何基于公有云打造TB级文件备份保护系统
2015-11-25 11:16:45企业业务稍微上点规模的,IT系统产生的数据很容易就超过TB级,并且资料文档等很容易超过亿级别的规模,如果用手动复制的方案来备份,基本是非常困难的;这种情况下,即使购买一些专业系统,随着数据量日益增大,跑起来也非常吃力。本文重点讨论如何基于云平台,来实现对应的解决方案。
企业业务稍微上点规模的,IT系统产生的数据很容易就超过TB级,并且资料文档等很容易超过亿级别的规模,如果用手动复制的方案来备份,基本是非常困难的;这种情况下,即使购买一些专业系统,随着数据量日益增大,跑起来也非常吃力。本文重点讨论如何基于云平台,来实现对应的解决方案。
B级海量文件场景特点
面对如此特点,如果按照目前的设备+软件方案,在以下几点有非常大的缺陷:
1.升级扩展复杂,预先估计容量,后续扩展起来相当麻烦,必须的改变存储策略,或重新离线做数据迁移分布。如果初始购买的存储扩展有限,后期还不能很好的升级扩展。
2.3-5年左右的生命周期,也就是说,数据经过几年后,改造升级,购买新的方案是必须的,这样当数据上到百TB级别,整个工程实施也是相当复杂了。
3. 一次投入特别的贵,如果对原始TB级数据做专业备份保护,投入得数十万,具体到不同的行业,性能和保护窗口参数稍微提升,投入立即上升到百万级。
随着数据量的增长,超过一个量级,比如10TB级别,其实这类方案已经难于胜任了。
破解思路
基本上来说,要破解海量数量,以及TB级增长的难题,基于云的方案是目前最有前途的思路,云有4个核心好处:
1.存储和计算能力按需扩展
2.可靠,云的计算和存储分布特点,使得系统在计算和存储都具备传统结构不具备的数倍的可靠性
3.安全,基础云服务商自身在安全方面不计成本,比起自己构建IT设施,来得更加专业
4.扩展,开放性更好,使得构建的服务,更容易外部系统对接
目前在国内以及全球其他地区,都有成熟的云平台可以作为构建基础。当然,除了明显的优点外,也有1个缺点是,云毕竟在异地,速度方面没有本地来得快,所以在设计系统的时候,要充分考虑到此处特点。以此为基础,考虑构思如下备份系统的设计目标:
最高性价比的TB级海量小文件备份服务
支持分布式,多节点集中管理监控
备份容易且快速恢复
结合云平台的优缺点,基本的设计思路大体如下:
以下将围绕以上5个点展开,看一个专业级别的备份保护系统如何打造。
TB级突破
实现TB级突破,重点思路在于如何解决备份和恢复的速度,以及海量规模的数据块存储。而解决数据备份和恢复速度的关键在于组织好数据索引;我们日常看到的网盘备份是简单的同步模型,很难胜任连续的数据块版本影射关系。而一个专业的备份系统,此处是必须要解决好。
架构上要突破纯云的方案,本地和云结合
纯云的方案,用了云的几个优势点,但也同时受云天生异地的特点影响,在传输效率方面是必定落后本地的方案,在强调速度的备份和恢复场景下,只有压缩数据,加大带宽。因此,更好的专业级方案是兼顾云和本地的优势进行设计。
以下黄色部分,就是加的一层本地存储;本地客户端将以分块的形式把数据写入本地客户端,同时启动同步逻辑,把数据从本地同步到云存储。
TB级数据重点在索引管理上要下功夫,索引分为本地和云端两级
本地索引采用分段分布设计,突破传统RDB单库数量过大,查询过慢的瓶颈。本地索引模型读写相对简单,可以采用自己研发或开源的本地数据存储方案,Sparkey, levelDB,BDB,甚至MongoDB等都可以,实现索引库理论支持TB级以上的的索引大小,具体到文件为每条索引可做到100字节以内
索引容量: TB/0.1KB > 100亿条索引
按照简单的顺序存取模型,海量的目录,文件索引,这种分级模型的索引框架,可以轻松解决TB级数据与海量小文件场景的管理。
当然,如果离开了异地配合,这种方案还是不完整的。因此在云上,要支持更大规模的索引容器。幸运的是,在云上,我们可以选择的方案还比较多。可以基于MongoDB,LevelDB等优秀的列模型数据库,也可以基于云平台本身的分布式KV数据库来保存索引。
设备通过调度中心定位到云索引中心 ; 单个云索引中心采用NO-SQL DB分布式设计,具体按照任务ID进行分布。关于具体的索引容器,可以选择云平台提供的KV数据库,如果要更多灵活的控制,也可以自己选用专业的KV 数据库来构建。理论上云端可以管理索引的数量无限。
数据按系列段分块存储,提升混合云模型的速度参数
普通的量级数据读写,无所谓要不要分块了,但一旦规模上到TB级别,特别在文件量变化快的场景,要尽可能缩短备份窗口,必要的数据存储组织就显得非常的关键。其数据存储分为两部分,本地和云。
本地数据存储设计,可采用N *KB – N *MB 相对固定系列段的分块设计,兼顾读写效率与空间平衡分块采用期望分块方案,尽可能让分块分布在1个区间,保证去重效果的同时,减低分块对索引记录数占用的数量。本文按照64KB 到 4MB的经验值方案来计算.
总可索引数据量区间:理论最小管理数据 100亿* 64KB = 600+TB , 理论最大管理数据 100亿* 4MB = 40+ PB 这么大的规模,理论上已经远远满足数据存储管理需要。

对于数据上云,初始化系统这里可以把设备定位到不同的云数据中心,与索引位于同1个中心内;上传的数据异步化存储到云存储,或可同时异步到特定的块存储设备;对于块存储,提供合并机制,将小块进行合并存储,提高存储读写效率。所以,理论上云端冗余管理的数据量受限于云存储空间提供商的。
本地和云的数据存储组织方案,在本地通过相对分块序列的方案,在云采用云存储的方案,从KB-MB级的小数据块文件都可以轻松管理起来。
上图是基于索引和块存储结合的增量应用。任何一个数据块的变化都会第一时间,通过本地的索引块签名快速判断是否需要上传备份 ; 如果本地的索引无法启动,将从云端获取签名进行比对。任何一个需要备份的数据块,可以快速通过分块序列存储方案,保存在对应的数据块文件中。
通过并行冗余通道,提升上下云的速度、稳定和可靠性
互联网络本身是一个质量无法端到端保证的的一个网络,传输的稳定性会又多个环节影响。包括运营商网络,平台的网络,以及用户接入的网络等。对于一个专业级的备份系统,必须要考虑网络通道的连续、稳定运行。
以上,在任何一次客户端注册期间,一旦认证通过后,可以根据系统资源情况,分配合适的数据节点给客户端。 客户端可以根据情况,正常情况下,多通道并行传送 ; 一旦检测到通道出现问题,自动摘除 ;各个节点会上报数据到调度中心; 同时当链路恢复的时候,自动接入到系统中。下图就是示意多通道在同步到云,以及从云恢复或下载数据。
采用端到端加密数据块设计,结合数据块垮云分布机制,可靠保存备份到本地和云的数据
在备份体系中,数据保密性设计不依赖于人,从机制上保证数据备份到云是机密的。最常用的一种方案就是采用对称加密,具体可以采用AES,3DES 等算法。目前比较常用AES256位,而key的产生可以在客户端产生。Key一旦丢失,数据将无法恢复和使用。因此key的妥善保护,也是非常重要。
在基于块的加密设计中,结合云分布特征,数据被打散在不同的存储位置,因此在数据安全方面进一步增加了强度。基于目前的公有云平台的情况,在国内和国外都有几大主流的云存储平台,分布在全球。理论上,数据可以分步在任何一个地方。唯一考虑的是数据如何跨地区进行同步和分布; 当然这里可以先写入本地云中心,冗余块通过高速通道,再同步其他云中心,这里可以是同构的云,也可以是异构的云。
引入自动适应方案,提升海量文件和应用场景的适应能力
在海量文件情况下,由几种系统因素影响备份的效率和资源开销。备份系统如果全速开进,会消耗过多的计算和IO资源,如果是生产系统,势必也会带来冲突。以下是几种典型的需要规避的:
通过对带宽,压缩算法,文件类型定义等预定义策略,可以快速平衡好系统资源。这种适合在确定判断系统场景的情况启用。
对于无法预知的情况,启动自动监测机制,包括压缩比,是否硬件加密加速,是否需要启动实时或批量扫描等。
总结与展望:
随着云平台的成熟和发展,网络基础设施日益完善,用云构建的数据备份系统,可以充分利用天然的地区分布,运维简单,灵活扩展特点,以及弹性按需投入的优势,企业数据走向云端简单更加简单可行。
作者简介 :陈元强,多备份创始人。15年经历,包括一线技术公关、项目与团队管理等,涉及云服务架构,系统底层、网络、存储、安全、大数据计算分析、移动应用等业务和技术领域。
大型网络之间的互联采用什么方案比较好?
大型网络之间的互联,例如数据中心、灾备中心、总部办公网等,一般需要很高的带宽和质量的网络,通常采用MSTP、MPLS等线路进行连接。 这些线路质量虽好,但是存在带宽低,费用高的特点。 相同带宽下,是Internet线路的几倍,随着带宽增长的需求越来越大,成本也越来越高。
这主要得益于强大的SD-WAN性能和极高的性价比。 在将一次性购买成本(CapEx)分摊到每年的运营成本(OpEx)后,就会发现用SD-WAN替代昂贵的MPLS线路后带来的经济优势。
关键应用使用体验和降低整体成本是用户采用SD-WAN的两大本质驱动力。
因此从这两大驱动力出发,向用户推出基于SD-WAN的关键应用加速服务。 通过链路健康状况监测、强大的应用、域名、IP库来为用户提供精准的选路,并可以根据应用SLA选择当前合适的链路,并组合用户当前链路,将专线、普通ADSL,甚至4G移动网络统一加入SD-WAN网络,通过算法对链路进行调度,确保通信质量的同时,节省带宽成本,让用户以更低的成本拥有“一条上云专线”,来保障视频会议质量、加速Office365、Salesforce、GitHub等知名生产力SaaS。 对于如阿里云、腾讯云、AWS、Azure等知名IaaS,基于精准调度能力,也能让用户以近专线的效果实现公有云的访问。
企业正在把SD-WAN作为一个优先事项。 以前企业主要关注的是网络安全和广域网优化。 但是,随着SD-WAN更多的被采用,WAN优化从中脱颖而出。
c++编程要用到哪些英语词组
auto :声明自动变量 一般不使用 double :声明双精度变量或函数 int: 声明整型变量或函数 struct:声明结构体变量或函数 break:跳出当前循环 else :条件语句否定分支(与 if 连用) long :声明长整型变量或函数 switch :用于开关语句 case:开关语句分支 enum :声明枚举类型 register:声明积存器变量 typedef:用以给数据类型取别名(当然还有其他作用) char :声明字符型变量或函数 extern:声明变量是在其他文件正声明(也可以看做是引用变量) return :子程序返回语句(可以带参数,也看不带参数) union:声明联合数据类型 const :声明只读变量 float:声明浮点型变量或函数 short :声明短整型变量或函数 unsigned:声明无符号类型变量或函数 continue:结束当前循环,开始下一轮循环 for:一种循环语句(可意会不可言传) signed:生命有符号类型变量或函数 void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) default:开关语句中的“其他”分支 goto:无条件跳转语句 sizeof:计算数据类型长度 volatile:说明变量在程序执行中可被隐含地改变 do :循环语句的循环体 while :循环语句的循环条件 static :声明静态变量 if:条件语句 1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。 这个关键字不怎么多写,因为所有的变量默认就是auto的。 (2)register 这个关键字命令编译器尽可能的将变量存在cpu内部寄存器中而不是通过内存寻址访问以提高效率。 (3)static 常见的两种用途: 1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。 在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销. 详细说明: 1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。 这一点是它与堆栈变量和堆变量的区别。 2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。 这一点是它与全局变量的区别。 3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。 使用注意: 1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; 2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; 3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出) (4)const被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 它可以修饰函数的参数、返回值,甚至函数的定义体。 作用: 1>修饰输入参数 a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。 例如将void Func(A a) 改为void Func(const A &a)。 b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。 否则既达不到提高效率的目的,又降低了函数的可理解性。 例如void Func(int x) 不应该改为void Func(const int &x)。 2>用const修饰函数的返回值 a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。 如对于: const char * GetString(void); 如下语句将出现编译错误: char *str = GetString();//cannot convert from const char * to char *; 正确的用法是: const char *str = GetString(); b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。 3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象. 说明: const type m; //修饰m为不可改变 示例: typedef char * pStr; //新的类型pStr; char string[4] = abc; const char *p1 = string; p1++; //正确,上边修饰的是*p1,p1可变 const pStr p2 = string; p2++; //错误,上边修饰的是p2,p2不可变,*p2可变 同理,const修饰指针时用此原则判断就不会混淆了。 const int *value; //*value不可变,value可变 int* const value; //value不可变,*value可变 const (int *) value; //(int *)是一种type,value不可变,*value可变 //逻辑上这样理解,编译不能通过,需要tydef int* NewType; const int* const value;//*value,value都不可变 (5)volatile 表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。 当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile. 该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。 简单示例: DWORD __stdcall threadFunc(LPVOID signal) { int* intSignal=reinterpret_cast(signal); *intSignal=2; while(*intSignal!=1) sleep(1000); return 0; } 该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。 显然intSignal的值必须在外部被改变,否则该线程不会退出。 但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了: mov ax,signal label: if(ax!=1) goto label 对于C编译器来说,它并不知道这个值会被其他线程修改。 自然就把它cache在寄存器里面。 C 编译器是没有线程概念的,这时候就需要用到volatile。 volatile 的本意是指:这个值可能会在当前线程外部被改变。 也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示: label: mov ax,signal if(ax!=1) goto label 注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。 它是const因为程序不应该试图去修改它。 (6)extern extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。 另外:C语言中的关键字
w7好用还是xp好用
window7是微软公司2009最新发布的操作系统,是pc系统进入全3D时代的标志,系统的安全性和美观性较之vista更强更棒,同时也因为它是个新系统所以它的软件兼容性不强,暂时无法运行一些专业的软件,当然如果你是个普通用户,平时就是上个网聊个QQ什么的,那么你就可以使用它了,一些常用的软件他是兼容的。 传说中window7的虚拟机技术是旗舰版才有的,同时对硬件的要求也不低,所以一般不要开启,那个本身就是为了解决我前面说的那个个别专业软件无法在window7里运行设计的。 当然很多多游戏WIN7也是不兼容的哈 哈哈 忘记了 现在补上window7是前进的方向,许多新的技术被运用在里面,以后XP是必将被淘汰的,但是如果你现在追求系统的稳定性以及软件的拓展宽度,那么你装机还是使用XP为好,以后等到WIN7出了SP2的时候再安装应该就可以通用了吧。 这是我的猜想,微软好像每个系统都是SP2后就很不错了样!呵呵 希望可以帮到你哦
发表评论