一、什么是实时主备
实时主备系统由主库、实时备库、守护进程和监视器组成。通过部署实时主备系统,可 以及时检测并处理各种硬件故障、数据库实例异常,确保持续提供数据库服务。
二、主要功能
1. 实时数据同步
主备库通过实时归档完成数据同步,实时归档要求主库将 RLOG_PKG 发送到备库后,再将 RLOG_PKG 写入本地联机 Redo 日志文件。但要注意的是,备库确认收到主库发送的Redo 日志,并不保证备库已经完成重演这些 Redo 日志,因此主备库之间的数据同步存在一定的时间差。
2. 主备库切换
主备库正常运行过程中,可以通过监视器的 Switchover 命令,一键完成主备库角色
转换。主备库切换功能可以确保在软、硬件升级,或系统维护时,提供不间断的数据库服务。
3. 自动故障处理
备库故障,不影响主库正常提供数据库服务,守护进程自动通知主库修改实时归档为
Invalid 状态,将实时备库失效。
4. 自动数据同步
备库故障恢复后,守护进程自动通知主库发送归档 Redo 日志,重新进行主备库数据同步。并在历史数据同步后,修改主库的实时归档状态为 Valid,恢复实时备库功能。备库接管后,原主库故障恢复,守护进程自动修改原主库的模式为 Standby,并重新作为备库加入主备系统。
5. 备库接管
主库发生故障后,可以通过监视器的 Takeover 命令,将备库切换为主库,继续对外
提供服务。如果配置为自动切换模式,确认监视器可以自动检测主库故障,并通知备库接管,这个过程不需要人工干预。
三、实时主备部署
1、部署环境
系统:centos7
CPU架构:x86_64
虚拟机软件:virtualbox
虚拟机: 192.168.43.31(主库)
192.168.43.44(备库)
192.168.43.31(监视器)
电脑内存不够用了,我就把监视器放在主库上了,生产中还是需要放在第三台服务器的;
2、安装数据库
单库安装,可以看我写过的一个安装过程
数据库的安装目录:/dm8
实例目录:/dm8/dmrw
3、初始化实例
初始化实例:(主备库各执行一次)
./dminit path=/dm8 db_name=dmrw page_size=32
使用dminit初始化的实例,需要先前台起一次数据库服务,服务正常退出即可
./dmserver /dm8/dmrw/dm.ini
4、主库进行脱机备份,备库还原与恢复
主库备份:
./dmrman ctlstmt="backup database '/dm8/dmrw/dm.ini' backupset '/dm8/bakfull'
"
主库备份发送到备库
scp -r /dm8/bakfull/ 192.168.43.44:/dm8
备库进行主库备份的还原和恢复以及db_magic更新
./dmrman ctlstmt="restore database '/dm8/dmrw/dm.ini' from backupset '/dm8/bakfull/'"
./dmrman ctlstmt="recover database '/dm8/dmrw/dm.ini' from backupset '/dm8/bakfull/'"
./dmrman ctlstmt="recover database '/dm8/dmrw/dm.ini' update db_magic"
5、配置主库
1)修改实例的dm.ini文件参数
INSTANCE_NAME = dmrw1
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
2)创建并配置归档文件dmarch.ini(实例所在目录)
[ARCHIVE_TIMELYE]
ARCH_TYPE = REALTIME#实时归档类型
ARCH_DEST = dmrw2 #实时归档目标实例名(主库侧填写备库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
3)配置MAL系统配置文件dmmal.ini
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = dmrw1 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.43.31 #MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.43.31 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
[MAL_INST2]
MAL_INST_NAME = dmrw2 #与 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = 192.168.43.44 # MAL 系统监听 TCP 内部网络 IP
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.43.44 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #与 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例对应的守护进程监听 TCP 端口
MAL_INST_DW_PORT = 33141
4)配置守护进程文件dmwatcher.ini
[GRP_RW]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值
INST_INI = /dm8/dm.ini #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
 
#要求dmmal.ini和dmwatcher.ini文件主备库一致,所以直接发送到备库即可
scp dmmal.ini dmwatcher.ini 192.168.43.44:/dm8/dmrw
5)以mount方式启动数据库
./dmserver /dm8/dm.ini mount
新终端使用disql工具连接数据库
./disql SYSDBA/SYSDBA
修改主库的oguid:sp_set_oguid(453331);
修改主库模式为primary:alter database primary;
6)启动守护进程
./dmwatcher /dm8/dmrw/dmwatcher.ini
数据库会自动从mount转换成open状态;
 
6、配置备库
1)修改实例的dm.ini文件参数
INSTANCE_NAME = dmrw2
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
2)创建并配置归档文件dmarch.ini(实例所在目录)
[ARCHIVE_TIMELY]
ARCH_TYPE = REALTIME#实时归档类型
ARCH_DEST = dmrw1 #实时归档目标实例名(备库侧填写主库实例名)
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dm8/arch #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 MB,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 10240 #单位 MB,0 表示无限制,范围 1024~4294967294 MB
3)查看主库发过来的文件:dmmal.ini和dmwatcher.ini
4)以mount方式启动数据库
./dmserver /dm8/dm.ini mount
新终端使用disql工具连接数据库
./disql SYSDBA/SYSDBA
修改备库的oguid:sp_set_oguid(453331);
修改备库模式为standby:alter database standby;
5)启动守护进程
./dmwatcher /dm8/dmrw/dmwatcher.ini
数据库会自动从mount转换成open状态;
7、监视器配置
这里我把监视起放在了主库上,生产中不要这样哦;
在安装目录下,新建监视器配置文件:dmmonitor.ini
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = /dm8/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP_RW]
MON_INST_OGUID = 453331 #组 GRP_RW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_RW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.43.31:52141
MON_DW_IP = 192.168.43.44:52141
启动监视器:
./dmmonitor /dm8/dmmonitor.ini
用show查看两个实例的情况:

8、注册服务
验证配置没有问题后,把前台起的服务注册一下:
使用root用户,到安装目录的script/root下
守护进程:
./dm_service_installer.sh -t dmwatcher -p dmrw -watcher_ini/dm/dmrw/dmwatcher.ini
数据库服务进程:
./dm_service_installer.sh -t dmserver -p dmrw -dm_ini /dm8/dmrw/dm.ini
监视器进程:在192.168.43.31上注册
./dm_service_installer.sh -t dmmonitor -p confirm -monitor_ini /dm8/dmmonitor.ini
看完上面的部署过程会发现,实时主备和读写分离很多都是相似的,不同的地方在于归档方式;
 
更多资讯请上达梦技术社区了解: https://eco.dameng.com