Appearance
数据库集群配置
**本文引用的文件** - [device.sql](file://docs/ddl/device.sql) - [store.sql](file://docs/ddl/store.sql) - [workflow.sql](file://docs/ddl/workflow.sql) - [DataBaseAdapter.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/adapter/DataBaseAdapter.java) - [DataBaseAdapterService.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/adapter/DataBaseAdapterService.java) - [application.yml(设备服务)](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-device/lemes-service-dm-device-server/src/main/resources/application.yml) - [application.yml(仓储服务)](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-store/lemes-service-dm-store-server/src/main/resources/application.yml) - [application.yml(工作流服务)](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-workflow/lemes-service-dm-workflow-server/src/main/resources/application.yml)目录
引言
本文件面向数据库管理员,提供 DeviceMate 项目的 PostgreSQL 集群化部署与运维指导。内容涵盖主从复制架构、读写分离、高可用与故障切换、备份策略、性能优化等关键主题,并结合代码库中现有的 DDL 定义与动态数据源适配能力,给出可落地的配置建议与操作步骤。
项目结构
DeviceMate 的数据库层由三部分组成:
- 核心业务库:设备、仓储、工作流等业务表
- 动态数据源适配层:支持多租户与多数据库类型路由
- 业务服务侧 MyBatis 拦截器配置:按模块精细化控制读写路由
图表来源
章节来源
核心组件
- 动态数据源适配层:根据租户名选择目标数据源,支持 MySQL、DB2、PostgreSQL 的分支执行路径。
- 业务服务拦截器:通过正则匹配与白/黑名单控制,将查询或更新操作路由到不同数据源。
- DDL 定义:设备、仓储、工作流三类业务表结构,包含序列、索引与注释,体现数据模型与约束。
章节来源
- DataBaseAdapter.java:11-15
- DataBaseAdapterService.java:20-47
- application.yml(设备服务):1-33
- application.yml(仓储服务):1-28
- application.yml(工作流服务):1-13
架构总览
DeviceMate 的数据库访问采用“动态数据源 + 多租户 + 读写分离”的组合方案:
- 主库负责写入与强一致读
- 从库承担只读查询,降低主库压力
- 通过拦截器与适配层实现透明路由
- 借助 DDL 中的序列与索引,保障并发与一致性
图表来源
- DataBaseAdapterService.java:27-46
- application.yml(设备服务):4-32
- application.yml(仓储服务):4-27
- application.yml(工作流服务):4-12
详细组件分析
主从复制与同步策略
- 复制方式:建议采用物理复制(如 WAL 流复制)或逻辑复制(如基于发布订阅),确保主从延迟可控。
- 同步级别:可配置同步类型(异步/半同步/强同步)以平衡一致性与性能。
- 复制槽:为主库保留复制槽,避免 WAL 被提前回收导致追赶失败。
- 序列与索引:DDL 中大量使用序列与索引,需在主从切换后统一管理序列偏移与索引重建策略。
图表来源
章节来源
读写分离与连接池
- 路由策略:通过拦截器的正则匹配与白/黑名单,将查询路由至从库,更新路由至主库。
- 连接池:建议为每个数据源配置独立连接池,设置合理的最大连接数、空闲超时与获取超时。
- 事务边界:跨服务事务需确保在同一数据源上执行;非事务读请求可自由分发至从库。
图表来源
章节来源
故障切换与高可用
- VIP/浮动 IP:为数据库集群配置 VIP,结合 Keepalived 或 Pacemaker 实现主库故障时的自动漂移。
- 健康检查:定期探测主库与从库的连通性、复制延迟与响应时间,异常时触发切换。
- 自动切换:当主库不可用且满足仲裁条件(多数从库存活、复制延迟达标)时,自动提升从库为主库。
- 读写分离降级:切换期间将所有流量切回主库,待新主库稳定后再逐步恢复从库读流量。
[此图为概念性流程图,无需图表来源]
备份策略
- 全量备份:周期性对主库进行逻辑导出或物理快照,确保可恢复到任意时间点。
- 增量备份:基于 WAL 归档,每日增量,结合校验与传输加密。
- 恢复流程:验证备份完整性 -> 恢复到临时实例 -> 校验数据一致性 -> 切换到新主库。
- 复制链路保护:归档目录容量与保留策略需与主库保持一致,避免复制中断。
[此图为概念性流程图,无需图表来源]
性能优化
- 内存设置:合理分配 shared_buffers、work_mem、effective_cache_size,结合业务峰值并发评估。
- 连接数限制:设置 max_connections 与连接池上限,避免资源争用。
- 查询优化:利用 DDL 中的索引与唯一约束,避免全表扫描;对高频查询建立复合索引。
- 统计信息:定期更新统计信息,帮助优化器选择最优执行计划。
章节来源
依赖关系分析
- 业务服务依赖动态数据源适配层,后者根据租户名解析真实数据源。
- 业务服务通过 MyBatis 拦截器控制 SQL 路由,实现读写分离。
- DDL 定义了序列、索引与注释,为并发与一致性提供基础。
图表来源
- DataBaseAdapterService.java:27-46
- application.yml(设备服务):4-32
- application.yml(仓储服务):4-27
- application.yml(工作流服务):4-12
- device.sql:203-250
- store.sql:203-250
- workflow.sql:1-70
章节来源
- DataBaseAdapter.java:11-15
- DataBaseAdapterService.java:20-47
- application.yml(设备服务):1-33
- application.yml(仓储服务):1-28
- application.yml(工作流服务):1-13
性能考虑
- 并发与锁:DDL 中的序列用于并发安全的自增,应避免在高并发场景下重置或回拨。
- 索引策略:针对高频查询字段建立索引,减少排序与过滤成本。
- 连接池参数:maxActive、maxIdle、maxWaitTime 等需结合业务峰值与延迟目标调优。
- 统计信息:定期 ANALYZE/VACUUM,保持查询计划最优。
章节来源
故障排查指南
- 连接失败:检查 DNS/网络、防火墙与证书;确认连接池参数与主从可达性。
- 复制延迟:检查磁盘 IO、WAL 归档与网络带宽;必要时增加从库或优化慢查询。
- 事务冲突:排查热点行锁与长事务,缩短事务窗口,避免跨服务长事务。
- 路由错误:核对拦截器规则与租户映射,确保查询/更新正确分流。
章节来源
- DataBaseAdapterService.java:27-46
- application.yml(设备服务):4-32
- application.yml(仓储服务):4-27
- application.yml(工作流服务):4-12
结论
DeviceMate 的数据库架构以动态数据源适配为核心,结合 MyBatis 拦截器实现读写分离,并通过 DDL 定义支撑高并发与一致性需求。建议在生产环境中完善主从复制、健康检查与自动故障转移机制,配套严格的备份与恢复流程,持续优化连接池与查询性能,确保系统稳定与高效运行。
附录
- DDL 文件清单
- 设备业务表:device.sql:203-250
- 仓储业务表:store.sql:203-250
- 工作流业务表:workflow.sql:1-70
- 适配层接口与实现
- 业务服务拦截器配置