Skip to content

DM 数据同步机制

数据同步的重要性

  • 数据保护:防止数据丢失,实现数据冗余
  • 高可用性:主库故障时可切换到备库,保证业务连续性
  • 读写分离:主库处理写请求,备库处理读请求,提高系统整体性能
  • 负载均衡:将读请求分发到多个备库,均衡系统负载
  • 灾备解决方案:实现异地数据同步,提高系统抗灾能力

数据同步的核心要素

  • 日志生成:主库生成重做日志
  • 日志传输:将日志从主库传输到备库
  • 日志应用:备库应用日志,更新数据
  • 数据一致性:保证主备数据的一致性
  • 故障检测:检测主库或备库故障
  • 自动切换:主库故障时自动切换到备库

数据同步原理

1. 日志生成机制

DM数据库的日志生成机制基于预写日志(WAL,Write-Ahead Logging)原则,即先写日志,再写数据文件。

日志类型

  • 重做日志(Redo Log):记录数据修改操作,用于恢复数据库
  • 归档日志(Archive Log):重做日志的归档文件,用于数据同步和恢复
  • 事务日志:记录事务的开始、提交、回滚等信息

日志生成过程

  1. 用户发起写操作
  2. 数据库引擎生成重做日志
  3. 将日志写入日志缓冲区
  4. 日志缓冲区定期或在事务提交时刷新到磁盘
  5. 生成归档日志(如果启用归档模式)

2. 日志传输机制

日志传输是数据同步的关键环节,负责将主库的日志传输到备库。

传输方式

  • 实时传输:主库实时将日志传输到备库
  • 批量传输:主库批量将日志传输到备库
  • 归档传输:主库生成归档日志后,将归档日志传输到备库

传输协议

  • TCP/IP协议:基于网络的日志传输
  • 共享存储:基于共享存储的日志访问(如DMDSC)
  • MAL系统:DM数据库内部的通信系统

传输流程

  1. 主库生成日志
  2. 日志通过MAL系统传输到备库
  3. 备库接收日志并写入本地日志缓冲区
  4. 备库将日志写入本地归档日志文件

3. 日志应用机制

日志应用是指备库将接收到的日志应用到本地数据库,实现数据同步。

应用模式

  • 实时应用:备库实时应用接收到的日志
  • 延迟应用:备库延迟一段时间后应用日志
  • 手动应用:手动触发备库应用日志

应用流程

  1. 备库从本地归档日志文件读取日志
  2. 解析日志内容,提取数据修改操作
  3. 将修改操作应用到备库数据文件
  4. 更新备库的数据字典和索引
  5. 记录应用进度

4. 数据一致性保证

DM数据库通过多种机制保证主备数据的一致性:

  • 预写日志机制:确保日志先于数据写入磁盘
  • 日志序列号(LSN):通过LSN跟踪日志生成和应用进度
  • 检查点机制:定期将内存中的修改刷新到磁盘
  • 锁机制:保证并发访问的数据一致性
  • 事务完整性:确保事务在主备库上的原子性

同步模式

DM数据库支持多种同步模式,适应不同的业务需求和网络环境。

1. 异步同步(ASYNC)

特点

  • 主库写入日志后立即返回,不等待备库确认
  • 备库异步接收和应用日志
  • 主备数据可能存在延迟
  • 系统性能最高
  • 数据一致性要求较低

适用场景

  • 网络带宽有限或延迟较高的场景
  • 对数据一致性要求不高的场景
  • 追求最高性能的场景

工作流程

  1. 主库执行事务并生成日志
  2. 主库将日志写入本地日志文件
  3. 主库向客户端返回事务成功
  4. 主库异步将日志传输到备库
  5. 备库接收并应用日志

2. 半同步同步(SEMISYNC)

特点

  • 主库写入日志后,等待至少一个备库确认
  • 备库接收日志并写入本地归档日志后确认
  • 主备数据延迟较小
  • 系统性能适中
  • 数据一致性要求较高

适用场景

  • 对数据一致性要求较高的场景
  • 网络条件较好的场景
  • 核心业务系统

工作流程

  1. 主库执行事务并生成日志
  2. 主库将日志写入本地日志文件
  3. 主库将日志传输到备库
  4. 备库接收日志并写入本地归档日志
  5. 备库向主库发送确认
  6. 主库收到至少一个备库确认后,向客户端返回事务成功

3. 全同步同步(FULLSYNC)

特点

  • 主库写入日志后,等待所有备库确认
  • 备库接收日志并写入本地归档日志后确认
  • 主备数据几乎实时一致
  • 系统性能最低
  • 数据一致性要求极高

适用场景

  • 对数据一致性要求极高的场景
  • 金融、证券等核心业务系统
  • 网络条件良好的场景

工作流程

  1. 主库执行事务并生成日志
  2. 主库将日志写入本地日志文件
  3. 主库将日志传输到所有备库
  4. 所有备库接收日志并写入本地归档日志
  5. 所有备库向主库发送确认
  6. 主库收到所有备库确认后,向客户端返回事务成功

