网易迁移方案揭秘:DDB 迁移至 TiDB

网友投稿 617 2024-03-10



转载来自:https://mp.weixin.qq.com/s/8JcrLSJQkT2_VKr3i4pgYg

网易迁移方案揭秘:DDB 迁移至 TiDB

作者:张振祥

公众号:不错技术所

目前公司已经多个业务上线TIDB服务,包括网易支付对账中心,网易云音乐心遇榜单系统等,但这些均是新业务直接上线TIDB。为探索已有业务迁移TIDB,本文对一些迁移方案进行了总结。

一、TiDB简介

TiDB Server:SQL 层,对外暴露 MySQL 协议的连接 endpoint,负责接受客户端的连接,执行 SQL 解析和优化,最终生成分布式执行计划TiDB 层本身是无状态的,实践中可以启动多个 TiDB 实例,通过负载均衡组件(如 LVS、HAProxy 或 F5)对外提供统一的接入地址,客户端的连接可以均匀地分摊在多个 TiDB 实例上以达到负载均衡的效果TiDB Server 本身并不存储数据,只是解析 SQL,将实际的数据读取请求转发给底层的存储节点 TiKV(或 TiFlash)

PD (Placement Driver) Server整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点

存储节点

TiKV Server:负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range(从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region。

TiKV 的 API 在 KV 键值对层面提供对分布式事务的原生支持,默认提供了 SI (Snapshot Isolation) 的隔离级别,这也是 TiDB 在 SQL 层面支持分布式事务的核心。TiDB 的 SQL 层做完 SQL 解析后,会将 SQL 的执行计划转换为对 TiKV API 的实际调用。所以,数据都存储在 TiKV 中。另外,TiKV 中的数据都会自动维护多副本(默认为三副本),天然支持高可用和自动故障转移

TiFlash:TiFlash 是一类特殊的存储节点。和普通 TiKV 节点不一样的是,在 TiFlash 内部,数据是以列式的形式进行存储,主要的功能是为分析型的场景加速

TIDB 优势

1.提供DDB同等程度的水平扩容能力

2.SQL支持能力较DDB好, 性能相当,DDB SQL 会有很多限制

比如说查询时要求要带上均衡字段、不建议做表join 操作等等;均衡字段不可频繁update, update 需要用 delete+insert;唯一约束限制,所有唯一键均需要加上均很字段,否则无法保证唯一

3.资源扩缩容粒度更加灵活, 不需要像DDB, 每次都翻倍扩容

4.数据一致性下限提升

5.数据存储成本一定程度降低

P_ABTEST_TEST_AGG 表1.5亿行,MySQL占用空间337G  TiDB 84G ,当然这是比较极端的情况,一般来讲我们认为TIDB磁盘存储 较DDB 会有下降30%。不需要raid10+rocksdb压缩-rockdb写放大

6.主从复制效率显著提高, 降低写负载下一致性和高可用降级的风险

7.扩容行为效率和安全性

8.在线DDL支持更好, 除了加索引基本都是秒回, 大表增加修改列成本显著降低

9.高可用自动恢复可靠性与效率显著提升

10.HTAP能力能够减少数据传输环节的成本和风险, 提供业务更高效的实时分析能力

某些场景下聚合查询的效率是MySQL的100倍

https://pingcap.com/blog-cn/tidb-and-tiflash-vs-mysql-mariadb-greenplum-apache-spark/

二、DDB(QS模式) 迁移TIDB 方案设计

梳理应用以及表的对应关系

确认迁移的业务域  

实际上一般我们以表维度来划分,如果有表级别的耦合我们会要求先进行业务改造

业务兼容性改造

不支持 FLOAT4/FLOAT8类型

不支持 XA语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开)

不支持 savepoints

不支持 存储过程/触发器

不支持 SELECT ... INTO @变量 语法

不支持 SELECT ... GROUP BY ... WITH ROLLUP 语法

不支持 外键约束

不支持 视图修改,业务需要梳理是否有相关依赖

因explicit_defaults_for_timestamp默认值不一致,需要梳理有没有insert timestamp字段为null的逻辑(TiDB 默认:ON,且仅支持设置该值为 ON。MySQL 5.7 默认:OFF。MySQL 8.0 默认:ON)

自增ID,自增列仅保证唯一,不保证自增。业务需要梳理是否有依赖自增特性的逻辑(TiDB 的自增列仅保证唯一,也能保证在单个 TiDB server 中自增,但不保证多个 TiDB server 中自增)

指定默认字符集/字符序为utf8mb4_bin、utf8mb4_general_ci

不支持修改 decimal 类型的精度

不支持有损变更,以及部分数据类型的更改(包括整数改为字符串或 BLOB 格式等)

连接串修改

jdbc.dirver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://10.170.208.12:6006/tidb_database

数据同步以及一致性校验

数据源切换方案

非LBD模式的QS

业务切换

业务改造成域名访问的方式

低峰期通过切换域名的方式切换数据源

源端rename表(为了避免出现双写,确定没有其他业务连该表)

域名切换

Kill  老库连接   

数据回滚

通过设置反向同步任务回滚数据

优点:业务除开连接串的修改外无需做任何修改

LBD/DBI模式

灰度发布

业务仅做兼容性改造

切换方案:遵循灰度发布程序

回滚方案:1.下掉灰度机器;2.新写入的数据做回滚  

优点:业务改造比较少

缺点:可能会出现双写的情况,数据可能会冲突

业务热开关切换

业务需要做兼容性及数据源热切开关改造

切换方案:1. 源表rename,确保没有其他业务使用;2. 业务开启禁写开关;3. 业务流量切换;4. 业务开启读写,完成切换

回滚方案:回滚方案需要考虑到新增数据反向同步

优点:业务改造比较少,无需加入异步写逻辑,也无需关心数据不一致情况,且能保证数据一致性,

缺点:切换一刀切,未经灰度验证

业务双写方案

业务通过热开关可以切换成 读写DDB,读写DDB+异步写TiDB ,读写TiDB + 异步写DDB,仅读写TiDB

读写DDB+异步写TiDB 时的切换方案:1.DDB中设置read_only;2. 等等NDC 增量同步完成;3. DBA关闭同步任务;4. 业务开启异步写TiDB;5. DDB中开启读写

回滚:业务直接切换到仅读写DDB 就行

优点:经过较长时间的灰度,稳定性/安全性较高

如果异常回滚较为迅速无损

问题:业务改造较多,需要加入异步写逻辑,热切开关等逻辑;另外还需要考虑异步写的数据一致性问题

三、数据同步上下游工具

数据同步以及回滚数据链路图

TIDB数据接入NDC数据链路图

TiCDC 监控详解见:

https://docs.pingcap.com/zh/tidb/v4.0/monitor-ticdc

●Changefeed table count:一个同步任务中分配到各个 TiCDC 节点同步的数据表个数

●Processor resolved ts:TiCDC 节点内部状态中已同步的时间点

Table resolved ts:同步任务中各数据表的同步进度

●Changefeed checkpoint:同步任务同步到下游的进度,正常情况下绿柱应和黄线相接

● PD etcd requests/s:TiCDC 节点每秒向 PD 读写数据的次数

● Exit error count:每分钟内导致同步中断的错误发生次数

TICDC 报警规则

TIDB 监控报警框架

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:统计信息十问:你所不知道的细节
下一篇:解决 Rust 生命周期问题:static hashmap 锁
相关文章