目录
[一 主库配置](#一 主库配置)
[二 备库配置](#二 备库配置)
[2.1 安装数据库及初始化实例](#2.1 安装数据库及初始化实例)
[2.2 还原主库数据](#2.2 还原主库数据)
[2.3 配置dmarch.ini](#2.3 配置dmarch.ini)
[2.4 配置dm.ini](#2.4 配置dm.ini)
[2.5 配置dmmal.ini](#2.5 配置dmmal.ini)
[2.6 配置dmwatcher.ini](#2.6 配置dmwatcher.ini)
[2.7 调整数据库模式](#2.7 调整数据库模式)
[2.8 制作启动脚本](#2.8 制作启动脚本)
[三 安装仲裁机](#三 安装仲裁机)
[3.1 安装数据库软件](#3.1 安装数据库软件)
[3.2 配置dmmonitor.ini](#3.2 配置dmmonitor.ini)
[3.3 创建监视器联机日志](#3.3 创建监视器联机日志)
[3.4 添加日常监控](#3.4 添加日常监控)
[3.5 制作启动脚本](#3.5 制作启动脚本)
[四 启动主备集群](#四 启动主备集群)
[4.1 启动data watch](#4.1 启动data watch)
[4.2 启动监视器](#4.2 启动监视器)
[4.3 同步数据验证](#4.3 同步数据验证)
[五 读写分离](#五 读写分离)
[5.1 配置修改](#5.1 配置修改)
[5.2 客户端配置](#5.2 客户端配置)
[5.2.1 单机配置](#5.2.1 单机配置)
[5.2.2 集群配置](#5.2.2 集群配置)
环境信息
以下为实验所创建的环境信息
|-------|--------|-----------------|----------|-------------|
| 服务器 | 监视器实例名 | IP地址 | MON_PORT | MON_INST_ID |
| 主机服务器 | MON1 | 192.168.159.128 | 8339 | 1 |
| 备机服务器 | MON2 | 192.168.159.132 | 8340 | 2 |
| 仲裁服务器 | MON3 | 192.168.159.131 | 8341 | 3 |
一 主库配置
1.1 安装数据库及初始化实例
安装及初始化实例省略。
1.2 备份数据库
将主库全量备份到本地。
|-----------------------------------------|
| backup database backupset '/bak/dmbak'; |

将备份的文件传到备库机器上
|--------------------------------------------------|
| scp -rp dmbak/ root@192.168.159.132:/dbbak/dmbak |
1.3 配置dmarch.ini文件
添加以下内容
|-----------------------------------------------------------------------------------------------------|
| ARCH_WAIT_APPLY = 0 ARCHIVE_REALTIME1 ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = DMSTD #实时归档目标实例名 |

1.4 配置dm.ini
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Vi dm.ini #将如下参数加入文件结尾处新增或者找到对应参数修改对应的数值 INSTANCE_NAME = ZHFT DW_INACTIVE_INTERVAL=60 ALTER_MODE_STATUS=0 ENABLE_OFFLINE_TS=2 MAL_INI=1 RLOG_SEND_APPLY_MON=64 DW_ARCH_SPACE_CHECK=1 DW_ARCH_HANG_CHECK=1 |
1.5 配置 dmmal .ini
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| vi /dm8/data/zhft/dmmal.ini #添加以下内容,修改对应的instance_name,对应的IP以及端口号。 MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 MAL_INST1 MAL_INST_NAME = ZHFT #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.159.128 #根据实际IP 地址配置 MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.159.128 #根据实际IP 地址配置 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口 MAL_INST2 MAL_INST_NAME = DMSTD MAL_HOST = 192.168.159.132 #根据实际IP 地址配置 MAL_PORT = 61142 MAL_INST_HOST =192.168.159.132 #根据实际IP 地址配置 MAL_INST_PORT = 5236 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142 |
1.6 配置 dmwatcher .ini
注意修改配置文件中的信息为正确的信息。
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmdba@zhft zhft$ more dmwatcher.ini GRP1 DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453331 #守护系统唯一 OGUID 值 INST_INI = /dm8/data/zhft/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD =/etc/rc.d/init.d/DmServiceZHFT start #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 DW_RECONNECT = 2 DW_FAILOVER_FORCE = 1 INST_SERVICE_IP_CHECK = 1 |
1.7 调整数据库模式
|----------------------------------------------------------------------------------------|
| 关闭数据库 ./dmserverd stop ./dmserver dm.ini mount 等看到SYSTEM IS READY,重新打开一个会话窗口,这个不要关闭!!! |

在新开的窗口上做以下操作
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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); SQL>exit |

回到窗口1,CTRL+C或者exit退出窗口。
1.8 制作启动脚本
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmdba@zhft bin$cd /home/dmdba/dm/dmdbms/bin cp ./service_template/DmWatcherService ./dmwatcherd vi dmwatcherd 修改INI_PATH=%INI_PATH%为当前的路径 chmod +x dmwatcherd |

二 备库配置
2.1 安装数据库及初始化实例
安装及初始化过程省略
2.2 还原主库数据
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmrman restore database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/'; recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' from backupset '/dbbak/dmbak/'; recover database '/home/dmdba/dm/dmdbms/bin/dm.ini' update db_magic; |

2.3 配置 dmarch.ini
|----------------------------------------------------------------------------------------------------------------------------------------------|
| vi /dbdata/dmdata/DMSTD/dmarch.ini 添加以下内容 ARCH_WAIT_APPLY = 0 ARCHIVE_REALTIME1 ARCH_TYPE = REALTIME #实时归档类型 ARCH_DEST = ZHFT #实时归档目标实例名 |

2.4 配置 dm.ini
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| vi dm.ini #将如下参数加入文件结尾处新增或者找到对应参数修改对应的数值 INSTANCE_NAME = DMSTD DW_INACTIVE_INTERVAL=60 ALTER_MODE_STATUS=0 ENABLE_OFFLINE_TS=2 MAL_INI=1 RLOG_SEND_APPLY_MON=64 DW_ARCH_SPACE_CHECK=1 DW_ARCH_HANG_CHECK=1 |
2.5 配置 dmmal.ini
添加以下信息,按照真实的信息修改。
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmdba@zhftstandby DMSTD$ more dmmal.ini MAL_CHECK_INTERVAL = 5 #MAL链路检测时间间隔 MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间 MAL_INST1 MAL_INST_NAME = ZHFT #实例名,和 dm.ini 中的 INSTANCE_NAME 一致 MAL_HOST = 192.168.159.128 #根据实际IP 地址配置 MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口 MAL_INST_HOST = 192.168.159.128 #根据实际IP 地址配置 MAL_INST_PORT = 5236 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致 MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口 MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口 MAL_INST2 MAL_INST_NAME = DMSTD MAL_HOST = 192.168.159.132 #根据实际IP 地址配置 MAL_PORT = 61142 MAL_INST_HOST = 192.168.159.132 #根据实际IP 地址配置 MAL_INST_PORT = 5236 MAL_DW_PORT = 52142 MAL_INST_DW_PORT = 33142 |
2.6 配置 dmwatcher.ini
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmdba@zhftstandby DMSTD$ more dmwatcher.ini GRP1 DW_TYPE = GLOBAL #全局守护类型 DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切 DW_ERROR_TIME = 10 #远程守护进程故障认定时间 INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间 INST_ERROR_TIME = 10 #本地实例故障认定时间 INST_OGUID = 453331 #守护系统唯一 OGUID 值 INST_INI = /home/dmdba/dm/dmdbms/bin/dm.ini #dm.ini 配置文件路径 INST_AUTO_RESTART = 1 #打开实例的自动启动功能 INST_STARTUP_CMD =/etc/rc.d/init.d/dmserverd start #命令行方式启动 RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭 RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭 DW_RECONNECT = 2 DW_FAILOVER_FORCE = 1 INST_SERVICE_IP_CHECK = 1 |
2.7 调整数据库模式
|----------------------------------------------------------------------------------------|
| 关闭数据库 ./dmserverd stop ./dmserver dm.ini mount 等看到SYSTEM IS READY,重新打开一个会话窗口,这个不要关闭!!! |

在新开的窗口上做以下操作
|------------------------------------------------------------------------------------------------------------------------------------------------|
| SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1); sp_set_oguid(453331); alter database standby; SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0); exit |

回到窗口1,CTRL+C或者exit退出窗口。
2.8 制作启动脚本
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| cd /home/dmdba/dm/dmdbms/bin cp ./service_template/DmWatcherService ./dmwatcherd vi dmwatcherd 修改INI_PATH=%INI_PATH%为当前的路径
chmod +x dmwatcherd |
三 安装仲裁机
3.1 安装 数据库软件
可以选择重新安装,也可以将已有的dmdbms目录拷贝过来,此处省略。
3.2 配置 dmmonitor.ini
在bin目录下添加以下内容,每个节点都需要添加,并且需要调整对应的IP以及MON_ID 、MON_INST_ID、MON_NAME为各个节点对应的。
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmdba@localhost bin$ more dmmonitor.ini MON_DW_CONFIRM = 1 #确认监视器模式 MON_LOG_PATH = /home/dmdba/dm/dmdbms/log #监视器日志文件存放路径 MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件 MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间 MON_INST_NUM = 3 #实例总个数 MON_HB_INTERVAL = 60 #通信心跳校验间隔 MON_BRO_INTERVAL = 100 #raft 协议中实例通信心跳间隔 MON_VOTE_INTERVAL = 100 #raft 协议中基础投票间隔 MON_ID = 3 #当前监视器在监视器系统中的 ID MON_MID = 45614 #当前监视器系统的唯一标识 MON_NAME = MON3 #监视器名 GRP1 MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值 #以下配置为监视器到组 GRP1 的守护进程的连接信息,以"IP:PORT"的形式配置 #IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT MON_DW_IP = 192.168.159.128:52141 MON_DW_IP = 192.168.159.132:52142 MON1 #监视器实例信息 MON_HOST = 192.168.159.128 #MON1 监视器所在 IP MON_PORT = 8339 #MON1 监视器监听端口 MON_INST_ID = 1 #监视器实例在监视器系统中的 ID MON2 MON_HOST = 192.168.159.132 #MON2 监视器所在 IP MON_PORT = 8340 #MON2 监视器监听端口 MON_INST_ID = 2 #监视器实例在监视器系统中的 ID MON3 MON_HOST = 192.168.159.131 #MON3 监视器所在 IP MON_PORT = 8341 #MON3 监视器监听端口 MON_INST_ID = 3 #监视器实例在监视器系统中的 ID |
3.3 创建 监视器联机日志
每个节点都需要执行。目录需要调整为对应的目录。
|------------------------------------------------------------------------------------------------------|
| ./dmmonitor raft_file_path=/home/dmdba/dm/dmdbms/log raft_file_size=1024 mon_magic=100 mon_name=MON1 |



3.4 添加 日常监控
在仲裁服务器上添加一个普通监视器用作日常监控运维
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmdba@localhost bin$ more dmmonitor_0.ini MON_DW_CONFIRM = 0 #非确认监视器模式 MON_LOG_PATH = /home/dmdba/dm/dmdbms/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 = 192.168.159.128:52141 MON_DW_IP = 192.168.159.132:52142 |
3.5 制作 启动脚本
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| cd /home/dmdba/dm/dmdbms/bin cp ./service_template/DmMonitorService ./dmmonitord vi dmmonitord 修改INI_PATH=/home/dmdba/dm/dmdbms/bin/dmmonitor.in chmod +x dmonitord |
四 启动主备集群
4.1 启动 data watch
在主备上都上开启服务
|--------------------|
| ./dmwatcherd start |

4.2 启动监视器
监视服务器上启动
|-----------------------------------|
| dmdba@ bin$./dmmonitord start |
监视器查看集群状态
|-----------------------------|
| ./dmmonitor dmmonitor_0.ini |

show 查看集群的实例状态

4.3 同步 数据验证
主库插入数据

登录备库查看是否同步过来

查看延迟情况

五 读写分离
5.1 配置修改
1、dmarch.ini
与实时同步的区别在于dmarch.ini配置文件中ARCH_TYPE参数可以配置REALTIME(实时归档类型)也可以配置为Timely(及时归档类型)。
2、dm_svc.conf
|------------------------------------------------------------------------|
| 开启读写分离 RW_SEPARATE = 1 可选:主库承担的读请求比例(0-100),其余读请求分发至备库 RW_PERCENT = 30 |
3、ARCH_WAIT_APPLY
• 实时主备架构:所有读写请求均发往主库,业务无需关心主备间的数据同步状态,主库自身的事务特性天然保障了数据一致性,因此基本不需要考虑主备事务一致性问题。
• 读写分离集群:读请求被驱动层自动分发到备库,而备库通过重演Redo日志与主库保持同步可能存在延迟,这就带来了"写后读"不一致的风险------用户刚提交的数据可能因备库尚未同步而查询不到。
因此,业务方必须根据自身场景调整ARCH_WAIT_APPLY参数:
|-----|-------------------|-----------------------------|--------------------|
| 参数值 | 适用场景 | 行为说明 | 代价 |
| 1 | 需要查询备机最新数据的强一致性业务 | 主库等待备库重演完成后再响应提交,彻底消除写后读不一致 | 性能衰减 |
| 0 | 可容忍备库短暂延迟的业务 | 主库不等待备库重演即响应提交 | 备库读可能读到旧数据,换取更高吞吐量 |
5.2 客户端配置
5.2.1 单机配置
配置示例
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| TIME_ZONE=(480) LANGUAGE=(CN) HSDM8=(192.168.159.128:5236) HSDM8 LOGIN_MODE=(1) RW_SEPARATE=(1) RW_PERCENT=(30) SWITCH_TIMES=(60) SWITCH_INTERVAL=(1000) #LOGIN_MODE 指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。 #RW_SEPARATE 表示是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。 #RW_PERCENT 表示读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例。可以根据主备库的实际压力来设定。 |

5.2.2 集群配置
配置示例
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| TIME_ZONE=(480) LANGUAGE=(CN) HSDM8=(192.168.159.128:5236,192.168.159.131:5236) HSDM8 LOGIN_MODE=(1) RW_SEPARATE=(1) RW_PERCENT=(30) SWITCH_TIMES=(60) SWITCH_INTERVAL=(1000) |
jdbc 连接串
|-----------------|
| jdbc:dm://HSDM8 |
更多