安装前准备
1.1硬件环境建议
数据守护集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况,其他环境配置项建议参考单机版安装前准备工作。
此处为虚拟机测试环境,准备三台机器DW_P、DW_S、DW_M,DW_P和DW_S用来部署主备库,DW_M用来部署确认监视器。其中DW_P和DW_S配置两块网卡,一块接入内部网络交换模块,一块接入到外部交换机,DW_M接入内部网络。
三台机器都事先安装了DM,安装路径为’/opt/dmdba’,执行程序保存在’/opt/dmdba/bin’目录中,数据存放路径为’/dmdata/data’。
各主备库的实例名建议采用“组名_守护环境_序号”的方式命名,方便按组区分不同实例,注意总长度不能超过16。本实例中组名为”GRP1”,配置为实时主备,主库命名为”GRP1_RT_01”,备库命名为”GRP1_RT_02”。
1.1.1网络环境
心跳网络对 mal 通讯系统的影响非常大,如果网络丢包或者延迟较大,则会严重影响 mal 系统的处理能力,从而导致整个集群出现响应服务请求慢的情况。为确保集群的稳定性,网络配置如下:
1、使用千兆或千兆以上网络;
2、集群间的心跳网络需同步数据,建议尽量使用两个交换机构建内网,以实现冗余和负载均衡;
3、建议服务器采用两个网卡绑定为一个逻辑网卡来使用(比如 bond 方式)。此处虚拟机安装环境,只需要配置两块网卡即可。
1.1.2磁盘IO
磁盘 IO 的读写速率会极大影响系统性能和用户体验。因此在进行集群安装部署前,应测试 IO 性能能否满足系统功能和性能需求。
IO 性能指标与系统的并发数、热点数据等因素往往密切相关。在数据守护集群,尤其生产系统中,推荐使用高性能 SSD 磁盘,以获得更佳性能,保证集群数据的实时同步。
因采用虚拟机测试环境,不考虑此要求。
1.2集群规划
DW_P | DW_S | |
业务 IP | 192.168.0.101 | 192.168.0.102 |
心跳 IP | 192.168.100.101 | 192.168.100.102 |
实例名 | GRP1_RT_01 | GRP1_RT_02 |
实例端口 | 5236 | 5236 |
MAL 端口 | 5336 | 5336 |
MAL 守护进程端口 | 5436 | 5436 |
守护进程端口 | 5536 | 5536 |
OGUID | 45331 | 45331 |
守护组 | GRP1 | GRP1 |
安装目录 | /opt/dmdba | /opt/dmdba |
实例目录 | /dmdata/data/ | /dmdata/data/ |
归档上限 | 51200 | 51200 |
确认监视器(DW_M)的IP为192.168.100.103
说明:读写分离集群与数据守护集群架构基本类似,但在搭建过程中,归档类型和 dm_svc.conf 配置文件等存在一定区别。此外,搭建过程中具体规划及部署方式以现场环境为准。
1.2集群架构
搭建的读写分离集群架构如下图:
1.3切换模式说明
故障切换方式 | dmarch | dmwatcher | dmmonitor | 监视器要求 |
故障手动切换 | ARCH_WAIT_APP | DW_MODE= | MON_DW_CON | 1、手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 |
故障自动切换 | ARCH_WAIT_APP | DW_MODE= | MON_DW_CON | 1、手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 |
1、ARCH_WAIT_APPLY 参数,设置为 0:高性能模式;设置为 1:事务一致模式。
2、故障手动切换情境下 ARCH_WAIT_APPLY 只能为 0。故障自动切换情境下 ARCH_WAIT_APPLY 可以为 0,也可以为 1。
3、ARCH_WAIT_APPLY 参数设置的判断依据为业务是否要查询备机最新数据。如果需要,则配置为 1(较大性能衰减);如果不需要,则配置为 0。
集群搭建
2.1配置DW_P主库
2.1.1初始化实例并备份数据
1、初始化实例
[root@DW_P ~]# su - dmdba
[dmdba@DW_P ~]$ cd /opt/dmdba/bin
[dmdba@DW_P bin]$ dminit PATH=/dmdata/data/ INSTANCE_NAME=GRP1_RT_01 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048
2、启动服务
[dmdba@DW_P bin]$ dmserver /dmdata/data/DAMENG/dm.ini
3、开启归档
[dmdba@DW_P ~]$ disql SYSDBA/SYSDBA:5236
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间
disql V8
SQL> alter database mount;
操作已执行
已用时间: 13.256(毫秒). 执行号:0.
SQL> alter database archivelog;
操作已执行
已用时间: 22.782(毫秒). 执行号:0.
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdata/arch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
操作已执行
已用时间: 5.780(毫秒). 执行号:0.
SQL> ALTER DATABASE OPEN;
操作已执行
已用时间: 106.828(毫秒). 执行号:0.
4、备份数据
SQL> BACKUP DATABASE BACKUPSET '/dmdata/dmbak/BACKUP_FILE';
操作已执行
已用时间: 00:00:07.296. 执行号:62601.
5、修改dm.ini
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
DMSQL 过程已成功完成
已用时间: 84.463(毫秒). 执行号:62602.
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60);
DMSQL 过程已成功完成
已用时间: 12.220(毫秒). 执行号:62603.
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0);
DMSQL 过程已成功完成
已用时间: 8.783(毫秒). 执行号:62604.
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2);
DMSQL 过程已成功完成
已用时间: 6.795(毫秒). 执行号:62605.
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1);
DMSQL 过程已成功完成
已用时间: 10.132(毫秒). 执行号:62606.
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64);
DMSQL 过程已成功完成
已用时间: 7.111(毫秒). 执行号:62607.
6、关闭前台实例服务
输入exit即可
2.1.2修改dmarch.ini
[dmdba@DW_P ~]$ vi /dmdata/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
[ARCHIVE_TIMELY1]
ARCH_TYPE =REALTIME #实时归档类型
ARCH_DEST =GRP1_RT_02 #即时归档目标实例名
2.1.3创建dmmal.ini
[dmdba@DW_P DAMENG]$ vi /dmdata/data/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 15 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 15 #判定 MAL 链路断开的时间
[MAL_INST1]
MAL_INST_NAME = GRP1_RT_01 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 192.168.100.101 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.0.101 #实例的对外服务 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 = GRP1_RT_02
MAL_HOST = 192.168.100.102
MAL_PORT = 5336
MAL_INST_HOST = 192.168.0.102
MAL_INST_PORT = 5236
MAL_DW_PORT = 5436
MAL_INST_DW_PORT = 5536
2.1.4创建dmwatcher.ini
[dmdba@DW_P DAMENG]$ vi /dmdata/data/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #MANUAL:故障手切 AUTO:故障自切
DW_ERROR_TIME = 20 #远程守护进程故障认定时间
INST_ERROR_TIME = 20 #本地实例故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_OGUID = 45331 #守护系统唯一 OGUID 值
INST_INI = /dmdata/data/DAMENG/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /opt/dmdba/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
2.1.5拷贝备份文件
[dmdba@~]$scp -r /dmdata/dmbak/BACKUP_FILE dmdba@192.168.100.102:/dmdata/dmbak
2.1.6注册服务
[root@~]# /opt/dmdba/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_01 -dm_ini /dmdata/data/DAMENG/dm.ini -m mount(注意是mount状态)
注意:一定要以 Mount 方式启动数据库实例,否则系统启动时会重构回滚表空间,生
成 Redo 日志;并且,启动后应用可能连接到数据库实例进行操作,破坏主备
库的数据一致性。数据守护配置结束后,守护进程会自动 Open 数据库。
[root@~]# /opt/dmdba/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
若要删除自启,可利用如下方式:
[root@~]# /opt/dmdba/script/root/dm_service_uninstaller.sh -n DmServiceGRP1_RT_01
[root@~]# /opt/dmdba/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
2.2配置DW_S备库
2.2.1初始化实例
[root@DW_S ~]# su - dmdba
[dmdba@DW_S ~]$ cd /opt/dmdba/bin
[dmdba@DW_S bin]$ dminit PATH=/dmdata/data/ INSTANCE_NAME=GRP1_RT_02 PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048
2.2.2恢复数据
[dmdba@DW_S~]$/opt/dmdba/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE'"
[dmdba@DW_S~]$/opt/dmdba/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' FROM BACKUPSET '/dmdata/dmbak/BACKUP_FILE'"
[dmdba@DW_S~]$/opt/dmdba/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/data/DAMENG/dm.ini' UPDATE DB_MAGIC"
2.2.3替换dmarch.ini
[dmdba@DW_S ~]$ vi /dmdata/data/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 51200
ARCH_FLUSH_BUF_SIZE = 0
ARCH_HANG_FLAG = 1
[ARCHIVE_TIMELY1]
ARCH_TYPE =REALTIME #实时归档类型
ARCH_DEST =GRP1_RT_02 #即时归档目标实例名
2.2.4配置dm.ini、dmmal.ini和dmwatcher.ini
- 配置dm.ini在DW_S机器上配置备库的实例名为GRP1_RT_02,dm.ini参数修改如下:
[dmdba@DW_S ~]$ vi /dmdata/data/DAMENG/dm.ini
INSTANCE_NAME = GRP1_RT_02
PORT_NUM = 5236 #数据库实例监听端口
DW_INACTIVE_INTERVAL = 60 #接收守护进程消息超时时间
ALTER_MODE_STATUS = 0 #不允许手工方式修改实例模式/状态/OGUID
ENABLE_OFFLINE_TS = 2 #不允许备库 OFFLINE 表空间
MAL_INI = 1 #打开 MAL 系统
ARCH_INI = 1 #打开归档配置
RLOG_SEND_APPLY_MON = 64 #统计最近 64 次的日志重演信息
- 配置dmmal.ini和dmwatcher.ini
DW_S机器里dmmal.ini、dmwatcher.ini与机器DW_P的dmmal.ini、dmwatcher.ini相同,参照 DW_P机器 dmmal.ini、dmwatcher.ini 文件进行配置。
2.2.5注册服务
[root@DW_S ~]# /opt/dmdba/script/root/dm_service_installer.sh -t dmserver -p GRP1_RT_02 -dm_ini /dmdata/data/DAMENG/dm.ini -m mount
[root@DW_S ~]# /opt/dmdba/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/data/DAMENG/dmwatcher.ini
若要删除自启,可利用如下方式:
[root@~]# /opt/dmdba/script/root/dm_service_uninstaller.sh -n DmServiceGRP1_RT_02
[root@~]# /opt/dmdba/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
2.3配置监视器
1、手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。
2、自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。
2.3.1创建dmmonitor.ini
[dmdba@~]$ vi /opt/dmdba/bin/dmmonitor.ini
MON_DW_CONFIRM = 1 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /dmdata/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.100.101:5436
MON_DW_IP = 192.168.100.102:5436
在配置监视器时,一般配置好确认监视器后,建议再配置一个非确认监视器的配置文件,在主备发生切换时,可以通过前台的方式启动非确认监视器进行手动切换。非确认监视器是通过将监视器配置文件中 MON_DW_CONFIRM 参数值修改为 0 来实现,示例如下:
[dmdba@~]$ vi /opt/dmdba/bin/dmmonitor_manual.ini
MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = /dmdata/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
#以下配置为监视器到组 GRP1 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
MON_DW_IP = 192.168.100.101:5436
MON_DW_IP = 192.168.100.102:5436
2.3.2注册服务(选做)
[root@DW_M ~]# /opt/dmdba/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /opt/dmdba/bin/dmmonitor.ini
若要删除自启,可利用如下方式:
[root@~]# /opt/dmdba/script/root/dm_service_uninstaller.sh -n DmMonitorServiceMonitor
2.3.3监视器使用
命令 | 含义 |
list | 查看守护进程的配置信息 |
show global info | 查看所有实例组的信息 |
tip | 查看系统当前运行状态 |
login | 登录监视器 |
logout | 退出登录 |
choose switchover GRP1 | 主机正常:查看可切换为主机的实例列表 |
switchover GRP1.实例名 | 主机正常:使用指定组的指定实例,切换为主机 |
choose takeover GRP1 | 主机故障:查看可切换为主机的实例列表 |
takeover GRP1.实例名 | 主机故障:使用指定组的指定实例,切换为主机 |
choose takeover force GRP1 | 强制切换:查看可切换为主机的实例列表 |
takeover force GRP1.实例名 | 强制切换:使用指定组的指定实例,切换为主机 |
对于在生产环境中配置有确认监视器时,主备只是发生了切换的情况下,再想将主备切换回去时,只需要启动非确认监视器执行切换命令即可。
2.4启动服务及查看信息
2.4.1启动数据库并修改参数
##DW_P机器
[dmdba@~]$ /opt/dmdba/bin/DmServiceGRP1_RT_01 start
[dmdba@~]$ disql SYSDBA/SYSDBA@192.168.0.101:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
##DW_S机器
[dmdba@~]$ /opt/dmdba/bin/DmServiceGRP1_RT_02 start
[dmdba@~]$ disql SYSDBA/SYSDBA@192.168.0.102:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
2.4.2启动守护进程
##DW_P/DW_S机器
[dmdba@~]$ /opt/dmdba/bin/DmWatcherServiceWatcher start
2.4.3启动监视器
##DW_M 机器
##后台启动
[dmdba@~]$ /opt/dmdba/bin/DmMonitorServiceMonitor start
##前台启动
[dmdba@~]$ /opt/dmdba/bin/dmmonitor /opt/dmdba/bin/dmmonitor.ini
2.5启停集群
##启动
##DW_P/DW_S机器
[dmdba@~]$ /opt/dmdba/bin/DmWatcherServiceWatcher start
##停止
##DW_P/DW_S机器
[dmdba@~]$ /opt/dmdba/bin/DmWatcherServiceWatcher stop
##DW_P机器
[dmdba@~]$ /opt/dmdba/bin/DmServiceGRP1_RT_01 stop
##DW_S机器
[dmdba@~]$ /opt/dmdba/bin/DmServiceGRP1_RT_02 stop
建议:
生产环境中建议应用使用服务名的方式进行连接,在配置文件 dm_svc.conf 中配置只连主库,这样连接的好处在于当主备发生切换后应用会自动连接到当前的主库,不会影响应用的正常使用。dm_svc.conf 详细介绍参考第三章节 dm_svc.conf 配置。
dm_svc.conf配置
3.1简介
dm_svc.conf 是使用达梦数据库时非常重要的配置文件,它包含了达梦各接口和客户端工具所需要配置的一些参数。通过它可以实现达梦各种集群的读写分离和均衡负载,且必须和接口/客户端工具位于同一台机器上才能生效。
初始 dm_svc.conf 文件由达梦安装时自动生成。不同的平台生成目录有所不同,注意相应访问用户需要对该文件有读取权限。
32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
在 Linux 平台下,此文件位于 /etc 目录。
但在某些情况下,所使用的用户没有读取和修改 /etc 目录下文件的权限,这时就需要将 dm_svc.conf 文件放到有权限的目录下,并修改 url 连接串的内容。以 Linux 平台,文件放在 /home/dmdba 目录下为例:
- 在 /home/dmdba 目录下,编辑 dm_svc.conf 文件:
TIME_ZONE=(480)
LANGUAGE=(cn)
dm=(ip:端口)
[dm]
KEYWORDS=(需要排除的关键字) - 修改连接串:
jdbc:dm://dm?dmsvccnotallow=/home/dmdba/dm_svc.conf
dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配置所有的配置项,服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区(服务配置区的相同配置项会覆盖全局配置区对应的配置项)。
3.2常用配置项介绍
1、服务名
用于连接数据库的服务名,参数值格式为:
服务名=(IP[:PORT],IP[:PORT],......)。
2、TIME_ZONE
指明客户端的默认时区设置范围为:-779~840M,如 60 对应 +1:00 时区,+480 对于东八区,如果不做配置默认是操作系统的时区。
3、KEYWORDS
该参数可以用于屏蔽数据库关键字,如果数据库关键字在 SQL 语句中以单词的形式存在,无法识别需要加上双引号或者可以通过该参数来屏蔽关键字,建议大小写都写入参数中。
例如:KEYWORDS=(versions,VERSIONS,type,TYPE)
4、LOGIN_MODE
指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
注意
在 2021 年版本之后,此参数的默认值由 0 变更为 4。该参数详细介绍及使用办法请参考《DM 数据守护与读写分离集群》-5.8 章节。手册位于数据库安装路径 /dmdbms/doc 文件夹。
5、SWITCH_TIMES
表示以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围 1~9223372036854775807,默认值为 1,可以设置至少 3 次用来避免由于网卡的波动,造成数据库连接测频繁切换。
6、SWITCH_INTERVAL
表示在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数 SWITCH_TIMES、EP_SELECTOR 配合使用,EP_SELECTOR 设置为 0,等待 SWITCH_INTERVAL 后会切换尝试连接下一个服务器,EP_SELECTOR 设置为 1,等待 SWITCH_INTERVAL 后会继续尝试连接该服务器,直到 SWITCH_TIMES 次再切换下一个服务器。
7、EP_SELECTOR
表示连接数据库时采用何种模型建立连接,0:依次选取列表中的不同节点建立连接,使得所有连接均匀地分布在各个节点上;1:选择列表中最前面的节点建立连接,只有当前节点无法建立连接时才会选择下一个节点进行连接。
8、AUTO_RECONNECT
表示连接发生异常或一些特殊场景下连接处理策略。0:关闭连接,1:当连接发生异常时自动切换到其他库,无论切换成功还是失败都会抛一个 SQLEXCEPTION,用于通知上层应用进行事务执行失败时的相关处理;2 配合 EP_SELECTOR=1 使用,如果服务名列表前面的节点恢复了,将当前连接切换到前面的节点上,可以根据应用的实际要求设定。
3.3常用配置
3.3.1单机配置
配置示例
##以#开头的行表示是注释
##全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DM=(192.168.100.100:5236)
连接示例:
- Disql连接:[dmdba@localhost~]$ disql SYSDBA/SYSDBA@DM
- 通过管理工具连接
3.3.2主备集群配置
- 配置示例(将/etc/dm_svc.conf文件move到/home/dmdba目录下)
##以#开头的行表示是注释#
##全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DMHA=(192.168.100.101:5236,192.168.100.102:5236)
##服务配置
[DMHA]
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
LOGIN_MODE=(1)
- jdbc连接串
jdbc:dm://DMHA
实验测试
4.1主备库数据同步测试
4.1.1主库插入数据
- 创建表空间
[dmdba@DW_P ~]$ disql SYSDBA/SYSDBA@192.168.100.101:5236
SQL> create tablespace TEST datafile '/dmdata/data/DAMENG/TEST.DBF' size 128; - 创建用户及授权
[dmdba@DW_P ~]$ disql SYSDBA/SYSDBA@192.168.100.101:5236
SQL> create user TEST identified by TEST123456 default tablespace TEST default index tablespace TEST;
SQL> grant resource to TEST;
- 表的创建及数据插入
## 切换到TEST用户下
SQL> conn TEST/TEST123456:5236
SQL> CREATE TABLE TEST
(
user_id INT NULL,
username VARCHAR(40) NULL,
gender VARCHAR(40) NULL
) TABLESPACE TEST; --指定表空间TS_DMOA
##插入测试数据
insert into TEST(user_id, username, gender)
VALUES(1,'张三','男');
insert into TEST(user_id, username, gender)
VALUES(2,'李四','男');
insert into TEST(user_id, username, gender)
VALUES(3,'阿花','女');
insert into TEST(user_id, username, gender)
VALUES(4,'李梅','女');
commit;
4、查询数据是否已经入库
SQL> select * from test;
行号
---------- ----------- -------- ------
1 1 张三 男
2 2 李四 男
3 3 阿花 女
4 4 李梅 女
4.1.2备库查询数据
[dmdba@DW_S ~]$ disql SYSDBA/SYSDBA@192.168.100.102:5236
服务器[LOCALHOST:5236]:处于备库打开状态
登录使用时间
disql V8
SQL> conn TEST/TEST123456:5236
服务器[LOCALHOST:5236]:处于备库打开状态
登录使用时间
SQL> select * from test;
行号
---------- ----------- -------- ------
1 1 张三 男
2 2 李四 男
3 3 阿花 女
4 4 李梅 女
已用时间: 2.918(毫秒). 执行号:101.
SQL> select count(*) from test;
行号
---------- --------------------
1 4
已用时间: 6.115(毫秒). 执行号:102.
结论:DW_P和DW_S的数据完全一致。
4.2主库模拟软件故障自动切换测试
4.2.1软件故障前
4.2.2主库模拟故障
##将机器DW_P上的主库软件关闭
##查询DM的进程
[dmdba@DW_P ~]$ ps -ef |grep dm
##将dmserver和dmwatcher进程KILL
[dmdba@DW_P ~]$ kill -9 26972 27053
4.2.3软件故障后
[dmdba@DW_P bin]$ dmmonitor dmmonitor_manual.ini
此处可见,备库已切换为主库。
4.2.4备库切换为主库后能否正确读写数据
##插入一条测试数据,并查询表
[dmdba@DW_S ~]$ disql TEST/TEST123456:5236
服务器[LOCALHOST:5236]:处于主库打开状态
登录使用时间
disql V8
SQL> insert into TEST(user_id, username, gender)
VALUES(5,'老王','男');
SQL> commit;
操作已执行
已用时间: 4.926(毫秒). 执行号:802.
SQL> select count(*) from test;
行号
---------- --------------------
1 5
结论:DW_S机器自动接管后,由STANDBY库升为PRIMARY库,GRP1_RT_02库可读写。
4.3原主库修复后是否自动加入集群
4.3.1原主库DW_P启动
[dmdba@DW_P bin]$ DmServiceGRP1_RT_01 start
Starting DmServiceGRP1_RT_01: [ OK ]
[dmdba@DW_P bin]$ DmWatcherServiceWatcher start
Starting DmWatcherServiceWatcher: [ OK ]
查看主备库状态
可见原来主库恢复后自动加入集群中。
4.3.2原主库故障修复后,新数据是否同步
##查看DW_P机器上的数据是否同步
[dmdba@DW_P ~]$ disql TEST/TEST123456:5236
服务器[LOCALHOST:5236]:处于备库打开状态
登录使用时间
disql V8
SQL> select count(*) from test;
行号
---------- --------------------
1 5
已用时间: 28.309(毫秒). 执行号:1.
结论:原主库修复后,自动加入集群,数据自动同步过来。
4.4手工切换主备集群
4.4.1切换前主备库状态
4.4.2手工switchover切换
手工切换:执行命令"switchover GRP1.实例名"进行切换。
切换成功,GRP1_RT_01恢复到主库对外提供服务。
4.4.3切换后主备库状态
结论:故障手工切换后,原主库DW_P从STANDBY提升为PRIMARY。
说明
5.1读写分离集群和数据守护集群dmarch.ini的配置区别
- 读写分离集群
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = GRP1_RT_02 #即时归档目标实例名
- 数据守护集群
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = GRP1_RT_02 #实时归档目标实例名
补充:
- 即时归档
即时归档(Timely)在主库将 Redo 日志写入联机日志文件后,通过 MAL 系统将 Redo 日志发送到备库。即时归档与实时归档的主要区别是 Redo 日志的发送时机不同。一个主库可以配置 1~8 个即时备库。
根据备库重演 Redo 日志和响应主库时机的不同,即时归档分为两种模式:事务一致模式和高性能模式。即时归档模式可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置。其中,ARCH_WAIT_APPLY 配置项默认值为 1,表示事务一致模式。
事务一致模式
主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。
高性能模式
与实时归档一样,备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。
- 实时归档
与本地归档写入保存在磁盘中的日志文件不同,实时归档(Realtime)将主库产生的 Redo 日志通过 MAL 系统传递到备库,实时归档是实时主备和 MPP 主备的实现基础。实时归档只在主库生效,一个主库可以配置 1~8 个实时备库。
实时归档的执行流程是,主库在 Redo 日志(RLOG_PKG)写入联机日志文件前,将 Redo 日志发送到备库,备库收到 Redo 日志(RLOG_PKG)后标记为 KEEP_RLOG_PKG,将原 KEEP_RLOG_PKG 加入日志重演任务系统,并马上响应主库,不需要等待 Redo 日志重演结束后再响应主库。主库收到备库的响应消息,确认备库已经收到 Redo 日志后,再将 Redo 日志写入联机日志文件中。
另外,实时归档也可以支持读写分离集群,实时归档也分为两种模式:事务一致模式和高性能模式,可以通过 dmarch.ini 中的 ARCH_WAIT_APPLY 或 WAIT_APPLY 配置项来设置实时归档的模式。实时归档和即时归档这两种模式的具体含义的说明完全相同,区别仅在于配置为实时归档时,dmarch.ini 中的 ARCH_WAIT_APPLY 配置项默认值为 0,即采用高性能模式。
事务一致模式
主库事务提交触发 Redo 日志刷盘和即时归档,备库收到主库发送的 Redo 日志,并重演完成后再响应主库。主库收到备库响应消息后,再响应用户的提交请求。事务一致模式下,同一个事务的 SELECT 语句无论是在主库执行,还是在备库执行,查询结果都满足 READ COMMIT 隔离级要求。
高性能模式
与实时归档一样,备库收到主库发送的 Redo 日志后,马上响应主库,再启动日志重演。高性能模式下,备库与主库的数据同步存在一定延时(一般情况下延迟时间非常短暂,用户几乎感觉不到),不能严格保证事务一致性。
事务一致模式下,主备库之间严格维护事务一致性,但主库要等备库 Redo 日志重演完成后,再响应用户的提交请求,事务提交时间会变长,存在一定的性能损失。高性能模式则通过牺牲事务一致性获得更高的性能和提升系统的吞吐量。用户应该根据实际情况,选择合适的即时归档模式。
5.2 dm_svc.conf的配置区别
同步逻辑是几乎一样,区别主要在于事务分发即读写分离分发比例
读写分离集群可通过配置dm_svc.conf实现事务分发,数据守护没有。
读写分离集群
cat /etc/dm_svc.conf
##以#开头的行表示是注释
##全局配置区
TIME_ZONE=(480) #指明客户端的默认时区 +480东八区
LANGUAGE=(en)
DMRW=(192.168.0.101:5236,192.168.0.102:5236)
##服务配置
[DMRW]
LOGIN_MODE=(1) #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
RW_SEPARATE=(1) #是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
RW_PERCENT=(30) #读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例
SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒
数据守护集群
cat /etc/dm_svc.conf
##以#开头的行表示是注释#
##全局配置区
TIME_ZONE=(480)
LANGUAGE=(cn)
DMHA=(192.168.0.101:5236,192.168.0.102:5236)
##服务配置
[DMHA]
LOGIN_MODE=(1) #0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
SWITCH_TIMES=(60) #以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。
SWITCH_INTERVAL=(1000) #在服务器之间切换的时间间隔,单位为毫秒