上半年时间里一直在组内项目里捣鼓着使用 redis 存储各种数据。redis 其丰富的数据类型,优异的性能表现,尤其是有着充足的文档和社区支持,一直是推动着我们使用和研究的,必须要感谢 antirez 大牛写出来这么个的 nosql 数据库。但正如我上一篇博文所提到的 —— redis 的单机的高度受限于可用的物理内存量,当然,redis 本身有着一定的数据压缩的能力(zipmap),但随着产品的持续运行,存储数据量的不断上升,始终会面临单机内存的临界点。尤其是在开启了 redis 的持久化功能后,copy-on-write 的性质要求着 redis 存储的数据量应为实际物理内存的一半。对于机器资源,资金成本不足的项目团队来说,这显然是一个不小的坎。
有见及此,在组内的某同事先驱之下,和他一起开发了一个 nosql 数据库 —— LedisDB,就是希望能在数据存储的源头上解决受限于内存容量的问题。
LedisDB 是什么?
LedisDB 是一款基于 LevelDB 开发的,类 redis 接口功能的持久化 nosql 数据库。它完全兼容 redis 协议,对于较常用的 redis api 都进行了实现(类似的产品有 ssdb)。
LevelDB 简介
LevelDB 是一个 google 开源的 key-value 存储引擎,其作者基本上就是当年风头一时无两的 Bigtable 的开发者们。LevelDB 是典型的依照 LSM(log structured merge)机制实现的存储引擎。它通过延迟写入技术来把随机写请求组织转化为追加写入,从而提高写入的性能。其数据依照key的排列顺序和访问热度进行组织存储在磁盘之上,对于具有公共前序的key(nosql的使用场景中往往容易出现)也具有一定的压缩能力。
LevelDB 的实现设计是一个相当有深度专题,网上有不少的研究资料,强烈推荐感兴趣的技术宅们去研究。
(上图摘自 :http://www.cnblogs.com/haippy/archive/2011/12/04/2276064.html)
Go
Go语言近这两年成长较快,基于性能以及开发成本的平衡性考虑,终选择了 Go 语言为开发语言。
功能
数据类型 & API
开发初期我们本希望兼容的 redis 的接口调用形式,但基于个别接口实现难度以及运行效率的综合考虑,我们并没有全部实现 redis 中所有的数据类型及其全部 api 。目前已实现的数据类型包括 : key-value(string),list,hash,zset(sorted set),bit。
在 redis 里所有的数据都是存放在一个全局的名字空间里,任意类型的数据都可通过一些公用的 api 诸如 get , delete 进行调用。这种表现形式类似于 python 那样的弱类型语言。但考虑到运行时类型判断带来的消耗,以及现实中开发者大多数情况下应很清楚自己所操作的数据类型。因此,我们天然地对所有数据类型进行了划分,对于每种数据类型都有各自的存取接口,各数据类型各的 api 分别都以其数据类型英文首字母开头来标识,因此对于 LedisDB 是没有 type 这样的 api 。
replicaion
作为一个数据库服务,同步复制应该说是一项不可或缺的功能。目前同步复制功能我们是参考了 MySQL 的工作模式来进行了一个比较基础的实现,在这方面还会进行持续的改进和优化。
storage
LedisDB 是基于 LevelDB 存储引擎而实现的,但是目前已有的 LevelDB 实现和衍生形态也有不少,因此我们支持配置一些不同的底层存储引擎来工作,目前所支持的一些存储引擎包括有 :leveldb,leveldb (go),lmdb,rocksdb 。不同的存储引擎在不同调用场景下表现可谓各有优劣,因此我们也在持续研究考察各个存储引擎的特性,希望能适配出一个相对稳定且高效的默认存储引擎。
客户端支持
在现阶段由于优先切合项目内的需求,因此并没有以语言流行程度进行客户端的支持。
目前支持的语言客户端包括;
Go
Python
C++
Lua (openresty)
Node.js
cli
基本架构图
应用
目前在 LedisDB 已在我们项目组内的一个消息推送服务,以及一些数据统计应用中投入了使用,后续会考虑作为在 cache 场景中进行使用。
TODO
截止到博文撰写日为止,LedisDB 才有了自己的 v0.2 release 版本,它还在不断的成熟和进化当中。 目前正在持续开发中的功能包括:服务运行态 信息 监控,存储过程,同步复制机制改进,多硬盘存储 ...... 我们期望 LedisDB 有朝一日能够在云云 nosql 产品中走出自己的一条发展和应用道路。
相关链接
主页 :http://ledisdb.com/
github项目 :https://github.com/siddontang/ledisdb
————————————————
版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qichao_cen/article/details/38437927