#定义同步备
在最大可用或最大保护模式,主库事务提交需要等待redo同步的备库称为同步备。默认情况下,同步备配置为需要多数派备库收到redo,主库事务才能提交成功。
Note:
单机部署中应称为同步备库,共享集群部署中应称为同步备集群,存算一体分布式集群部署中则应称为各个组的同步备节点。
后文统一采用为“主库”、“备库”作为代称。
YashanDB支持用户通过设置QUORUM_SYNC_STANDBYS和REQUIRED_SYNC_STANDBYS参数自定义同步备,从而灵活调整主库事务提交成功的同步机制。自定义配置时需遵循如下规则:
不同部署形态下,表现各异:
在单机部署中,两个参数均支持在线设置,立即生效。
在共享集群部署中,所有实例的REQUIRED_SYNC_STANDBYS参数配置必须完全一致,QUORUM_SYNC_STANDBYS参数不生效。
在存算一体分布式集群部署中,同一个组内节点应该配置一致,否则可能出现异常。上述两个参数均会在安装时配置,不建议后续修改。
自定义同步备仅在最大保护模式下生效,且需两个参数都满足时主库事务才能提交成功,例如设置QUORUM_SYNC_STANDBYS='ANY 2 (*)'且REQUIRED_SYNC_STANDBYS='standby2',redo同步到备库2且同步到另外任意1个备库后主库事务才能提交成功。
主库的设置不会同步至备库,即每个节点可以独立设置上述参数,但建议同一个环境中所有节点的相应参数值保持一致。当各节点的上述两个参数中某个参数的配置不完全一致时,整个数据库环境始终以主库的配置为准(主备角色切换可能会引起配置变化)。
若已开启自动选主,同一个环境中所有节点的上述参数配置必须一致(否则会出现数据库不一致问题),且不允许两个参数的值包含具体的备库名称。
仅REQUIRED_SYNC_STANDBYS参数可以指定为ARCHIVE_DEST_x链路配置项DISABLE_ELECTION = TRUE的备库。
# REQUIRED_SYNC_STANDBYS
REQUIRED_SYNC_STANDBYS参数表示必须指定备库全部收到redo日志后主库事务才能提交成功,参数值格式为'*'或'standby_name1, standby_name2, …'。
*表示当前所有备库。standby_name1, standby_name2, …表示具体的备库列表,必须使用真实的名称且不能重复,备库名可查询GV$ARCHIVE_DEST视图的DB_UNIQUE_NAME字段获取。
示例
-- 查询备库信息
SELECT dest_name,service,db_unique_name,node_id FROM GV$ARCHIVE_DEST;
DEST_NAME SERVICE DB_UNIQUE_NAME NODE_ID
----------------- ---------------------------------------------------------------- --------------------------------- ----------------------------------------------------------------
ARCHIVE_DEST_1 192.168.1.3:1689 standby1 1-2
ARCHIVE_DEST_2 192.168.1.4:1689 standby2 1-3
-- 确保standby2收到redo后,主库的事务才提交
ALTER SYSTEM SET REQUIRED_SYNC_STANDBYS ='standby2' SCOPE=BOTH;
-- 确保所有备库都收到redo后,主库的事务才提交
ALTER SYSTEM SET REQUIRED_SYNC_STANDBYS ='*' SCOPE=BOTH;
# QUORUM_SYNC_STANDBYS
QUORUM_SYNC_STANDBYS参数表示收到redo日志的备库达到指定条件后主库事务才能提交成功,且不能指定为ARCHIVE_DEST_x链路配置项DISABLE_ELECTION = TRUE的备库,参数值格式为'MAJORITY'或'ANY syncNum (备库列表)'。
MAJORITY:默认值,表示至少有(N-d)/2个备库收到redo日志,主库事务才可以提交。若计算结果为小数则直接向下取整。N:所有节点(包含主库)的数量。
d:备库的ARCHIVE_DEST_x链路参数的DISABLE_ELECTION = TRUE时不参与多数派的投票且不记入收到redo日志节点,该类备库的个数记为d。
ANY syncNum (备库列表):表示达到syncNum个数的备库同步redo后,满足主库提交事务的条件。配置要求如下:ANY:必须大写且不能省略。
syncNum的值:不能为零且不能大于
()列表中的备库个数。表示这组备库里,至少需要syncNum个备库收到redo日志,主库事务才可以提交。备库列表:不能为空,长度不超过32个字符。配置为
*表示所有备库,如需直接罗列备库则格式为standby_name1, standby_name2, …,必须使用真实的备库名称且不能重复,备库名可查询GV$ARCHIVE_DEST视图的DB_UNIQUE_NAME字段获取。
Caution:
QUORUM_SYNC_STANDBYS参数不能设置为ARCHIVE_DEST_x链路配置项DISABLE_ELECTION = TRUE的备库,若备库列表中的所有备库均DISABLE_ELECTION = TRUE,则会报错。
示例(单机、存算一体分布式集群部署)
-- QUORUM_SYNC_STANDBYS默认值为MAJORITY
SHOW PARAMETER QUORUM_SYNC_STANDBYS;
NAME VALUE
------------------------------- --------------------
QUORUM_SYNC_STANDBYS MAJORITY
-- 主库事务提交,要确保备库2和备库3中任意1个收到redo
ALTER SYSTEM SET QUORUM_SYNC_STANDBYS='ANY 1 (standby2, standby3)' SCOPE=BOTH;
-- 主库事务提交,要确保所有备库中任意1个备库收到redo
ALTER SYSTEM SET QUORUM_SYNC_STANDBYS='ANY 1 (*)' SCOPE=BOTH;

