Skip to content

数据库集群配置

**本文引用的文件** - [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)

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

引言

本文件面向数据库管理员,提供 DeviceMate 项目的 PostgreSQL 集群化部署与运维指导。内容涵盖主从复制架构、读写分离、高可用与故障切换、备份策略、性能优化等关键主题,并结合代码库中现有的 DDL 定义与动态数据源适配能力,给出可落地的配置建议与操作步骤。

项目结构

DeviceMate 的数据库层由三部分组成:

  • 核心业务库:设备、仓储、工作流等业务表
  • 动态数据源适配层:支持多租户与多数据库类型路由
  • 业务服务侧 MyBatis 拦截器配置:按模块精细化控制读写路由

图表来源

章节来源

核心组件

  • 动态数据源适配层:根据租户名选择目标数据源,支持 MySQL、DB2、PostgreSQL 的分支执行路径。
  • 业务服务拦截器:通过正则匹配与白/黑名单控制,将查询或更新操作路由到不同数据源。
  • DDL 定义:设备、仓储、工作流三类业务表结构,包含序列、索引与注释,体现数据模型与约束。

章节来源

架构总览

DeviceMate 的数据库访问采用“动态数据源 + 多租户 + 读写分离”的组合方案:

  • 主库负责写入与强一致读
  • 从库承担只读查询,降低主库压力
  • 通过拦截器与适配层实现透明路由
  • 借助 DDL 中的序列与索引,保障并发与一致性

图表来源

详细组件分析

主从复制与同步策略

  • 复制方式:建议采用物理复制(如 WAL 流复制)或逻辑复制(如基于发布订阅),确保主从延迟可控。
  • 同步级别:可配置同步类型(异步/半同步/强同步)以平衡一致性与性能。
  • 复制槽:为主库保留复制槽,避免 WAL 被提前回收导致追赶失败。
  • 序列与索引:DDL 中大量使用序列与索引,需在主从切换后统一管理序列偏移与索引重建策略。

图表来源

章节来源

读写分离与连接池

  • 路由策略:通过拦截器的正则匹配与白/黑名单,将查询路由至从库,更新路由至主库。
  • 连接池:建议为每个数据源配置独立连接池,设置合理的最大连接数、空闲超时与获取超时。
  • 事务边界:跨服务事务需确保在同一数据源上执行;非事务读请求可自由分发至从库。

图表来源

章节来源

故障切换与高可用

  • VIP/浮动 IP:为数据库集群配置 VIP,结合 Keepalived 或 Pacemaker 实现主库故障时的自动漂移。
  • 健康检查:定期探测主库与从库的连通性、复制延迟与响应时间,异常时触发切换。
  • 自动切换:当主库不可用且满足仲裁条件(多数从库存活、复制延迟达标)时,自动提升从库为主库。
  • 读写分离降级:切换期间将所有流量切回主库,待新主库稳定后再逐步恢复从库读流量。

[此图为概念性流程图,无需图表来源]

备份策略

  • 全量备份:周期性对主库进行逻辑导出或物理快照,确保可恢复到任意时间点。
  • 增量备份:基于 WAL 归档,每日增量,结合校验与传输加密。
  • 恢复流程:验证备份完整性 -> 恢复到临时实例 -> 校验数据一致性 -> 切换到新主库。
  • 复制链路保护:归档目录容量与保留策略需与主库保持一致,避免复制中断。

[此图为概念性流程图,无需图表来源]

性能优化

  • 内存设置:合理分配 shared_buffers、work_mem、effective_cache_size,结合业务峰值并发评估。
  • 连接数限制:设置 max_connections 与连接池上限,避免资源争用。
  • 查询优化:利用 DDL 中的索引与唯一约束,避免全表扫描;对高频查询建立复合索引。
  • 统计信息:定期更新统计信息,帮助优化器选择最优执行计划。

章节来源

依赖关系分析

  • 业务服务依赖动态数据源适配层,后者根据租户名解析真实数据源。
  • 业务服务通过 MyBatis 拦截器控制 SQL 路由,实现读写分离。
  • DDL 定义了序列、索引与注释,为并发与一致性提供基础。

图表来源

章节来源

性能考虑

  • 并发与锁:DDL 中的序列用于并发安全的自增,应避免在高并发场景下重置或回拨。
  • 索引策略:针对高频查询字段建立索引,减少排序与过滤成本。
  • 连接池参数:maxActive、maxIdle、maxWaitTime 等需结合业务峰值与延迟目标调优。
  • 统计信息:定期 ANALYZE/VACUUM,保持查询计划最优。

章节来源

故障排查指南

  • 连接失败:检查 DNS/网络、防火墙与证书;确认连接池参数与主从可达性。
  • 复制延迟:检查磁盘 IO、WAL 归档与网络带宽;必要时增加从库或优化慢查询。
  • 事务冲突:排查热点行锁与长事务,缩短事务窗口,避免跨服务长事务。
  • 路由错误:核对拦截器规则与租户映射,确保查询/更新正确分流。

章节来源

结论

DeviceMate 的数据库架构以动态数据源适配为核心,结合 MyBatis 拦截器实现读写分离,并通过 DDL 定义支撑高并发与一致性需求。建议在生产环境中完善主从复制、健康检查与自动故障转移机制,配套严格的备份与恢复流程,持续优化连接池与查询性能,确保系统稳定与高效运行。

附录