暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

YashanDB 仲裁选主功能配置与管理指南

原创 「捉虫特工队」🐞 2025-08-31
158

YashanDB 仲裁选主功能配置与管理指南

功能概述

YashanDB 仲裁选主(Election)功能是基于 yasom 进程实现的高可用自动故障切换机制,适用于一主一备部署架构。当主库发生故障无法提供服务时,系统通过 yasom 协调将备库升级为主库,同时将原主库降级为备库,实现快速故障恢复,保障业务连续性。

核心特性

  • 自动故障转移:主库宕机后,备库可自动升级为新主库
  • 角色确认机制:主库重启时需向 yasom 确认角色,有效避免脑裂
  • 智能保护模式
    • 零数据丢失模式:确保 RPO=0,对备库状态要求严格
    • 普通模式:提供更灵活的切换策略,可能存在少量数据丢失

重要提示:仲裁选主功能仅在 yasom 和备库的 yasagent 进程均正常运行状态下生效。


环境要求

前置条件

  • 部署架构:一主一备部署,备库数量仅允许1个
  • 版本一致性:主备库数据库版本必须一致
  • 资源配置:主备库各项资源参数建议保持一致
  • 身份认证:需开启操作系统身份认证(默认安装时已开启)
  • 部署建议:建议将 yasom 部署在独立服务器,不与主/备库同机部署

命令详解

1. 启用仲裁选主功能

yasboot election enable on -c <cluster_name>

使用示例

yasboot election enable on -c yashandb # 验证启用状态 yasboot election config show -c yashandb

2. 禁用仲裁选主功能

yasboot election enable off -c <cluster_name>

使用示例

# 正常关闭 yasboot election enable off -c yashandb # 强制关闭(适用于节点离线情况) yasboot election enable off --force -c yashandb # 验证关闭状态 yasboot election config show -c yashandb

3. 查看仲裁状态

yasboot election status -c <cluster_name>

输出内容

  • Protection Mode:主节点保护模式
  • Members:各节点角色、状态、延迟信息
  • Automatic Failover:仲裁状态(DISABLED/Enabled in…)

4. 查看仲裁配置

yasboot election config show -c <cluster_name>

关键配置信息

  • Properties:当前生效参数值
  • Configurable Failover Conditions:配置条件选主设置
  • Automatic Failover:仲裁功能状态

5. 设置仲裁参数

yasboot election config set -k <key> -v <value> -c <cluster_name>

支持参数

参数名 默认值 取值范围 功能说明
FailoverThreshold 9 [2, 1000] 心跳超时时间(秒)
FailoverAutoReinstate false true/false 脑裂自动修复开关
ZeroDataLossMode true true/false 零数据丢失模式开关

6. 重置仲裁参数

yasboot election config unset -k <key> -c <cluster_name>

7. 查看仲裁事件记录

yasboot election event show -c <cluster_name>

事件类型:failover、confirm role、need repair、protection demote/promote


条件故障切换配置流程

步骤一:环境检查

# 检查集群状态 yasboot cluster status -c yashandb -d

步骤二:配置条件故障切换

健康条件配置

方法1:使用 yasboot(推荐)

yasboot group config set --key FAILOVER_HEALTH_CONDITION \ --value CORRUPTED_CONTROLFILE,INACCESSIBLE_LOGFILE,STUCK_ARCHIVER,DATAFILE_WRITE_ERRORS,DATAFILE_NO_SPACE,SLICE_NO_SPACE \ --cluster yashandb --group-id 1

方法2:使用 yasql

ALTER SYSTEM SET FAILOVER_HEALTH_CONDITION = 'CORRUPTED_CONTROLFILE,INACCESSIBLE_LOGFILE,STUCK_ARCHIVER,DATAFILE_WRITE_ERRORS,DATAFILE_NO_SPACE,SLICE_NO_SPACE' SCOPE = BOTH; # 验证配置 show parameter FAILOVER_HEALTH_CONDITION;

可配置的健康条件

  • CORRUPTED_CONTROLFILE:主库写控制文件失败
  • INACCESSIBLE_LOGFILE:主库写redo文件失败
  • STUCK_ARCHIVER:归档磁盘满导致redo归档失败
  • DATAFILE_WRITE_ERRORS:主库写脏页失败
  • DATAFILE_NO_SPACE:磁盘满导致数据文件写入失败
  • SLICE_NO_SPACE:磁盘满导致slice文件写入失败

