comdb - 融合couchbase与mysql的分布式KV存储

发布: 2013-07-27 18:13

K/V数据的优点是结构简单,读写速度快。目前的互联网应用互动数据要求这种级别的存取效率。
沿着当前技术发展趋势设计这么一种分布式的KV存储系统。

comdb中的couchbase系统,本身是一个偏向内存的分布式KV存储系统。
couchbase充分展示了无主分布式系统的优势,集群中所有节点都以相同的模式存取数据,
所有节点在集群中的角色完全一致,集群完全符合大规模水平扩展的需求。

在设计comdb的运行机制时,除了实现两个组件的合并存取,提供一致的访问接口,
还在mysql这层做了大量的工作,模拟couchbase的某些分布机制,
以实现高可用的大规模集群水平扩展与数据自动迁移。
虽然couchbase有自带的磁盘存储,但现有一些开发工程师和运维对新兴的KV存储可靠性尚有些疑虑,
再多应用一层mysql存储,对尽可能保证数据完整非常有帮助。

comdb的设计,主要根据当前计算机技术发展趋势,大内存,快速网络,
弱化磁盘存储的应用,把其作为一个最终可用的磁盘备份。​

comdb的原理,
提供唯一通用的KV数据存取接口,
couchbase中的bucket对应mysql库中的表,
mysql表结构为,用户数据+维护元数据,key, value, version, ctime, mtime,
写入mysql的KV值使用异步操作,
mysql层可配置的记录副本数,
基于一致性hash的数据分布,
数据的实时自动化迁移,
后台的数据批量自动化迁移,
couchbase内存缓存失效自动从mysql层读取,
mysql层的动态节点多版本配置支持,

comdb的实现,
目前comdb的实现先采用的php实现,用以验证comdb的设计与原理的可用性。
以php语言实现的话,其中有些功能会暂时忽略,比如异步写入实现还不是必须的,
同步写入只是速度会慢些,但对于验证其设计原理不会有影响。
这种方式的好处实现原型比较快,能快速发现设计原理不足,
发现实现细节时需要特别注意的一些问题。
并且不需要改动现有的服务架构,做到系统的一步步进化,
不会每次改动都是推倒重来。

实现的第二步,可能会改用C程序实现接口,封装成一个完整的KV服务,
只提供一个接口API即可。
这一步的异步写入mysql实现,需要使用couchbase的流复制机制,或者修改couchbase源代码,
使用couchbase的内部数据同步队列,把数据推送到mysql存储中。
这一步涉及C的服务编程,难度大些,
但机制原理验证可行性之后,熟练的C工程师实现这些问题不大。

原理详解:
mysql层的数据记录版本号机制
防止老数据覆盖新数据。
在每次更新数据时,通过更新传递的版本号确定本次更新是否能执行,
比如有个逻辑读取了一条数据过了几秒的时间才执行更新,
这期间可能另一逻辑读取同一条数据,马上更新了值,
再等到第一次更新请求过来后,存储一个数据记录版本号差,
这时更新不成功,需要合并完成数据后再次执行更新。

集群节点配置版本号机制,
用于节点变化时重新分布数据。
每次修改节点配置,给配置信息一个新的版本号。
在读取数据时,如果使用当前的配置信息无法读取到数据,
需要再使用前一个版本的配置信息尝试读取数据,依次类推,直接第一个配置信息版本为止。
如果在使用中间的某个配置版本号时读取到数据,这时触发自动实时数据迁移,
把这条数据记录存储到使用当前最新版本配置信息其应该存储的节点上,
并清理掉这条数据在老版本节点中存存储的记录。
在写入数据时,先执行前一步的读取数据的操作,合并数据后,
把数据写入到使用当前配置节点应该存储。
注意,这里需要先读取一次再执行数据合并后才能写入。
如果读取出数据的节点配置版本与当前节点配置版本号不符,还需要执行一步清理老节点上数据的处理逻辑。

后台自动数据重新分布进程,
前面提到的多节点配置信息版本号机制中,多个版本同时存储的话,
读写数据都需要考虑老配置信息版本号中的数据问题。
自动数据重新分布进程用于解决这个问题。
在修改节点配置时,触发该进程启动重新分布处理,
处理完成后可把前一个节点配置版本设置为已经重新分布数据完成状态,
下次再有数据存取时,不再需要考虑这个版本的递归查询问题。
当然在数据量大的情况下,重新分布数据会比较耗时,需要在该进程内有一个队列,
存储节点配置版本号修改事件,变成重新分布的顺序化处理,防止数据处理的混乱。
在重新分布数据的过程中,系统不需要停机,所有服务都在线提供正常服务。

分布式存储作为现在互联网应用广泛的技术,可研究挖掘的技术理念还非常多,
这理先实现一个KV存储沾上点分布式系统的边。
对于设计不足的地方,可在后续开发应用过程中不断完善,敬请期待。


参考:
couchbase的分布式KV存储机制。
tair系统的分布式KV存储实现机制。
megastore系统的分布式KV存储实现机制。








原文: http://qtchina.tk/?q=node/745

Powered by zexport