Tair mdb 存储引擎的实现

Tair是一个高性能、分布式、可扩展、高可靠的NoSQL存储系统。本文基于Tair v3.1.2.43版本,探究其mdb存储引擎的实现。

Tair目前有mdb、ldb和rdb等存储引擎。其中mdb是Tair最早的一款内存型产品,也是在公司内部应用最广泛的集中式缓存。特别适用容量小(一般在M级别,50G之内),读写QPS高(万级别)的应用场景。由于是内存型产品,因此无法保证数据的安全性,对数据安全有要求的应用建议在后端加持久化数据源(例如MySQL)。本文接下来详细讨论Tair mdb存储引擎的实现。

Tair的存储引擎接口是src\storage\storage_manager.hpp里的虚基类storage_manager。所有的Tair存储引擎均继承实现了storage_manager这个虚基类。src\dataserver\tair_manager.cpp文件中的tair_manager::initialize函数根据配置文件中storage_engine的设置初始化相应的存储引擎。

mdb引擎默认使用POSIX共享内存的方式进行内存的分配和管理。mdb引擎会在初始化的时候创建或者使用已存在的共享内存。其配置使用内存的方式和共享内存命名的前缀均在其配置文件中进行设置。如图所示:

src\storage\mdb目录是mdb存储引擎的实现,这里的实现、测试和接口文件都放在同一个目录中。其中有关mdb存储实现的文件如下:

◇ db_define.{hpp,cpp} —— mdb引擎相关的配置信息和定义。
◇ mdb_factory.{hpp,cpp} —— mdb引擎初始化工厂类的实现。
◇ mdb_manager.{hpp,cpp} —— mdb引擎管理结构的实现。
◇ mdb_instance.{hpp,cpp} —— mdb实例相关的实现。
◇ mem_cache.{hpp,cpp}  —— MemCache结构的实现。
◇ mem_pool.{hpp,cpp} —— MemPool结构的实现。
◇ cache_hashmap.{hpp,cpp} —— 全局缓存KV结构映射的Hash表的实现。
◇ mdb_stat_manager.{hpp,cpp} —— mdb引擎状态管理相关实现。
◇ mdb_stat.hpp —— mdb引擎读取写入统计的相关数据结构的定义和实现。
◇ lock_guard.hpp —— pthread_mutex_t的简单RAII封装。

其中mdb_define.{hpp,cpp}里定义了mdb引擎的配置变量,打开共享内存的操作函数以及获取时间、判断当前时间的hour是否在给定区间等函数。

mdb_factory.{hpp,cpp}用于创建mdb引擎,mdb_factory.hpp中定义的接口如下:

create_mdb_manager读取配置文件中的配置信息,然后创建mdb_manager对象并返回。这个函数在src\dataserver\tair_manager.cpp文件中的tair_manager::initialize函数中被调用。

mdb_manager.{hpp,cpp}定义了mdb引擎管理类mdb_manager的实现,mdb_manager类继承自storage_manager虚基类,实现了相关的虚函数接口。其定义std::vector<mdb_instance*>结构保存所有的mdb实例。mdb_instance类在mdb_instance.{hpp,cpp}中定义和实现。mdb_manager类的initialize函数会调用init_area_stat函数创建/打开名为mdb_param::mdb_path+".stat这个存储mdb引擎状态信息的共享内存块,其大小为TAIR_MAX_AREA_COUNT * sizeof(mdb_area_stat)。然后会根据配置文件里的实例个数信息创建mdb_instance实例。配置如下:

mdb_instance创建时会创建名为mdb_param::mdb_path+".000"开始计数的共享内存块。创建的实例中bucket的个数由以下配置决定:

mdb_instancemem_cachemem_poolcache_hashmap这几个类构成了mdb存储引擎的核心。创建完成后,其包含指向关系如下:

对应的内存结构图大致如下:

其中MemPool以页的形式管理通过共享内存分配的内存,分配或者释放一个内存页。其定义了uint8_t page_bitmap[BITMAP_SIZE],以位的形式来管理内存页;MemCache比页低一级,采用slab算法将内存分配给具体的item;HashTable以一个巨大的Hash表存储key的映射关系。下面阐述对共享内存具体的分配情况。内存布局如图所示:

cache meta的结构如下:

hash buckets的结构如下:

slab use这里,当前的代码实际上仅放置了一个mdb_cache_info:

下面是内存管理结构中的一些定义:

mdb_id的定义:

其中item_id的图示如下:

一些换算关系如下:

page_addr = S0 + (page_id * page_size)
item_addr = S0 + (page_id * page_size) + sizeof(page_info) + (slab_size * offset_in_page)

最后是slab分配器和K/V存储相关的细节。mem_cache类使用slab_manager类对从mem_pool中申请到的内存页进行管理。页信息的结构定义如下:

mem_cache里的pages被放置在三个链表中,分别是Free页链表、Full页链表和Partial页链表。Free页链表、Full页链表是简单的双向链表,用于链接空页和满页。Partial页链表如下图:

