达梦技术社区:https://eco.dameng.com
一、DM数据集群
01| DM集群概述
DM数据库体系中的集群:
- DSC:共享存储,对标RAC
- DW:数据守护,主从模式
- MPP :大规模并行处理,完全对等无共享式集群,个人理解类似MongoDB的分片集群,对标分布式集群
1. DM的集群简介
DM集群,基于redo日志实现,不同集群采用不用的redo归档类型
- DM数据守护:即双机热备
- 本地归档、实时归档、异步归档
- 读写分离集群
- 本地归档,即时归档
- MPP主备集群
- 本地归档、实时归档
回顾DM归档类型:
- 本地归档:归档地为locla
- 实时归档:redo先通过MAL系统发送到其他节点,在收到ACK后执行本地归档
- 即时归档:先执行本地归档,在通过MAL发送给其他节点,在备机重放完成后,返回ACK
- 异步归档:定时归档或基于时间间隔,触发归档线程进行归档
主库将redo传输到备库后,备库接收redo并用apply 线程在备库进行重放,从而实现备库与主库的数据同步
2. 数据守护datawatch
数据守护(双机热备)核心思想:监控数据库状态,获取主备数据同步情况
常见的双机热备方案:
- 基于HA软件+ 共享数据
- 使用共享存储存放数据,数据可供两个服务器访问
- 应用:oracle rac、Window Server操作系统自带的集群故障转移
- 使用共享存储存放数据,数据可供两个服务器访问
- 基于redo日志|相当于MySQL中的binlog传输
- 主备各有自己的数据,利用日志的传输重放达到数据一致的目的
- 应用:DM data watch、Oracle data guard
- 主备各有自己的数据,利用日志的传输重放达到数据一致的目的
3. DM数据库集群节点模式
DM数据库在集群和非集群状态下,有三种数据库模式
02| DM 数据守护dmwatch
1. 故障切换
守护进程故障切换:
- 自动切换:
- 故障发生时,确认监视器(dmmonitor)选择一个备库提升为主库对外提供服务;
- 实现故障自动切换,必须配置且仅能配置一个dmmonitor确认监视器
- 手动切换
- 故障发生,备库提供只读服务,用户可手动提升一个备库作为主库;
- 故障发生,备库提供只读服务,用户可手动提升一个备库作为主库;
2. 数据守护进程的控制文件
- dmwatcher.ctl
- MPP、Realtime、Timely 类型的守护进程都必须配置dmwatcher.ctl文件(守护3.0以下)
- 作用:
- 记录系统守护系统运行过程中,守护进程组内主库变迁历史信息
- 记录数据库模式的变化过程
- 判断主库是否能加入当前主备集群
- 判断系统是否出现分裂
- 降低用户使用数据守护的复杂度
- 提供一些更加使用、强大的功能特性
在无法正常open的情况下,可以用 **open force**
命令,强制open 主库
在主库故障,但备库不满足接管条件时,可以使用**takeover force**
命令,及时恢复数据库服务
3. 监视器
监视器的作用:
- 监视数据守护状态
- 状态信息确认(配置为故障自动切换的确认监视器的情况下)
- 管理数据守护状态
- 发起故障自动接管命令
- 监视器类型
- 监控模式(dmmonitor.ini: MON_DW_CONFIRM=0)–除确认监视器外其他节点配置为0
- 确认模式(dmmonitor.ini: MON_DW_CONFIRM=1)–只有确认监视器才配置为1
- 区别:确认监视器除了具备监控模式监视器所有功能外,还具有状态确认和自动接管两个功能。
03| 读写分离集群
读写分离最多配置8个即时备库
适用场景:读远大于写事务
读写分离系统事务特征:
- 纯读操作的事务全部在备机执行。
- 纯写操作的事务全部在主机执行。
- 既有读又有写的事务,从写事务开始全部在主机执行。此类事务遵循以下原则:
- 读操作尽量放在写操作之前,利用备机的可读特点来分摊系统压力。
- 在业务允许条件下,尽可能拆分为纯读和纯写事务。
- 写操作后尽量不要有读操作,避免压力集中在主机,影响性能。
04| 主备集群MPP
适用场景:写压力比读压力相对较小,通过增加备机分担读压力
05| 对比读写分离和主备集群
读写分离集群与主备集群的主要区别:
- 主备集群模式是高性能模式,读写分离集群默认是一致性模式
- 归档方式不同: realtime/timely
- 应用访问连接串不同,dm_svc.conf文件配置内容不同
# 以下为主备集群配置
TIME_ZONE=(+8:00)
LANGUAGE=(en)
DM_DW=(192.168.1.21:5236,192.168.1.23:5236)
LOGIN_MODE=(1)
[DM_DW]
LOGIN_MODE=(1)
SWITCH_TIME=2000
SWITCH_INTERVAL=10
# 以下为读写分离集群配置
TIME_ZONE=(+8:00)
LANGUAGE=(cn)
RWC1=(172.16.1.1:5236,172.16.1.2:5236)
[RWC1]
LOGIN_MODE=(1)
RW_SEPARATE=(1) # 读写分离模式
RW_PERCENT=(25) # 配置读写比例
SWITCH_TIME=(300)
SWITCH_INTERVAL=(200)
# 以下为主备集群应用连接串配置
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://DW1</URL>
# 以下为读写分离集群应用连接串配置
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://RWC1</URL>
或<URL>jdbc:dm://192.168.0.206:5236?rwSeparate=1&rwPercent=10</URL>
06| 主备数据同步原理
主库的RLOG_PKG日志通过实时归档机制发送到备库后,备库将最新收到的RLOG_PKG 保存在内存中,不马上启动重演,这个 RLOG_PKG 我们称之为 KEEP_PKG。
引入 KEEP_PKG 的主要目的是,避免下述场景中,主库故障重启后不必要的主备切换,减少用户干预。
场景说明(实时主备或 MPP 主备):
- 1.用户登录主库 A 执行
CREATE TABLE TX(C1 INT);
INSERT INTO TX VALUES(1);
COMMIT;
其中 COMMIT 操作将触发实时归档,发送 RLOG_PKG 到备库 B。
- 2.备库 B 收到 RLOG_PKG,响应主库 A,并启动日志重演。
- 3.主库 A 在 RLOG_PKG 写入联机日志文件之前故障。
- 4.主库 A 重新启动后,由于 RLOG_PKG 没有写入联机日志文件,之前插入 TX 表的数据丢失;但此时备库 B 已经重演日志成功,TX 表中已经插入一行数据。
上述场景中,主备库数据不再保持一致,必须将备库 B 切换为主库,并重新从 B 同步 数据到 A。如果配置的是手动切换模式,则必须要有用户干预,进行备库接管后,才能恢复 数据库服务。
引入 KEEP_PKG 后,备库 B 收到主库 A 发送的 RLOG_PKG,并不会马上启动日志重演, 主库 A 重启后,守护进程 A 检测到备库 B 存在 KEEP_PKG,通知备库 B 丢弃 KEEP_PKG 后, 直接 Open 主库 A,就可以继续提供数据库服务。并且,这些操作是由守护进程自动完成, 不需要用户干预。
如果备库自动接管、或者用户发起备库接管命令,那么备库的 KEEP_PKG 将会启动重演,不管主库是否已经将 KEEP_PKG 对应的 Redo 日志写入联机日志文件中,备库接管时 的 APPLY_LSN 一定是大于等于主库的FILE_LSN。当故障主库重启后,仍然可以作为备库, 自动重新加入数据守护系统。
备库 KEEP_PKG 日志重演的时机包括:
- 1. 备库收到新的 RLOG_PKG
备库收到新的 RLOG_PKG 时,会将当前保存的 KEEP_PKG 日志重演,并将新收到的
RLOG_PKG 再次放入 KEEP_PKG 中。
- 2. 收到主库的重演命令
主库会定时将 FILE_LSN 等信息发送到备库,当主库 FILE_LSN 等于备库 SLSN 时, 表明主库已经将 KEEP_PKG 对应的 Redo 日志写入联机日志文件中,此时备库会启动 KEEP_PKG 的日志重演。
- 3. 备库切换为新主库
在监视器执行 SWITCHOVER 或 TAKEOVER 命令,或者确认监视器通知备库自动接管时, 备库会在切换为 PRIMARY 模式之前,启动 KEEP_PKG 的日志重演。
即时归档在 RLOG_PKG 写入主库联机 Redo 日志文件后,再发送 RLOG_PKG 到备库,
因此即时备库没有 KEEP_PKG。
07| 实时归档和即时归档的两种模式
- 高性能模式
- dmarch.ini中ARCH_WAIT_APPLY=0
- 备库收到RLOG_PKG后,直接给主库返回ACK
- 备库与主库同步存在一定的延时,不能严格保证事务一致性
- 事务一致模式
- dmarch.ini中ARCH_WAIT_APPLY=1
- 备库收到RLOG_PKG后,将其在备库重演完成后,给主库返回ACK
- 注意:即时归档模式中,rlog_pkg先在主库归档后才传递给备库
实时归档默认是高性能模式
即时归档的读写分离集群默认模式是事务一致模式
任意一个备库的实时归档/即时归档失败(即使其他备库归档成功了),主库都会切换为 Suspend 状态。
高性能模式示意图:
08| 归档日志中的MAGIC
在DM数据库中,在归档日志中记录了几个MAGIC号
- PMN_MAGIC:在数据库初始化时生成,整个主备集群中PMN_MAGIC是一致的(这就是主备集群的备库必须由主库进行数据恢复的原因)
- DB_MAGIC:集群中的各个节点的实例的DB_MAGIC是唯一的(在rman进行recover时,通过update magic进行更新)
- RSC_MAGIC:标识归档日志源库的DB_MAGIC
**达梦技术社区:https://eco.dameng.com
**åå