一、安装前准备
1.1 硬件环境建议
读写分离集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况,其他环境配置项建议请参考安装前准备工作。
1.1.1 网络环境
心跳网络对 mal 通讯系统的影响非常大,如果网络丢包或者延迟较大,则会严重影响 mal 系统的处理能力,从而导致整个集群出现响应服务请求慢的情况。为确保集群的稳定性,网络配置如下:
- 使用千兆或千兆以上网络;
- 集群间的心跳网络需同步数据,建议尽量使用两个交换机构建内网,以实现冗余和负载均衡;
- 建议服务器采用两个网卡绑定为一个逻辑网卡来使用(比如 bond 方式)。
1.1.2 磁盘 IO
磁盘 IO 的读写速率会极大影响系统性能和用户体验。因此在进行集群安装部署前,应测试 IO 性能能否满足系统功能和性能需求。
IO 性能指标与系统的并发数、热点数据等因素往往密切相关。在读写分离集群,尤其生产系统中,推荐使用高性能 SSD 磁盘,以获得更佳性能,保证集群数据的实时同步。
1.2.集群规划
不管几个节点,建议所有的节点数据库名都配置成一致的。
A机(读写) | B机(读) | |
---|---|---|
业务 IP | 192.168.40.130 | 192.168.40.140 |
心跳 IP | 192.168.183.50 | 192.168.183.60 |
实例名 | top01 | top02 |
实例端口 | 5236 | 5236 |
MAL 端口 | 5336 | 5336 |
MAL 守护进程端口 | 5436 | 5436 |
守护进程端口 | 5536 | 5536 |
OGUID | 45331 | 45331 |
守护组 | grp1 | grp1 |
安装目录 | /dmdb8/dmdbms | /dmdb8/dmdbms |
实例目录 | /dmdb8/dmdata | /dmdb8/dmdata |
归档上限 | 51200 | 51200 |
确认监视器 IP 为 10.10.10.10。
生产建议(MAL)和业务使用的分开,且做网口级别的bond冗余
MAL_HOST:内部通讯
MAL_INST_HOST:对外服务
1.3.集群架构
搭建的读写分离集群架构如下图:
1.4.切换模式说明
该文档采用故障手动切换方式
故障切换方式 | dmarch | dmwatcher | dmmonitor | 监视器要求 |
---|---|---|---|---|
故障手动切换 | ARCH_WAIT_APP | |||
LY=0 | DW_MODE= | |||
MANUAL | MON_DW_CON | |||
FIRM=0 | 1、手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 | |||
故障自动切换 | ARCH_WAIT_APP | |||
LY= 1 | DW_MODE= | |||
AUTO | MON_DW_CON | |||
FIRM=1 | 2、自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。 |
- ARCH_WAIT_APPLY 参数,设置为 0:高性能模式;设置为 1:事务一致模式。
- 故障手动切换情境下 ARCH_WAIT_APPLY 只能为 0。故障自动切换情境下 ARCH_WAIT_APPLY 可以为 0,也可以为 1。
- ARCH_WAIT_APPLY 参数设置的判断依据为业务是否要查询备机最新数据。如果需要,则配置为 1(较大性能衰减);如果不需要,则配置为 0。
二.集群搭建
前提2个节点都已安装数据库软件
2.1 配置主库A机(读写)
2.1.1 初始化实例并备份数据
- 初始化实例
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/dminit PATH=/dmdb8/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CASE_SENSITIVE=1 CHARSET=1 LENGTH_IN_CHAR=0 INSTANCE_NAME=top01 PORT_NUM=5236
参数解释
PAGE_SIZE:
EXTENT_SIZE:
LOG_SIZE:日志文件大小
CASE_SENSITIVE:建议从 MYSQL 和 SQLSERVER 迁移过来的系统,使用大小写不敏感,ORACLE 迁移过来的系统,使用大小写敏感,默认为区分。取值:Y、y、1 表示敏感;N、n、0 表示不敏感。默认值为 Y 。
CHARSET/UNICODE_FLAG:0 代表 GB18030,1 代表 UTF-8,2 代表韩文字符集 EUC-KR。默认为 0
DB_NAME:初始化数据库名称,默认为 DAMENG
INSTANCE_NAME:初始化数据库实例名称,默认为 DMSERVER
PORT_NUM:数据库端口号,默认5236
LENGTH_IN_CHAR:VARCHAR 类型对象的长度是否以字符为单位。取值为 1 或者 Y 表示是,取值为 0 或 N 表示否。默认值为 0
- 启动服务
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/dmserver /dmdb8/dmdata/DAMENG/dm.ini
- 开启归档
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.130:5236
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmdb8/dmarch/DAMENG, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200';
SQL> ALTER DATABASE OPEN;
- 备份数据
SQL> BACKUP DATABASE BACKUPSET '/dmdb8/dmbak/DAMENG/BACKUP_FILE';
- 修改 dm.ini
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); --接收守护进程消息超时时间
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0); --不允许手工方式修改实例模式/状态/OGUID
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2); --不允许备库OFFLINE表空间
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1); --打开MAL系统
SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1); --打开归档配置
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64); --统计最近64次的日志发送信息
- 关闭前台实例服务
SQL> shutdown immediate;
2.1.2 修改 dmarch.ini
Copy[dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdb8/dmarch/DAMENG #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = top02 #即时归档目标实例名
2.1.3 创建 dmmal.ini
[dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmmal.ini
MAL_CHECK_INTERVAL = 10 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 10 #判定 MAL 链路断开的时间
MAL_TEMP_PATH = /dmdb8/dmdata/DAMENG/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 = top01 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 192.168.183.50 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.40.130 #实例的对外服务 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 = top02 #实例名,和 dm.ini 的 INSTANCE_NAME 一致
MAL_HOST = 192.168.183.60 #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 5336 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = 192.168.40.140 #实例的对外服务 IP 地址
MAL_INST_PORT = 5236 #实例对外服务端口,和 dm.ini 的 PORT_NUM 一致
MAL_DW_PORT = 5436 #实例对应的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 5536 #实例监听守护进程 TCP 连接的端口
生产建议(MAL)和业务使用的分开,且做网口级别的bond冗余
MAL_HOST:内部通讯
MAL_INST_HOST:对外服务
2.1.4 创建 dmwatcher.ini
[dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmwatcher.ini
[GRP1]
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 = /dmdb8/dmdata/DAMENG/dm.ini #dm.ini 文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = /dmdb8/dmdbms/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
2.1.5 拷贝备份文件
##拷贝备份文件到 192.168.40.140 机器
[dmdba@~]$ scp -r /dmdb8/dmbak/DAMENG/BACKUP_FILE dmdba@192.168.40.140:/dmdb8/dmbak
2.1.6 注册服务
[root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top01 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
[root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
若要删除自启,可利用如下方式:
[root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmServicetop01
[root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
补充:注册服务过程如下:
[root@localhost DAMENG]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top01 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicetop01.service to /usr/lib/systemd/system/DmServicetop01.service.
Finished to create the service (DmServicetop01)
[root@localhost DAMENG]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service.
Finished to create the service (DmWatcherServiceWatcher)
2.2 配置 B 机器
2.2.1 初始化实例
[dmdba@~]$ /dmdb8/dmdbms/bin/dminit PATH=/dmdb8/dmdata PAGE_SIZE=32 EXTENT_SIZE=32 LOG_SIZE=2048 CASE_SENSITIVE=1 CHARSET=1 LENGTH_IN_CHAR=0 INSTANCE_NAME=top02 PORT_NUM=5236
2.2.2 恢复数据
[dmdba@~]$ /dmdb8/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdb8/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdb8/dmbak/BACKUP_FILE'"
[dmdba@~]$ /dmdb8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdb8/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmdb8/dmbak/BACKUP_FILE'"
[dmdba@~]$ /dmdb8/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdb8/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC"
2.2.3 替换 dmarch.ini
[dmdba@~]$ vi /dmdb8/dmdata/DAMENG/dmarch.ini
ARCH_WAIT_APPLY = 0 #0:高性能 1:事务一致
[ARCHIVE_LOCAL]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = /dmdb8/dmarch/DAMENG/ #本地归档存放路径
ARCH_FILE_SIZE = 1024 #单个归档大小,单位 MB
ARCH_SPACE_LIMIT = 51200 #归档上限,单位 MB
[ARCHIVE_TIMELY1]
ARCH_TYPE = TIMELY #即时归档类型
ARCH_DEST = top01 #即时归档目标实例名
2.2.4 配置 dm.ini、dmmal.ini 和 dmwatcher.ini
配置 dm.ini
在 B 机器上配置备库的实例名为 top02,dm.ini 参数修改如下:
SQL> SP_SET_PARA_VALUE (2,'PORT_NUM',5236);
SQL> SP_SET_PARA_VALUE (2,'DW_INACTIVE_INTERVAL',60); --接收守护进程消息超时时间
SQL> SP_SET_PARA_VALUE (2,'ALTER_MODE_STATUS',0); --不允许手工方式修改实例模式/状态/OGUID
SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2); --不允许备库OFFLINE表空间
SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1); --打开MAL系统
SQL> SP_SET_PARA_VALUE (2,'ARCH_INI',1); --打开归档配置
SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64); --统计最近64次的日志发送信息
配置 dmmal.ini 和 dmwatcher.ini
B 机器里 dmmal.ini、dmwatcher.ini 与 A 机器 top01 的 dmmal.ini、dmwatcher.ini 相同,参照 A 机器 dmmal.ini、dmwatcher.ini 文件进行配置。
补充:
主备库的dmmal.ini配置是一致的;dmwatcher.ini里主备的配置文件路径、命令行方式启动的路径一致的话,dmwatcher.ini一致,建议相关路径一致;特殊情况备库RLOG_APPLY_THRESHOLD 如指定备库重演日志的时间阈值,如果有需要开启的话,需在备库配置。
2.2.5 注册服务
[root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top02 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
[root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
若要删除自启,可利用如下方式:
Copy[root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmServicetop02
[root@~]# /dmdb8/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher
注册服务过程:
[root@localhost dmbak]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmserver -p top02 -dm_ini /dmdb8/dmdata/DAMENG/dm.ini -m mount
Created symlink from /etc/systemd/system/multi-user.target.wants/DmServicetop02.service to /usr/lib/systemd/system/DmServicetop02.service.
Finished to create the service (DmServicetop02)
[root@localhost dmbak]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdb8/dmdata/DAMENG/dmwatcher.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmWatcherServiceWatcher.service to /usr/lib/systemd/system/DmWatcherServiceWatcher.service.
Finished to create the service (DmWatcherServiceWatcher)
2.3 配置监视器
- 手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。
- 自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。
2.3.1 创建 dmmonitor.ini
[dmdba@~]$ vi /dmdb8/dmdbms/bin/dmmonitor.ini
MON_DW_CONFIRM = 0 #0:非确认(故障手切) 1:确认(故障自切)
MON_LOG_PATH = ../log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 512 #单个日志大小,单位 MB
MON_LOG_SPACE_LIMIT = 2048 #日志上限,单位 MB
[GRP1]
MON_INST_OGUID = 45331 #组 GRP1 的唯一 OGUID 值
MON_DW_IP = 192.168.183.50:5436 #IP 对应 MAL_HOST,PORT 对应 MAL_DW_PORT
MON_DW_IP = 192.168.183.60:5436
同步传输 dmmonitor.ini至192.168.40.140备节点
scp /dmdb8/dmdbms/bin/dmmonitor.ini dmdba@192.168.40.140:/dmdb8/dmdbms/bin/dmmonitor.ini
2.3.2 注册服务(选做)
[root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdb8/dmdbms/bin/dmmonitor.ini
若要删除自启,可利用如下方式:
[root@~]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -n DmMonitorServiceMonitor
补充:注册服务过程
[root@localhost bin]# /dmdb8/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdb8/dmdbms/bin/dmmonitor.ini
Created symlink from /etc/systemd/system/multi-user.target.wants/DmMonitorServiceMonitor.service to /usr/lib/systemd/system/DmMonitorServiceMonitor.service.
Finished to create the service (DmMonitorServiceMonitor)
2.3.3 监视器使用
进入监视器。
安装目录的bin目录下 ./dmmonitor 加上dmmonitor.ini路径
若ini也在bin目录,可直接执行 ./dmmonitor dmmonitor.ini
cd /dmdb8/dmdbms/bin
./dmmonitor /dmdb8/dmdbms/bin/dmmonitor.ini
可视情况执行如下命令:
命令 | 含义 |
---|---|
list | 查看守护进程的配置信息 |
show global info | 查看所有实例组的信息 |
tip | 查看系统当前运行状态 |
login | 登录监视器 |
logout | 退出登录 |
choose switchoverGRP1 | 主机正常:查看可切换为主机的实例列表 |
switchoverGRP1.实例名 | 主机正常:使用指定组的指定实例,切换为主机 |
choose takeoverGRP1 | 主机故障:查看可切换为主机的实例列表 |
takeoverGRP1.实例名 | 主机故障:使用指定组的指定实例,切换为主机 |
choose takeover force GRP1 | 强制切换:查看可切换为主机的实例列表 |
takeover force GRP1.实例名 | 强制切换:使用指定组的指定实例,切换为主机 |
主机故障后,在备机执行 SELECT SF_DW_CHECK_TAKEOVER(); 【1:可接管;0:不可接管】。
2.4 启动服务及查看信息
2.4.1 启动数据库并修改参数
##40.130 机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop01 start
[dmdba@~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.130:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE PRIMARY;
##B 机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop02 start
[dmdba@~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@192.168.40.140:5236
SQL> SP_SET_OGUID(45331);
SQL> ALTER DATABASE STANDBY;
2.4.2 启动守护进程
##A/B机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher start
--查看状态
/dmdb8/dmdbms/bin/DmWatcherServiceWatcher status
--若注册的有系统服务,可使用以下方法:
systemctl start DmWatcherServiceWatcher
systemctl status DmWatcherServiceWatcher
systemctl enable DmWatcherServiceWatcher
2.4.3 启动监视器
##后台启动
[dmdba@~]$ /dmdb8/dmdbms/bin/DmMonitorServiceMonitor start
--查看状态
[dmdba@~]$ /dmdb8/dmdbms/bin/DmMonitorServiceMonitor status
##前台启动
[dmdba@~]$ /dmdb8/dmdbms/bin/dmmonitor /dmdb8/dmdbms/bin/dmmonitor.ini
--若注册的有系统服务,可使用以下方法:
systemctl start DmMonitorServiceMonitor
systemctl status DmMonitorServiceMonitor
systemctl enable DmMonitorServiceMonitor
2.5 启停集群
##启动
##A/B 机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher start
##停止
##A/B机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmWatcherServiceWatcher stop
##A 机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop01 stop
##B机器
[dmdba@~]$ /dmdb8/dmdbms/bin/DmServicetop02 stop
三.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?dmsvcconf=/home/dmdba/dm_svc.conf
dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配置所有的配置项,服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区(服务配置区的相同配置项会覆盖全局配置区对应的配置项)。
3.2 常用配置项介绍
- 服务名
用于连接数据库的服务名,参数值格式为:
服务名=(IP[:PORT],IP[:PORT],…)。
- TIME_ZONE
指明客户端的默认时区设置范围为:-779~840M,如 60 对应 +1:00 时区,+480 对于东八区,如果不做配置默认是操作系统的时区。
- KEYWORDS
该参数可以用于屏蔽数据库关键字,如果数据库关键字在 SQL 语句中以单词的形式存在,无法识别需要加上双引号或者可以通过该参数来屏蔽关键字,建议大小写都写入参数中。
屏蔽后如果sql中有关键字执行sql会报错语法分析出错,所以建议表名、表字段等尽量不要出现关键字。
例如:KEYWORDS=(versions,VERSIONS,type,TYPE)
- LOGIN_MODE
指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库,NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库;2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库,PRIMARY 模式次之,最后选择 STANDBY 模式。
注意
在 2021 年版本之后,此参数的默认值由 0 变更为 4。该参数详细介绍及使用办法请参考《DM 数据守护与读写分离集群》-5.8 章节。手册位于数据库安装路径 /dmdbms/doc 文件夹。
- SWITCH_TIMES
表示以服务名连接数据库时,若未找到符合条件的库成功建立连接,将尝试遍历服务名中库列表的次数。有效值范围 1~9223372036854775807,默认值为 1,可以设置至少 3 次用来避免由于网卡的波动,造成数据库连接测频繁切换。
- SWITCH_INTERVAL
表示在服务器之间切换的时间间隔,单位为毫秒,有效值范围 1~9223372036854775807。与参数 SWITCH_TIMES、EP_SELECTOR 配合使用,EP_SELECTOR 设置为 0,等待 SWITCH_INTERVAL 后会切换尝试连接下一个服务器,EP_SELECTOR 设置为 1,等待 SWITCH_INTERVAL 后会继续尝试连接该服务器,直到 SWITCH_TIMES 次再切换下一个服务器。
- RW_SEPARATE
表示是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端进行选择,且只会选择服务名中配置的节点。
- RW_PERCENT
表示读写分离分发比例,有效值范围 0~100,主库占所有事物数的比例。可以根据主备库的实际压力来设定。
- EP_SELECTOR
表示连接数据库时采用何种模型建立连接,0:依次选取列表中的不同节点建立连接,使得所有连接均匀地分布在各个节点上,1:选择列表中最前面的节点建立连接,只有当前节点无法建立连接时才会选择下一个节点进行连接。缺省值0
- AUTO_RECONNECT
表示连接发生异常或一些特殊场景下连接处理策略。0:关闭连接,1:当连接发生异常时自动切换到其他库,无论切换成功还是失败都会抛一个 SQLEXCEPTION,用于通知上层应用进行事务执行失败时的相关处理;2 配合 EP_SELECTOR=1 使用,如果服务名列表前面的节点恢复了,将当前连接切换到前面的节点上,可以根据应用的实际要求设定。缺省值0
3.3 常用配置
dbeaver不支持
3.3.1 单机配置
配置示例
##以#开头的行表示是注释
##全局配置区
TIME_ZONE=(480)
LANGUAGE=(en)
DM=(192.168.40.130:5236)
连接示例:
- Disql 连接:
[dmdba@localhost~]$/dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@DM
- 通过管理工具连接:
3.2.2 读写分离集群配置
- 配置示例
1.服务器上配置
cat /etc/dm_svc.conf
##以#开头的行表示是注释
##全局配置区
TIME_ZONE=(480) #指明客户端的默认时区 +480东八区
LANGUAGE=(en)
DMRW=(192.168.40.130:5236,192.168.40.140: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) #在服务器之间切换的时间间隔,单位为毫秒
建议使用服务名连接是为了防止当集群发生切换时应用连接不到切换后的主库。默认主备集群是连接到主库进行读和写操作的,备库只是在灾备库。
2.客户端配置
win64:C:\Windows\System32\dm_svc.conf
##以#开头的行表示是注释
##全局配置区
TIME_ZONE=(480) #指明客户端的默认时区 +480东八区
LANGUAGE=(en)
DMRW=(192.168.40.130:5236,192.168.40.140: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) #在服务器之间切换的时间间隔,单位为毫秒
3.manager连接工具连接
- jdbc 连接串
jdbc:dm://DMRW
jdbc:dm://DM?DM=(192.168.40.130:5236)
参考链接:https://eco.dameng.com/document/dm/zh-cn/ops/RWC-installation-cluster.html#1.2%20%E9%9B%86%E7%BE%A4%E8%A7%84%E5%88%92
3.4.问题处理
读写分离架构下数据库连接工具连接失败
问题描述
主备、客户端/etc/dm_svc.conf 文件配置如下:
[dmdba@localhost ~]$ cat /etc/dm_svc.conf
##全局配置区
TIME_ZONE=(480) #指明客户端的默认时区 +480东八区
LANGUAGE=(en)
DMRW=(192.168.40.130:5236,192.168.40.140: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) #在服务器之间切换的时间间隔,单位为毫秒
--服务器上访问正常
[dmdba@localhost ~]$ /dmdb8/dmdbms/bin/disql SYSDBA/SYSDBA@DMRW
Server[192.168.40.130:5236]:mode is primary, state is open
login used time : 10.786(ms)
disql V8
解决办法
客户端需配置
win64:C:\Windows\System32\dm_svc.conf
配置后manager连接工具需重启
参考链接:https://eco.dameng.com/document/dm/zh-cn/ops/RWC-installation-cluster.html