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请求时,首先会拿到当前操作涉及到的模块名称,检查是否存在跨库操作,然后根据模块名称获取当前模块对应的数据源去执行对应的操作。