Bootstrap pg_restore 之后的 bucardo 复制
Bootstrap bucardo replication after pg_restore
目前我正在设置 Master/Master 在不同位置的 5 个节点之间使用 bucardo 进行复制(应该提供位置透明性)。该数据库包含 ~500 个应该被复制的表。我根据它们之间的相互依赖性将它们分组为最多 50 个表的较小复制群。所有 table 都定义了主键,并且每个节点上的定序器都设置为提供系统范围内的唯一标识(基于残基 class)
为了在每个节点上获得一个初始数据库,我将一个 --data-only
自定义格式 pg_dump 放入一个文件中,并通过 pg_restore
在每个节点上恢复它。 Bucardo 同步设置了 bucardo_latest
策略来解决冲突。现在,当我开始同步时,bucardo 首先删除原始数据库中的所有数据集,然后从其中一个恢复的节点再次插入它,因为所有恢复的数据集都有一个“后来的时间戳”(我调用 pg_restore 的时间点) .这最终禁止了初始启动,因为 bucardo 需要很多时间并且也会失败,因为有很多数据集需要解决并且超时通常太短。
我在每个 table 上也有 'last_modified' 时间戳,由 UPDATE 触发器管理,但据我了解,pg_dump 通过 COPY 插入数据,因此这些触发器不会不会被解雇。
- bucardo 使用哪个时间戳来找出谁是
bucardo_latest
?
- 我必须用
set SESSION_REPLICATION_ROLE = 'replica';
之类的东西调用 pg_dump
吗?
我只是想让 bucardo 跟踪每个新的更改,而不是因为还原而执行伪更改。
编辑:pg_restore 确实在恢复时触发了多个触发器...如前所述,我在每个 table 中跟踪用户和最后修改日期,并且这些值设置给用户和恢复完成时的时间戳。我知道,我可以通过 psql
为纯文本格式恢复设置 SESSION_REPLICATION_ROLE。这对 pg_restore 也有可能吗?
common approach 是在配置复制之前进行 dump/restore 处理。
所以一个选项是:
- 删除每个数据库中的
bucardo
模式
- 为每个对象做一个
bucardo remove
(大多数允许使用all
,比如bucardo remove table all
- dump/restore 你的数据
- 重新配置复制。只需确保在添加同步时设置选项
onetimecopy=0
。这是默认设置,但我觉得把它明确化会更安全。
bucardo用哪个时间戳来查出谁是bucardo_latest?
bucardo
处理自己的时间戳值。每个 table 都应该有一个名为 bucardo.delta_myschema_mytable
的触发器,它创建并插入一个名为 bucardo.delta_myschema_mytable
的 table。此 table 有一列 txntime timestamp with time zone not null default now()
,这是使用的时间戳。
我是否必须用类似 set SESSION_REPLICATION_ROLE = 'replica';?
的方式调用 pg_dump
AFAIK,如果 bucardo
触发器已在 table 中设置,则 pg_restore
的选项 --disable-triggers
应该可以解决问题。
您还可以查看这些关于使用 large databases and the use of session_replication_role
的文章
目前我正在设置 Master/Master 在不同位置的 5 个节点之间使用 bucardo 进行复制(应该提供位置透明性)。该数据库包含 ~500 个应该被复制的表。我根据它们之间的相互依赖性将它们分组为最多 50 个表的较小复制群。所有 table 都定义了主键,并且每个节点上的定序器都设置为提供系统范围内的唯一标识(基于残基 class)
为了在每个节点上获得一个初始数据库,我将一个 --data-only
自定义格式 pg_dump 放入一个文件中,并通过 pg_restore
在每个节点上恢复它。 Bucardo 同步设置了 bucardo_latest
策略来解决冲突。现在,当我开始同步时,bucardo 首先删除原始数据库中的所有数据集,然后从其中一个恢复的节点再次插入它,因为所有恢复的数据集都有一个“后来的时间戳”(我调用 pg_restore 的时间点) .这最终禁止了初始启动,因为 bucardo 需要很多时间并且也会失败,因为有很多数据集需要解决并且超时通常太短。
我在每个 table 上也有 'last_modified' 时间戳,由 UPDATE 触发器管理,但据我了解,pg_dump 通过 COPY 插入数据,因此这些触发器不会不会被解雇。
- bucardo 使用哪个时间戳来找出谁是
bucardo_latest
? - 我必须用
set SESSION_REPLICATION_ROLE = 'replica';
之类的东西调用pg_dump
吗?
我只是想让 bucardo 跟踪每个新的更改,而不是因为还原而执行伪更改。
编辑:pg_restore 确实在恢复时触发了多个触发器...如前所述,我在每个 table 中跟踪用户和最后修改日期,并且这些值设置给用户和恢复完成时的时间戳。我知道,我可以通过 psql
为纯文本格式恢复设置 SESSION_REPLICATION_ROLE。这对 pg_restore 也有可能吗?
common approach 是在配置复制之前进行 dump/restore 处理。
所以一个选项是:
- 删除每个数据库中的
bucardo
模式 - 为每个对象做一个
bucardo remove
(大多数允许使用all
,比如bucardo remove table all
- dump/restore 你的数据
- 重新配置复制。只需确保在添加同步时设置选项
onetimecopy=0
。这是默认设置,但我觉得把它明确化会更安全。
bucardo用哪个时间戳来查出谁是bucardo_latest?
bucardo
处理自己的时间戳值。每个 table 都应该有一个名为 bucardo.delta_myschema_mytable
的触发器,它创建并插入一个名为 bucardo.delta_myschema_mytable
的 table。此 table 有一列 txntime timestamp with time zone not null default now()
,这是使用的时间戳。
我是否必须用类似 set SESSION_REPLICATION_ROLE = 'replica';?
的方式调用 pg_dumpAFAIK,如果 bucardo
触发器已在 table 中设置,则 pg_restore
的选项 --disable-triggers
应该可以解决问题。
您还可以查看这些关于使用 large databases and the use of session_replication_role
的文章