简介
Tair 是一种高可用、高性能、高扩展的kv结构的存储系统,支持分布式集群部署。
功能
- 临时数据存储:应用有大量的临时数据存储,可通过使用 mdb 来存储这类数据,避免应用内存管理的开销,提升应用性能。如 session 数据、权限信息等
- 数据库缓存:作为后端数据库之上的缓存,降低应用对后端数据库的访问压力。
- 持久化存储:将 Tair 当成传统数据库使用,数据写入磁盘。
缺点
分布式系统的可靠性和一致性无法同时保证,特别是有网络延迟的情况下。Tair 在有 dataServer 宕机时,可能会有数据延迟或丢失的情况。
架构
client
- 提供访问Tair集群的 Api
- 更新及缓存本地数据分布表
- LocalCache,对 Tair 集群的保护,避免热点问题影响 Tair 集群服务
- 单机限流等
Config Server
- 两台机器互为主备,心跳监听对方存活情况
- 通过 diamond 存储元数据配置、localcache、hotzone、forbiddenKeys等配置数据
- 通过和 Data Server 机器之间的心跳检测,用来检测集群中存活的机器,并构造数据在集群中的分布表
- 提供数据分布表的查询服务
- 调度 Data Server 中机器之间的数据复制、迁移等操作
Data Server
- 提供数据底层存储引擎
- 执行 Client 发起的 put/get/remove 等操作
- 执行数据迁移、复制等 Config Server 调度的操作
- 访问统计
负载均衡与数据重建
Tair 将所有的 key 通过一致性hash算法分配到 N 个桶中,桶是Tair复制和迁移的基本单位,configServer 再根据某些策略分配每个桶到各个 dataServer 中。因为 key 的 hash 算法,可以认为每个桶的数据是均衡的,进而每个 dataServer 的数据分布也是均衡的。
桶分布策略:负载均衡优先策略(桶尽量均匀分布)、位置安全优先策略(同一个桶的多份数据【备份数量可配置】尽量不落在同一个机房),不管哪种策略需满足两个条件:1、每个桶必须多份复制的数据,2、一个桶的多份数据不能在同一台 dataServer 上。
当有某台 dataServer 宕机时,configServer 会重新构造新的 key 的索引表,并调度 dataServer 之间数据的复制和迁移
底层存储
Tair 都是以 kv 的形式存储,不支持模糊查询,不支持事务,不适合大吞吐量场景,适合读多写少场景。
mdb:参考 memcache,纯内存存储,数据可接受丢失,访问速度要求高,访问 QPS 高。
rdb:基于 redis 存储,支持复杂结构存储。
ldb:基于 leveldb 存储,支持分级 key(value 里有多层 key),相比 mdb 无法抗较高 QPS,适合更新频繁,数据不可丢失场景。