达梦数据守护集群由主库、实时备库、守护进程和监视器组成。通过部署实时主备系统,可以及时检测并处理各种软硬件故障,确保持续提供数据库服务。
图1
上图节选自《DM8数据守护与读写分离集群V4.0.pdf》第三页。为便于自己的理解,我增加了绿色字体部分表示各端口。
IP规划
端口规划
与ORACLE那样DATAGUAID主备库之间传递log复用数据库的业务地址不同,达梦采用独特的内外网设计,提高了灵活性与安全性和诊断故障时的便利性。
搭建一主一备集群推荐三套独立服务器,其中主机和备机需两块网卡。测试环境最低配置两套主机,每台一块网卡。每台服务器内端口不能重复。
在搭建数据守护系统前,应注意系统中各实例使用的 DM 服务器版本应一致,同时还应注意各实例所在主机的操作系统版本、时区及时间设置都应一致,以免系统在运行时出现意想不到的错误。
本实验采用两套VirtualBox虚拟机,各4G内存。操作系统Linux kylinpr 4.19.90-24.4.v2101.ky10.x86_64。数据库DM V8。
图1中左边蓝色部分。
prmary模式,提供完整数据库服务的实例,一般来说主库是支撑应用系统的生产库。
主库可以是新初始化的数据库,也可以是正在生产、使用中的数据库。
达梦数据库有三种模式:NORMAL、PRIMARY、STANDBY。加入主备系统前的状态是NORMAL,加入主备系统需更改运行模式:
SQL>alter database primary;
修改前需要开启允许更改模式
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
修改后关闭
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
如果使用Huge表,在初始化库时需要将建库参数HUGE_WITH_DELTA和RLOG_GEN_FOR_HUGE都设置为1.
图1中右边蓝色部分。
standby模式,提供只读数据库服务的实例。备库除了用于容灾,也可提供备份和查询等服务。
备库需要新初始化一个新库,然后通过主库的备份还原而得,确保数据一致。
加入主备系统需要更改运行模式:
SQL>alter database standby;
修改前需要开启允许更改模式
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 1);
修改后关闭
SQL>SP_SET_PARA_VALUE(1, ‘ALTER_MODE_STATUS’, 0);
改后关闭
****注意不能使用分别初始化库或者直接拷贝数据文件的方法来直接配置数据守护
PERMANENT_MAGIC和DB_MAGIC是表示数据库唯一性的INTEGER类型值,在初始化后生成,并且PERMANENT_MAGIC一经生成永不改变。而DB_MAGIC每次从备份集还原后会生成新的值,以此区分备份源库和还原目标库。
如果分别初始化库,两节点的PERMANENT_MAGIC不一致,代表不是来自同一个“祖先”,它们之间没有血脉联系,不能加入同一个守护集群。
如果采用直接拷贝文件的方式搭建集群,两节点的PERMANENT_MAGIC一样,但DB_MAGIC也一样,则无法区分彼此。
以已经搭建好的一套实时主备系统为例:
主库
备库
从上图可见主库LIUSVR01和备库LIUSVR02处于open状态。PERMANENT_MAGIC一致,DB_MAGIC则各不相同。
图1中左侧和右测粉色组件
守护进程是达梦数据守护系统中不可或缺的核心部件,是数据库实例和监视器之间信息流转的桥梁。数据库实例向本地守护进程发送信息,接收本地守护进程的消息和命令;监视器接收守护进程的消息,并向守护进程发送命令;数据库实例与监视器之间没有直接的消息交互;守护进程解析并执行监视器发起的各种命令(Switchover/Takeover/Open force 等),并在必要时通知数据库实例执行相应的操作
图1中上边粉色组件
监视器是达梦数据守护系统的大脑。通过监视器,可以监控数据守护系统的运行情况,获取主备库状态、守护进程状态、以及主备库数据同步情况等信息。同时,监视器还提供了一系列命令来管理数据守护系统。通常独立部署在主备节点之外的服务器上,以避免产生误判。
MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM通过 MAL 系统实现 Redo 日志传输,以及其他一些节点间的消息通讯。
在配置数据守护集群时最低需要配置五个文件,dm.ini、dmmal.ini、dmarch.ini、dmwatcher.ini、dmmonitor.ini。
dm.ini是从单实例到各复杂结构所共有的,定义了达梦数据库的基础配置。
配置数据守护时需要修改dm.ini文件中的以下参数:
这里除了INSTANCE_NAME参数是根据不同节点来配置的,其他参数配置相同。
INSTANCE_NAME = LIUSVR01
#INSTANCE_NAME = LIUSVR02
RLOG_SEND_APPLY_MON = 64
#统计最近64次的日志发送信息
DW_INACTIVE_INTERVAL = 60
#接收守护进程消息超时时间
ALTER_MODE_STATUS = 0
#不允许以手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2
#不允许备库offline表空间
MAL_INI = 1
#打开MAL系统
ARCH_INI = 1
#打开归档配置
dmmal.ini是MAL系统的核心配置文件。数据守护系统中的内外网ip地址和各组件的监听端口号都在此进行定义。
各主备库的dmmal.ini配置必须完全一致。
其中:
MAL_INST_HOST是实例的对外服务ip。
MAL_INST_PORT等于dm.ini文件中的NUM_PORT,是实例的对外服务端口。应用系统通过MAL_INST_HOST + MAL_INST_PORT访问数据库。
MAL_HOST 是内网地址,守护进程间和监视器的信息交互以及实例间传递redo都通过该网络。
MAL_PORT是MAL监听端口,用于数据守护、DSC、MPP等环境中各节点实例之间MAL链路配置。实例间通过MAL_HOST + MAL_PORT建立链接传递redo。
MAL_DW_PORT是守护进程的监听端口。
是各实例守护进程之间,以及守护进程和监视器之间的通讯端口。其他守护进程或监视器使用MAL_HOST + MAL_DW_PORT创建与该实例守护进程的网络连接。
MAL_INST_DW_PORT是数据库实例监听守护进程的端口。守护进程通过MAL_HOST + MAL_INST_DW_PORT建立到本地实例的TCP连接。
dmarch.ini是归档配置文件。在两个主备节点的环境中,数据同步的ARCH_DEST互写对方的实例。当前是LIUSVR01,则对应的ARCH_DEST写LIUSVR02
当前是LIUSVR02,则对应的ARCH_DEST写LIUSVR01
dmwatcher.ini是守护进程配置文件,除了异步主备,其他类型的主备必须配置为全局守护类型。在两个节点都创建并添加以下内容:
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/data/LIUDB/dm.ini #dm.ini配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dm8/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阀值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阀值,默认关闭。
MON_DW_CONFIRM = 1 #确认监视器模式
#MON_DW_CONFIRM = 0#监控模式监视器
MON_LOG_PATH = /home/dmdba/dmdbms/data/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以IP:PORT的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 10.168.100.100:6000
MON_DW_IP = 10.168.100.101:6000
以已经搭建好的一套实时主备系统为例:
上图可见:6000是dmwatcher(守护进程)开启的,查看本次试验的配置列表可知,对应MAL_DW_PORT参数,代表守护进程的监听端口。除4236外,其他几个值均对应dmserver程序。MAL_INST_PORT是实例的对外监听,MAL_PORT是实例的对内端口(主要传输redo),MAL_INST_DW_PORT用于建立本地守护进程到数据库实例的信息连接。
从上图可见,红颜色线条标示dmmmonitor程序建立的到节点二6000端口(6000端口是dmwatcher的监听端口)的TCP连接。黄颜色标示出dmwatcher程序建立的到节点二6000端口的网络连接,说明守护进程之间互有通讯。绿色线条标示出dmmonitor程序建立的到本地节点6000端口的TCP连接;与之对应,蓝色线条标示出dmwatcher程序通过6000端口建立的到dmmmonitor的连接。
再看查看节点二
与之对应,红色线条标示出dmwatcher程序通过6000端口到节点一的TCP连接。黄颜色标示出本地dmwatcher程序通过6000端口到节点一的连接。另一侧的端口与上图一致。
由于条件所限,本实验将监视器部署到了节点一上。上面图标说明,各实例守护进程之间,监视器与守护进程间通过MAL_HOST+MAL_DW_PORT连接的网络链路互通消息。
从图表还可见dmserver通过MAL_HOST+MAL_PORT(5800)端口连接。5900(MAL_INST_DW_PORT)端口两端都是127.0.0.1,为本地守护进程到本地实例之间的链路。
dminit path=/DM8/data db_name=LIUDB instance_name=LIUSVR01 port_num=5236 SYSDBA_PWD=SYSDBA12345 PAGE_SIZE=16 EXTENT_SIZE=32 LOG_SIZE=500
使用root用户注册实例的服务,以方便管理。
/DM8/script/root/dm_service_installer.sh -t dmserver -dm_ini /DM8/data/LIUDB/dm.ini -p LIUSVR01
使用DMINIT创建的实例需要启动一次完成初始化
systemctl start DmServiceLIUSVR01
#检查
systemctl | grep DmServiceLIUSVR01
systemctl stop DmServiceLIUSVR01
#检查
systemctl | grep DmServiceLIUSVR01
dmrman CTLSTMT="BACKUP DATABASE '/DM8/data/LIUDB/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/DM8/backup/BACKUP_FILE_01'"
scp -r * dmdba@192.168.100.101:/DM8/backup
dminit path=/DM8/data db_name=LIUDB instance_name=LIUSVR02 port_num=5236 SYSDBA_PWD=DM01SYSDBA PAGE_SIZE=16 EXTENT_SIZE=32 LOG_SIZE=500
/DM8/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/LIUDB/dm.ini -p DMSVR02
dmrman CTLSTMT="RESTORE DATABASE '/DM8/data/LIUDB/dm.ini' FROM BACKUPSET '/DM8/backup/BACKUP_FILE_01'"
dmrman CTLSTMT="RECOVER DATABASE '/DM8/data/LIUDB/dm.ini' FROM BACKUPSET '/DM8/backup/BACKUP_FILE_01'"
dmrman CTLSTMT="RECOVER DATABASE '/DM8/data/LIUDB/dm.ini' UPDATE DB_MAGIC"
sed -i s/'ALTER_MODE_STATUS = 1'/'ALTER_MODE_STATUS = 0'/g /dm8/data/DM01/dm.ini
sed -i s/'ENABLE_OFFLINE_TS = 1'/'ENABLE_OFFLINE_TS = 2'/g /dm8/data/DM01/dm.ini
sed -i s/'MAL_INI = 0'/'MAL_INI = 1'/g /dm8/data/DM01/dm.ini
sed -i s/'ARCH_INI = 0'/'ARCH_INI = 1'/g /dm8/data/DM01/dm.ini
执行如下命令检查参数修改结果
cat dm.ini | egrep "ALTER_MODE_STATUS|ENABLE_OFFLINE_TS|MAL_INI|ARCH_INI|DW_INACTIVE_INTERVA|RLOG_SEND_APPLY_MON"
【注】:主备库完全一样
cat >>/DM8/data/LIUDB/dmmal.ini<<EOF
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 5
[MAL_INST1]
MAL_INST_NAME = LIUSVR01
MAL_HOST = 10.168.100.100
MAL_PORT = 5800
MAL_INST_HOST = 192.168.100.100
MAL_INST_PORT = 5236
MAL_DW_PORT = 6000
MAL_INST_DW_PORT = 5900
[MAL_INST2]
MAL_INST_NAME = LIUSVR02
MAL_HOST = 10.168.100.101
MAL_PORT = 5800
MAL_INST_HOST = 192.168.100.101
MAL_INST_PORT = 5236
MAL_DW_PORT = 6000
MAL_INST_DW_PORT = 5900
EOF
【注】:主备库完全一样
mv /DM8/data/LIUDB/dmarch.ini /DM8/data/LIUDB/dmarch.inibak
cat >>/DM8/data/LIUDB/dmarch.ini<<EOF
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = LIUSVR02
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /DM8/arch
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
EOF
【注意:ARCH_DEST主库写备库】
cat >>/dm8/data/DM01/dmarch.ini<<EOF
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME
ARCH_DEST = LIUSVR01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm8/arch
ARCH_FILE_SIZE = 64
ARCH_SPACE_LIMIT = 0
EOF
【注意:ARCH_DEST备库写主库】
cat >>/dm8/data/DM01/dmwatcher.ini<<EOF
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO
DW_ERROR_TIME = 10
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 10
INST_OGUID = 453331
INST_INI = /dm8/data/DM01/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /dm8/bin/dmserver
RLOG_SEND_THRESHOLD = 0
RLOG_APPLY_THRESHOLD = 0
EOF
【注】:主备库完全一样
前面的配置文件修改完成后就可以启动实例了。为保证主备库的数据一致性,在数据搭建过程中,这一步必须以配置(mount)方式启动主备库。
dmserver /dm8/data/LIUDB/dm.ini mount
这个OGUID必须和dmwatcher.ini以及dmmonitor.ini文件中设置的一样。
disql sysdba/SYSDBA12345
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);
dmserver /DM8/data/LIUDB/dm.ini mount
切记这时不要open备库!open数据库会产生REDO。
disql sysdba/SYSDBA12345
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
SQL>sp_set_oguid(453331);
SQL>alter database standby;
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
-主库(DmWatcherServiceLIUSVR01)
/dm8/script/root/dm_service_installer.sh –t dmwatcher -watcher_ini /DM8/data/LIUDB/dmwatcher.ini -p LIUSVR01
备库(DmWatcherServiceLIUSVR02)
/dm8/script/root/dm_service_installer.sh -t dmwatcher -watcher_ini /dm8/data/LIUDB/dmwatcher.ini -p LIUSVR02
----主库(DmWatcherServiceLIUSVR01
systemctl start DmWatcherServiceLIUSVR01
----备库(DmWatcherServiceLIUSVR02)
systemctl start DmWatcherServiceLIUSVR02
/此时主备库应为OPEN状态,若还是MOUNT状态,则检查上面几个配置文件是否有错漏/
select instance_name,status$,mode$ from v$instance;
在监控节点创建并修改dmmonitor.ini配置文件
cat >>/DM8/data/dmmonitor.ini<<EOF
MON_DW_CONFIRM = 1
MON_LOG_PATH = /DM8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 10.168.100.100:6000
MON_DW_IP = 10.168.100.101:6000
EOF
cat >>/DM8/data/dmmonitor0.ini<<EOF
MON_DW_CONFIRM = 0
MON_LOG_PATH = /DM8/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 0
[GRP1]
MON_INST_OGUID = 453331
MON_DW_IP = 10.168.100.100:6000
MON_DW_IP = 10.168.100.101:6000
EOF
用root用户注册,将确认监视器注册为后台服务
/DM8/script/root/dm_service_installer.sh -t dmmonitor -monitor_ini /DM8/data/dmmonitor.ini -p LIUDB
systemctl start DmMonitorServiceLIUDB
普通监视器用来给数据库管理员提供一个查看和执行管理命令的窗口,其启动与否不会影响到数据守护的运行。
在监视器里输入login命令
输入用户名和口令
输入switchover命令进行主备切换
检查原主库状态
切换成功
文章
阅读量
获赞