跳转到内容

DS 垂直分库原理

DS元信息相关数据主要保存在DS元信息库(默认为AUTUMN库)下面,垂直分库数据源相关配置在data_source_config表中

表结构如下:

CREATE TABLE `data_source_config` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`projectName` varchar(64) DEFAULT NULL COMMENT '项目名',
`dataSourceKey` varchar(64) NOT NULL DEFAULT '' COMMENT '数据源标识',
`type` varchar(128) NOT NULL DEFAULT '' COMMENT '数据源类型',
`host` varchar(256) DEFAULT NULL COMMENT 'host',
`port` int DEFAULT NULL COMMENT '端口',
`schema` varchar(64) DEFAULT NULL COMMENT '数据库名称',
`username` varchar(64) DEFAULT NULL COMMENT '用户名',
`password` varchar(64) DEFAULT NULL COMMENT '密码',
`maxPoolSize` int DEFAULT NULL COMMENT '最大连接池数量',
`minPoolSize` int DEFAULT NULL COMMENT '最小连接池数量',
`isDefault` tinyint(1) DEFAULT '0' COMMENT '是否默认数据源',
`extra` json DEFAULT NULL COMMENT '扩展字段',
`createdAt` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updatedAt` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_project_name` (`projectName`),
KEY `idx_data_source_name` (`dataSourceKey`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

数据源和模块映射关系保存在data_source_mapping表中,

表结构如下:

CREATE TABLE `data_source_mapping` (
`id` int NOT NULL AUTO_INCREMENT,
`projectName` varchar(64) NOT NULL DEFAULT '' COMMENT '项目名',
`moduleName` varchar(64) NOT NULL DEFAULT '' COMMENT '模块名',
`dataSourceId` int NOT NULL COMMENT '数据源ID',
`dataSourceType` varchar(64) NOT NULL DEFAULT '' COMMENT '数据源类型',
`status` varchar(64) NOT NULL DEFAULT '' COMMENT '数据源状态 DEPLOYING:发布中 SUCCESS:成功',
`extra` json DEFAULT NULL COMMENT '扩展字段',
`createdAt` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updatedAt` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_project_name` (`projectName`),
KEY `idx_module_name` (`moduleName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  • 某个项目第一次deploy时,无论是否垂直分库,DS都会在data_source_config写入当前租户的默认数据源配置
  • DS会根据data_source_mapping表中是否存在记录判断当前租户是否开启垂直分库
  • 当每次deploy时MS会把当前待发布的模型和模块-数据源映射关系一起发给DS,DS会根据发过来的映射关系查找到相关数据库配置,创建数据源执行对应模块的DDL语句。
  • 考虑到,MS等一些内置模型无法配置映射关系,DS对没有配置数据源映射的模块使用默认数据源(DS环境变量中配置的数据源)。
  • 当DS收到DML请求时,首先会拿到当前操作涉及到的模块名称,检查是否存在跨库操作,然后根据模块名称获取当前模块对应的数据源去执行对应的操作。