#定义同步备
在最大可用模式和最大保护模式下,主库事务提交需要等待redo同步的备库称为同步备。默认情况下,同步备配置为QUORUM_SYNC_STANDBYS='MAJORITY',即需要多数派备库收到redo,主库事务才能提交成功。
YashanDB支持用户通过设置QUORUM_SYNC_STANDBYS和REQUIRED_SYNC_STANDBYS参数自定义同步备。
每个节点实例上均存在这两个参数且可以独立设置,主库的设置不会同步至备库,建议同一个环境中所有节点的相应参数值保持一致。当各节点的上述两个参数中某个参数的配置不完全一致时,整个数据库环境始终以主库的配置为准(即主备角色切换可能会引起配置变化)。
自定义同步备(即设置QUORUM_SYNC_STANDBYS和REQUIRED_SYNC_STANDBYS参数)需遵循如下规则:
自定义同步备仅在最大保护模式下生效,且需两个参数都满足时主库事务才能提交成功,例如设置QUORUM_SYNC_STANDBYS='ANY 2 (*)'且REQUIRED_SYNC_STANDBYS='standby2',redo同步到备库2且同步到另外任意1个备库后主库事务才能提交成功。
不同部署形态下,表现各异:
在单机部署中,两个参数均支持在线设置,立即生效。
在分布式部署中,两个参数均在安装时配置,不建议后续修改。
在共享集群部署中,所有实例的REQUIRED_SYNC_STANDBYS参数配置必须完全一致,QUORUM_SYNC_STANDBYS参数不生效。
若已开启自动选主,组内各主备库的两个参数的相应参数值必须一致,否则会出现数据库不一致问题。且不允许两个参数的值包含具体的备库名称。
# REQUIRED_SYNC_STANDBYS
REQUIRED_SYNC_STANDBYS参数表示必须指定备库全部收到redo日志后主库事务才能提交成功,参数值格式为'*'
或'standby_name1, standby_name2, …'
。
*
表示当前所有备库。standby_name1, standby_name2, …
表示具体的备库列表,必须使用真实的备库名称且不能重复,备库名称要求如下:单机部署中,备库名称的编号x需与ARCHIVE_DEST_x参数对应(例如ARCHIVE_DEST_1对应的备库名称应该为此处的standby_name1),可以通过查询V$ARCHIVE_DEST视图获取对应关系。
分布式部署中,备库名称需与分布式集群部署配置文件中节点在组内顺序一致(例如节点组内第1个节点对应的备库名称应该为此处的standby_name1),可以通过查询DV$ARCHIVE_DEST视图获取对应关系。
示例(单机、分布式部署)
--主库事务提交,要确保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日志的备库达到指定条件后主库事务才能提交成功,参数值格式为'MAJORITY'
或'ANY syncNum (备库列表)'
。
MAJORITY
:默认值,表示至少需N/2个备库(即多数派)同步redo后,满足主库提交事务的条件,其中N为所有节点(包含主库)的数量,若计算结果为小数则直接向下取整。ANY syncNum (备库列表)
:表示达到syncNum个数的备库同步redo后,满足主库提交事务的条件。配置要求如下:ANY:必须大写且不能省略。
syncNum的值:不能为零且不能大于
()
列表中的备库个数。备库列表:不能为空,长度不超过32个字符。
*
表示所有备库,如需直接罗列备库列表则格式为standby_name1, standby_name2, …
,备库列表的配置要求同REQUIRED_SYNC_STANDBYS参数。
示例(单机、分布式部署)
-- 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;