数据存储是软件系统中的核心模块。有人说数据存储很复杂,比方有Mysql,Sybase, DB2, SQL Server, Oracle RAC & DataGuard等关系型数据存储系统,也有Tcaplus(这里加个链接指向Tcaplus的官方介绍文档), MongoDB, BigTable, Casandra, BDB, Memcached, TC, Redis等NoSQL数据存储系统,还有NuoDB, VoltDB等NewSQL数据存储系统, 这些系统经历了数年甚至数十年的技术沉淀和发展。也有人说数据存储很简单,我见过有人直接把数据按自己定义的格式写到本地文件,做出来的软件系统也运行得挺好的,不过大约一年以后听他说悲剧了数据写坏无法恢复出来了。
我觉得做好一个数据存储系统至少得考虑好如下五个方面:强易用性(Utility),高性价比(Performance),高可用性(Availability),高可扩展性(Scalability),强安全性(Security)。为了方面记忆,我把它们简称为UPASS,如果你做好了这五个方面那么表示"You Pass"了,相信你借助这个短语一下就记住了这五点。
强易用性(U)
强易用性(U)是指存储系统能够方便支持应用的开发和功能性需求。比方,Memcached支持Key-Value存储,对于一些极其简单的数据缓存需求是合适的;Redis支持字符串,map, list, set,有序集这几种数据结构,能满足稍微复杂些的系统的存储需求;MongoDB支持面向文档的高度结构化的数据存储需求;Tcaplus支持多列数据存储,List数据结构,支持索引,也支持高度结构化的面向对象数据存储,能满足较广泛系统的数据存储需求;Oracle数据库支持完整SQL,存储过程,触发器,ACID事务功能,以及较强的分析函数和聚合函数。
高性价比§
高性价比§一方面是追求高吞吐量低时延,另一方面是减少金钱和资源的开销。金钱和资源主要体现在软件版本费用、机器开销、网络开销、运营人力开销。为了追求高性能,通常会将同步接口转换为异步接口,提高存储空间利用率,支持数据冷热交换降低硬盘IO,支持IO合并降低硬盘IO,提供全方位的负载均衡,还要求系统性能跟随机器数量增加成线性增长。Figure01体现了部分这些思想。
Mysql的Api是同步接口的,Oracle调用接口(OCI)也支持了异步接口,Tcaplus的Api支持成熟的异步接口。
Redis天然就是缓存存储,Mysql, Oracle DB等也支持了一些数据缓存功能,Tcaplus更是将内存缓存和硬盘存储结合发挥得淋漓尽致,Tcaplus支持直接根据数据应用层使用情况做冷热识别,在Master-Slave热备保证数据安全的基础上利用共享内存缓存对硬盘IO做时间空间上的合并。
在挂载FusionIO SSD硬盘的PC Server上,数据记录1KB左右,数据容量达到内存的2倍以上,Tcaplus每秒读吞吐量达到7.6万QPS,每秒写吞吐量达到5.8万QPS。
Oracle RAC的多实例是P2P结构的,实例较多时性能会达不到随机器数量增加而线程增长。Tcaplus采用简单路由算法划分处理数据,系统总体性能随机器数量增加成线性增长。
Figure01
高可用性(A)
高可用性(A)是数据存储系统非常重要并且有特色的功能。高可用性要求系统任何一个局部出故障时整体还能对外提供服务,尽量做到应用无感知。
数据是有状态的,时刻在发生变化,高可用是以一定程度数据一致性为前提的,完全没有数据一致性保证的高可用性几乎是没有意义的,就好比一个包含数据文件的数据库实例被损坏了,然后系统马上切换到另一个没有任何数据的(或者说丢弃了所有历史数据的)数据库实例上,这样的"高可用"没有什么意义。我们在高可用和数据强一致性之间做平衡选择,以期达到高可用程度和数据强一致性程度都能被应用接受的状态。这和接入层的高可用性有很大区别,接入层不同进程是P2P结构的,没有数据一致性的问题,一个进程挂了另一个进程马上顶替上来就可以了。
系统稳定也是高可用性的一个重要方面。
Oracle DB通过RAC提供共享内存+多数据库实例的模式,再加上DataGuard做异地数据冗余,进而实现高可用,实现比较复杂。如Figure02所示。
Figure02
Mysql通过复制Binlog流水的Master-Slave机制实现高可用,既支持行级别重做数据也支持语句级别重做SQL。
MongoDB的复制集通过选举算法实现数据多份拷贝,以此提供高可用。
Tcaplus采用了较简洁的方式,通过百毫秒级延迟Master-Slave热备(幂等数据重做保证可靠数据复制),数据文件镜像冷备,Binlog流水冷备,以及较完善的自动化恢复回档机制实现高可用性。如Figure03所示。Tcaplus每年经历近百次机器及网络硬件故障,但应用层可用性做到了接近五个九(99.999%),五个九意味着全年不可用时间仅5分钟,应用层对故障基本无感知。
Figure03
高可扩展性(S)
高可扩展性(S)主要是指系统一方面有强的扩容缩容机制,另一方面有强的升级变更兼容性。做得好的话,要求这两方面都能在不停服、无损业务访问的情况下完成。
Mysql等关系数据库在可扩展性方面还比较弱,通常是应用系统在停服的情况下自己实现扩容缩容。
NoSQL存储系统设计简化,比较容易做到强的可扩展性。扩容缩容一方面要解决路由变更的问题,另一方面要解决数据搬迁的问题。
路由策略比较常用的有一致性Hash策略和简单路由表策略。前者的好处是扩缩容时受影响的范围小,但路由策略看起来不直观,万一出了棘手的非预期故障需要人工参与修复的话会比较麻烦。后者的路由表是DBA肉眼可以直接看懂的,如果保持模数是个固定大数,将扩缩容自动细拆为多个小步骤(一个小步骤对应一个小范围),仍然可以将扩缩容时受影响的范围控制得比较小。
数据搬迁有先复制数据,再处理收尾缓存请求,再切换路由的做法。
数据搬迁也有先变更路由,再执行数据移动的做法,执行数据移动的同时处理应用请求,可以在接入层通过事务实现数据一致性保证,也可以在存储层通过搬迁目的端探测搬迁源端的方式实现数据一致性保证。
Redis的Presharding扩容机制便是通过先复制数据再切换路由的做法实现的。
MongoDB采用Sharding技术,通过移动Shard中的Chunks来完成数据扩容、数据平衡,也是通过先复制数据再切换路由的做法实现的。如Figure04所示。
Figure04
Tcaplus采用先切换路由再做数据移动的方式实现无损应用的在线数据扩容、缩容,这样做与先复制数据再切换路由相比的有个好处是省去了收尾缓存的开销和管理。如Figure05所示。Tcaplus经历了数千次无损应用的在线数据扩容、缩容操作。Tcaplus也支持不停服版本升级。
Figure05
强安全性(S)
强安全性(S)一是尽量保证存储的数据不被篡改不被窃听,二是尽量保证系统服务是用户可使用的、不被恶意破坏的。
有人认为数据存储一般都是处于内网被防火墙隔离,安全并不重要,我不认同这种观点,原因是:数据往往是核心资产,对于一个大的公司或组织可能会面临来自内网的安全威胁,而且防火墙也不是不能被打破的,这也是Google正在执行BeyondCorp计划用于取消内外网之别的原因;另一方面,云存储还会直接面向Internet用户。当然,对于确实完全不重要的数据也没有讨论安全性的必要,这是另外一回事。
强安全性通常要求:不管是访问数据、使用管理系统、还是登录机器,用户登录需要认证,用户访问权限有隔离控制,机器密码被管理起来周期性更新;口令和数据的网络传输是加密的,口令和数据存储是加密的;具备访问安全审计;充分利用安全基础设施,例如防火墙端口限制,防DDOS攻击等。
Oracle DB等关系数据库在安全性方面做得比较成熟了,NoSQL系统在安全性方面做得还普遍较薄弱。
总结
通过了解UPASS,你应该对数据存储软件系统有了较全面认识,做好一个数据存储系统还确实比较复杂。对于大团队可以创新开发运营自己的数据存储系统;对于中小团队舍不得花大成本的话,最主要的还是通过认真审视包括UPASS在内的方方面面,选择一个适合自己的现有存储系统直接利用。
转载请注明出处:https://stgod.com/3015/