一、pg_rewind的执行流程概述
1. 获取 pg_control 文件
首先获取源和目标节点的 pg_control 文件。pg_control 文件包含了数据库的关键控制信息,如检查点信息、时间线信息等。这些信息对于确定数据的同步点和同步方式至关重要。
2. 系统标识及版本检查
检查源和目标的 “系统标识” 是否一致,以及 pg_rewind的版本是否匹配。系统标识不一致可能意味着节点所属的系统环境不同,版本不匹配可能导致某些功能无法正常使用,从而影响数据同步的准确性。
3. 检查节点运行状态及访问权限
确认目标节点是否运行,同时检查通过文件系统路径访问源节点时,源节点是否运行。这一步骤再次强调了节点运行状态对数据同步的影响,并且确保在访问源节点数据时有正确的权限和条件。
4. 检查点时间线一致性检查
检查源和目标的 “Latest checkpoint's TimeLineID” 是否一致。如果一致,则说明数据在检查点处是同步的,不需要进行复杂的同步操作,可以直接退出(返回 Exit (0))。如果不一致,则需要计算分叉点的位置,这是确定数据差异开始的关键步骤。
5. 文件映射创建
遍历源节点的数据目录,收集目标节点不存在的文件 / 目录 / 链接,后续创建。在这个过程中,需要注意一些规则:
- 如果存在同名却类型不一致的文件 / 目录 / 链接(除了 pg_wal 外),则报错退出。这是为了避免数据结构混乱,确保同步的数据在类型上是一致的。
- 忽略临时目录 pgsql_tmp、postmater.pid 等。这些临时文件通常与节点的当前运行状态相关,不需要同步。
- 忽略用户自定义的文件 / 目录。用户自定义的文件可能具有特定的用途和结构,不适合进行统一的同步。
- 如果文件大小不一致,则需要对文件进行 truncate 或者 copy tail 操作。这是为了确保文件在目标节点上的大小与源节点一致,保证数据的完整性。
- 非表文件,一律重新拷贝一份。这是一种简单有效的确保非表文件同步的方法。
- 同时,遍历目标节点的数据目录,收集源节点不存在的文件 / 目录 / 链接等,后续要删除。这一步骤是为了清理目标节点上多余的文件,使目标节点的数据结构与源节点更加匹配。
6. 页面映射(pageMap)
获取目标节点在 “分叉点之前的第一个快照” 的位置 chkptrec。这个快照位置是数据同步的一个重要参考点。遍历目标节点 chkptrec 之后的所有 xlog 记录,在这个过程中:
- 忽略 Create Database 操作。如果源节点没有对应 db 的目录,前一个步骤会将其删除;如果源节点创建了同名的其他 db,replay 的时候也会被删除掉。
- 忽略 Drop Database 操作,因为源节点对应的 db 的目录会被重新拷贝过来。
- 忽略文件 Truncate 操作,大小不一致的文件会被 copy tail。
- 忽略文件的创建操作,因为会被自动删除。
- 如果更新表的主文件的数据块,且没有被源节点 trunc、remove 或者覆盖,则需要同步对应的数据块。这是为了确保表数据的一致性。
7. 坏块校验与修复(可选)
校验并收集目标节点所有表文件的坏块,后续修复这些坏块。这一步骤可以提高数据的质量和完整性,避免因为坏块问题导致数据错误。
8. 数据同步
同步数据(试运行模式下不会真正修改数据),包括同步坏块、快照点之后更新的块;truncate、copy 和源节点大小不一致的文件;创建不存在的目录、链接等。这是整个 pg_rewind执行过程中的核心操作,通过这些操作确保目标节点的数据与源节点在分叉点之后的数据保持一致。
9. 创建 backup_label 文件及更新 pg_control 文件
创建 backup_label 文件,使得目标节点重启后,从分差点前第一个快照点开始回放。同时更新 pg_control 文件,以反映数据同步后的状态。
二、pg_rewind在主从切换中的应用场景及意义
(一)应用场景
1. 主从切换后的数据同步
当主从节点发生切换后,如果主备的时间线不相等,pg_rewind可以用于同步数据。例如,在主节点发生故障,从节点晋升为主节点后,旧主节点需要降为备节点,此时如果数据存在差异,pg_rewind可以帮助旧主节点快速同步新主节点的数据。
2. 数据恢复与一致性维护
在某些情况下,如数据文件损坏或丢失,或者因为人为错误导致数据不一致,pg_rewind可以通过从其他节点同步数据来恢复数据的一致性。
(二)意义
1. 提高系统可用性
通过快速准确地同步数据,pg_rewind可以减少主从切换过程中的数据不一致时间,从而提高系统的可用性。系统可以更快地恢复到正常的主从运行状态,为用户提供持续的服务。
2. 确保数据一致性
pg_rewind严格的执行流程和原理保证了数据在主从节点之间的一致性。这对于数据库系统来说是至关重要的,因为数据一致性是数据库正确运行的基础,任何数据不一致都可能导致系统错误或数据丢失。
pg_rewind是一个功能强大且原理复杂的工具,它在数据库主从切换和数据一致性维护方面发挥着不可替代的作用。通过深入理解其执行流程和原理,我们可以更好地利用它来保障数据库系统的稳定运行。