Tair(4):Tair原理架构

一个Tair集群主要包括3个必选模块:ConfigServer、Dataserver和Client

通常情况下,一个 Tair 集群中包含2台 Configserver 及多台 DataServer。其中两台 Configserver 互为主备。通过和 Dataserver 之间的心跳检测获取集群中存活可用的 Dataserver,构建数据在集群中的分布信息(对照表)。Dataserver 负责数据的存储,并按照 Configserver 的指示完成数据的复制和迁移工作。Client 在启动的时候,从 Configserver 获取数据分布信息,根据数据分布信息,和相应的 Dataserver 进行交互,完成用户的请求。

从架构上看,Configserver 的角色类似于传统应用系统的中心节点,整个集群服务依赖于 Configserver 的正常工作。而实际上,Tair 的 Configserver 是非常轻量级的,当正在工作的 Configserver 宕机的时候,另一台会在秒级别时间内自动接管。而且,即使出现两台 ConfigServer 同时宕机的恶劣情况,只要 DataServer 没有新的变化,Tair 依然服务正常。应用在使用时只需要连接 Configserver,而不需要知道内部节点的情况。

table

​ 对照表,存放了桶和dataserver的对应关系,put数据时,会对key进行hash计算,在对桶数量取模,然后根据对照表找到相应的dataserver

0 192.168.0.1
1 192.168.0.2
2 192.168.0.1
3 192.168.0.2
4 192.168.0.1
5 192.168.0.2

假设新增了一个节点——192.168.10.3,当configserver发现新增的节点后,会重新构建对照表。构建依据以下两个原则:

  1. 数据在新表中均衡地分布到所有节点上。
  2. 尽可能地保持现有的对照关系。

更新之后的对照表如下所示:

0 192.168.0.1
1 192.168.0.2
2 192.168.0.1
3 192.168.0.2
4 192.168.0.3
5 192.168.0.3

Client

  • 提供访问 Tair 集群的API
  • 更新并缓存数据分布表
  • LocalCache,避免过热的数据访问影响 Tair 集群服务。
  • 流量控制

common

  • common 目录提供基础数据结构和组件

ConfigServer

  • 两台 Configserver 互为主备
  • 通过和 Dataserver 之间的心跳检测来获取集群中存活、可用的 Dataserver 节点信息
  • 根据获取的 Dataserver 节点信息构建数据在集群中的分布表
  • 提供数据分布表的查询服务
  • 调度 Dataserver 之间的数据迁移、复制

DataServer

  • 提供存储引擎
  • 接受 Client 发起的 put/get/remove 等操作
  • 执行数据迁移、复制
  • 访问统计

Storage

​ Tair的存储分为两种:persistence(持久化)和 cache(非持久化) ,非持久化Tair看成是分布式缓存,持久化Tair将数据序列化到磁盘,还可以配置备份数量,将一份数据放到不同的主机上,防止数据丢失。

Tair对存储做了一个抽象层,可以很方便的替换 tair 底层的存储引擎,主要有下面三种存储引擎:

mdb

​ 一个高效率的关系型缓存存储数据库,定位于 cache 缓存,类似于 memcache。采用page/slab管理内存。支持 k/v 存取、prefix 操作、expire数据过期,采用共享内存方式,重启数据不丢。阿里内部大都采用此种模式。

图中mempool是申请到的内存池,大小在配置文件dataserver.conf中指定slab_mem_size=4096,默认是4个g,mempool被划分很多slab组,每组slab下又包含了若干page,每个page下又包含了一组chunk,memcache中叫chunk在图中指定item,item是真正存放数据的地方。

rdb

定位于 cache 缓存,采用了 redis 的内存存储结构。支持 k/v, list, hash, set, sortedset 等数据结构。

ldb

​ ldb,定位于高性能存储, 多实例配置使用,充分利用IO,采用了 levelDB 作为引擎,并可选择内嵌mdb作为KV级别cache 加速,这种情况下 cache 与持久化存储的数据一致性由 tair 进行维护。支持 k/v,prefix 等数据结构。

Memtable:内存数据结构,新的数据会首先写入这里。

Log文件:写Memtable前会先写Log文件,Log通过append的方式顺序写入,Log的存在使得机器宕机导致的内存数据丢失得以恢复。

compact:压缩,LevelDB的一个重要特性就是数据的分层,由于数据的分层, 越旧的数据处在越大的层级,越新的数据在越小的层级,compaction的过程是产生SSTable的过程,在查询数据的时候, 最先读取MemTable里面的数据, 然后是L0的SSTable里面, 接着是L1, L2直到最大的层级。在分层设计中, 越往上层,数据的容量越大, 大约Ln是Ln-1层数据的10倍。 在各个层级的SSTable文件, 只有L0层的数据是有MemTable直接flush到磁盘上, 其它层的数据是经过compaction过程进行排序整理产生的。这意味着L0层以上的数据, 各个SSTable文件内的数据是有序且不会重叠的。

packets

​packets目录提供了通信协议中各种数据包的实现。基础库主要包括tbsys和tbnet,其中tbsys是主要的数据结构和文件操作的实现,包括排它锁和读写锁实现,对线程的包装,以及配置文件读写和分析等。tbnet是主要实现了单线程的网络读写数据流,采用了epoll的模式。

plugin

​tair 还内置了一个插件容器,可以支持热插拔插件。插件由 config server 配置,config server 会将插件配置同步给各个数据节点,数据节点会负责加载/卸载相应的插件。

插件分为 request 和 response 两类,可以分别在 request 和 response 时执行相应的操作,比如在 put 前检查用户的 quota 信息等。插件容器也让 tair 在功能方便具有更好的灵活性。

猜你喜欢

转载自blog.csdn.net/u013938578/article/details/134909809