您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
首页
博文
课程
大赛
工具
更多
用户中心
开发者社区
>
博文
>
国际计费系统基于Sharding-Proxy大数据迁移方案实践
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
国际计费系统基于Sharding-Proxy大数据迁移方案实践
自猿其说Tech
2022-07-18
IP归属:未知
207480浏览
计算机编程
### 1 背景 - 计费数据量剧增,需要将老库进行数据拆分到多个分库,数据分片; - 拆分规则为收付款对象(或ID)字段,进行HASH,取模(32),分32个库 ### 2 目标 - 实现数据从老库,按照分片规则,迁移到分库中 - 保证数据平滑迁移,尽量停产时间最小 - 支持回滚,同步失败,支持回滚单库 ### 3 方案 #### 3.1 基于蜂巢中间件实现 ![](//img1.jcloudcs.com/developer.jdcloud.com/4c9b1c5b-b80d-4b47-9d20-30045a118bb420220718141255.png) #### 3.2 半自研同步数据处理程序 1. 开发数据处理程序,消费历史数据MQ;消费增量数据MQ 2. 基于dts同步历史数据(指定时间位点,同步历史) 3. 基于JDQ同步实时数据(指定时间位点,恢复实时同步) ![](//img1.jcloudcs.com/developer.jdcloud.com/83c69075-a87c-458c-ba04-46e620291c1520220718141324.png) #### 3.3 基于开源中间件策略 ![](//img1.jcloudcs.com/developer.jdcloud.com/e7c5a748-b8dd-42e4-a49c-6b430c07e5cb20220718141354.png) #### 3.4 完全自研数据处理工具 1. 开发数据查询程序,历史数据查询发送MQ写入 2. 实时数据双写 3. 统一发送MQ,由MQ异步处理写入 ![](//img1.jcloudcs.com/developer.jdcloud.com/9858ea70-98c8-4865-940e-8a219677b6c420220718141435.png) #### 3.5 方案对比 ![](//img1.jcloudcs.com/developer.jdcloud.com/f74cc452-50b2-4052-a63b-d73c1d50435220220718141537.png) **综上整体评估,我们最终选取,基于sharding-proxy做数据迁移整体方案** ### 4 Proxy介绍与搭建 #### 4.1 简介 ##### 4.1.1 设计意义 定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的数据库)版本,它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作数据,对 DBA 更加友好。 - 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用; - 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。 ![](//img1.jcloudcs.com/developer.jdcloud.com/c09ec24d-7f9a-47f1-af87-193877f1933120220718141618.png) ##### 4.1.2 整体架构 ![](//img1.jcloudcs.com/developer.jdcloud.com/0c737644-69ea-4b32-acbc-a3358cb6326920220718141643.png) 整个架构可以分为前端、后端和核心组件三部分。 前端负责与客户端进行网络通信,采用的是基于NIO的客户端/服务器框架,在Windows和Mac操作系统下采用NIO模型,Linux系统自动适配为Epoll模型。通信的过程中完成对MySQL协议的编解码。核心组件得到解码的MySQL命令后,开始调用Sharding-Core对SQL进行解析、路由、改写、结果归并等核心功能。后端与真实数据库的交互目前借助于Hikari连接池。 #### 4.2 搭建 ##### 4.2.1 关键字解读 下载,解压,安装mysql驱动,启动,完事 ##### 4.2.2 安装shareding-proxy 安装包下载,选择合适版本(本文选用4.1.1),在官网进行下载,官网地址https://shardingsphere.apache.org/document/current/cn/downloads ![](//img1.jcloudcs.com/developer.jdcloud.com/290d8437-031f-48f7-8b75-a338714cdc5f20220718141717.png) - 安装包解压(自动解压,或是命令解压),解压目录自己随意指定(有权限目录均可) ![](//img1.jcloudcs.com/developer.jdcloud.com/8334b570-dc60-4be6-b435-b5cb41a55ebb20220718141741.png) - 解压后shareding-proxy目录 ![](//img1.jcloudcs.com/developer.jdcloud.com/224d6d51-5060-4c85-a293-7fe8e6e7d45f20220718141805.png) - shareding-proxy配置目录conf,包含所有配置数据 ![](//img1.jcloudcs.com/developer.jdcloud.com/09f3df63-0faa-471e-a895-e73de989861b20220718141819.png) ##### 4.2.3 安装mysql驱动 将mysql的驱动jar包(mysql-connector-java-5.1.44.jar )放在shareding-proxy的lib目录下ShardingSphere-Proxy不带mysql驱动jar包,需要手动下载 下载地址https://dev.mysql.com/downloads/connector/j/ ![](//img1.jcloudcs.com/developer.jdcloud.com/faaba895-a57f-47e0-8448-29345015759720220718141840.png) #### 4.2.4 proxy启动 shareding-proxy的bin目录start.sh,通过./start.sh启动 ![](//img1.jcloudcs.com/developer.jdcloud.com/24494528-a076-40df-8d23-06c88ea0a31020220718141904.png) ##### 4.2.5 Remark Sharding-Proxy默认的启动端口是3307 #### 4.3 配置 ##### 4.3.1 关键字解读 六大配置——日志配置(logback.xml),基础服务配置(server.yaml),逻辑配置(四个conf配置文件,分片(核心)/影子/读写分离/加密配置) 本例基于server.yaml、config-sharding.yaml配置分片策略 ##### 4.3.2 server.yaml 基础服务配置,三部分组成 ###### 1)shareding-jdbc的编排治理配置,提供数据治理功能,包含如下: - 配置集中化与动态化。(支持数据源,表与分片读写分离策略的动态切换) - 数据治理。提供熔断数据库访问程序对数据库的访问和禁用从库的访问的能力 - 支持Zookeeper和etcd的注册中心; ![](//img1.jcloudcs.com/developer.jdcloud.com/d38c8ac8-3196-42f3-a231-cdb429282c2d20220718141952.png) ###### 2)权限配置,配置用户名和密码以及授权数据库 - 下例配置两个用户,分别为:root/root和sharding/sharding,其中root默认授权所有的数据库,而sharding用户则授权sharding_db数据库。在这里的数据库(schema)是逻辑数据库,在config-*.yaml中配置对应分库映射 ![](//img1.jcloudcs.com/developer.jdcloud.com/e9688605-705c-4473-85c6-a812257c40dc20220718142020.png) - 代理数据源参数配置 配置数据链接,线程,核数等 ![](//img1.jcloudcs.com/developer.jdcloud.com/4aa7880b-94ac-449b-b4c6-912f782be37120220718142041.png) ##### 4.3.3 config-sharding.yaml shareding-proxy核心配置,分片规则相关配置,包含schemaName、dataSources、shardingRule三部分 ###### 1)下图逻辑库对应分库数据源的映射配置 - schemaName逻辑库名,在server.yaml声明的授权的schema就是这里的schemaName - dataSources为数据源配置,本例映射俩个分库(ds_0,ds_1),ds_${0..1}对应逻辑分库名,url填写实际库 ![](//img1.jcloudcs.com/developer.jdcloud.com/9118128f-973e-4ed0-9795-091848c02ee720220718142120.png) ##### 4.3.4 logback.xml 基于logback的日志配置 ##### 4.3.5 剩余三项配置 config-shadow.yaml/config-master_slave.yaml/config-encrypt.yaml 分别为影子库配置,主从配置,数据字段加密配置,有意可以自行看下文链接 ### 5 调试 基于搭建ShardingSphere-Proxy代理选择直连工具客户端 1. 用Navicat或者mysql命令直连 2. 手动mysql命令链接如下 ![](//img1.jcloudcs.com/developer.jdcloud.com/a880b387-199f-4437-8970-6d8b17515c8220220718142217.png) 查询不带拆分键默认搜全库,新增默认根据拆分键路由对应真实库 ### 6 数据迁移 **迁移三步** 1)线上安装sharding-proxy 2)数据同步:创建迁移任务,启动同步,原理即是创建DTS任务 ![](//img1.jcloudcs.com/developer.jdcloud.com/c388bfc4-a135-4031-b2ed-a97d99f5ab2220220718142303.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/716ed837-8ddc-4404-a178-108d1c99955a20220718142310.png) 3)数据完整性校验 - 全量比对,整体同步进度查询 ![](//img1.jcloudcs.com/developer.jdcloud.com/4ce82161-d3a1-4a11-8029-9aa05016053620220718142334.png) - 时间分段比对,按照各个时间段抽样进行新库老库总量比对,手动校验 ![](//img1.jcloudcs.com/developer.jdcloud.com/f5d286bf-fd94-4aef-91c8-385b14c3d61720220718142402.png) - 随机抽样比对:随机新库某个时间段的数据逐条进行比对,手动工具校验 手动根据开发工具分别抽样查询,并查询出的数据与老库进行比对 - 全量数据校验:对比同步数据进行全量数据校验,根据DTS工具进行校验,耗时较长 ![](//img1.jcloudcs.com/developer.jdcloud.com/bf8bfeec-b7b9-4cf7-acf4-8f9c232de7c020220718142426.png) ### 7 配置查询机 基于easyops或者myops配置物流指定查询机,通过查询机查询proxy代理实现 ### 8 问题与总结 整体数据迁移过程中遇到的最大的问题即是数据不可测,针对各种历史数据问题导致数据迁移中断,造成返工,清理垃圾数据,重新迁移 #### 8.1 拆分键为空 拆分键为空默认不支持 ![](//img1.jcloudcs.com/developer.jdcloud.com/008a6ed0-9b90-4f6a-85e7-45960084a6d020220718142530.png) #### 8.2 更新拆分键 更新语句默认不支持更新拆分键(实际4.x不支持更新带拆分键,5.x已经支持更新带拆分键不改的情况下) Unknown exception: [INSERT INTO .... ON DUPLICATE KEY UPDATE can not support update for sharding column.] #### 8.3 针对以上俩种异常的解决方法 拆分键不能为空,设置默认拆分键 更新带拆分键,升级sharding-proxy到5.x或配置同步DTS去掉拆分键更新 ------------ ###### 自猿其说Tech-JDL京东物流技术与数据智能部 ###### 作者:任洪波
原创文章,需联系作者,授权转载
上一篇:深入理解java和dubbo的SPI机制
下一篇:通过MockMVC实现REST接口单测化的测试
相关文章
Taro小程序跨端开发入门实战
Flutter For Web实践
配运基础数据缓存瘦身实践
自猿其说Tech
文章数
426
阅读量
2149940
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149940
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号