Semi-sync topology
在一些环境中,不仅控制半同步复制副本的数量很重要,还要控制副本是半同步还是异步。orchestrator可以检测到不希望的半同步配置,并切换半同步标志rpl_semi_sync_slave_enabled和rpl_semi_sync_master_enabled以纠正情况。
Semi-sync master (rpl_semi_sync_master_enabled
)
在主故障切换(例如 DeadMaster)期间,如果 DetectSemiSyncEnforcedQuery 对新主返回的值 > 0,orchestrator 会启用半同步主标志。如果主标志被其他方式更改或错误设置,orchestrator 将不触发任何恢复。
半同步主可能会遇到两种故障情况:LockedSemiSyncMaster 和 MasterWithTooManySemiSyncReplicas。在这两种条件的任一恢复期间,orchestrator 会在半同步复制副本上禁用半同步主标志。
Semi-sync replicas (rpl_semi_sync_slave_enabled
)
orchestrator能够检测拓扑中是否存在不正确数量的半同步复制副本(LockedSemiSyncMaster 和 MasterWithTooManySemiSyncReplicas),然后通过相应地启用/禁用半同步复制副本标志来纠正情况。
此行为可以通过以下选项进行控制:
-
DetectSemiSyncEnforcedQuery:
- 查询返回半同步优先级(0表示异步副本;数字越大表示优先级越高)。
-
EnforceExactSemiSyncReplicas:
- 该参数决定是否强制执行严格的半同步复制副本拓扑。如果启用,LockedSemiSyncMaster 和 MasterWithTooManyReplicas 的恢复将根据优先级顺序精确地启用和禁用半同步复制副本,以匹配所需的拓扑。
-
RecoverLockedSemiSyncMaster:
- 决定是否从 LockedSemiSyncMaster 场景中恢复。如果启用,LockedSemiSyncMaster 的恢复将按照优先级顺序在副本上启用半同步(永远不会禁用),以匹配主服务器等待副本数。如果设置了EnforceExactSemiSyncReplicas,则此选项不起作用。如果您只想处理半同步副本太少的情况而不处理太多的情况,这将非常有用。
-
ReasonableLockedSemiSyncMasterSeconds:
- 触发LockedSemiSyncMaster条件的秒数;如果未设置,则回退到ReasonableReplicationLagSeconds。
优先级顺序由 DetectSemiSyncEnforcedQuery
(零表示异步副本;数字越大表示优先级越高)、晋升规则(DetectPromotionRuleQuery
)和主机名(fallback)定义。
示例1
执行严格的半同步复制副本拓扑,其中 rpl_semi_sync_master_wait_for_slave_count=1
:
"DetectSemiSyncEnforcedQuery": "select priority from meta.semi_sync where cluster_member = @@hostname",
"EnforceExactSemiSyncReplicas": true
假设这个拓扑,
,- replica1 (priority = 10, rpl_semi_sync_slave_enabled = 1)
master
`- replica2 (priority = 20, rpl_semi_sync_slave_enabled = 1)
在这个拓扑中,orchestrator将检测到一个MasterWithTooManySemiSyncReplicas的情况,并在replica1(优先级较低)上禁用半同步。
示例2
强制执行弱的半同步复制副本拓扑,其中 rpl_semi_sync_master_wait_for_slave_count=1
:
"DetectSemiSyncEnforcedQuery": "select 2586",
"DetectPromotionRuleQuery": "select promotion_rule from meta.promotion_rules where cluster_member = @@hostname",
"RecoverLockedSemiSyncMaster": true
假设目前这个拓扑结构,
,- replica1 (priority = 2586, promotion rule = prefer, rpl_semi_sync_slave_enabled = 0)
master
`- replica2 (priority = 2586, promotion rule = neutral, rpl_semi_sync_slave_enabled = 0)
orchestrator将检测到一个LockedSemiSyncMaster的情况,并在replica1上启用半同步(具有更优先的晋升规则)。
相关参数
DetectSemiSyncEnforcedQuery string // 可选查询(在拓扑实例上执行)以确定是否对主写入完全强制执行半同步(在任何情况下都不允许异步回退)。 如果提供,必须返回一行一列、值 0 或 1。
EnforceExactSemiSyncReplicas bool // 如果为 true,则将启用/禁用半同步副本以匹配所需优先级顺序中的等待计数; 这适用于 LockedSemiSyncMaster 和 MasterWithTooManySemiSyncReplicas
RecoverLockedSemiSyncMaster bool // 如果为 true,则 Orchestrator 将通过在副本上启用半同步以匹配等待计数来从 LockedSemiSync 状态恢复; 此行为可以被 EnforceExactSemiSyncReplicas 覆盖
ReasonableLockedSemiSyncMasterSeconds uint // 在触发 LockedSemiSync 分析之前评估 LockedSemiSyncHypothesis 的时间; 如果未设置,则回退到 ReasonableReplicationLagSeconds
DetectSemiSyncEnforcedQuery
可选自定义查询(在拓扑实例上执行)以确定是否对主写入完全强制执行半同步(在任何情况下都不允许异步回退)。 如果提供,必须返回一行一列、值 0 或 1。