双机正常时的切换
前提条件
- GaussDB双机正常运行,已经建立日志同步。
- 双机需在同一地域,不同地域的双机无法进行切换。
背景信息
- 场景一:当数据库升级时,先停止备机,升级备机数据库,然后启动备机,当主备关系稳定后切换主备机,然后升级原来的主机数据库,这样可保证业务零中断,数据零丢失,提供高可靠性数据库服务。
- 场景二:在复杂的应用系统中,除数据库软件还有其他应用进程,当这些进程产生异常时需进行切换,则为了避免数据丢失,主备数据库也要跟着切换。
- switchover 命令必须在双机正常状态下执行,它会保证在切换过程中不会存在任何数据丢失。
- switchover 命令在平滑切换时可能会因为磁盘IO阻塞导致切换超时失败,此时switchover仍然可能继续进行,并最终切换成功。您在 switchover 命令执行失败后,仍可继续尝试执行此命令。
- 说明: 可用相关命令设置切换等待时间,如果切换时间大于此等待时间,会导致切换超时失败。
switchover 命令执行超时失败后可采取以下两种方案。
- 方案一:停止主机,并将备机强制升主。
- 方案二:分别停止主机和备机,然后重新启动主机和备机。
示例
在备机上执行gs_ctl query命令,查询双机状态看是否满足切换条件。
Ha state:
LOCAL_ROLE : Standby
STATIC_CONNECTIONS : 1
DB_STATE : Normal
DETAIL_INFORMATION : Normal
Senders info:
No information
Receiver info:
RECEIVER_PID : 32388
LOCAL_ROLE : Standby
PEER_ROLE : Primary
PEER_STATE : Normal
STATE : streaming
SENDER_SENT_LOCATION : 0/B000000
SENDER_WRITE_LOCATION : 0/B000000
SENDER_FLUSH_LOCATION : 0/B000000
SENDER_REPLAY_LOCATION : 0/B000000
RECEIVER_RECEIVED_LOCATION : 0/B000000
RECEIVER_WRITE_LOCATION : 0/B000000
RECEIVER_FLUSH_LOCATION : 0/B000000
RECEIVER_REPLAY_LOCATION : 0/B000000
SYNC_PERCENT : 100%
CHANNEL : 10.144.197.189:51506 <--10.144.197.188:1357
说明:DB_STATE字段为Normal,SYNC_PERCENT为100%,说明双机状态正常,可以进行正常切换。
在备机上执行gs_ctl switchover命令,进行双机角色切换。
gaussdba@linux:~/opt/data> gs_ctl switchover
waiting for server to switchover........ done
switchover completed
在备机上执行gs_ctl query命令,进行状态查询,确认角色切换成功。
gaussdba@linux:~> gs_ctl query
Ha state:
LOCAL_ROLE : Primary
STATIC_CONNECTIONS : 1
DB_STATE : Normal
DETAIL_INFORMATION : Normal
Senders info:
SENDER_PID : 6773
LOCAL_ROLE : Primary
PEER_ROLE : Standby
PEER_STATE : Normal
...... ......
...... ......
说明:在备机上查询LOCAL_ROLE:Primary,PEER_ROLE:Standby说明主机已经降为备机,备机已经升为主机,角色转换成功。
主机故障时的切换
前提条件
主机出现故障,并且无法及时恢复。
说明: 本条件并不是必须条件,在主备机正常同步的情况下,也可以使用 failover 命令强行将备机升为主机,但并不建议这么做,因为这样会导致数据库双主。
- failover操作可以加-M参数,指定数据库切换之后的模式,但只允许指定的模式高于自己的模式,这样允许将次级联备机、级联备机或备机升为主机,将次级联备机、级联备机升为备机,或者将次级联备机升为级联备机。如果不加-M参数,默认将数据库切换成主机。
- failover操作只会将备机升为主机,不会主动修复故障的原主机。
场景一:failover操作不加-M参数,默认将数据库升为主机。在备机上执行如下命令。
gs_ctl failover
在备机上查询是否升为主机。
gs_ctl query
场景二:failover操作加-M 参数,指定数据库切换后的模式。在次级联备机上执行如下命令。
gs_ctl failover -M standby
在次级联备机上查询是否升为备机。
gs_ctl query
场景三:failover操作-M参数指定的模式低于自己的模式,报错退出。以级联备机模式启动数据库。
gs_ctl start -M cascadestandby
将级联备机升为次级联备机,报错退出。
gs_ctl failover -M cascadestandby1
示例一:failover操作不加-M参数,默认将数据库升为主机。
在备机上执行gs_ctl failover命令,进行升主。
gaussdba@linux:~/opt/data> gs_ctl failover
waiting for server to failover.... done
failover completed
在备机上查询双机状态,确认本端已经升为主机。
Ha state:
LOCAL_ROLE : Primary
STATIC_CONNECTIONS : 2
DB_STATE : Normal
DETAIL_INFORMATION : Normal
Senders info:
No information
Receiver info:
No information
说明:可以看到LOCAL_ROLE:Primary ,说明备机已经升为主机。
示例二:failover操作加-M参数,指定数据库切换后的模式。
在次级联备机上执行gs_ctl failover -M standby命令,升为备机。
gaussdba@linux:~/opt/data> gs_ctl failover -M standby
waiting for server to failover.... done
failover completed
在次级联备机上查询是否升为备机。
Ha state:
LOCAL_ROLE : Standby
STATIC_CONNECTIONS : 0
DB_STATE : NeedRepair
DETAIL_INFORMATION : Disconnected
Senders info:
No information
Receiver info:
No information
说明:可以看到LOCAL_ROLE:Standby ,说明次级联备机已经升为备机。
示例三:failover操作-M参数指定的模式低于自己的模式,报错退出。
以级联备机模式启动数据库。
gaussdba@linux:~/opt/data> gs_ctl start -M cascadestandby
server starting.... done
server started
将级联备机升为次级联备机,报错退出。
gaussdba@linux:~/opt/data> gs_ctl failover -M cascadestandby1
server mode is higher than failover mode