错误码条件配置

方法1:使用 yasboot(推荐)

yasboot group config set --key FAILOVER_ERROR_CONDITION \ --value 00109,00301-28 \ --cluster yashandb --group-id 1

方法2:使用 yasql

ALTER SYSTEM SET FAILOVER_ERROR_CONDITION = '00109, 00301-28' SCOPE = BOTH;

错误码触发示例

-- 构造触发错误码00109的场景 CREATE USER regress IDENTIFIED BY regress; GRANT DBA TO regress; CONN regress/regress; DROP TABLE IF EXISTS tab_om_condition; CREATE TABLE tab_om_condition( area_no CHAR(2), id INT, area VARCHAR(50), price FLOAT, name VARCHAR(50) ); CREATE OR REPLACE TRIGGER trig_om_condition BEFORE INSERT ON tab_om_condition FOR EACH ROW BEGIN INSERT INTO tab_om_condition VALUES(2, 12, 'shanghai', '100', 'test'); END; / -- 期望触发YAS-00109错误 INSERT INTO tab_om_condition VALUES(1, 1, 'shanghai', '100', 'test');

步骤三:启用仲裁功能

yasboot election enable on -c yashandb

步骤四:验证配置

# 查看仲裁状态 yasboot election status -c yashandb # 预期输出示例 # group 1 # Protection Mode: MAXIMUM PROTECTION # Members: # [1-1:1] - Primary database # [1-2:2] - Physical standby database # Transport Lag: 0 seconds # Apply Lag: 0 seconds # Apply Rate: 0.00 KByte/s # # Automatic Failover: Enabled in Zero Data Loss Mode # 查看仲裁配置 yasboot election config show -c yashandb # 预期输出示例 # group 1 # Protection Mode: MAXIMUM PROTECTION # Members: # [1-2:2] - Primary database # [1-1:1] - Physical standby database # Transport Lag: 0 seconds # Apply Lag: 0 seconds # Apply Rate: 5.81 MByte/s # # Properties: # FailoverThreshold = 9 # FailoverAutoReinstate = false # ZeroDataLossMode = true # # Configurable Failover Conditions: # Health Conditions: # CORRUPTED_CONTROLFILE = YES # INACCESSIBLE_LOGFILE = YES # STUCK_ARCHIVER = YES # DATAFILE_WRITE_ERRORS = YES # DATAFILE_NO_SPACE = YES # SLICE_NO_SPACE = YES # Error Code Conditions: # YAS-00109: work stack overflow, try to push %d bytes # YAS-00301 (errno 28): file operation "%s" failed, %s # # Automatic Failover: Enabled in Zero Data Loss Mode

触发机制说明

触发条件

  1. 健康条件触发:数据库检测到配置的健康异常条件
  2. 错误码触发:数据库遇到配置的特定错误码
  3. 心跳超时触发:备库检测到主库心跳超时(超过FailoverThreshold设定值)

触发流程

  1. yasagent 检测到触发条件后,向 yasom 报告主库异常
  2. yasom 协调备库进行选举,选择最合适的备库升为主库
  3. 新主库开始提供服务,原主库被降级为备库
  4. 整个过程通常在秒级完成

常见问题处理

Q1:仲裁功能启动失败

  • 检查主备库连接状态
  • 确认 V$DATABASE.STATUSNORMAL
  • 排查网络或存储问题

Q2:无法切换到最大保护模式

  • 确保备库同步正常
  • 检查无网络瓶颈或存储空间不足

Q3:主库故障后无法切换

  • 检查备库 Apply Lag 是否过大
  • 确认备库未处于 NEED REPAIR 状态
  • 检查零丢失模式下主库保护模式设置

Q4:强制关闭后主库启动失败

  • 检查并手动调整主备库的 OM_ELECTION_ENABLE 参数

最佳实践建议

  1. 测试验证:生产环境部署前,在测试环境充分验证所有配置
  2. 定期检查:定期检查仲裁状态和事件日志,确保高可用机制正常
  3. 监控告警:设置关键指标监控和告警,如心跳延迟、同步状态等
  4. 文档维护:保持配置变更记录,便于故障排查和审计

注意:本文档基于 YashanDB 23.4.1 版本,不同版本可能存在功能差异,请以实际版本文档为准。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论