DM主备守护集群分为实时主备、读写分离集群、MPP主备集群。基于redo日志实现,不同的集群采用不同的redo日志归档类型。
实时主备:
实时主备系统由主库、实时备库、守护进程和监视器组成。通过部署实时主备系统,可以及时检测并处理各种硬件故障、数据库实例异常,确保持续提供数据库服务。
实时主备由一个主库以及一个或者多个配置了实时(Realtime)归档的备库组成,其主要目的是保障数据库可用性,提高数据安全性。实时主备系统中,主库提供完整的数据库功能,备库提供只读服务。主库修改数据产生的Redo日志,通过实时归档机制,在写入联机Redo日志文件之前发送到备库,实时备库通过重演Redo日志与主库保持数据同步。当主库出现故障时,备库在将所有Redo日志重演结束后,就可以切换为主库对外提供数据库服务。
主要功能
- 实时数据同步
- 主备库切换
- 自动故障处理
- 自动数据同步
- 备库接管
- 备库强制接管
- 读写分离访问
归档流程:
实时归档是实时主备数据同步的基础,其流程如下图所示:
主库生成联机 Redo 日志,当触发日志写文件操作后,日志线程先将 RLOG_PKG 发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合法则返回错误信息,合法则作为 KEEP_PKG 保留在内存中,原有 KEEP_PKG 的 Redo 日志加入 Apply 任务队列进行 Redo 日志重演,并响应主库日志接收成功。
MPP主备:
MPP主备就是在MPP集群的基础上,为每一个MPP节点配置一套实时主备系统,这些实时主备系统一起构成了MPP主备系统。我们将一个MPP节点对应的主备系统称为一个数据守护组(Group),MPP主备系统中各个数据守护组保持相对独立,当某个MPP主节点出现故 障时,在其对应的数据守护组内挑选一个备库切换为主库后,就可以确保整个MPP集群的正常使用。
MPP 主备的主要目的是为 DM MPP 集群提供数据可靠性保障,备库只做数据容灾、备份,MPP 备库并不是 MPP 集群的一部分,只是某个 MPP 节点(主库)的镜像。MPP 备库不参与 MPP 操作,与其他 MPP 备库之间也没有任何关系,MPP 备库只能以单节点方式提供只读服务,但不提供全局的 MPP 只读服务。
MPP 主备系统中,一个守护进程 dmwatcher 可以监控、管理多个守护进程组的数据库实例。一般来说,一台物理机器上,可以部署 1 个 MPP 节点的主库和多个其他 MPP 节点的备库,充分利用硬件资源,节省投资。
Global 守护类型的 MPP 主备库需要在 dm.ini 中配置 MPP_INI 为 1,并且 MPP 主备库的本地数据文件目录下都需要有 dmmpp.ctl 文件,如果 Global 守护类型的备库没有上述配置,守护进程和监视器无法正常使用,守护进程会切换到 Shutdown 状态,监视器上无法正常执行命令,会打印配置不一致的提示信息。
下图以三个 MPP 节点,每个节点配备两个备库为例,说明 MPP 主备系统的结构。
读写分离集群:
读写分离集群由一个主库以及一个或者多个配置了即时(Timely)归档或实时 (Realtime)归档的备库组成,其主要目标是在保障数据库可用性基础上,实现读、写操作的自动分离,进一步提升数据库的业务支撑能力。读写分离集群通过配置事务一致模式保证主、备库数据一致性,并配合达梦数据库管理系统的各种接口(JDBC、DPI等),将只读操作自动分流到备库,有效降低主库的负载,提升系统吞吐量。
读写分离集群提供数据保护、容灾等数据守护基本功能,还具有读写操作自动分离、负载均衡等特性。读写分离集群最多可以配置 8 个即时备库或 8 个实时备库,提供数据同步、备库故障自动处理、故障恢复自动数据同步等功能,也支持自动故障切换和手动故障切换两种守护模式。
归档流程:
读写分离集群可以配置为即时归档,也可以配置为实时归档,这两种配置方式仅仅是归档流程上有差别,读写分离集群的特性仍然是一致的。即时归档流程与实时归档流程存在一定差异。
实现原理:
实现读写分离集群的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错” 这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,对应用透明。
读写分离集群数据库连接创建流程:
1. 用户发起数据库连接请求。
2. 接口(JDBC、DPI 等)根据服务名配置(在 dm_svc.conf 中进行配置)登录主库。
3. 主库挑选一个有效即时备库的 IP/Port 返回给接口。
4. 接口根据返回的备库 IP 和 Port 信息,向备库发起一个连接请求。
5. 备库返回连接成功信息。
6. 接口响应用户数据库连接创建成功。
接口在备库上创建的连接是读写分离集群自动创建的;对用户而言,就是在主库上创建了一个数据库连接。下图以配置了两个备库的读写集群为例,说明了读写分离集群的连接创建流程。
读写分离集群语句分发流程:
1. 接口收到用户的请求。
2. 接口优先将 SQL 发送到备库执行。
3. 备库执行并返回执行结果。如果接口收到的是备库执行成功消息,则转到第 6 步,
如果接口收到的是备库执行失败消息,则转到第 4 步。
4. 重新将执行失败的 SQL 发送到主库执行。只要第 3 步中的 SQL 在备库执行失败,
则同一个事务后续的所有操作(包括只读操作)都会直接发送到主库执行。
5. 主库执行并返回执行结果给接口。一旦主库上执行的写事务提交,则下次继续从第
1 步开始执行。
6. 接口响应用户并将执行结果返回给用户。
高性能与事务一致性
高性能:备机收到重演日志,加到重演线程队列后响应主机,主机不需要等待备机重演完成后在响应主库。
事务一致性:备机收到重演日志,重演完成后响应主机,主机需要等待备机重演完成后响应主机。
数据守护集群的高性能与事务一致性是由归档参数ARCH_WAIT_APPLY参数控制的。
备库收到Redo日志后,是否需要重演完成后再响应主库。0表示收到马上响应(高性能模式),1表示重演完成后响应 (事务一致模式)。配置为即时归档的读写分离集群时,默
认值为1;配置为实时归档的读写分离集群时,默认值为0。
实时归档的读写分离
实时主备也可以配置接口的读写分离属性进行访问,实现读写分离功能特性。实时读写分离同样也支持事务一致模式和高性能模式,由配置文件 dmarch.ini 中的ARCH_WAIT_APPLY 配置项来确定,1 表示事务一致模式,0 表示高性能模式,实时读写分离下,默认值为 0,即采用高性能模式。这个参数在实时归档中的用法和在即时归档中是相同的,只是默认值不同。
和即时归档不同的是,实时归档先发送日志到备库,然后再写入本地联机日志,和即时归档相比,实时归档的读写分离可以有效避免备库自动接管后老主库的分裂,在对读写分离集群的可用性要求比较高的情况下,可以采用这种配置方式。
达梦在线服务平台:https://eco.dameng.com