redo-log(重做日志)
是一组物理文件,和数据文件同等重要。数据库中添加、删除、修改对象,或者改变数据,数据库都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。 重做日志文件以 log 为扩展名。redo-log 多用于数据库的备份和恢复。数据先写入 redo-log,后写入数据文件,如果数据库异常断电,数据库缓存区中的数据页没有写入数据文件中,在下次数据库启动后,可以通过 redo-log 里面的数据,恢复数据到断电前的状态。
archivelog(归档日志)
redo-log 日志是循环使用的,当 redo-log 被写满后,数据库会根据检查点覆盖之前的内容。为了保证数据库备份恢复操作正常执行,需要启动归档模式,redo-log 中的数据复制到归档日志中。归档日志文件以归档时间命名,扩展名也是 log。生产环境必须开归档模式。
日志缓冲区
日志缓冲区是用于存放 redo 信息的内存缓冲区。系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将 redo 信息放置到日志缓冲区中。修改 dm.ini 中 RLOG_POOL_SIZE 参数来设置日志缓冲区大小。
数据库参数优化脚本-AutoParaAdj.sql 有根据服务器内存对此参数大小进行调整。
DM 数据守护(Data Watch)是一种集成化的高可用、高性能数据库解决方案,数据守护可以配置成实时主备集群、读写分离集群,基本不受数据规模的影响,只需数秒时间就可以将备库切换为主库对外提供数据库服务。
DM 数据守护(Data Watch)的实现原理非常简单:将主库(生产库)产生的 Redo 日志传输到备库,备库接收并重新应用 Redo 日志,从而实现备库与主库的数据同步。
DM 数据守护系统主要由主库、备库、Redo-log、Redo 日志传输、Redo 日志重演、守护进程(dmwatcher)、监视器(dmmonitor)组成。
主库:全集群只能有一个主库,主库是用来直接支撑应用系统。必须是 primary 模式
备库:全集群至少有一个备库,提供只读数据库服务的实例。必须是 standby 模式
Redo 日志: 记录物理数据页内容变化的日志。
Redo 日志传输:主备库之间的 Redo 日志传输,以日志包 RLOG_PKG 为单位,方向是主库通过 MAL 系统发送 Redo 日志到备库。数据守护类型的区别,就是主库日志包 RLOG_PKG 的发送时机,以及备库收到 Redo 日志后的处理策略。
Redo 日志重演:备库收到主库发送的 Redo 日志后,在物理数据页上,重新修改数据的过程。Redo 日志重演由专门的 Redo 日志重演服务完成,重演服务严格按照 Redo 日志产生的先后顺序,解析 Redo 日志、并且重演过程中备库会生成自身的 Redo 日志写入联机日志文件。
守护进程:(dmwatcher)是数据守护系统的核心工具,监控数据库实例的运行状态和主备库数据同步情况,在出现故障时启动各种处理预案。守护进程是各种消息的中转站,接收数据库实例、其他守护进程、以及监视器发送的各种消息;同时,守护进程也会将收到的数据库实例消息转发给其他守护进程和监视器。守护进程必须和被守护的数据库实例部署在同一台机器上。
监视器:(dmmonitor)用来监控守护系统内守护进程、数据库实例信息,执行用户输
入命令、监控实例故障、实现自动切换等。监视器一般配置在数据库实例和守护进程以外的
机器上。要单独部署,不能和集群中数据库部署在一台服务器。监视器支持两种运行模式:监控模式和确认模式(1 套集群环境只能配置 1 个确认模式)。
DM 守护方案是根据归档类型分类
- 基于实时归档(REALTIME)
- 基于即时归档(TIMELY)
- 基于异步归档(ASYNC)
本地归档,任何本地归档(LOCAL ARCHIVE) 写入 redo 日志到本地归档文件,在 redo 日志写入日志文件后触发。
- 实时归档(REALTIME)
主库在 Redo 日志(RLOG_PKG)写入 redo-log 文件前,将 Redo 日志发送到备库。实时归档也可以支持读写分离集群(访问)。根据备库重演 Redo 日志和响应主库时机的不同,实时归档也分为两种模式:事务一致模式和高性能模式 默认:高性能模式
- 即时归档(TIMELY)
主库在 Redo 日志(RLOG_PKG)写入 redo-log 文件后,将 Redo 日志发送到备库。根据备库重演 Redo 日志和响应主库时机的不同,即时归档分为两种模式:事务一致模式和高性能模式。默认:事务一致性
dmarch.ini 中的 ARCH_WAIT_APPLY 配置项 1=事务一致模式,0=高性能模式
- 基于异步归档(ASYNC)的异步主备。
由主、备库上配置的定时器触发,过 MAL 系统将 Redo 日志发送到异步备库。
两种模式
事务一致模式:备库收到主库发送的 Redo 日志,并重演完成后再响应主库。事务一致模式下,同一个事务的 SELECt 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。
高性能模式:备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。
事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。应该根据实际情况,选择合适的模式。
dmarch.ini 中的 ARCH_WAIT_APPLY 配置项 1=事务一致模式,0 = 高性能模式
主备集群:实时归档+高性能
读写分离集群:即时归档+事务一致(目前不推荐)
Redo日志 --(RLOG_PKG)
达梦数据库批量保存物理事务产生的 Redo 日志的数据单元,以物理事务 PTX 为单位保存日志,一个日志包内可连续保存一个或多个 PTX。物理事务提交时将 Redo 日志写入到日志包中。
KEEP_PKG
主库的RLOG_PKG日志通过实时归档机制发送到备库后,备库将最新收到的RLOG_PKG保存在内存中,不马上启动重演,这个 RLOG_PKG 我们称之为 KEEP_PKG。而即时归档不存在这种机制。
实时归档如果没有KEEP_PKG,备库收到后马上进行了重演,而主库在准备写入联机日志文件前故障,则会导致备库的数据比主库的还要多,造成数据不一致。这样备库就必须是主库。
备库 KEEP_PKG 日志重演的时机包括:
- 备库收到新的RLOG_PKG,会将当前保存的 KEEP_PKG 日志重演,并将新收到的RLOG_PKG 再次放入 KEEP_PKG 中。
- 收到主库的重演命令
主库已经将 KEEP_PKG 对应的 Redo 日志写入redo log文件中,此时备库会启动 KEEP_PKG 的日志重演。 - 备库切换为新主库
在监视器执行 SWITCHOVER 或 TAKEOVER 命令,或者确认监视器通知备库自动接管时,备库会在切换为 PRIMARY 模式之前,启动 KEEP_PKG 的日志重演。
| 参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
| REDOS_BUF_SIZE | 1024 | 静态 | 待重演日志堆积的内存限制, 堆积的日志缓冲区占用内存超过此限制,则新的日志将会被延迟加入重演队列, 等待重演释放部分内存后再加入。 以 M 为单位, 有效值范围(0~65536),默认 1024。 0 表示无内存限制。REDOS_BUF_SIZE 和 REDOS_BUF_NUM 同时起作用, 只要达到一个条件即会触发延迟处理 |
| REDOS_BUF_NUM | 4096 | 静态 | 待重演日志缓冲区允许堆积的数目限制, 超过限制则新的日志将会被延迟加入重演队列, 等待堆积数减少后再加入。 以个数为单位, 有效值范围(0~9999), 默认 4096。 0 表示无限制。REDOS_BUF_SIZE 和 REDOS_BUF_NUM 同时起作用,只要达到一个条件即会触发延迟处理 |
| REDOS_MAX_DELAY | 180 | 静态 | 备库重演日志缓冲区的时间限制,超过此限制则认为重演异常,服务器自动宕机,防止日志堆积、 主库不能及时响应用户请求。 以秒(S)为单位, 有效值范围(0~7200) 。 0 表示无重做时间限制 |
实时归档
主库生成联机 Redo 日志,当触发日志写文件操作后,日志线程先将 RLOG_PKG 发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合法则返回错误信息,合法则作为 KEEP_PKG 保留在内存中,原有 KEEP_PKG 的 Redo 日志加入 Apply 任务队列进行 Redo 日志重演,并响应主库日志接收成功。
即时归档
主库生成联机 Redo 日志,当触发日志写文件操作后,写入联机日志后,将 RLOG_PKG 发送到备库,备库接收后进行合法性校验(包括日志是否连续、备库状态是否 Open 等),不合法则返回错误信息,合法后,判断模式,是否响应主库,RLOG_PKG直接加入到 Apply 任务系统,启动 Redo 日志重演。如果是事务一致性模式,最后重演完响应主库。
- 基本和单机环境一致,操作系统参数调整一致。
- 集群内所有操作系统的数据盘是否独立分区
- 集群内所有操作系统的目录挂载是否一致
- 集群内所有操作系统是否开启ntp时间同步(调整时关闭数据库)
- 集群内所有操作系统用户(dmdba),user id与group id 是否一致
- 集群内所有服务器是否在同一局域网内,注意网络防火墙策略
- 备份目录是否共享目录(nfs)
- 监视器(dmmonitor)有条件一定要独立安装在不同于数据库实例的服务器
OGUID在同一个局域网下多套数据库服务是不能一样的
- 数据库配置文件 dm.ini
- MAL 配置文件 dmmal.ini (集群内一致)
- Redo 日志归档配置文件 dmarch.ini
- 守护进程配置文件 dmwatcher.ini (集群内基本一致)
- 确认监视器配置文件 dmmonitor_auto.ini
- 普通监视器配置文件 dmmonitor_manual.ini(可以每一台服务器都部署)
除了2个监视器配置文件,其他文件推荐放在 /dmdbms/data/DAMENG/下面
DAMENG :是dminit时以DB_NAME参数值创建的文件夹
- 实例、备份数据
- 修改dm.ini
- 修改dmarch.ini
- 修改dmwatcher.ini
- 修改dmmal.ini
- 拷贝实例目录
- 注册服务
- 修改dm.ini
- 修改dmarch.ini
- 修改dmwatcher.ini
- 修改dmmal.ini
- 恢复数据库
- 注册服务
- 确认监视器配置文件
- 普通监视器配置文件
- 注册服务
- 设置OGUID
- 启动服务
服务器A-主库–实例、备份数据
--初始化实例 [dmdba@~]$ /opt/dmdbms/bin/dminit PATH=/opt/dmdbms/data/ INSTANCE_NAME=RWC1_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 --启动服务 [dmdba@~]$ /opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini --开启归档 [dmdba@~]$ /opt/dmdbms/bin/disql SYSDBA/SYSDBA@172.16.1.1:5236 SQL> ALTER DATABASE MOUNT; SQL> ALTER DATABASE ARCHIVELOG; SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/opt/dmdbms/data/DAMENG/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200'; SQL> ALTER DATABASE OPEN; --备份数据 SQL> BACKUP DATABASE BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'; 热备冷备都可以 --关闭数据库
服务器A-主库----dm.ini
| 配置项 | 参数值 | 配置含义 |
|---|---|---|
| INSTANCE_NAME | 自定义 | 数据库实例名(长度不超过 16 个字符),与 dmmal.ini 中的MAL_INST_NAME 对应。配置数据守护系统时,应该保持INSTANCE_NAME 是全局唯一的。 |
| PORT_NUM | 5236 | 数据库实例监听端口(范围 1024~65534),与 dmmal.ini 中 的 MAL_INST_PORT 对应 |
| DW_INACTIVE_INTERVAL | 60 | 接收守护进程消息超时时间。(默认) |
| ALTER_MODE_STATUS | 0 | 是否允许手工修改数据库的模式和状态,1 表示允许,0 表示不允许,此参数可动态修改,默认为 1,数据守护环境下建议配置为 0,避免用户手工干预。 |
| ENABLE_OFFLINE_TS | 2 | 是否允许 offline 表空间,1 表示允许,0 表示不允许,2 表示禁止备库,其他放开。守护环境下建议配置为 2。 |
| MAL_INI | 1 | 系统配置开关,0 表示不启用 MAL 系统,1 表示启用 MAL系统。 |
| ARCH_INI | 1 | Redo 日志归档配置开关,0 表示不启动 Redo 日志归档,1 表示启用 Redo 日志归档。 |
| RLOG_SEND_APPLY_MON | 64 | 统计最近64次日志发送消息。(默认) |
服务器A-主库----dmarch.ini
服务器A
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/ #本地归档存放路径 ARCH_FILE_SIZE = 1024 #单个归档大小,单位MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位MB 业务要求修改 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = RWC1_02 #实时归档目标实例名
服务器B
ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/ ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 51200 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = RWC1_01
*注意限制归档空间大小,防止磁盘撑爆,根据实际环境更改
服务器A-主库----dmwatcher.ini
服务器A
[GRWC1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 45331 #守护系统唯一OGUID值 INST_INI = /opt/dmdbms/data/DAMENG/dm.ini #dm.ini文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
服务器A-主库----dmmal.ini
服务器A
MAL_CHECK_INTERVAL = 10 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定MAL链路断开的时间 MAL_TEMP_PATH = /opt/dmdbms/data/malpath/ #临时文件目录 MAL_BUF_SIZE = 512 #单个MAL缓存大小,单位MB MAL_SYS_BUF_SIZE = 2048 #MAL总大小限制,单位MB MAL_COMPRESS_LEVEL = 0 #MAL消息压缩等级,0表示不压缩 [MAL_INST1] MAL_INST_NAME = RWC1_01 #实例名,和dm.ini的INSTANCE_NAME一致 MAL_HOST = 192.168.1.1 #MAL系统监听TCP连接的IP地址 MAL_PORT = 5336 #MAL系统监听TCP连接的端口 MAL_INST_HOST = 172.16.1.1 #实例的对外服务IP地址 MAL_INST_PORT = 5236 #实例对外服务端口,和dm.ini的PORT_NUM一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听TCP连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程TCP连接的端口 [MAL_INST2] MAL_INST_NAME = RWC1_02 MAL_HOST = 192.168.1.2 MAL_PORT = 5336 MAL_INST_HOST = 172.16.1.2 MAL_INST_PORT = 5236 MAL_DW_PORT = 5436 MAL_INST_DW_PORT = 5536
服务器A-主库–拷贝实例目录
-拷贝实例到B机器 [dmdba@~]$ scp -r /opt/dmdbms/data/DAMENG dmdba@192.168.1.2:/opt/dmdbms/data/
服务器A-主库–注册服务
使用root权限用户 /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p RWC1_01 -dm_ini /opt/dmdbms/data/DAMENG/dm.ini -m mount /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /opt/dmdbms/data/DAMENG/dmwatcher.ini
服务器A 准备完毕
服务器B-主库----dm.ini
| 配置项 | 参数值 | 配置含义 |
|---|---|---|
| INSTANCE_NAME | 自定义 | 数据库实例名(长度不超过 16 个字符),与 dmmal.ini 中的MAL_INST_NAME 对应。配置数据守护系统时,应该保持INSTANCE_NAME 是全局唯一的。 |
| PORT_NUM | 5236 | 数据库实例监听端口(范围 1024~65534),与 dmmal.ini 中 的 MAL_INST_PORT 对应 |
| DW_INACTIVE_INTERVAL | 60 | 接收守护进程消息超时时间。(默认) |
| ALTER_MODE_STATUS | 0 | 是否允许手工修改数据库的模式和状态,1 表示允许,0 表示不允许,此参数可动态修改,默认为 1,数据守护环境下建议配置为 0,避免用户手工干预。 |
| ENABLE_OFFLINE_TS | 2 | 是否允许 offline 表空间,1 表示允许,0 表示不允许,2 表示禁止备库,其他放开。守护环境下建议配置为 2。 |
| MAL_INI | 1 | 系统配置开关,0 表示不启用 MAL 系统,1 表示启用 MAL系统。 |
| ARCH_INI | 1 | Redo 日志归档配置开关,0 表示不启动 Redo 日志归档,1 表示启用 Redo 日志归档。 |
| RLOG_SEND_APPLY_MON | 64 | 统计最近64次日志发送消息。(默认) |
服务器B-主库----dmarch.ini
服务器A
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL #本地归档类型 ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/ #本地归档存放路径 ARCH_FILE_SIZE = 1024 #单个归档大小,单位MB ARCH_SPACE_LIMIT = 51200 #归档上限,单位MB 业务要求修改 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = RWC1_02 #实时归档目标实例名
服务器B
ARCH_WAIT_APPLY = 0 [ARCHIVE_LOCAL] ARCH_TYPE = LOCAL ARCH_DEST = /opt/dmdbms/data/DAMENG/arch/ ARCH_FILE_SIZE = 1024 ARCH_SPACE_LIMIT = 51200 [ARCHIVE_REALTIME1] ARCH_TYPE = REALTIME ARCH_DEST = RWC1_01
*注意限制归档空间大小,防止磁盘撑爆,根据实际环境更改
服务器B-主库----dmwatcher.ini 主备基本一样
服务器A
[GRWC1] DW_TYPE = GLOBAL #全局守护类型 DW_MODE = MANUAL #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 20 #远程守护进程故障认定时间 INST_ERROR_TIME = 20 #本地实例故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_OGUID = 45331 #守护系统唯一OGUID值 INST_INI = /opt/dmdbms/data/DAMENG/dm.ini #dm.ini文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
服务器B-主库----dmmal.ini 主备基本一样
服务器B
MAL_CHECK_INTERVAL = 10 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 10 #判定MAL链路断开的时间 MAL_TEMP_PATH = /opt/dmdbms/data/malpath/ #临时文件目录 MAL_BUF_SIZE = 512 #单个MAL缓存大小,单位MB MAL_SYS_BUF_SIZE = 2048 #MAL总大小限制,单位MB MAL_COMPRESS_LEVEL = 0 #MAL消息压缩等级,0表示不压缩 [MAL_INST1] MAL_INST_NAME = RWC1_01 #实例名,和dm.ini的INSTANCE_NAME一致 MAL_HOST = 192.168.1.1 #MAL系统监听TCP连接的IP地址 MAL_PORT = 5336 #MAL系统监听TCP连接的端口 MAL_INST_HOST = 172.16.1.1 #实例的对外服务IP地址 MAL_INST_PORT = 5236 #实例对外服务端口,和dm.ini的PORT_NUM一致 MAL_DW_PORT = 5436 #实例对应的守护进程监听TCP连接的端口 MAL_INST_DW_PORT = 5536 #实例监听守护进程TCP连接的端口 [MAL_INST2] MAL_INST_NAME = RWC1_02 MAL_HOST = 192.168.1.2 MAL_PORT = 5336 MAL_INST_HOST = 172.16.1.2 MAL_INST_PORT = 5236 MAL_DW_PORT = 5436 MAL_INST_DW_PORT = 5536
服务器B-备库–注册服务
使用root权限用户 /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p RWC1_02 -dm_ini /opt/dmdbms/data/DAMENG/dm.ini -m mount /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /opt/dmdbms/data/DAMENG/dmwatcher.ini
服务器B-备库–恢复数据
[dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'" [dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'" [dmdba@~]$ /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' UPDATe DB_MAGIC"
服务器B 准备完毕
服务器C-监视器
- 非确认监视器配置文件 建议放在集群各节点的bin目录中
- 确认监视器配置文件 一定放在监视器所在服务器上面并注册后台自启服务。
监视器
MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切) MON_LOG_PATH = /opt/dmdbms/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔60s定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 512 #单个日志大小,单位MB MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位MB [GRWC1] MON_INST_OGUID = 45331 #组GRWC1的唯一OGUID值 MON_DW_IP = 192.168.1.1:5436 #IP对应MAL_HOST,PORT对应MAL_DW_PORT MON_DW_IP = 192.168.1.2:5436
用root用户注册
/opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /opt/dmdbms/bin/dmmonitor.ini
启动数据库并修改参数
服务器A-主库启动到mount状态
/opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini mount ./disql SYSDBA/SYSDBA SQL>sp_set_para_value(1,'ALTER_MODE_STATUS',1); SQL>sp_set_oguid(453331); SQL>alter database primary; SQL>sp_set_para_value(1,'ALTER_MODE_STATUS',0);
停库
服务器B-备库启动到mount状态
/opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/dm.ini mount ./disql SYSDBA/SYSDBA SQL>sp_set_para_value(1,'ALTER_MODE_STATUS',1); SQL>sp_set_oguid(45331); SQL>alter database standby; SQL>sp_set_para_value(1,'ALTER_MODE_STATUS',0);
停库
启动主备库数据库服务
服务器A-主库
/opt/dmdbms/bin/DmServiceRWC1_01 start
服务器B-备库
/opt/dmdbms/bin/DmServiceRWC1_02 start
启动后,主备库状态应该是mount状态,只有所有DmWatcherServiceWatcher启动后,才会变成open状态
启动主备库守护服务
服务器A-主库
/opt/dmdbms/bin/DmWatcherServiceWatcher start
服务器B-备库
/opt/dmdbms/bin/DmWatcherServiceWatcher start
启动确认监视器
/opt/dmdbms/bin/DmMonitorServiceMonitor start
非确认模式前台启动方法
/opt/dmdbms/bin/dmmonitor /dm/dmdbms/bin/dmmonitor_manual.ini
监视器常用命令
监视器常用命令-show
可以看到数据库状态、守护进程状态,FLSN,CLSN等
如果主库CLSN差异比较大,多输入几次show命令后,主库和备库之间的CLSN差值还是越来越大,就说明主备库存在延时,如果这种情况,保业务的话,可以先停备库。
也可以使用 select cur_lsn from v$rlog; 查看主备库的lsn。比较主备库的差异。
监视器常用命令-choose switchover/choose takeover
使用前,必须先输入login 命令 登录
choose takeover GDW1_01 takeover GDW1_01.DW1_01B choose switchover grp1 switchover grp1.PROD01
监视器常用命令-show arch send info [group_name.]db_name
显示源库到指定备库的日志发送信息,以及源库的控制守护进程本地到指定备库的Recovery 间隔信息。也支持异步备库的查询。
SEND CODE:主库到指定备库的日志发送结果,
Code 小于 0 表示发送失败,
等于 0 表示发送成功,
等于 100 表示实际未发送。
SEND DESC INFO:
主库到指定备库的日志发送结果描述信息。
集群关闭顺序
退出监视器
关闭备机的守护进程
关闭主机的守护进程
关闭主机实例
关闭备机实例
集群开启顺序
开启主机实例
开启备机实例
开启备机的守护进程
开启主机的守护进程
开启监视器
dm_svc.conf 是使用DM数据库时非常重要的配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。通过他可以实现DM各种集群的读写分离和均衡负载,它必须和接口/客户端工具(tomcat|was中间件)位于同一台机器上才能生效
初始 dm_svc.conf 文件由 DM 安装时自动生成。不同的平台生成目录有所不同注意需要访问的
通过服务名访问的用户对该文件需要有读权限。
1.32 位的 DM 安装在 Win32 操作平台下,此文件位于%SystemRoot%system32目录;
2.64 位的 DM 安装在 Win64 操作平台下,此文件位于%SystemRoot%system32目录;
3.32 位的 DM 安装在 Win64 操作平台下,此文件位于%SystemRoot%SysWOW64目录;
4.在 Linux 平台下,此文件位于/etc 目录;_svc.conf配置
1.修改dm_svc.conf内容
TIME_ZONE=(480) LANGUAGE=(cn) DMHA=(192.168.100.100:5236,192.168.100.101:5236)
#服务配置
[DMHA] SWITCH_TIMES=(3) SWITCH_INTERVAL=(1000) LOGIN_MODE=(1)
2.修改url连接串增加 jdbc:dm://DMHA
如下:
static String dname = "dm.jdbc.driver.DmDriver"; static String url = "jdbc:dm://DMHA";
以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区(服务配置区的相同配置项会覆盖全局配置区对应的配置项)。
LOGIN_MODE:指定优先登录的服务器模式。
0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;
1:只连接主库;
2:只连接备库;
3:优先连接 STANDBY 模式的库, PRIMARY 模式次之,最后选择 NORMAL 模式;
4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择STANDBY 模式 。
SWITCH_TIMES:以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围1~9223372036854775807,默认值为1,可以设置至少3次用来避免由于网卡的波动照成数据库连接测频繁切换。
WITCH_INTERVAL :在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数SWITCH_TIMES、EP_SELECTOR配合使用,EP_SELECTOR设置为0,等待SWITCH_INTERVAL后会切换尝试连接下一个服务,EP_SELECTOR设置为1,等待SWITCH_INTERVAL后会继续尝试连接该服务器,直到SWITCH_TIMES次再切换下一个服务器。
读写分离常见配置1.修改dm_svc.conf内容
TIME_ZONE=(480)
LANGUAGE=(cn)
DMRW=(192.168.100.100:5236,192.168.100.101:5236)
#服务配置
[DMRW]
LOGIN_MODE=(1)
RW_SEPARATE=(1)
RW_PERCENT=(30)
SWITCH_TIMES=(60)
SWITCH_INTERVAL=(1000)
2.修改url连接串增加 jdbc:dm://DMHA
如下:
static String dname = “dm.jdbc.driver.DmDriver”;
static String url = “jdbc:dm://DMHA”;
RW_SEPARATE:
是否启用读写分离。
0:不启用;
1:启用;
2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
RW_PERCENT
读写分离分发比例,有效值范围 0~100,及主库占所有事物数的比例。可以根据主备库的实际压力来设定。
测试
上面测试说明,只写一个主库IP,驱动也是可以实现读写分离
如果不能使用dm_svc.conf了。或者新语言暂时不能写多IP,可以考虑写VIP,利用 keepalived配置VIP
读写分离实现原理实现读写分离集群的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先
将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”
这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,
对应用透明。
读写分离集群数据库连接创建流程:
- 用户发起数据库连接请求。
- 接口(JDBC、DPI 等)根据服务名配置(在 dm_svc.conf 中进行配置)登录主库。
- 主库挑选一个有效即时备库的 IP/Port 返回给接口。
- 接口根据返回的备库 IP 和 Port 信息,向备库发起一个连接请求。
- 备库返回连接成功信息。
- 接口响应用户数据库连接创建成功。
*注意不要写成rwSeparate=(1)&rwPercent=(50) ,
要写成rwSeparate=1&rwPercent=50
这2个参数加上(),没有出现读写分离。
但是LOGIN_MODE=(1)和 LOGIN_MODE=1
都没有问题
写完后,要测试!!
如果权限不足,不能在/etc 或者 system32目录目录写dm_svc.conf. 可以写在其他目录,用 dmsvcconf 指定路径
感谢各位!
技术博客社区地址
https://eco.dameng.com