下图是不同的Area里放置item的图示:

最后剩下的mdb_stat_manager.{hpp,cpp}mdb_stat.hpp定义和实现了访问统计相关的功能,其创建的共享内存块为相应的mdb实例的名称+”mdbstat”,此处不再赘述。

时间: 2024-11-01 11:19:32

Tair mdb 存储引擎的实现的相关文章

【MySQL】FEDERATED存储引擎

FEDERATED存储引擎的描述 mysql 提供了一个类似Oracle中的数据库链接(DBLINK)功能的存储引擎--FEDERATED.当我们创建一个以FEDERATED为存储引擎的表时,服务器在数据库目录只创建一个表定义文件.文件由表的名字开始,并有一个frm扩展名.无其它文件被创建,因为实际的数据在一个远程数据库上.这不同于为本地表工作的存储引擎的方式. 如何使用FEDERATED存储引擎 CREATE TABLE federated_table (     id     int(20)

MongoDB · 特性分析 · MMAPv1 存储引擎原理

MongoDB 的 mongod 服务管理一个数据目录,可包含多个DB,每个DB的数据单独组织,本文主要介绍 MMAPv1 存储引擎的数据组织方式. Database 每个 Database(DB) 由一个.ns文件及若干个数据文件组成 $ll mydb.* -rw------- 1 ydzhang staff 67108864 7 4 14:05 mydb.0 -rw------- 1 ydzhang staff 16777216 7 4 14:05 mydb.ns 数据文件从0开始编号,依次

mysql cluster存储引擎NDB,如何设置哪些数据不被LOAD到内存中?

问题描述 mysql cluster存储引擎NDB,如何设置哪些数据不被LOAD到内存中? mysql cluster存储引擎NDB,如何设置哪些数据不被LOAD到内存中?

FEDERATED存储引擎的使用

FEDERATED存储 引擎的功能与oracle的DBLINK基本类似,主要用来提供对远程MySQL服务器 上面的数据的访问接口,默认情况下面,mysql是不启用该存储 引擎的,如下 Java代码   mysql> show engines;    从上面可以看到FEDERATED的Support是NO,说明没有启用,如果没有的话说明没有编译进去,需要重新安装,要像启用的话使Support为YES,可以在/etc/my.cnf加federated(在mysqld加),然后重启就可以启用 配置很简

MySql数据库插入式的多存储引擎机制

什么是MySql数据库? 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是数据库管理系统,它们可以存储数据,并提供查询和更新数据库中的数据的功能等等.根据数据库如何存储数据和如何操作数据的实现机制不同,这些数据库之间即有区别又有共同点. MySql数据库是开放源代码的关系型数据库.目前,它可以提供的功能有:支持sql语言.子查询.存储过程.触发器.视图.索引.事务.锁.

MySQL数据库存储引擎和分支现状

在MySQL经历了2008年Sun的收购和2009年Oracle收购Sun的过程中,基本处于停滞发展的情况,在可以预见的未来,MySQL是肯定会被Oracle搁置并且逐步雪藏消灭掉的.MySQL随着相应的各主创和内部开发人员的离去,缔造了各个不同的引擎和分支,让MySQL有希望继续发扬光大起来. 本文大致讲解一下MySQL目前除了主要的 MyISAM.InnoDB.Heap(Memory).NDB 等引擎之外的其他引擎的发展和现状,以及MySQL主干以外的分支的状况,为了我们未来更好的使用MyS

mysql数据据存储引擎InnoDB和MyISAM的优势及区别

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键.如果事物回滚将造成不完全回滚,不具有原子性.如果执行大量的SELECT,MyISAM是更好的选择. InnoDB:这种类型是事务安全的.它与BDB类

MySQL专用开源数据库存储引擎出炉

来自国际领先的数据库厂商Solid Information Technology公司的消息宣称,该公司为MySQL量身定制的开源数据库存储引擎 ─ Solid DB Storage Engine for MySQL的Beta版,已于当地时间2006年7月25日正式对外发布.欢迎广大开源社区的用户及MySQL的忠实追随者在 http://dev.soliddb.com/download下载,抢先感受全新的.更高价值的体验. Solid公司此次面向全球开放的Solid DB Storage Engi

MySQL存储引擎的选择

一般而言,有InnoDB就差不多了,在大部分情况下,InnoDB就能满足我们的日常需求,所以在MySQL 5.5 之后,InnoDB就作为了默认的存储引擎.也就是说除了某些特征InnoDB没法提供,我们才有可能去选择其他的引擎. 事务 如果要用到事务,那么InnoDB就是不二之选,至少目前是这样的.由于MyISAM不支持事务,所以如果不需要事务,主要就是查询,插入等操作,那么也可以用MyISAM. 备份 在很多情况下,我们是在应用还在运行的情况下对数据进行备份的,所以如果在这种情况下,InnoD