主备集群多种故障情况模拟
前言,主备如要实现自动切换和手动切换,必须要有一台服务器用作监视器,
这个监视器我们称之为非确认监视器,部署在主备机器上的我们称之为确认监视器。
在主备自动切换配置中,我们使用了普通监视器,并且配置了一台机器作为确认监视器。需要注意的是,一个主备集群最多只能有一个确认监视器。
监视器类型
- 确认监视器:默认配置,使用配置文件(
dmmonitor.ini
)中的MON_DW_CONFIRM
参数设置为 0。 - 非确认监视器:用于确认主备切换,
MON_DW_CONFIRM
参数设置为 1。
如果要实现自动切换和手动切换,需要更改配置文件
修改配置文件
需要修改 dmwatcher.ini
的参数:
vi /data/dmdata/DAMENG/dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO #自动切换,手动切换需要改成MANUAL
- DW_MODE:切换模式,缺省为 MANUAL。
MANUAL
:故障手动切换模式。AUTO
:故障自动切换模式。
添加非确认监视器参数
如果设置的是自动切换,则必须要给这个参数,手动切换则不用给
在配置文件中添加确认监视器的参数:
MON_DW_CONFIRM = 1 #非确认监视器
MON_LOG_PATH = /opt/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 32
MON_LOG_SPACE_LIMIT = 2048
MON_TAKEOVER_SHUTDOWN = 10 #自动切换必须要给这个参数,如果为0也不会自动切换
[GRP1]
MON_INST_OGUID = 45335
MON_DW_IP = 192.168.142.132:52141
MON_DW_IP = 192.168.142.133:52142
手册原话:如果配置了自动接管,因为老主库正常退出之后,默认配置(监视器的
MON_TAKEOVER_SHUTDOWN 配置为 0)无法触发自动接管,所以只能手动干预;如果
MON_TAKEOVER_SHUTDOWN 非 0,主库正常退出后,超过设定的时间主库仍未重启,
备库可以完成自动接管;
环境配置
- 主服务器:192.168.142.132
- 备服务器:192.168.142.133
- 监视器:192.168.142.131
1. 主备自动切换
在主备自动切换配置中,我们使用了确认监视器,并且配置了一台机器作为非确认监视器。需要注意的是,一个主备集群最多只能有一个非确认监视器。
修改主和备的配置文件dmwatcher.ini
vim dmwatcher.ini
[GRP1]
DW_TYPE = GLOBAL
DW_MODE = AUTO ##修改这里
修改非确认监视器的配置文件,添加
vim dmmonitor0.ini
MON_DW_CONFIRM = 1
MON_TAKEOVER_SHUTDOWN = 10 ##添加这里
下面将模拟主库故障,自动切换过程
正常情况
主库故障,发生切换
切换完成
主库恢复正常后自动会加入集群
2. 主备强制切换
在某些情况下,可能需要进行主备的强制切换。请确保在执行此操作之前,您已做好充分的准备和测试。
# 组中主库出现故障时,可以通过此命令选出组中可以执行正常接管的备库列表
choose takeover grp1
将主库网络直接中断,模拟主库故障,主库中执行命令
[root@NODE2 ~]# systemctl stop network
choose takeover grp1
# 用指定组中的指定备库接管组中的故障主库
takeover grp1.DM01
# 该命令要求监视器曾经收到过故障主库的历史信息,并且主库的历史信息必须满足被接管条件,可以先通过 choose takeover [group_name]选出符合正常接管条件的备库列表,选择其中一个备库执行接管操作即可。
查看允许进行切换的备库
因为上一步模拟自动切换,DM02现在是主库,所以DM01现在是备库
手动将主库故障,之后在执行takeover grp1.DM01
至此,手动切换完成
如果执行choose takeover grp1出现下面的提示
no database can do takeover! --守护进程是STARTUP状态不能执行takeover命令
可以使用备库强制接管
如果执行 Takeover 命令不成功,但主库可能由于硬件损坏等原因无法马上恢复,为DM 数据守护与读写分离集群 V4.0了及时恢复数据库服务,DM 提供了 Takeover Force 命令,强制将备库切换为主库。但需要由用户确认主库故障前,主库与接管备库的数据是一致的(主库到备库的归档是 Valid状态),避免引发守护进程组分裂。
RSTAT : 此 字 段 对 备 库 有效,表 示 主 库 到 备 库 的 归 档 状 态 , 可 能 为Valid/Invalid/Unknown,对于本地守护类型的备库,此字段为 NULL,对于主库本身,此字段值为 Valid。该字段值要从备库对应的主库实例上取,如果当前没有活动主库或者
DM 数据守护与读写分离集群 V4.0备库无法确认对应的主库,则该字段显示为 Unknown。
指定组中主库出现故障时,可以通过此命令选出组中可以执行强制接管的备库列表
choose takeover force grp1
使用指定组中的指定备库强制接管组中的故障主库。执行此命令需要先登录监视器。
takeover force grp1.NODE1
3. 主备改单机
在特定场景下,需要将主备集群改为单机模式。
停止监视器,守护进程和数据库服务
./DmMonitorServiceMONITOR stop
./DmWatcherServiceDM02 stop
./DmServiceDM02 stop
关闭mal邮件系统,删除dmmal配置文件
vim dm.ini
MAL_INI=0 #关闭mal
ALTER_MODE_STATUS=1 #改成1
修改dmarch.ini,注释主备配置
vim dmarch.ini
#注释下面三行主备配置
#[ARCHIVE_REALTIME]
#ARCH_TYPE = REALTIME
#ARCH_DEST = DM01 ##备库为DM01
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /data/dmarch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240 ##根据实际磁盘填写,勿超出
启动数据库,修改数据库状态
./DmServiceDM02 start
登录数据库执行sql
SQL> ALTER DATABASE NORMAL;
修改服务配置文件
cd /opt/dmdbms/bin
vim DmServiceDM01
START_MODE由MOUNT改为OPEN
START_MODE=open
重启数据库服务
cd /opt/dmdbms/bin
./DmServiceDM01 restart
检测主机数据库是否开启
SELECT * FROM V$INSTANCE;
主库执行同样操作,至此,主备变单机完成