数据最终还是要存储到磁盘(Disk)上,内存中的数据变化需要复制到与磁盘上。这时,从内存向磁盘复制数据的过程可以看作原始写操作的异步操作,显然,异步操作使得前端的写操作显得更快。如下图所示:

图3
在事务型(OLTP)系统中,内存中在启动时需要和磁盘保持一致。 因此,内存需要有相同的库表定义;并且在第一启动时,将所需库表数据加载到内存中。
5. 内存集群化
目前,经典的MySQL集群,通过读写分离,水平切分,实现海量数据存储。为应对海量数据存储,内存同样需要做集群。垂直和水平切分策略,可用性策略与MySQL集群架构设计基本相同。如下图所示,其中 Ameoba 是分布式代理,它进行数据路由等控制。
唯一的不同是,由于内存的高性能,可以不再进行读写分离设计。


图4
6. 混合分区(Hybrid Shard)
接第4节的分析,内存数据最终仍需要持久化到磁盘。这里需要一种混合分区(Hybrid Shard)来解决。即原来一个MySQL节点承担的一个水平分区,将由一个内存节点和一个MySQL节点共同组成。
H-Shard = MDB + MySQL.
这种架构将形成由两级(2LDB),混合分区构成的集群。的如下图所示:

图5
7. 内存选型
常见的内存产品包括商业版和免费版两类。商业版如:Altibase,Timesten,Berkley DB等。他们在电信,金融,证券等高性能计算应用中运用较为广泛。商业版功能强大,然而,价格比较昂贵,不适合目前“廉价PC+免费软件”的架构搭建思想。
笔者曾就职与中国移动系统提供商,其中计费、运营等系统就运用Timesten提供高性能运算,但还主要用于高频度小数据计算,如计费批价,优惠计算,信控等,采用单节点模式使用。
开源领域产品主要有H2,HsqlDB,Derby等。在混合分区架构中,内存将承担OLTP的职责,因此除了读写性能外,功能的完备,事务等都需要作为优先评估的因素。
8. 新架构的挑战
通过引入内存作为中间持久层,再加入分布式架构以支撑海量数据访问,这种架构设计颇具挑战。最先而易见的情况就是新架构的复杂度,正如MySQL集群架构诞生初始一样。
我们以 H2 ,一个开源的高性能内存为例说明:
1) 整合 Ameoba 与 H2
Ameoba 是分布式代理,它与 MySQL 整合已经在阿里巴巴核心业务中成功运用。如果仅将节点看作一个存储,MySQL Node 和 H2 Node 并无本质区别。JDBC驱动,DB切分,路由,皆由Ameoba 统一负责。
2) 异步持久化
每个逻辑混合分区= H2 + MySQL,谁来完成H2 中的数据变更异步写入 MySQL?
比较好的方案是内存提供实时增量的复制器(Replicator) ,例如:基于联机日志复制的双机热备机制。AltiBase 等产品就提供了此功能。
3)高可用性
内存一旦崩溃,数据不复存在。因此首先要做到数据快速异步写入MySQL作持久化存储。同时要有健壮的容错和Failover机制,保证一个H2节点崩溃,同一逻辑分区中的替补H2节点立即顶替工作。
一种方案是分布式代理如 Ameoba 来解决,例如:每个Shard,H2至少设2个节点,采用Primary-Secondary模式,如图6所示:

图6
另一种方案是前面提到的内存实时复制功能。
虽然有些内存DB如H2自身能支持内存,磁盘两级存储,但其自身提供的磁盘存储和访问方案可靠性不如 MySQL。因此,使用内存式Primary-Secondary 模式更为可行。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30367-2.html
和男朋友走在街上
得了吧
宋茜全程似发脾气的女鬼