4. 异步实时同步(ASYNCREAL)

特点

  • 主库实时发送日志,备库实时应用
  • 主库不等待备库确认
  • 主备数据延迟较小
  • 系统性能较高
  • 兼顾性能和数据一致性

适用场景

  • 需要实时数据同步的场景
  • 对系统性能要求较高的场景
  • 大多数核心业务系统

工作流程

  1. 主库执行事务并生成日志
  2. 主库将日志写入本地日志文件
  3. 主库向客户端返回事务成功
  4. 主库实时将日志传输到备库
  5. 备库实时接收并应用日志

5. 同步模式比较

同步模式数据一致性系统性能网络要求适用场景
异步同步网络条件差,对一致性要求低
半同步同步网络条件较好,对一致性要求较高
全同步同步网络条件好,对一致性要求极高
异步实时同步中高网络条件较好,兼顾性能和一致性

数据同步架构

1. 主备架构

主备架构是最基本的数据同步架构,由一个主库和一个或多个备库组成。

架构图

特点

  • 架构简单,易部署和管理
  • 提供基本的高可用性和数据保护
  • 支持读写分离
  • 主库故障时可切换到备库

2. 级联架构

级联架构是指备库同时作为其他备库的主库,形成级联关系。

架构图

特点

  • 减少主库的网络压力
  • 适用于远距离数据同步
  • 提高系统的扩展性
  • 可构建复杂的灾备体系

3. 双向架构

双向架构是指两个库互相作为对方的备库,形成双向同步关系。

架构图

特点

  • 适用于双中心部署
  • 实现快速切换和负载均衡
  • 提高系统的可用性和抗灾能力
  • 需注意避免循环复制

数据同步配置

1. 主库配置

归档模式配置

sql
-- 启用归档模式
ALTER DATABASE ARCHIVELOG;

-- 配置归档路径
ALTER SYSTEM SET ARCH_DEST = '/dm/arch';

日志传输配置

ini
-- dm.ini配置
DW_TYPE = PRIMARY
DW_MODE = ASYNC
DW_ERROR_TIME = 30
OGUID = 453331

-- dmarch.ini配置
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0

