背景:
这是小菜鸟第一次尝试搭建达梦数据库的主备集群,使用的是VMware下安装三个CentOS7的虚拟机,每个虚拟机都安装DM8数据库,安装目录是/dm8。
一定要说的事:
1、三个虚拟机就叫他主机、备机、监视器吧,其中主机和备机需要创建数据库实例,监视器不需要,主机和备机的实例名不要一样,实例名(INSTANCE_NAME)就是那个默认叫DMSERVER的东西。
2、开始前先看看三台机器的ip,并确保可以互相ping通,比如我的三个虚拟机ip分别是192.168.116.129、192.168.116.130、192.168.116.131,分别是主机、备机、监视器。
步骤:
第一步:同步数据
脱机备份主机数据并在备机上还原,请确保数据库实例被关闭,关闭方式:在数据库安装目录/bin下面执行“./DmService+你的实例名 stop”。什么?你问我为啥要关闭服务?脱机!脱机!什么叫脱机啊?战术后仰(=,=)~ 为啥要脱机备份?因为脱机情况下,数据库在备份过程中不会有新的操作和数据,可以保证数据的绝对一致性。 联机备份行不行?也可以,这不是初次尝试嘛,要什么自行车,详细情况可以参考dm8安装目录下doc目录下的《DM8数据守护与读写分离集群V4.0.pdf》。
使用dmrman工具对数据库进行脱机备份,在/dm8/bin目录下执行命令:
./dmrman CTLSTMT="BACKUP DATABASE 'dm安装装目录/data/实例名/dm.ini' FULL TO 文件名 BACKUPSET '备份目录名'" 。
这样在你输入的目录下面就有了备份文件,把这个备份目录整个发送到备机,注意发送的是目录!执行命令(先把备机的防火墙关了):
scp -r 主机的备份目录 备机的ip+冒号+备机的目标目录
在备机上进行数据还原与更新,在备机dm的安装目录/bin下面执行三个命令:
./dmrman ctlstmt="restore database 'dm的安装目录/data/实例名/dm.ini' from backupset '拷过来的备份目录'"
./dmrman ctlstmt="recover database 'dm的安装目录/data/实例名/dm.ini' from backupset '拷过来的备份目录'"
./dmrman ctlstmt="recover database 'dm的安装目录/data/实例名/dm.ini' update db_magic"
第二步:配置主机
1、在主机dm的安装目录下/data/实例名下可以找到dm.ini文件,vi dm.ini编辑修改以下参数:
INSTANCE_NAME= 你的实例名 ps:一般是对应的,不需要修改
ARCH_INI=1
MAL_INI=1
ALTER_MODE_STATUS= 0
ENABLE_OFFLINE_TS = 2
一般情况下,dm.ini文件很长,怎么快速找到这几个参数呢,在用vim编辑文件时,在命令模式(就是最后保存文件输入:wq那种模式,esc键可以切换到的那个)输入问号+要找的参数(区分大小写)按回车既可以快速找到了,例如:
修改完成后可以在命令行精确的查看文件的参数是否准确,如:
2、 配置dmmal.ini,在dm.ini文件相同的目录下新建dmmal.ini:
MAL_CHECK_INTERVAL = 5 #MAL 链路检测时间间隔
MAL_CONN_FAIL_INTERVAL = 5 #判定 MAL 链路断开的时间
[MAL_INST1] #主机
MAL_INST_NAME = #实例名,和 dm.ini 中的 INSTANCE_NAME 一致
MAL_HOST = #MAL 系统监听 TCP 连接的 IP 地址
MAL_PORT = 61141 #MAL 系统监听 TCP 连接的端口
MAL_INST_HOST = #实例的对外服务 IP 地址
MAL_INST_PORT = 32141 #实例的对外服务端口,和 dm.ini 中的 PORT_NUM 一致
MAL_DW_PORT = 52141 #实例本地的守护进程监听 TCP 连接的端口
MAL_INST_DW_PORT = 33141 #实例监听守护进程 TCP 连接的端口
[MAL_INST2] #备机
MAL_INST_NAME =
MAL_HOST =
MAL_PORT = 61142
MAL_INST_HOST =
MAL_INST_PORT = 32142
MAL_DW_PORT = 52142
MAL_INST_DW_PORT = 33142
其中的主备机的实例名、各端口、ip等距自己情况填写。
3、配置dmarch.ini,相同目录下新建或修改dmarch.ini,注意主机向备机同步数据因此实时归档的ARCH_DEST配置为备机的实例名:
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = 备机的数据库实例名 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = 自己的归档路径 #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~2147483647M
4、配置dmwatcher.ini,相同路径下新建:
[GRP1] #组名
DW_TYPE = GLOBAL #全局守护类型
DW_MODE = AUTO #自动切换模式
DW_ERROR_TIME = 10 #远程守护进程故障认定时间
INST_RECOVER_TIME = 60 #主库守护进程启动恢复的间隔时间
INST_ERROR_TIME = 10 #本地实例故障认定时间
INST_OGUID = 453331 #守护系统唯一 OGUID 值(根据情况修改)
INST_INI = #dm.ini 配置文件路径
INST_AUTO_RESTART = 1 #打开实例的自动启动功能
INST_STARTUP_CMD = dm安装目录/bin/dmserver #命令行方式启动
RLOG_SEND_THRESHOLD = 0 #指定主库发送日志到备库的时间阈值,默认关闭
RLOG_APPLY_THRESHOLD = 0 #指定备库重演日志的时间阈值,默认关闭
5、以mount方式启动主库,在dm安装目录的/bin下执行:
./dmserver dm安装目录/data/实例名/dm.ini mount
注意必须以mount方式启动数据库实例,否则系统会重构roll表空间,产生redo日志,破坏数据一致性。
而后,新打开一个命令行窗口,启动disql命令行工具,登录数据库,将数据库设为primary模式并设置oguid值(在dmwatcher.ini中设置的),注意以disql连接数据库时如果不设ip和端口号则默认连接本机的5236端口,此时如果数据库实例不是默认端口便会报网络连接错误。
sql脚本如下:
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
sp_set_oguid(453331);
alter database primary;
SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
第三步:配置备机
1、备机的dm.ini、dmmal.ini、dmwatcher配置与主机基本一致(仅实例名、安装路径可能存在差异需要调整),在此不做赘述,可用scp命令直接传输过来。
2、配置备机的dmarch.ini,因为这是备机,要将归档发送到主机,因此ARCH_DEST要写主机的实例,这里可能有长得好看的要问了:“啊~为啥备机要给主机发归档啊?”,我猜是因为将来可能会发生主机故障需要将备机切换成主机的这种主备交换身份的操作,那么有可能成为主机的备机就需要知道将来可能要把日志发给谁。
[ARCHIVE_REALTIME]
ARCH_TYPE = REALTIME #实时归档类型
ARCH_DEST = 主机的数据库实例名 #实时归档目标实例名
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL #本地归档类型
ARCH_DEST = 自己的归档路径 #本地归档文件存放路径
ARCH_FILE_SIZE = 128 #单位 Mb,本地单个归档文件最大值
ARCH_SPACE_LIMIT = 0 #单位 Mb,0 表示无限制,范围 1024~2147483647M
3、mount方式启动备库:
./dmserver dm安装目录/data/实例名/dm.ini mount
新开命令行,使用disql执行SQL:
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);
第四步:配置监视器
因为这个集群设置的故障自动切换,所以需要第三台机器作为监视器,在dm的安装目录下新建dmmonitor.ini,其中的MON_DW_IP中的IP与PORT需要和dmmal.ini中的MAL_HOST与MAL_DW_PORT保持一致。
MON_DW_CONFIRM = 1 #确认监视器模式
MON_LOG_PATH = 自己的监视器日志路径 #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 32 #每个日志文件最大 32M
MON_LOG_SPACE_LIMIT = 0 #不限定日志文件总占用空间
[GRP1]
MON_INST_OGUID = 453331 #组 GRP1 的唯一 OGUID 值
MON_DW_IP = 主机的MAL_HOST对应ip+冒号+主机的守护进程监听端口MAL_DW_PORT
MON_DW_IP = 备机
第五步:注册并启动服务
1、注册服务。需要在服务器上注册数据库实例、守护进程与监视器的服务,当然,之前注册过的数据库实例是不需要再次注册的,命令行注册数据库实例、守护进程和监视器服务的方式,使用root用户在dm安装目录的bin目录下执行:
--注册主库实例服务
./dm_service_installer.sh -t dmserver -dm_ini dm安装目录/data/实例名/dm.ini -m mount -p 实例名
--注册主库守护进程服务
./dm_service_installer.sh -t dmwatcher -watcher_ini dm安装目录/data/实例名/dmwatcher.ini -p 守护进程服务名
--注册监视器服务
./dm_service_installer.sh -t dmmonitor -monitor_ini 新建的dmmonitor.ini的目录/dmmonitor.ini -p 监视器名
2、启动服务,先启动主备机的数据库实例服务与守护进程而后启动监视器,启动方式是在dm安装目录的bin目录下执行:
--启动数据库实例
./dmserver dm安装目录/data/数据库实例名/dm.ini
--启动守护进程
./dmwatcher dm安装目录/data/数据库实例名/dmwatcher.ini
--启动监视器
./dmmonitor 新建的dmmonitor.ini所在目录/dmmonitor.ini