存储 频道

淘宝开源Key/Value存储Tair技术剖析

  抽象的存储引擎层

  Tair的存储引擎有一个抽象层,只要满足存储引擎需要的接口,便可以很方便地替换Tair底层的存储引擎。比如你可以很方便地将bdb、tc甚至MySQL作为Tair的存储引擎,而同时使用Tair的分布方式、同步等特性。

  Tair默认包含两个存储引擎:mdb和fdb。

  mdb是一个高效的缓存存储引擎,它有着和memcached类似的内存管理方式。mdb支持使用share memory,这使得我们在重启Tair数据节点的进程时不会导致数据的丢失,从而使升级对应用来说更平滑,不会导致命中率的较大波动。

  fdb是一个简单高效的持久化存储引擎,使用树的方式根据数据key的hash值索引数据,加快查找速度。索引文件和数据文件分离,尽量保持索引文件在内存中,以便减小IO开销。使用空闲空间池管理被删除的空间。

  自动的复制和迁移

  为了增强数据的安全性,Tair支持配置数据的备份数。比如你可以配置备份数为3,则每个数据都会写在不同的3台机器上。得益于抽象的存储引擎层,无论是作为cache的mdb,还是持久化的fdb,都支持可配的备份数。

  当数据写入一个节点(通常我们称其为主节点)后,主节点会根据对照表自动将数据写入到其他备份节点,整个过程对用户是透明的。

  当有新节点加入或者有节点不可用时,configserver会根据当前可用的节点,重新build一张对照表。数据节点同步到新的对照表时,会自动将在新表中不由自己负责的数据迁移到新的目标节点。迁移完成后,客户端可以从configserver同步到新的对照表,完成扩容或者容灾过程。整个过程对用户是透明的,服务不中断。

  插件容器

  Tair还内置了一个插件容器,可以支持热插拔插件。

  插件由configserver配置,configserver会将插件配置同步给各个数据节点,数据节点会负责加载/卸载相应的插件。

  插件分为request和response两类,可以分别在request和response时执行相应的操作,比如在put前检查用户的quota信息等。

  插件容器也让Tair在功能方便具有更好的灵活性。

  Tair的未来

  我们将Tair开源,希望有更多的用户能从我们开发的产品中受益,更希望依托社区的力量,使Tair有更广阔的发展空间。

  Tair开源后,有很多用户关心我们是否会持续维护这个项目。我们将Tair开源后,淘宝内部已经不再有私有的Tair分支,所有的开发和应用都基于开源分支。Tair在淘宝有非常广的应用,我们内部有一个团队,专门负责Tair的开发和维护,相信我们会和社区一起,将Tair越做越好。

  有很多用户在淘宝开源平台上申请加入Tair项目,加入项目在我们的开源平台上意味着成为项目的提交者,可以向代码库直接提交代码。所以我们暂时还没有批准外部用户加入,我们将在大家对Tair有更深入的了解后和社区一起决定是否批准加入项目的申请,在此之前,如果你有对代码的改进,欢迎使用patch的方式提交给我们,我们将在review后决定是否合并到代码库。

  希望我们能和社区一起,将Tair做成一个真正对大家都有帮助的项目。

  关于作者

  若海,真名余刚,淘宝网核心系统研发部工程师,Tair的主要作者之一,当前的方向是大型分布式缓存和存储解决方案。

0
相关文章