本文于 8 天前发布,最后更新于 8 天前
读写分离集群安装部署前需要额外注意操作系统、CPU、网络环境和磁盘 IO 配置情况,其他环境配置项建议请参考安装前准备工作。
心跳网络方面:
- 集群间的心跳网络要走数据,最好走两个交换机,来实现冗余和负载均衡。
- 需要把服务器多个心跳网卡绑定为一个逻辑网卡来使用 (比如 bond 方式)。
- 交换机速度建议至少为千兆。
存储方面:
- 需要在每台机器上挂在独立存储,其中主机所在机器挂载的存储建议大一些。
- 需要格式化好,且所有机器挂载路径保持一致。
- 在空间不够用时,要求支持在挂载目录上直接进行扩充。
- 文件系统建议使用 ext4。
国产化工作开展以来,国产化芯片种类很多,作为数据库集群来说,需要确保各节点服务器的 CPU 一致。不同芯片的性能不同,如果各节点服务器的 CPU 不一致,则会严重影响集群的整体性能,从而影响整体服务响应的效果。在正式生产环境中,建议使用统一配置的服务器。
心跳网络对 mal 通讯系统的影响非常大,如果网络丢包或者延迟较大,则会严重影响 mal 系统的处理能力,从而导致整个集群出现响应服务请求慢的情况。为确保集群的稳定性,网络配置如下:
- 使用千兆或千兆以上网络;
- 集群间的心跳网络需同步数据,建议尽量使用两个交换机构建内网,以实现冗余和负载均衡;
- 建议服务器采用两个网卡绑定为一个逻辑网卡来使用(比如 bond 方式)。
磁盘 IO 的读写速率会极大影响系统性能和用户体验。因此在进行集群安装部署前,应测试 IO 性能能否满足系统功能和性能需求。
IO 性能指标与系统的并发数、热点数据等因素往往密切相关。在数据守护集群,尤其生产系统中,推荐使用高性能 SSD 磁盘,以获得更佳性能,保证集群数据的实时同步。
读写分离集群规划
|
A 机器 |
B 机器 |
C 机器 |
业务 IP |
172.16.1.1 |
172.16.1.2 |
172.16.1.3 |
心跳 IP |
192.168.1.1 |
192.168.1.2 |
192.168.1.3 |
实例名 |
RWC1_01 |
RWC1_01B |
RWC1_02B |
实例端口 |
5236 |
5236 |
5236 |
MAL 端口 |
5336 |
5336 |
5336 |
MAL 守护进程端口 |
5436 |
5436 |
5436 |
守护进程端口 |
5536 |
5536 |
5536 |
OGUID |
45331 |
守护组 |
GRWC1 |
安装目录 |
/opt/dmdbms |
实例目录 |
/dmdata |
归档上限 |
51200 |
确认监视器 IP |
10.10.10.10 |
| --初始化实例 |
| [dmdba@~]# /opt/dmdbms/bin/dminit PATH=/dmdata INSTANCE_NAME=RWC1_01 PAGE_SIZE=32 LOG_SIZE=2048 |
| |
| --前台启动 |
| [dmdba@~]# /opt/dmdbms/bin/dmserver /dmdata/DAMENG/dm.ini |
| |
| --另开窗口 - 连接数据库 - 开启归档日志 |
| [dmdba@~]# /opt/dmdbms/bin/disql SYSDBA/SYSDBA@172.16.1.1:5236 |
| SQL> ALTER DATABASE MOUNT; |
| SQL> ALTER DATABASE ARCHIVELOG; |
| SQL> ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=51200'; |
| SQL> ALTER DATABASE OPEN; |
| |
| --关闭前台实例服务 - 然后使用dmrman进行冷备 |
| [dmdba@~]# /opt/dmdbms/bin/dmrman |
| RMAN> BACKUP DATABASE '/dmdata/DAMENG/dm.ini' BACKUPSET '/dmbak/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); |
| SQL> SP_SET_PARA_VALUE (2,'ENABLE_OFFLINE_TS',2); |
| SQL> SP_SET_PARA_VALUE (2,'MAL_INI',1); |
| SQL> SP_SET_PARA_VALUE (2,'TIMER_INI',1); |
| SQL> SP_SET_PARA_VALUE (2,'RLOG_SEND_APPLY_MON',64); |
| [dmdba@~] |
| ARCH_WAIT_APPLY = 1 |
| [ARCHIVE_LOCAL] |
| ARCH_TYPE = LOCAL |
| ARCH_DEST = /dmarch/ |
| ARCH_FILE_SIZE = 1024 |
| ARCH_SPACE_LIMIT = 51200 |
| [ARCHIVE_TIMELY1] |
| ARCH_TYPE = TIMELY |
| ARCH_DEST = RWC1_01B |
| [ARCHIVE_ASYNC] |
| ARCH_TYPE = ASYNC |
| ARCH_DEST = RWC1_02B |
| ARCH_TIMER_NAME = RT_TIMER |
| [dmdba@~] |
| MAL_CHECK_INTERVAL = 10 |
| MAL_CONN_FAIL_INTERVAL = 10 |
| MAL_TEMP_PATH = /dmdata/malpath/ |
| MAL_BUF_SIZE = 512 |
| MAL_SYS_BUF_SIZE = 2048 |
| MAL_COMPRESS_LEVEL = 0 |
| |
| [MAL_INST1] |
| MAL_INST_NAME = RWC1_01 |
| MAL_HOST = 192.168.1.1 |
| MAL_PORT = 5336 |
| MAL_INST_HOST = 172.16.1.1 |
| MAL_INST_PORT = 5236 |
| MAL_DW_PORT = 5436 |
| MAL_INST_DW_PORT = 5536 |
| [MAL_INST2] |
| MAL_INST_NAME = RWC1_01B |
| MAL_HOST = 192.168.1.2 |
| MAL_PORT = 5336 |
| MAL_INST_HOST = 172.16.1.2 |
| MAL_INST_PORT = 5236 |
| MAL_DW_PORT = 5436 |
| MAL_INST_DW_PORT = 5536 |
| [MAL_INST3] |
| MAL_INST_NAME = RWC1_02B |
| MAL_HOST = 192.168.1.3 |
| MAL_PORT = 5336 |
| MAL_INST_HOST = 172.16.1.3 |
| MAL_INST_PORT = 5236 |
| MAL_DW_PORT = 5436 |
| MAL_INST_DW_PORT = 5536 |
| [dmdba@~] |
| [GRWC1] |
| DW_TYPE = GLOBAL |
| DW_MODE = AUTO |
| DW_ERROR_TIME = 20 |
| INST_ERROR_TIME = 20 |
| INST_RECOVER_TIME = 60 |
| INST_OGUID = 45331 |
| INST_INI = /dmdata/DAMENG/dm.ini |
| INST_AUTO_RESTART = 1 |
| INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver |
| RLOG_SEND_THRESHOLD = 0 |
| RLOG_APPLY_THRESHOLD = 0 |
| [dmdba@~] |
| |
| [RT_TIMER] |
| TYPE = 2 |
| FREQ_MONTH_WEEK_INTERVAL = 1 |
| FREQ_SUB_INTERVAL = 1 |
| FREQ_MINUTE_INTERVAL = 1 |
| START_TIME = 00:00:00 |
| END_TIME = 00:00:00 |
| DURING_START_DATE = 2020-01-01 01:01:01 |
| DURING_END_DATE = 9999-12-31 23:59:59 |
| NO_END_DATE_FLAG = 1 |
| DESCRIBE = RT TIMER |
| IS_VALID = 1 |
| |
| [dmdba@~] |
| |
| [RT_TIMER] |
| TYPE = 2 |
| FREQ_MONTH_WEEK_INTERVAL = 1 |
| FREQ_SUB_INTERVAL = 0 |
| FREQ_MINUTE_INTERVAL = 0 |
| START_TIME = 02:00:00 |
| END_TIME = 02:00:00 |
| DURING_START_DATE = 2020-01-01 01:01:01 |
| DURING_END_DATE = 9999-12-31 23:59:59 |
| NO_END_DATE_FLAG = 1 |
| DESCRIBE = RT TIMER |
| IS_VALID = 1 |
| --拷贝实例到B机器、C机器 |
| [dmdba@~]# scp -r /dmdata/DAMENG dmdba@192.168.1.2:/dmdata/ |
| [dmdba@~]# scp -r /dmdata/DAMENG dmdba@192.168.1.3:/dmdata/ |
| --注册dmserver服务 |
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p RWC1_01 -dm_ini /dmdata/DAMENG/dm.ini -m mount |
| --注册dmwatcher服务 |
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini |
| |
| --备注:删除自启 |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceRWC1_01 |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher |
| [dmdba@~] |
| INSTANCE_NAME = RWC1_01B |
| [dmdba@~] |
| ARCH_WAIT_APPLY = 1 |
| [ARCHIVE_LOCAL] |
| ARCH_TYPE = LOCAL |
| ARCH_DEST = /dmarch/ |
| ARCH_FILE_SIZE = 1024 |
| ARCH_SPACE_LIMIT = 51200 |
| [ARCHIVE_TIMELY1] |
| ARCH_TYPE = TIMELY |
| ARCH_DEST = RWC1_01 |
| [ARCHIVE_ASYNC] |
| ARCH_TYPE = ASYNC |
| ARCH_DEST = RWC1_02B |
| ARCH_TIMER_NAME = RT_TIMER |
与 A 机器 RWC1_01 的 dmmal.ini、dmwatcher.ini、dmtimer.ini 相同
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p RWC1_01B -dm_ini /dmdata/DAMENG/dm.ini -m mount |
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini |
| |
| --备注:删除自启 |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceRWC1_01B |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher |
| [dmdba@~]# /opt/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'" |
| [dmdba@~]# /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/opt/dmdbms/data/DAMENG/bak/BACKUP_FILE'" |
| [dmdba@~]# /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC" |
| [dmdba@~] |
| INSTANCE_NAME = RWC1_02B |
| [dmdba@~] |
| [ARCHIVE_LOCAL] |
| ARCH_TYPE = LOCAL |
| ARCH_DEST = /dmarch/ |
| ARCH_FILE_SIZE = 1024 |
| ARCH_SPACE_LIMIT = 51200 |
| [dmdba@~] |
| [GRWC1] |
| DW_TYPE = LOCAL |
| DW_MODE = MANUAL |
| DW_ERROR_TIME = 20 |
| INST_ERROR_TIME = 20 |
| INST_OGUID = 45331 |
| INST_INI = /dmdata/DAMENG/dm.ini |
| INST_AUTO_RESTART = 1 |
| INST_STARTUP_CMD = /opt/dmdbms/bin/dmserver |
与 A 机器 RWC1_01 的 dmmal.ini、dmtimer.ini 相同
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p RWC1_02B -dm_ini /dmdata/DAMENG/dm.ini -m mount |
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmwatcher -p Watcher -watcher_ini /dmdata/DAMENG/dmwatcher.ini |
| |
| --备注:删除自启 |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmServiceRWC1_02B |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmWatcherServiceWatcher |
| [dmdba@~]# /opt/dmdbms/bin/dmrman CTLSTMT="RESTORE DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmbak/BACKUP_FILE'" |
| [dmdba@~]# /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' FROM BACKUPSET '/dmbak/BACKUP_FILE'" |
| [dmdba@~]# /opt/dmdbms/bin/dmrman CTLSTMT="RECOVER DATABASE '/dmdata/DAMENG/dm.ini' UPDATE DB_MAGIC" |
- 在各节点数据库的 bin 目录中 存放非确认监视器配置文件。
- 在确认监视器机器上(非集群节点) 注册确认监视器自启服务。
| [dmdba@~] |
| MON_DW_CONFIRM = 1 |
| MON_LOG_PATH = /opt/dmdbms/log |
| MON_LOG_INTERVAL = 60 |
| MON_LOG_FILE_SIZE = 512 |
| MON_LOG_SPACE_LIMIT = 2048 |
| |
| [GRWC1] |
| MON_INST_OGUID = 45331 |
| MON_DW_IP = 192.168.1.1:5436 |
| MON_DW_IP = 192.168.1.2:5436 |
| MON_DW_IP = 192.168.1.3:5436 |
| [root@~]# /opt/dmdbms/script/root/dm_service_installer.sh -t dmmonitor -p Monitor -monitor_ini /dmdata/DAMENG/dmmonitor.ini |
| |
| --备注:删除自启 |
| [root@~]# /opt/dmdbms/script/root/dm_service_uninstaller.sh -n DmMonitorServiceMonitor |
命令 |
含义 |
list |
查看守护进程的配置信息 |
show global info |
查看所有实例组的信息 |
tip |
查看系统当前运行状态 |
login |
登录监视器 |
logout |
退出登录 |
choose switchover GRP1 |
主机正常:查看可切换为主机的实例列表 |
switchover GRP1. 实例名 |
主机正常:使用指定组的指定实例,切换为主机 |
choose takeover GRP1 |
主机故障:查看可切换为主机的实例列表 |
takeover GRP1. 实例名 |
主机故障:使用指定组的指定实例,切换为主机 |
choose takeover force GRP1 |
强制切换:查看可切换为主机的实例列表 |
takeover force GRP1. 实例名 |
强制切换:使用指定组的指定实例,切换为主机 |
备注:主机故障后,在备机执行 SELECT SF_DW_CHECK_TAKEOVER();
【1: 可接管 0: 不可接管】
| [dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_01 start |
| [dmdba@~]# /opt/dmdbms/bin/disql SYSDBA/SYSDBA@172.16.1.1:5236 |
| SQL> SP_SET_OGUID(45331); |
| SQL> ALTER DATABASE PRIMARY; |
| [dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_01B start |
| [dmdba@~]# /opt/dmdbms/bin/disql SYSDBA/SYSDBA@172.16.1.2:5236 |
| SQL> SP_SET_OGUID(45331); |
| SQL> ALTER DATABASE STANDBY; |
| [dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_02B start |
| [dmdba@~]# /opt/dmdbms/bin/disql SYSDBA/SYSDBA@172.16.1.3:5236 |
| SQL> SP_SET_OGUID(45331); |
| SQL> ALTER DATABASE STANDBY; |
A/B/C 机器
备注:
前台启动:
[dmdba@~]# /opt/dmdbms/bin/dmmonitor /opt/dmdbms/bin/dmmonitor.ini
启动:A 机器 RWC1_01 主库→B 机器 RWC1_01B 备库→C 机器 RWC1_02B 备库→A/B/C 机器数据库进程
启动各数据库进程【按顺序】
| A机器:[dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_01 start |
| B机器:[dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_01B start |
| C机器:[dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_02B start |
启动 A/B/C 机器守护进程
停止:A/B/C 机器守护进程→A 机器 RWC1_01 主库→B 机器 RWC1_01B 备库→C 机器 RWC1_02B 备库
停止 A/B/C 机器守护进程
停止各机器数据库进程【按顺序】
| A机器:[dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_01 stop |
| B机器:[dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_01B stop |
| C机器:[dmdba@~]# /opt/dmdbms/bin/DmServiceRWC1_02B stop |
Linux 环境:dm_svc.conf 放在应用服务器 /etc 目录下。
Windows32 环境:dm_svc.conf 放在应用服务器 System32 目录下。
Windows64 环境:dm_svc.conf 放在应用服务器 System32 和 SysWOW64 目录下。
| [root@~] |
| TIME_ZONE=(+8:00) |
| LANGUAGE=(cn) |
| RWC1=(172.16.1.1:5236,172.16.1.2:5236) |
| |
| [RWC1] |
| LOGIN_MODE=(1) |
| RW_SEPARATE=(1) |
| RW_PERCENT=(25) |
| SWITCH_TIME=(300) |
| SWITCH_INTERVAL=(200) |
| <DRIVER>dm.jdbc.driver.DmDriver</DRIVER> |
| <URL>jdbc:dm://RWC1</URL> |