TcaplusDB有损搬迁介绍


TcaplusDB有损搬迁介绍

TcaplusDB搬迁分为有损搬迁和无损搬迁,有损是指搬迁过程中对外服务有损。

*应用场景*

? 存储层扩容

? 存储层缩容

? 设备搬迁

? shard搬迁

 

*TcaplusDB架构*

*数据分片模型*

TcaplusDB中会把每张表分成N个shard, shard分布在1个或多个tcapsvr节点上。 根据key计算hash得到对应的shardID。 计算方式:

hash_code = hash(keys) % 10000

RangeShardID
0-2000 101
2001-4000 102
4001-6000 103
6001-8000 104
8001-10000 105

 

一个表通过hash分表,按照路由数组长度(默认为10000)进行取模运算分片(Mod Sharding),所以每张表最多可以分成10000个分片(Shard)。以下图为例,1个TcaplusDB表被分为5个shard文件分布到不同存储节点,每个结点分布有1个或多个分片的数据。

 

 

*数据访问流程*

GameSvr通过API访问tcaproxy,在tcaproxy中根据key计算出对应的hash值获取路由信息,把请求转发到对应的tcapsvr上。

 

 

*搬迁方案*

在业界中,主要有两种数据搬迁方案。

1、先搬迁数据,再切换路由信息。5

2、先切换路由信息,再搬迁数据。

方式优势不足难点
先搬后切 容错性强,状态一致,搬迁过程可随时回退,天然支持所有操作。 搬迁过程中不能很快降低源端的负载 搬迁过程中的写操作如何同步到目的端
先切后搬 快速分流,可以很快降低源端的负载。 容错性差,搬迁过程中不能回退 如何在搬迁过程中支持各种请求

 

*业界数据搬迁方式*

*数据库*Sharding方式*搬迁方式**实现步骤**优缺点*
MySQL 单机 先搬后切 裂变扩容 有损
MongoDB key range/hash 先搬后切 ①先搬迁 ② binlog同步 ③ 拒绝请求,刷新并切换路由 路由更新状态有损
Redis hash 客户端路由切换 ① 搬迁slot ② 请求访问源端slot,没找到数据,返回ASK转向,请求目的端 ③ 该slot若已搬迁完成则更新客户端路由 无损,但影响服务性能
TDSQL hash 先搬后切 ① dump所需要数据,搬迁到目的端; ② binlog同步,最后拒绝请求,更新路由 路由更新状态有损

 

*TcaplusDB 搬迁方式*

搬迁搬迁方式优点应用场景
有损搬迁 先切后搬 能够尽快降低源端的负载,以及避免在搬迁完成时还需要同步写操作到目的端 扩容、缩容、设备搬迁、shard搬迁
无损搬迁--逻辑搬迁 先搬后切 搬迁过程中业务不感知。搬迁记录数据,搬迁以后能有效减少存储引擎存储空洞率。 扩容、缩容、设备搬迁、shard搬迁
无损搬迁--物理搬迁 先搬后切 搬迁速度快,减少序列化操作。搬迁速度是逻辑搬迁几倍。 设备搬迁,shard搬迁

 

*有损搬迁*

TcaplusDB的有损搬迁为了能够尽快降低源端的负载,以及避免在搬迁完成时还需要同步写操作到目的端,采用了先搬后切的方式。

路由状态的转换由tcapcenter控制,并通知到tcaproxy,路由状态转换为:

*normal--> wait --> reject --> sync --> normal*

 

 

 

 

*搬迁过程的路由状态*

*路由状态*含义*存在意义*
normal 正常情况下的路由状态 正常情况下的路由状态
wait 等待搬迁的路由 数据搬迁是一个事务,tcapcenter在初始化该事务时,会生成所有需要搬迁的路由,wait状态就是表示这些路由处于等待搬迁状态,该状态下请求包将由源端处理
reject 拒绝到搬迁路由的所有请求,并进行染色 保证数据一致性
sync 路由正处于数据搬迁中 该状态下,就表示请求包应该由目的端处理

 

*为什么需要Reject状态*

假设由wait状态直接转变为sync状态,tcaproxy到源端svr的通道中仍然存在写请求未被处理:

1、源端svr将key对应的记录搬迁到目的端svr

2、源端svr处理通道中的记录更新请求

3、由于是sync状态,tcaproxy会到目的端svr获取

按照该流程,如果没有reject状态的话,proxy会读取记录的旧数据。

 

 

 

*搬迁过程的请求处理*

 

 

 

1、tcaproxy收到请求包之后,检测所请求的记录是否在目的端tcapsvr

若存在目的端tcapsvr,转 步骤4;

若不存在目的端tcapsvr, 转 步骤2;

2、tcaproxy向源端tcapsvr拉取所请求的记录

3、tcaproxy将拉取回来的记录写入到目的端

4、tcaproxy将gamesvr的请求发送给目的端tcapsvr进行处理

 

*搬迁速度控制*

搬迁过程中使用滑动窗口的方式控制搬迁速度

? pending buffer默认长度为1000,实际表征了并发量

? 指定时间内无ack则重传

? 目的端返回busy,则按照重试策略重试

 

 

时间分段

宏观时间

? 23:00 - 07:00, 业务低峰期,搬迁速度可以提高

? 07:00 - 23:00, 业务主要服务时间,搬迁速度可以降低

微观时间

? 以10ms作为粒度,将每秒速度平均分配到100个10ms,从而使搬迁速度更加平滑

 


img

TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码完全自研。具备缓存+落地融合架构、PB级存储、毫秒级时延、无损水平扩展和复杂数据结构等特性。同时具备丰富的生态、便捷的迁移、极低的运维成本和五个九高可用等特点。客户覆盖游戏、互联网、政务、金融、制造和物联网等领域。