[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = STANDBY_DB
ARCH_INCOMING_PATH = /dm/arch_remote
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0

2. 备库配置

备库角色配置

sql
-- 设置备库角色
ALTER DATABASE STANDBY;

日志应用配置

ini
-- dm.ini配置
DW_TYPE = STANDBY
DW_MODE = ASYNC
DW_ERROR_TIME = 30
OGUID = 453331

-- dmarch.ini配置
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0

[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = PRIMARY_DB
ARCH_INCOMING_PATH = /dm/arch_remote
ARCH_FILE_SIZE = 128
ARCH_SPACE_LIMIT = 0

3. MAL系统配置

ini
-- dmmal.ini配置
[MAL_INST1]
MAL_INST_NAME = PRIMARY_DB
MAL_HOST = 192.168.1.101
MAL_PORT = 61141
MAL_INST_HOST = 192.168.0.101
MAL_INST_PORT = 5236
MAL_DW_PORT = 52141

[MAL_INST2]
MAL_INST_NAME = STANDBY_DB
MAL_HOST = 192.168.1.102
MAL_PORT = 61142
MAL_INST_HOST = 192.168.0.102
MAL_INST_PORT = 5236
MAL_DW_PORT = 52142

数据同步监控

1. 监控视图

DM数据库提供了丰富的监控视图,用于监控数据同步状态。

核心监控视图

  • V$DATAWATCH:查看DataWatch状态
  • V$ARCH_FILE:查看归档文件信息
  • V$ARCH_SEND_STATUS:查看日志发送状态
  • V$ARCH_APPLY_STATUS:查看日志应用状态
  • V$MAL_INS:查看MAL系统状态
  • V$INSTANCE:查看实例状态

监控示例

sql
-- 查看DataWatch状态
SELECT * FROM V$DATAWATCH;

-- 查看日志发送状态
SELECT * FROM V$ARCH_SEND_STATUS;

-- 查看日志应用状态
SELECT * FROM V$ARCH_APPLY_STATUS;

-- 查看MAL系统状态
SELECT * FROM V$MAL_INS;

2. 监控指标

关键监控指标

  • 日志发送延迟:主库发送日志到备库的延迟
  • 日志应用延迟:备库应用日志的延迟
  • 日志发送速率:主库发送日志的速率
  • 日志应用速率:备库应用日志的速率
  • 日志积压量:备库未应用的日志量
  • 同步状态:主备同步状态

监控方法

  • 使用DM管理工具监控
  • 使用SQL查询监控视图
  • 使用第三方监控工具(如Zabbix、Prometheus)
  • 配置告警,及时发现同步异常

数据同步常见问题

1. 主备数据不一致

原因

  • 网络故障导致日志传输中断
  • 备库应用日志失败
  • 主库或备库参数配置错误
  • 硬件故障导致日志损坏

解决方法

  • 检查网络连接,修复网络故障
  • 查看备库日志,分析应用失败原因
  • 检查主备参数配置,确保一致
  • 使用主库备份恢复备库
  • 使用ALTER DATABASE STANDBY REFRESH命令刷新备库

2. 日志传输延迟

原因

  • 网络带宽不足
  • 网络延迟过高
  • 主库负载过高
  • 备库接收或应用日志速度慢

解决方法

  • 增加网络带宽
  • 优化网络配置,减少延迟
  • 优化主库性能,减少日志生成量
  • 优化备库性能,提高日志应用速度
  • 调整同步模式,如从全同步改为半同步

3. 备库应用日志失败

原因

  • 日志文件损坏
  • 备库数据文件损坏
  • 主备版本不一致
  • 备库参数配置错误

解决方法

  • 检查日志文件完整性
  • 检查备库数据文件完整性
  • 确保主备版本一致
  • 检查备库参数配置
  • 重新初始化备库

4. 主库无法发送日志

原因

  • MAL系统配置错误
  • 备库未启动
  • 备库无法访问
  • 主库参数配置错误

解决方法

  • 检查MAL系统配置
  • 确保备库已启动
  • 检查备库网络连接
  • 检查主库参数配置
  • 重启MAL系统或数据库实例

数据同步最佳实践

1. 部署最佳实践

  • 网络配置:使用独立网卡分离业务网络和同步网络
  • 硬件配置:主备库配置建议相同或相近
  • 存储配置:使用RAID 10等冗余存储方案
  • 同步模式:根据业务需求选择合适的同步模式
  • 监控配置:配置完善的监控和告警

2. 配置最佳实践

  • 参数优化:根据系统负载优化同步参数
  • 日志配置:配置合理的日志大小和归档策略
  • MAL配置:优化MAL系统配置,提高通信效率
  • OGUID配置:确保集群OGUID唯一

3. 维护最佳实践

  • 定期备份:定期备份主库和备库
  • 定期监控:监控同步状态和性能
  • 定期测试:测试故障切换和数据一致性
  • 定期清理:清理过期的归档日志
  • 文档管理:维护详细的同步配置文档

4. 性能优化

  • SQL优化:优化SQL语句,减少日志生成量
  • 索引优化:合理设计索引,提高查询性能
  • 缓存优化:优化缓冲区大小,提高缓存命中率
  • I/O优化:优化存储参数,提高I/O性能
  • 网络优化:优化网络配置,提高日志同步效率

常见问题(FAQ)

Q1: 如何选择合适的同步模式?

A1: 选择同步模式需要考虑以下因素:

  • 业务对数据一致性的要求

  • 网络带宽和延迟

  • 系统性能要求

  • 可用性要求

  • 异步同步:适用于网络条件差,对一致性要求低的场景

  • 半同步同步:适用于网络条件较好,对一致性要求较高的场景

  • 全同步同步:适用于网络条件好,对一致性要求极高的场景

  • 异步实时同步:适用于兼顾性能和一致性的场景

Q2: 如何处理主备数据不一致?

A2: 处理主备数据不一致的方法:

  • 检查数据不一致的原因
  • 使用主库的备份恢复备库
  • 使用ALTER DATABASE STANDBY REFRESH命令刷新备库
  • 重新初始化备库
  • 检查并修复网络或硬件故障

Q3: 如何监控数据同步状态?

A3: 监控数据同步状态的方法:

  • 使用DM管理工具的监控功能
  • 查询V$DATAWATCH、V$ARCH_SEND_STATUS等监控视图
  • 使用第三方监控工具
  • 配置告警,及时发现同步异常

Q4: 如何优化数据同步性能?

A4: 优化数据同步性能的方法:

  • 优化SQL语句,减少日志生成量
  • 优化网络配置,提高日志传输效率
  • 优化备库性能,提高日志应用速度
  • 调整同步模式,平衡性能和一致性
  • 配置合理的日志大小和归档策略

Q5: 数据同步和数据备份有什么区别?

A5: 数据同步和数据备份的区别:

  • 数据同步:实时或准实时将数据从主库复制到备库,用于高可用和读写分离
  • 数据备份:定期将数据备份到其他存储介质,用于数据恢复
  • 数据同步提供业务连续性,数据备份提供数据保护
  • 数据同步是实时的,数据备份是定期的

版本差异说明

版本主要变化
DM 7支持基本的数据同步功能,最多支持一主一备
DM 8增强了数据同步功能,支持一主多备、级联备库等多种部署模式
DM 8.1优化了数据同步性能和可靠性,支持更多的同步模式和故障检测机制

在配置和使用数据同步时,需要注意以下几点:

  • 选择合适的同步模式和部署架构
  • 配置合理的参数和网络
  • 定期监控同步状态和性能
  • 制定完善的故障处理和恢复策略
  • 定期进行测试和演练

通过合理的配置和维护,可以充分发挥数据同步的优势,提高系统的可用性和数据保护能力,为业务提供可靠的数据服务。