专访基于 Erlang 的开源 NoSQL 数据库 Tiger 创始人姚新明

  • 郑柯

2012 年 7 月 12 日

话题:Erlang架构AI

编者按:感谢ZoomQuiet淘宝褚霸为本次采访提供问题。

姚新明,Erlang 程序员,目前就职于安防技术中国有限公司杭州研究院云计算部,从事分布式文件系统的研发,早期从事企业信息系统开发、SaaS 系统架构,写过 javascript,干过 java,会点 perl、c、emacs lisp,喜欢 linux、emacs,爱好开源技术,目前主要关注 NoSQL、分布式技术、分布式文件系统。

InfoQ: 请对 Tiger 项目做个介绍。

姚新明:Tiger是一个 Erlang 开发的 NoSQL 数据库,基于 Erlang、zab 协议以及 leveldb、Redis 引擎实现,目的是提供高性能,高可靠性,高可用性的数据服务。单点问题一直是困扰架构师的主要问题之一,自己以前做架构的时候也碰到比较多,一直没有找到好的解决方案,接触 Erlang、zab 协议,leveldb 后,我意识到我以前所面临的一些问题是可以解决的,所以就有了 Tiger。

InfoQ: Tiger 在数据的安全性方面是如何做到的?

姚新明:Tiger 采用 2f+1 的集群模式,数据相当于多副本存储,所以数据丢失的概率比较小。

InfoQ: Tiger 在灾难恢复方面有哪些特性?

姚新明: Tiger 采用 2f+1 的集群模式,是基于 consensus 设计理念的集群,因此在 f 台机器出故障的时候不会影响系统的可用性,新增加的机器可以在线加入集群,历史数据会先从本地恢复,再从 leader 同步剩余的数据,所以只要不是所有机器都 crash,那么系统是可以恢复的。

InfoQ:能否介绍下 Tiger 的性能和可以承载的数据集大小?

姚新明:Tiger 的单机读写可以达到 10k tps 的能力,集群读写能力为 n:1, 这主要得益于 Erlang 强大的网络能力,以及 leveldb 存储引擎。数据集如果是 leveldb 引擎,主要瓶颈在磁盘容量,如果是 Redis 引擎,瓶颈主要是在内存,另外数据量太大系统重启恢复的时间会相对长点,zab 引擎的 log 是使用 leveldb,从 leveldb 的测试报告,大概是 100M 左右的顺序读能力,所以如果是 6G 的数据,估计回放数据要 2 分钟左右。

InfoQ: 为什么选择 Erlang 作为开发平台?

姚新明: Erlang 在网络编程方面有很大的优势,另外分布式协议 paxos 和 zab 都是基于消息的协议,Erlang 的 actor 模型很适合处理这种协议,用 Erlang 实现的 zab 引擎只有 2k 代码左右,比 zookeeper 的代码量小很多。

InfoQ: 为什么不在 menisa 上进行改进?

姚新明:menisa 是一个不错的数据库,功能比较多,但是也有比较明显的缺点,首先是对网络分区没有很好的处理,另外单个表的限制也是比较大的问题,Erlang 做数据库引擎其实不是一个很好的选择,个人认为 mmeisa 更适合 2 台机器做 HA 的模式,不是特别适合分布式大数据。

InfoQ: 作为少数派的基于 Erl 的 NoSQL 作品, 和 CouchDB/CouchBase ,Tiger 相比有什么优势?

姚新明: CouchDb 是文档数据库,我以前也简单用过,从性能和可靠性以及可用性方面 Tiger 应该是有更大的优势。CouchBase 其实和 Tiger 的做法类似,Erlang 做通讯层,c 做持久层,目前 Tiger 功能相对少些,因为 zab 协议的支持,可靠性和可用性应该更好,性能方面没有对比过。

InfoQ:目前,您推荐在什么场景中使用 Tiger?

姚新明: 比较适合 N:1 读写的场景,系统对可靠性和可用性要求比较高都可以考虑 Tiger,比如 session 服务器,认证中心都是可以的,当然作为缓存也可以, 应该说使用 memcached 和 Redis 的场景都能使用,当然 Redis 接口目前还不是很全。部署是建议 3 台或者 5 台集群方式。如果是采用 Erlang 开发 server,也可以嵌入 Tiger 中使用的 zab_engine 来解决多 server 的数据一致性问题。

InfoQ: Tiger 对中文信息是否有方便的支持?

姚新明: 下一步将完善文档,因为前端采用的是大家都比较熟悉的 memcached 协议和 Redis 协议,所以从使用的角度应该问题不大。如果只是验证,在项目主页上有说明,基本上是傻瓜型的,生产环境安装部署需要修改几个配置,这个会增加到文档中去。

InfoQ: 对于 Tiger 的未来有什么计划?

姚新明:

  1. 根据用户反馈,完善已有的 api 包括 memcached 和 Redis ,推出稳定的版本
  2. 完善性能测试,性能调优
  3. zab 引擎的完善
  4. 增加数据备份功能

从长远的角度是考虑做一个类似 riak 的系统,但不是 p2p 模式,而是采用 master slave 模式,数据一致性通过 zab 引擎来实现,那么系统将会是一个大型的高可靠性分布式 K/V 系统。

InfoQ:目前有种说法是最低调的 Riak 可能是最终胜出者。Tiger 的目标是 Riak, 那为什么 Riak 目前无法解决手上的问题? 或者説 Riak 相比 Tiger 的应用场景有什么不同?

姚新明: Riak 是 p2p 模型的,对于数据是基于 CAP 的最终一致性,相当与弱一致性,我还是比较喜欢 master slave 模式,简单可控性强。另外 Riak 中所有 node 都是连接的,保活消息广播量比较大,估计能支持的节点数会有限。

Riak 我是比较喜欢的,Basho 公司应该是在 c 和 Erlang 方面都很有实力的公司,Tiger 的项目结构是参考 Riak 做的,打包脚本是直接从 Riak 拿来的,省了不少工作。eleveldb 也是从 Basho 公司拿来的。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

Erlang架构AI