跳转到内容

DS 垂直分库用户使用手册

前言. 垂直分库使用须知

上面介绍了如果开启垂直分库,但是相对于单库来说,在垂直分库场景下存在一些使用限制

跨库写

  • 0.16版本DS引入了Seata依赖,支持分布式事务,所以可以进行跨库写,前提是需要部署Seata服务,对于业务开发人员来说,和单库开发体验一致,加上DS事务注解即可,不用关心是否跨库。
  • 0.16之前的版本不支持跨库写功能,所以垂直分库前需要结合分库方案检查当前项目中是否存在跨库写逻辑,否则分库后如果存在跨库写DS会抛出相关不支持异常。

跨库读

0.16版本和0.16之前的版本均支持跨库读,比如业务模块A直接查询业务模块B的模型数据。

垂直分库开启后不可关闭

垂直分库开启后不可关闭,之所以要开启垂直分库,是为了缓解单库压力,提高业务性能,理论上没有关闭垂直分库的需求,并且关闭垂直分库需要大量的数据迁移。

支持跨库读

比如业务模块A直接查询业务模块B的模型数据

垂直分库开启后不可关闭

1.新建环境时开启垂直分库流程

1.1 新建环境时开启垂直分库

切换为运行环境管理 —> 新增

新增环境开启垂直分库

1.2 添加垂直分库数据库

运行环境 —> 配置 —> 数据库 新增数据库

1.3 配置模块与数据库的映射关系

模型上报到交付控制台后,deploy时配置待发布模块映射的数据库(已发布过的不可更改数据库映射),模块映射的数据库不能为空。

发布管理 —> 资源发布详情 —> 分库设置

模块数据源映射

配置完模块与数据库的映射关系后,执行计划,即完成了在垂直分库下模型资源发布的完整流程

  • 以上垂直分库下模型发布的流程基于不开启安全生产,开启安全生产环境下,会返回需要在每个dataSourceKey下执行的SQL语句,把每个数据库对应的SQL到每个数据库下面去执行即可。

2.从单库架构切换到垂直分库架构

以下操作流程假设租户projectName = trantor,projectName 在MS上是通过DS_PROJECT_ID 配置

2.1 初始化当前已有模块和默认数据源的映射关系

2.1.1 从DS元信息库中获取当前租户默认数据源

DS元信息库默认为Autumn, 使用MYSQL数据库时项目中可以通过MYSQL_DATABASE环境变量设置。 当前租户trantor的默认数据源可以在data_source_config表中找到,每一个租户都会有一个默认数据源,默认数据源的配置来源于DS环境变量中的数据源配置,默认数据源的dataSourceKey为trantor_default,或者由以下SQL获取:

select * from data_source_config where projectName = 'trantor' and isDefault = 1;

2.1.2 从DS元信息库中获取当前租户下所有模块

select * from module where projectName = 'trantor' and isDeleted = 0;

name即为module名称

2.1.3 建立当前已有模块和默认数据源映射关系

从2.1.1和2.1.2分别获取到默认数据源id和当前已有租户后,初始化映射关系:比如有Order , Product 两个模块,对应的默认数据源id为1

INSERT INTO
`data_source_mapping` (
`projectName`,
`moduleName`,
`dataSourceId`,
`dataSourceType`,
`status`
)
VALUES
(
'trantor',
'Order',
'1',
'MySQL',
'SUCCESS'
),
(
'trantor',
'Product',
'1',
'MySQL',
'SUCCESS'
)
;

2.2 更改MetaStore元信息表,开启当前环境垂直分库功能

表: meta_store_management__environment 对应环境的 字段: databaseShardingEnabled 值: 更改为true 改完之后不需要重启MS服务

2.3 交付控制台添加数据源

需要提前创建好各个模块的分库 交付控制台->运行环境->数据库->数据库配置 新增数据库

2.4 数据和表结构迁移 (从当前流程开始,需要全部停机,避免迁移过程中会有数据变化)

准备好分库后,需要手动把需要垂直分库的模块对应的数据和表结构迁移到对应的分库中。 比如: 需要将订单(Order)模块和商品模块(Product)分别迁移order_db和product_db中,则需要从当前默认业务库中把当前所有订单模块(Order)对应的表和数据迁移到order_db中,将商品模块(Product)对于的表和数据迁移到product_db中。

数据迁移方案: 数据迁移方案有很多,相关操作人可以自由决定,我们列举一个基于navicat的数据迁移方案:

  1. 在navicate上点击Tools->Data Transfer,选择对应的数据库,点击next。 数据迁移1

  2. 选择对应需要迁移的表,传输模式选择Auto(默认情况下过滤模块开头对应表就行)。 数据迁移2

  3. 开始迁移。 数据迁移3

2.5 修改模块和数据源映射关系

2.4流程中迁移完数据后,需要在DS元信息中修改模块与数据源的映射关系。 按照4.4的例子比如: 重新建立Order模块与数据源的映射关系,Product模块与数据源的映射关系 从data_source_config中获取Order模块和Product模块分别对应的数据源信息, 假设Order对应的垂直分库数据源id为2, Product对应的垂直分库数据源id为3, 更新data_souce_mapping表,

update
`data_source_mapping`
set `dataSourceId` = 2
where
`projectName` = 'trantor' and `moduleName` = 'Order' and `dataSourceType` = 'MYSQL';
update
`data_source_mapping`
set `dataSourceId` = 3
where
`projectName` = 'trantor' and `moduleName` = 'Product' and `dataSourceType` = 'MYSQL';

2.6 上述流程完成后重启DS服务