目录标题
Oracle ADG、PostgreSQL流复制与MySQL增强半同步机制原理与对比分析
一、引言
二、Oracle Active Data Guard (ADG)机制分析
2.1 WAL/redo生成与传输原理
Oracle ADG基于物理备库(Physical Standby Database)技术,通过重做数据(Redo Data)的传输和应用来实现主库与备库的同步。ADG的核心是将主库的重做记录实时或近乎实时地传输到备库,并在备库上重新应用这些修改。
WAL/redo生成过程:
当用户在主库提交数据时,会在SGA的redo缓冲区中首先记录redo信息。在提交操作时,LGWR(日志写入进程)会将redo数据写入redo数据文件中。任何对数据库的修改(DML、DDL、DCL)在写入数据文件之前,首先会生成对应的"重做记录"(Redo Record),并写入内存中的重做日志缓冲区(Redo Log Buffer)。
日志传输机制:
主库在运行过程中会不断地产生redo日志,这些日志需要发送到备库,这个发送动作有两种传输方式:
- ARCH进程(传输归档日志):在非实时传输场景下使用,主要用于归档模式。
- LGWR进程(传输重做日志):在实时传输场景下使用,确保备库能实时获取主库的变更。
ADG支持三种数据保护模式,这些模式决定了redo日志传输的同步程度:
-
最大保护(Maximum Protection):
保证主库和备库的绝对同步,任何情况下主库的损毁都不会导致已提交数据的丢失。所有事务在提交前,其redo不仅被写入到本地的online redo log,还要同时提交到standby数据库的standby redo log,并确认redo数据至少在一个standby数据库可用。 -
最大可用(Maximum Availability):
正常情况下与最大保护模式相同,但当网络或备库不可用时,主库仍可以继续使用。主库会自动转换为"最大性能"模式,等待备库可用时,将归档传输到备库做恢复。 -
最大性能(Maximum Performance):
默认模式,主库和备库是异步的。这种模式可能在主库出现损坏时,丢失一部分数据,但对主库负荷最小,因此具有最好的性能。
2.2 主备切换(Switchover)流程
Oracle ADG的主备切换(Switchover)是一种计划内的角色转换,允许在不丢失数据的情况下平滑地将主库转换为备库,同时将备库转换为主库。
主备切换的前提条件:
- 主库和备库之间网络连接通畅
- 没有活动的会话连接在数据库中
- PRIMARY数据库处于打开状态,STANDBY数据库处于同步状态
- 如果设置了REDO应用的延迟,需要将这个设置去掉
主库切换为备库的步骤:
-
确认主库的switchover状态:
SELECT SWITCHOVER_STATUS FROM V$DATABASE; -- 期望返回TO STANDBY -
执行主库到备库的角色转换:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN; -
启动和应用日志状态:
SHUTDOWN IMMEDIATE; STARTUP; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; -
查看数据库模式:
SELECT DEST_NAME, STATUS, DATABASE_MODE, RECOVERY_MODE, PROTECTION_MODE FROM V$ARCHIVE_DEST_STATUS;
备库切换为主库的步骤:
-
确认备库的switchover状态:
SELECT SWITCHOVER_STATUS FROM V$DATABASE; -- 期望返回TO PRIMARY -
执行备库到主库的角色转换:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; -
关闭并重启数据库:
SHUTDOWN IMMEDIATE; STARTUP; ALTER SYSTEM SWITCH LOGFILE;
切换验证:
切换完成后,新主库上执行:
SELECT DATABASE_ROLE FROM V$DATABASE;
-- 期望返回PRIMARY
ADG切换的内部流程包括以下关键步骤:
- 配置主库与备库
- 配置日志传输服务
- 配置Data Guard Broker
- 启用ADG
- 切换角色
- 启动数据库
- 监控同步状态
- 完成切换
2.3 故障切换(Failover)机制
故障切换(Failover)是在主库发生意外故障且无法正常恢复时采取的紧急措施,将备库转换为主库。与Switchover不同,Failover通常意味着可能存在数据丢失,并且原ADG环境会被破坏,需要重建。
故障切换的前提条件:
由于PRIMARY数据库已经无法启动,FAILOVER切换所需的条件并不多,主要检查STANDBY是否运行在最大保护模式下,如果是的话,需要将其置为最大性能模式,否则切换到PRIMARY角色也无法启动。
故障切换的步骤:
-
检查是否有日志GAP(未应用的日志):
SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG; SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;如果有GAP,需要拷贝缺失的归档日志并注册:
ALTER DATABASE REGISTER PHYSICAL LOGFILE '路径'; -
停止应用归档:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; -
将STANDBY数据库切换为PRIMARY数据库:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH; -- 或强制模式(适用于紧急情况) ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE; -
确认数据库角色已转换:
SELECT DATABASE_ROLE FROM V$DATABASE; -- 期望返回PRIMARY -
打开数据库:
ALTER DATABASE OPEN; -
验证数据库模式:
SELECT OPEN_MODE FROM V$DATABASE; -- 期望返回READ WRITE
故障切换后的处理:
FAILOVER切换完成后,ADG环境会被破坏,需要重建。如果主库或备库开启了闪回功能,则可以通过闪回数据库功能恢复ADG环境。例如:
-
将原主库利用闪回数据库功能闪回到备库变为主库的SCN时间点,然后将其转换为备库,最后利用switchover转换为最初的环境(需要原主库开启闪回)。
-
将新主库利用闪回数据库功能闪回到其变为主库的SCN时间点,然后将其转换为备库(需要新主库开启闪回,且会丢失部分数据)。
-
利用RMAN重新搭建DG环境。
Switchover和Failover的核心区别:
- Switchover是指主库转换成备库,然后将原备库转换成新主库;而Failover是指将备库直接转换成主库。
- 使用场合不同:Switchover用于有准备的、计划之中的切换;Failover用于意料之外的突发情况。
- 数据丢失程度不同:Switchover不会丢失数据,Failover通常意味着有部分数据丢失。
- 善后处理不同:Switchover之后DG环境不会被破坏,仍然有Primary、Standby两种角色的系统存在;而Failover之后,DG环境就会被破坏,一般情况下需要重建。
三、PostgreSQL流复制机制分析
3.1 WAL生成与传输原理
PostgreSQL的流复制(Streaming Replication)是一种实时同步数据的机制,其核心是WAL(Write-Ahead Logging)日志与流复制机制。
WAL生成过程:
当数据发生变化时,对应的后端进程(每个客户端连接都会关联一个后端进程)会产生对应的WAL记录,这些WAL记录会被后端进程直接写入wal buffer中,才能继续后续的操作。
当事务同步提交时,后端进程会将wal buffer中的WAL记录写入WAL文件并刷盘,再将事务状态设置为成功。
WAL的主要作用是确保数据的一致性和持久性,即使在系统崩溃的情况下,也能够恢复到最近的一致状态。
WAL传输机制:
PostgreSQL的流复制过程可以分为三个主要步骤:
-
WAL生成:主库(Primary)在处理写操作时,首先将变更记录到WAL文件中。
-
WAL发送:主服务器通过网络将WAL记录发送给备用服务器。主节点上的复制进程(WAL sender)负责将WAL日志发送给从节点。
-
WAL应用:备用服务器接收到WAL记录后,将其应用到自己的数据文件中,使数据保持一致。从节点接收到WAL文件后,会将其应用到从节点上,从而实现数据同步。
PostgreSQL支持两种复制模式:
-
异步复制(默认):主库提交事务后立即返回,不等待备库确认,性能高但可能丢失极少数据。
-
同步复制:主库必须等待备库确认WAL写入后才提交,保证强一致性但增加延迟。
复制槽(Replication Slot)是PostgreSQL流复制中的重要概念,用于管理复制流,确保主服务器保留WAL日志直至从服务器处理完毕,从而避免数据丢失。
3.2 主备切换(Switchover)流程
PostgreSQL的主备切换(Switchover)是一种计划内的角色转换,允许在不丢失数据的情况下将主库转换为备库,同时将备库转换为主库。
主备切换的前提条件:
- 主库和备库之间网络连接通畅
- 备库处于同步状态,即与主库的数据一致
- 应用程序已停止写入主库(对于计划内切换)
主库切换为备库的步骤:
-
停止主库的写操作(可选,对于计划内切换):
SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE datname = 'your_db' AND pid <> pg_backend_pid(); -
检查主库的WAL发送状态:
SELECT application_name, client_addr, state, sync_state FROM pg_stat_replication; -
在主库上执行切换命令:
SELECT pg_switchover_to_standby(); -
主库将停止接受写操作并转换为备库角色。
备库切换为主库的步骤:
-
在目标备库上执行提升操作:
SELECT pg_promote(); -
验证新主库的状态:
SELECT pg_is_in_recovery(); -- 期望返回f(表示不再是备库) -
重新配置其他备库指向新主库:
-- 在每个旧备库上执行 SELECT pg_stop_backup(); ALTER SYSTEM SET primary_conninfo = 'host=new_primary_host port=5432 user=repl password=secret'; SELECT pg_start_backup('switchover');
使用repmgr工具进行主备切换:
repmgr是一个常用的PostgreSQL复制管理工具,提供了更高级的切换功能:
-
在新主库节点上执行:
repmgr -f /path/to/repmgr.conf standby switchover --siblings-follow–siblings-follow参数表示所有从库的同步源自动改成最新的主库节点。
-
switchover的内部流程如下:
- 关闭当前的主库
- 等待老主库彻底关闭后,在目标备库上进行pg_promote()
- 重启启动老主库,降级成standby数据库,指向复制源新主库
- sibling nodes兄弟节点同样进行了复制源重定向,指向新主库
- 整个switchover过程结束
-
验证集群状态:
repmgr -f /path/to/repmgr.conf cluster show
3.3 故障切换(Failover)机制
故障切换(Failover)是在主库发生意外故障且无法正常恢复时采取的紧急措施,将备库转换为主库。与Switchover不同,Failover可能会导致数据丢失,具体取决于复制模式和故障发生时的状态。
故障切换的前提条件:
- 确认主库确实无法恢复
- 选择一个数据最新的备库作为新主库
手动故障切换的步骤:
-
停止主库(如果可能):
pg_ctl stop -D /path/to/primary/data -
在目标备库上执行提升操作:
SELECT pg_promote(); -
验证新主库的状态:
SELECT pg_is_in_recovery(); -- 期望返回f(表示不再是备库) -
重新配置其他备库指向新主库:
-- 在每个旧备库上执行 SELECT pg_stop_backup(); ALTER SYSTEM SET primary_conninfo = 'host=new_primary_host port=5432 user=repl password=secret'; SELECT pg_start_backup('failover');
使用repmgr工具进行故障切换:
-
在目标备库上执行:
repmgr -f /path/to/repmgr.conf standby promote --siblings-follow -
promote的内部流程如下:
- 提升备库为新主库
- 重新配置其他备库指向新主库
- 更新集群元数据
-
验证集群状态:
repmgr -f /path/to/repmgr.conf cluster show
自动故障切换机制:
PostgreSQL本身不提供内置的自动故障切换功能,但可以通过第三方工具实现:
-
Patroni:一个流行的PostgreSQL高可用解决方案,结合etcd、Consul或ZooKeeper实现自动故障切换。
-
pgpool-II:提供连接池、负载均衡和故障转移功能。
-
repmgrd:repmgr工具的守护进程模式,可以监控主库状态并自动触发故障切换。
故障切换后的处理:
-
当原主库恢复后,需要将其重新加入集群作为备库:
# 在原主库上执行 pg_rewind -D /path/to/primary/data --source-server='host=new_primary_host port=5432 user=repl password=secret' pg_ctl start -D /path/to/primary/data -
使用repmgr重新注册原主库:
repmgr -f /path/to/repmgr.conf node rejoin -d 'host=new_primary_host port=5432 user=repl password=secret' --force-rewind
四、MySQL增强半同步复制机制分析
4.1 二进制日志生成与传输原理
MySQL的增强半同步复制(Enhanced Semi-Synchronous Replication)是在传统异步复制基础上的改进,旨在提高数据一致性,同时尽量减少对主库性能的影响。
二进制日志生成过程:
当客户端在主库上写入一个事务时,主库首先将变更记录到二进制日志(binlog)中。在传统异步复制中,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理。
增强半同步复制的核心改进:
当客户端在主库上写入一个事务时,需要等待从库接收到主库的binlog,且主库接收到ACK确认之后,客户端才能收到事务成功提交的消息。
工作原理:
增强半同步复制的核心流程如下:
- 主库执行事务并写入binlog。
- 主库等待至少一个从库接收并写入中继日志(relay log)。
- 从库接收到binlog后,向主库发送ACK确认。
- 主库收到ACK后,提交事务并返回成功给客户端。
增强半同步复制的关键组件:
- 主库:负责处理所有写操作,并将这些操作记录在二进制日志(binlog)中。
- 从库:接收主库发送的binlog,并将其写入中继日志(relay log),然后通过SQL线程回放这些变更。
- ACK确认机制:从库在接收到binlog并写入中继日志后,向主库发送ACK确认。
增强半同步复制的两种模式:
MySQL 5.7引入了rpl_semi_sync_master_wait_point参数,用于控制半同步模式下主库在返回结果给会话之前提交事务的方式。
-
AFTER_COMMIT模式(5.5和5.6默认值):
主库将每个事务写入binlog之后,先提交事务,然后将binlog数据传递到从库并刷新到磁盘(relay log)。接着主库等待从库反馈收到relay log,只有收到ack之后主库才将commit OK结果反馈给客户端。 -
AFTER_SYNC模式(5.7默认值):
主库将每个事务写入binlog,然后将binlog数据传递到从库并刷新到磁盘(relay log)。主库等待从库反馈接收到relay log的ack之后,再提交事务并且返回commit OK结果给客户端。
超时降级机制:
如果主库在指定时间内(默认rpl_semi_sync_master_timeout = 10秒)未收到ACK,则自动降级为异步复制,避免阻塞事务。当从库恢复后,主库会自动重新切换回半同步模式。
增强半同步复制的优势:
- 提高数据一致性:确保事务至少被一个从库接收,减少主库宕机时的数据丢失。
- 性能平衡:相比全同步复制,性能影响较小。
- 自动降级:当从库不可达时,自动降级为异步复制,保证系统可用性。
4.2 主备切换(Switchover)流程
MySQL的主备切换(Switchover)是一种计划内的角色转换,允许在不丢失数据的情况下将主库转换为从库,同时将从库转换为主库。增强半同步复制环境下的主备切换需要特别注意数据一致性和切换流程。
主备切换的前提条件:
- 确保主库和从库之间的数据同步正常,即从库的Seconds_Behind_Master为0或接近0。
- 确认半同步复制状态正常,主库和至少一个从库处于半同步模式。
- 应用程序已停止写入主库(对于计划内切换)。
主库切换为从库的步骤:
-
停止主库的写操作(可选,对于计划内切换):
FLUSH TABLES WITH READ LOCK; -
检查从库的同步状态:
SHOW SLAVE STATUS\G; -- 确保Slave_IO_Running和Slave_SQL_Running均为Yes,Seconds_Behind_Master为0 -
在主库上禁用半同步复制:
SET GLOBAL rpl_semi_sync_master_enabled = 0; -
停止主库的二进制日志记录(可选):
SET SQL_LOG_BIN=0; -
等待所有事务完成提交:
-- 等待所有事务完成提交 -
将主库转换为从库:
CHANGE MASTER TO MASTER_HOST='new_master_host', MASTER_USER='repl', MASTER_PASSWORD='secret', MASTER_LOG_FILE='new_master_binlog.000001', MASTER_LOG_POS=4; START SLAVE;
从库切换为主库的步骤:
-
在目标从库上禁用半同步复制:
SET GLOBAL rpl_semi_sync_slave_enabled = 0; -
停止从库的复制线程:
STOP SLAVE; -
重置从库的复制信息:
RESET SLAVE ALL; -
启用二进制日志记录(如果尚未启用):
SET SQL_LOG_BIN=1; -
将从库提升为主库:
-- 确保新主库的server_id唯一 SET GLOBAL read_only=0; -
重新配置新主库的半同步复制参数:
SET GLOBAL rpl_semi_sync_master_enabled=1; SET GLOBAL rpl_semi_sync_master_timeout=10000;
使用GTID进行主备切换:
如果启用了GTID(全局事务标识符),主备切换会更加简单:
-
在新主库上执行:
STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only=0; -
其他从库重新指向新主库:
STOP SLAVE; CHANGE MASTER TO MASTER_HOST='new_master_host', MASTER_USER='repl', MASTER_PASSWORD='secret', MASTER_AUTO_POSITION=1; START SLAVE; -
重新启用半同步复制:
SET GLOBAL rpl_semi_sync_slave_enabled=1; START SLAVE IO_THREAD;
切换后的验证:
-
检查新主库的状态:
SHOW VARIABLES LIKE 'read_only'; -- 期望返回OFF SHOW MASTER STATUS; -
检查新从库的状态:
SHOW SLAVE STATUS\G; -- 确保Slave_IO_Running和Slave_SQL_Running均为Yes -
检查半同步复制状态:
SHOW STATUS LIKE 'Rpl_semi_sync_master_status'; -- 期望返回ON SHOW STATUS LIKE 'Rpl_semi_sync_slave_status'; -- 期望返回ON
4.3 故障切换(Failover)机制
故障切换(Failover)是在主库发生意外故障且无法正常恢复时采取的紧急措施,将从库转换为主库。与Switchover不同,Failover可能会导致数据丢失,具体取决于复制模式和故障发生时的状态。
故障切换的前提条件:
- 确认主库确实无法恢复
- 选择一个数据最新的从库作为新主库
- 确保该从库已经接收了尽可能多的主库变更
手动故障切换的步骤:
-
确认主库故障:
mysqladmin ping -h master_host -
选择数据最新的从库作为新主库:
-- 在每个从库上检查Seconds_Behind_Master和复制状态 SHOW SLAVE STATUS\G; -
在新主库上禁用半同步复制:
SET GLOBAL rpl_semi_sync_slave_enabled = 0; -
停止新主库的复制线程:
STOP SLAVE; -
重置新主库的复制信息:
RESET SLAVE ALL; -
将新主库提升为主库:
SET GLOBAL read_only=0; -
重新配置其他从库指向新主库:
-- 在每个旧从库上执行 STOP SLAVE; CHANGE MASTER TO MASTER_HOST='new_master_host', MASTER_USER='repl', MASTER_PASSWORD='secret', MASTER_AUTO_POSITION=1; SET GLOBAL rpl_semi_sync_slave_enabled=1; START SLAVE;
使用GTID进行故障切换:
如果启用了GTID,故障切换会更加简单:
-
在新主库上执行:
STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only=0; -
其他从库重新指向新主库:
STOP SLAVE; CHANGE MASTER TO MASTER_HOST='new_master_host', MASTER_USER='repl', MASTER_PASSWORD='secret', MASTER_AUTO_POSITION=1; START SLAVE;
自动故障切换解决方案:
MySQL生态系统提供了多种自动故障切换解决方案:
-
MHA(Master High Availability):
- 自动检测主库故障
- 选择最优从库进行切换
- 支持GTID和自动修复主从复制关系
-
Orchestrator:
- 提供图形化界面管理主从拓扑
- 支持自动故障转移
- 与Kubernetes等云原生架构集成良好
-
Keepalived:
- 基于VRRP协议实现VIP(虚拟IP)漂移
- 快速切换主库
- 简单易用,适合小型集群
-
InnoDB Cluster:
- 基于组复制技术
- 提供自动故障转移功能
- 支持多主和单主模式
增强半同步复制在故障切换中的作用:
增强半同步复制确保每个事务在提交前至少被一个从库接收,从而减少故障切换时的数据丢失风险。在增强半同步模式下,当主库发生故障时,至少有一个从库已经接收了主库的binlog,因此可以将该从库提升为主库,从而最大限度地减少数据丢失。
故障切换后的处理:
-
当原主库恢复后,需要将其重新加入集群作为从库:
-- 在原主库上执行 STOP SLAVE; CHANGE MASTER TO MASTER_HOST='new_master_host', MASTER_USER='repl', MASTER_PASSWORD='secret', MASTER_AUTO_POSITION=1; SET GLOBAL rpl_semi_sync_master_enabled=0; START SLAVE; -
重新启用半同步复制:
-- 在新主库上执行 SET GLOBAL rpl_semi_sync_master_enabled=1; -- 在所有从库上执行 SET GLOBAL rpl_semi_sync_slave_enabled=1; START SLAVE IO_THREAD;
五、三种机制的对比分析
5.1 WAL/redo机制对比
日志生成与写入机制:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 日志类型 | Redo日志 | WAL日志 | 二进制日志(binlog) |
| 写入顺序 | 先写日志缓冲区,再写入在线日志文件 | 先写入wal buffer,再写入WAL文件 | 先写入binlog cache,再刷新到binlog文件 |
| 写入时机 | LGWR进程负责将日志缓冲区内容写入在线日志文件 | 后端进程直接写入wal buffer,事务提交时刷盘 | 事务提交时,binlog cache被刷新到binlog文件 |
| 日志格式 | 物理格式,记录数据块的变化 | 物理格式(默认),也支持逻辑解码 | 支持多种格式(STATEMENT、ROW、MIXED) |
日志传输机制:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 传输方式 | LGWR或ARCH进程 | WAL sender进程 | binlog dump线程 |
| 传输协议 | Oracle Net服务 | PostgreSQL复制协议 | MySQL二进制协议 |
| 同步方式 | 支持同步(最大保护、最大可用)和异步(最大性能)模式 | 支持同步和异步复制模式 | 增强半同步模式,主库等待至少一个从库确认 |
| 实时性 | 实时(LGWR)或异步(ARCH) | 实时(流复制)或异步 | 半同步,主库等待从库ACK |
日志应用机制:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 应用方式 | 物理备库应用redo日志,逻辑备库应用SQL | 备库应用WAL日志 | 从库应用中继日志中的SQL语句 |
| 应用线程 | 专用的恢复进程 | 专用的恢复进程 | SQL线程 |
| 应用模式 | 实时应用(MANAGED REAL TIME APPLY)或基于时间点恢复 | 实时应用或基于时间点恢复 | 异步应用,从库SQL线程回放变更 |
| 一致性保证 | 物理备库与主库完全一致 | 备库与主库完全一致 | 从库可能存在延迟,但数据最终一致 |
5.2 主备切换(Switchover)机制对比
切换类型与场景:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 切换类型 | 计划内切换(Switchover) | 计划内切换(Switchover) | 计划内切换(Switchover) |
| 适用场景 | 系统升级、数据迁移等常态任务 | 系统维护、升级或扩容 | 维护或升级时的手动切换 |
| 数据一致性 | 完全一致,无数据丢失 | 完全一致,无数据丢失 | 完全一致,无数据丢失(如果使用GTID) |
| 切换可逆性 | 是,切换后ADG环境仍然存在 | 是,切换后复制关系可以保留 | 是,切换后复制关系可以重建 |
切换流程对比:
| 步骤 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 1. 准备阶段 | 检查主备状态,确保无活动会话 | 停止主库写操作,检查复制状态 | 停止主库写操作,检查从库同步状态 |
| 2. 主库处理 | 执行ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY | 执行pg_switchover_to_standby() | 执行CHANGE MASTER TO指向新主库 |
| 3. 备库处理 | 执行ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY | 执行pg_promote() | 执行RESET SLAVE ALL和START SLAVE |
| 4. 验证阶段 | 检查数据库角色和保护模式 | 检查数据库角色和复制状态 | 检查复制状态和GTID一致性 |
| 5. 完成切换 | 启动新备库的redo应用 | 重新配置其他备库指向新主库 | 重新配置原主库为新从库 |
切换工具与自动化:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 原生工具 | Data Guard Broker | pg_switchover和pg_promote | 无原生工具,依赖第三方 |
| 第三方工具 | 无 | repmgr、Patroni、pgpool-II | MHA、Orchestrator、Keepalived |
| 自动化程度 | 中等,需要手动执行命令 | 高,支持完全自动化切换 | 中等,依赖第三方工具实现自动化 |
| 切换脚本复杂度 | 中等,需要熟悉ADG命令 | 低,pg_switchover接口简单 | 高,需要处理多种情况和异常 |
5.3 故障切换(Failover)机制对比
故障检测机制:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 检测方式 | 手动检测或Data Guard Broker监控 | 第三方工具(如repmgr、Patroni)监控 | 第三方工具(如MHA、Orchestrator)监控 |
| 检测指标 | 数据库状态、日志传输状态 | 数据库连接状态、复制延迟 | 数据库连接状态、Seconds_Behind_Master |
| 检测频率 | 可配置,默认较低 | 可配置,通常较高 | 可配置,通常较高 |
| 自动检测支持 | 部分支持(需要Data Guard Broker) | 完全支持(依赖第三方工具) | 完全支持(依赖第三方工具) |
故障切换流程对比:
| 步骤 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 1. 故障确认 | 手动确认主库故障 | 工具自动检测或手动确认 | 工具自动检测或手动确认 |
| 2. 备库选择 | 管理员选择目标备库 | 工具选择最优备库(基于优先级或同步状态) | 工具选择最优从库(基于Seconds_Behind_Master或GTID) |
| 3. 日志应用 | 执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH | 执行pg_promote() | 执行RESET SLAVE ALL和START SLAVE |
| 4. 提升备库 | 执行ALTER DATABASE OPEN | 执行pg_promote() | 执行SET GLOBAL read_only=0 |
| 5. 应用切换 | 手动更新应用连接配置 | 自动VIP切换或DNS更新 | 自动VIP切换或DNS更新 |
| 6. 原主库处理 | 通常需要重建ADG环境 | 可以使用pg_rewind重新加入集群 | 重新配置为新从库 |
数据丢失风险:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 数据丢失可能性 | 可能,取决于保护模式 | 可能,取决于复制模式 | 可能,取决于半同步配置 |
| 最大保护模式 | 零数据丢失 | 不适用 | 不适用 |
| 最大可用模式 | 可能丢失少量数据 | 不适用 | 不适用 |
| 最大性能模式 | 可能丢失较多数据 | 异步模式下可能丢失数据 | 异步模式下可能丢失数据 |
| 半同步模式 | 不适用 | 同步模式下零数据丢失 | 增强半同步减少数据丢失 |
故障恢复与清理:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 原主库恢复 | 需要重建ADG环境或使用闪回数据库 | 可以使用pg_rewind重新加入集群 | 重新配置为新从库 |
| 环境重建难度 | 高,需要专业知识 | 低,使用pg_rewind或pg_basebackup | 中等,需要处理GTID或binlog位置 |
| 故障恢复时间 | 长,需要重建数据库 | 短,通常几分钟内完成 | 中等,取决于数据量和工具 |
| 恢复后验证 | 需要检查保护模式和复制状态 | 需要检查复制状态和一致性 | 需要检查复制状态和GTID一致性 |
5.4 综合对比与适用场景
综合特性对比:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 数据一致性 | 高,支持最大保护模式 | 高,支持同步复制 | 中等,增强半同步减少数据丢失 |
| 性能影响 | 最大保护模式下性能影响较大 | 同步复制模式下性能影响较大 | 半同步模式下性能影响较小 |
| 部署复杂度 | 高,需要专业知识 | 中等,需要熟悉PostgreSQL复制 | 中等,需要配置半同步和GTID |
| 维护难度 | 高,需要专业DBA | 中等,社区支持丰富 | 中等,依赖第三方工具 |
| 自动化支持 | 中等,需要手动执行命令 | 高,第三方工具支持完善 | 高,多种自动化工具可选 |
| 云原生支持 | 中等,需要额外配置 | 高,Patroni等工具支持Kubernetes | 高,Orchestrator和InnoDB Cluster支持云环境 |
适用场景对比:
| 场景 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 企业级关键业务 | 首选,提供最高级别的数据保护 | 可选,适合对一致性要求高的场景 | 可选,适合对性能和一致性平衡的场景 |
| 开源项目和Web应用 | 不适用,成本较高 | 首选,开源且功能强大 | 首选,与LAMP栈集成良好 |
| 云原生环境 | 可以使用,但需要额外配置 | 首选,支持容器化部署 | 首选,InnoDB Cluster支持云环境 |
| 高并发写入场景 | 最大性能模式下适用 | 异步复制模式下适用 | 增强半同步模式下适用 |
| 地理分布式部署 | 最大可用模式下适用 | 异步复制模式下适用 | 不推荐,延迟可能影响性能 |
| 混合工作负载(读写分离) | 支持,备库可用于只读查询 | 支持,备库可用于只读查询 | 支持,但需要考虑复制延迟 |
成本与许可对比:
| 特性 | Oracle ADG | PostgreSQL流复制 | MySQL增强半同步 |
|---|---|---|---|
| 许可成本 | 高,需要企业版许可 | 无,开源免费 | 社区版免费,企业版需要许可 |
| 硬件成本 | 高,建议使用专用硬件 | 低,可在普通硬件上运行 | 低,可在普通硬件上运行 |
| 管理成本 | 高,需要专业DBA | 中等,社区支持丰富 | 中等,需要熟悉MySQL复制 |
| 培训成本 | 高,Oracle专有技术 | 中等,社区资源丰富 | 低,MySQL生态系统成熟 |
六、结论与最佳实践
6.1 核心结论
-
WAL/redo机制:
- Oracle ADG使用物理redo日志,提供最强的数据保护但成本较高。
- PostgreSQL流复制基于WAL日志,提供灵活的复制模式和强大的生态系统。
- MySQL增强半同步使用二进制日志,在性能和一致性之间取得平衡。
-
主备切换机制:
- 三种机制都支持计划内切换,但Oracle ADG需要更多手动步骤,而PostgreSQL和MySQL有更完善的自动化工具。
- PostgreSQL的repmgr和Patroni工具提供了最完善的自动化切换功能。
- MySQL的GTID简化了主备切换时的同步位置定位。
-
故障切换机制:
- Oracle ADG的故障切换可能导致数据丢失,且需要重建ADG环境。
- PostgreSQL和MySQL都有成熟的自动故障切换解决方案,支持快速恢复。
- 增强半同步复制和PostgreSQL的同步复制模式都能有效减少故障切换时的数据丢失。
-
综合评价:
- 对于企业级关键业务,Oracle ADG提供最高级别的数据保护,但成本和复杂性较高。
- 对于开源项目和云原生环境,PostgreSQL流复制是最佳选择,提供高性能和强大的生态系统。
- 对于MySQL生态系统的应用,增强半同步复制结合InnoDB Cluster或MHA提供了高性能和高可用性的解决方案。
6.2 最佳实践建议
针对Oracle ADG的最佳实践:
-
保护模式选择:根据业务需求选择适当的保护模式,关键业务使用最大保护模式,高并发业务使用最大性能模式。
-
定期测试切换:定期进行Switchover测试,确保在紧急情况下能够顺利进行Failover。
-
监控与预警:设置完善的监控系统,监控Redo传输状态、保护模式和潜在的日志GAP。
-
备份策略:结合RMAN备份和ADG,确保在灾难情况下能够快速恢复。
针对PostgreSQL流复制的最佳实践:
-
使用repmgr或Patroni:在生产环境中,使用repmgr或Patroni等工具实现自动化的主备切换和故障切换。
-
配置复制槽:使用复制槽确保主库保留足够的WAL日志,防止备库长时间断开后无法恢复。
-
监控复制延迟:使用pg_stat_replication和pg_stat_activity监控复制状态和延迟。
-
定期演练:定期进行故障切换演练,确保团队熟悉流程并验证自动化工具的有效性。
针对MySQL增强半同步复制的最佳实践:
-
启用GTID:始终启用GTID,简化主从切换和故障恢复过程。
-
使用增强半同步:在主库和从库上启用增强半同步复制,减少数据丢失风险。
-
选择合适的自动化工具:根据环境选择MHA、Orchestrator或InnoDB Cluster等自动化工具。
-
监控复制状态:使用SHOW SLAVE STATUS和Percona Toolkit监控复制状态和延迟。
-
连接池优化:优化应用连接池配置,确保在数据库切换时能够快速恢复连接。
通用最佳实践:
-
数据一致性验证:无论使用哪种机制,定期验证主从数据一致性是关键。
-
自动化与监控:投资于自动化工具和监控系统,减少人为错误并提高恢复速度。
-
文档与培训:维护详细的架构文档,并对团队进行培训,确保在紧急情况下能够有效响应。
-
灾难恢复计划:制定详细的灾难恢复计划,并定期演练,确保在极端情况下能够快速恢复服务。
-
成本效益分析:在选择复制机制时,进行全面的成本效益分析,包括许可成本、硬件成本和管理成本。
通过理解和应用这些最佳实践,您可以根据具体业务需求选择最合适的数据库复制机制,并确保您的数据库系统具备高可用性和数据一致性,能够在各种故障场景下快速恢复。
内容由 AI 生成

1628

被折叠的 条评论
为什么被折叠?



