- 安装部署:
1.1 先觉条件,先要安装pgsql数据库
- 先到https://yum.postgresql.org/repopackages.php寻找合适的系统pgsql版本。
- 我的选型的是pgsql9.4,系统是CentOS 7 - x86_64,复制链接地址
- 用yum安装:
yum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-3.noarch.rpm yum install postgresql94-server postgresql94-contrib |
- 安装过程输入y确定,安装完毕运行rpm -aq| grep postgres命令,会出现以下四条:
postgresql94-contrib-9.4.19-2PGDG.rhel7.x86_64 postgresql94-server-9.4.19-2PGDG.rhel7.x86_64 postgresql94-libs-9.4.19-2PGDG.rhel7.x86_64 postgresql94-9.4.19-2PGDG.rhel7.x86_64 |
- 此为安装成功!如果已有数据库,请直接执行上面命令,查看是否有这四条
- 缺少哪个包请补安装哪个包。
- 安装完成,初始化数据库(以下操作已有数据库不要执行,用于新安装的数据库):
/usr/pgsql-9.4/bin/postgresql94-setup initdb |
- 设置开机自启动
systemctl enable postgresql-94 systemctl start postgresql-94 |
- 执行psql --version验证是否成功。出现版本号,成功。
-
- 配置pgsql
- 配置防火墙,开启端口:
firewall-cmd --permanent --add-port=5432/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd –reload |
已关闭防火墙的不用执行上述操作。
1.1.1.2 修改用户密码:
- 切换用户:su – postgres
- 登录数据库: psql -U postgres 也可直接执行psql,在postgres用户下默认。
- 设置postgres用户密码为postgres:ALTER USER postgres WITH PASSWORD 'postgres';
- 退出数据库:\q
1.1.1.3 开启远程访问
- vim /var/lib/pgsql/9.4/data/postgresql.conf
- 修改#listen_addresses = 'localhost' 为 listen_addresses='*‘;
- 当然,我设置的是监听所有,此处‘*’也可以改为任何你想开放的服务器IP。
- vim /var/lib/pgsql/10/data/pg_hba.conf
- 改为任修改如下内容,信任指定服务器连接
# IPv4 local connections: host all all 127.0.0.1/32 trust host all all 0.0.0.0/0(我这写的是所有,可改成需要连接的服务器IP) trust |
1.1.1.4 重启服务
systemctl restart postgresql-10 |
-
- 安装pglogical
1.2.1 安装“2ndQuadrant的General Public”存储库
- Pgsql准备完成,以root身份运行以下命令:
curl https://access.2ndquadrant. com/api/repository/dl/default/release/9.4/rpm | bash yum install postgresql94-pglogical |
- 安装完成执行rpm -aq| grep postgres,显示除了上面四个,还会多下面这个:
- postgresql94-pglogical-2.2.1-1.el7.x86_64
1.2.2 配置pgsql
1.2.2.1 修改postgresql.conf
- vim /var/lib/pgsql/9.4/data/postgresql.conf
- 添加以下配置:
wal_level = 'logical' max_worker_processes = 10 # one per database needed on provider node # one per node needed on subscriber node max_replication_slots = 10 # one per node needed on provider node max_wal_senders = 10 # one per node needed on provider node shared_preload_libraries = 'pglogical' |
1.2.2.2 修改pg_hba.conf
- vim /var/lib/pgsql/10/data/pg_hba.conf
- 配置允许复制连接。
- 放开注释,修改成下面样子(在文档最下面):
# replication privilege. local replication postgres trust host replication postgres 127.0.0.1/32 trust host replication postgres ::1/128 trust host replication postgres 10.0.7.0/24(可改为需要连接的ip或网段) trust |
1.2.3.1 配置pglogical
- 必须在所有节点上安装扩展
CREATE EXTENSION pglogical; |
- 如果使用PostgreSQL 9.4,则pglogical_origin还必须在该节点上安装扩展:
CREATE EXTENSION pglogical_origin; |
1.2.3.2 提供者节点配置
- 在一个数据库里创建提供者节点:
SELECT pglogical.create_node( node_name := 'provider1', dsn := 'host=providerhost port=5432 dbname=db' ); |
- 创建复制集,将public架构中的所有表添加到default复制集中:
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); |
1.2.3.3 订阅者节点配置
- 在另一个数据库创建订阅者节点:
SELECT pglogical.create_node( node_name := 'subscriber1', dsn := 'host=thishost port=5432 dbname=db' ); |
- 在订阅者节点,创建订阅,订阅提供者节点,该订阅将在后台启动同步和复制过程:
SELECT pglogical.create_subscription( subscription_name := 'subscription1', provider_dsn := 'host=providerhost port=5432 dbname=db' ); |
- 用法:
2.1 节点管理
可以使用SQL接口动态添加和删除节点。
- pglogical.create_node(node_name name, dsn text) 创建一个节点。
参数:
-
- node_name - 新节点的名称,每个数据库只允许一个节点
- dsn - 节点的连接字符串,对于应该是提供者的节点,应该可以从外部访问
- pglogical.drop_node(node_name name, ifexists bool) 删除pglogical节点。
参数:
-
- node_name - 现有节点的名称
- ifexists - 如果为true,则在订阅不存在时不会引发错误,默认为false
- pglogical.alter_node_add_interface(node_name name, interface_name name, dsn text) 向节点添加其他接口。
当创建节点,因为它的接口也与所创建的 dsn 指定 create_node ,并与相同的名称的节点。此接口允许将具有不同连接字符串的备用接口添加到现有节点。
参数:
-
- node_name - 现有节点的名称
- interface_name - 要添加的新接口的名称
- dsn - 用于新接口的节点的连接字符串
- pglogical.alter_node_drop_interface(node_name name, interface_name name) 从节点中删除现有接口。
参数:
-
- node_name - 现有节点的名称
- interface_name - 现有接口的名称
2.2 订阅管理
- pglogical.create_subscription(subscription_name name, provider_dsn text, replication_sets text[], synchronize_structure boolean, synchronize_data boolean, forward_origins text[], apply_delay interval) 创建从当前节点到提供者节点的订阅。命令不会阻止,只是启动操作。
参数:
-
- subscription_name - 订阅的名称,必须是唯一的
- provider_dsn - 提供者的连接字符串
- replication_sets - 要订阅的复制集数组,这些必须已存在,默认为“{default,default_insert_only,ddl_sql}”
- synchronize_structure - 指定是否将提供者与订阅者之间的结构同步,默认为false
- synchronize_data - 指定是否将数据从提供者同步到订阅者,默认为true
- forward_origins - 要转发的原始名称数组,当前只支持的值是空数组,意味着不转发任何不是源自提供者节点的更改,或“{all}”这意味着复制所有更改,无论它们的来源是什么,默认是全部}”
- apply_delay - 延迟复制多少,默认为0秒
- pglogical.drop_subscription(subscription_name name, ifexists bool) 断开订阅并将其从目录中删除。
参数:
-
- subscription_name - 现有订阅的名称
- ifexists - 如果为true,则在订阅不存在时不会引发错误,默认为false
- pglogical.alter_subscription_disable(subscription_name name, immediate bool) 禁用订阅并将其与提供程序断开连接。
参数:
-
- subscription_name - 现有订阅的名称
- immediate - 如果为true,则立即停止订阅,否则它将仅在当前事务结束时停止,默认为false
- pglogical.alter_subscription_enable(subscription_name name, immediate bool) 启用禁用订阅。
参数:
-
- subscription_name - 现有订阅的名称
- immediate - 如果为true,则立即启动订阅,否则它将仅在当前事务结束时启动,默认为false
- pglogical.alter_subscription_interface(subscription_name name, interface_name name) 切换订阅以使用不同的接口连接到提供者节点。
参数:
-
- subscription_name - 现有订阅的名称
- interface_name - 当前提供者节点的现有接口的名称
- pglogical.alter_subscription_synchronize(subscription_name name, truncate bool) 所有集中的所有未同步表都在单个操作中同步。表被逐个复制和同步。命令不会阻止,只是启动操作。
参数:
-
- subscription_name - 现有订阅的名称
- truncate - 如果为true,表将在复制前被截断,默认为false
- pglogical.alter_subscription_resynchronize_table(subscription_name name, relation regclass) 重新同步一个现有表。 警告:此函数将首先截断表。
参数:
-
- subscription_name - 现有订阅的名称
- relation - 现有表的名称,可选择限定
- pglogical.show_subscription_status(subscription_name name) 显示有关订阅的状态和基本信息。
参数:
-
- subscription_name - 现有订阅的可选名称,如果未提供名称,该函数将显示本地节点上所有订阅的状态
- pglogical.show_subscription_table(subscription_name name, relation regclass) 显示表的同步状态。
参数:
-
- subscription_name - 现有订阅的名称
- relation - 现有表的名称,可选择限定
- pglogical.alter_subscription_add_replication_set(subscription_name name, replication_set name) 将一个复制集添加到订户中。不同步,仅激活事件消耗。
参数:
-
- subscription_name - 现有订阅的名称
- replication_set - 要添加的复制名称集
- pglogical.alter_subscription_remove_replication_set(subscription_name name, replication_set name) 从订户中删除一个复制集。
参数:
-
- subscription_name - 现有订阅的名称
- replication_set - 要删除的复制名称
2.3 复制集
复制集提供了一种机制来控制将复制数据库中的哪些表以及将复制这些表上的哪些操作。
如果每个复制组可以分别指定 INSERTs, UPDATEs, DELETEs 并 TRUNCATEs 在集被复制。每个表都可以在多个复制集中,每个订阅者也可以订阅多个复制集。复制的结果表和操作集是表所在的集合的并集。在将表添加到复制集之前,不会复制表。
有三个预先存在的复制集,名为“default”,“default_insert_only”和“ddl_sql”。定义“默认”复制集以复制对表的所有更改。“default_insert_only”仅复制INSERT,适用于没有主键的表(有关详细信息,请参阅限制部分)。定义“ddl_sql”复制集以复制由其指定的架构更改pglogical.replicate_ddl_command
提供了以下用于管理复制集的函数:
- pglogical.create_replication_set(set_name name, replicate_insert bool, replicate_update bool, replicate_delete bool, replicate_truncate bool) 此函数创建一个新的复制集。
参数:
-
- set_name - 集合的名称,必须是唯一的
- replicate_insert - 指定是否 INSERT 复制,默认为true
- replicate_update - 指定是否 UPDATE 复制,默认为true
- replicate_delete - 指定是否 DELETE 复制,默认为true
- replicate_truncate - 指定是否 TRUNCATE 复制,默认为true
- pglogical.alter_replication_set(set_name name, replicate_inserts bool, replicate_updates bool, replicate_deletes bool, replicate_truncate bool) 此函数更改现有复制集的参数。
参数:
-
- set_name - 现有复制集的名称
- replicate_insert - 指定是否 INSERT 复制,默认为true
- replicate_update - 指定是否 UPDATE 复制,默认为true
- replicate_delete - 指定是否 DELETE 复制,默认为true
- replicate_truncate - 指定是否 TRUNCATE 复制,默认为true
- pglogical.drop_replication_set(set_name text) 删除复制集。
参数:
-
- pglogical.replication_set_add_table(set_name name, relation regclass, synchronize_data boolean, columns text [],row_filter text) 将表添加到复制集。
参数:
-
- set_name - 现有复制集的名称
- relation - 要添加到集合中的表的名称或OID
- synchronize_data - 如果为true,则表数据将在订阅给定复制集的所有订户上同步,默认为false
- columns - 要复制的列的列表。通常,当应复制所有列时,这将设置为NULL,这是默认值
- row_filter - 行过滤表达式,默认为NULL(无过滤),有关详细信息,请参阅(行过滤)。警告:在使用有效行筛选器同步数据时要小心。使用synchronize_data=true有效row_filter就像对表的一次性操作。使用修改后再次执行它将row_filter不会将数据同步到订户。订阅者可能需要打电话pglogical.alter_subscription_resynchronize_table()来修复它。
- pglogical.replication_set_add_all_tables(set_name name, schema_names text[], synchronize_data boolean) 添加给定模式中的所有表。仅添加现有表,将来不会自动添加将要创建的表。有关如何确保将来创建的表添加到正确的复制集,请参见为新表自动分配复制集一节。
参数:
-
- set_name - 现有复制集的名称
- schema_names - 应从中添加表的现有模式的名称数组
- synchronize_data - 如果为true,则表数据将在订阅给定复制集的所有订户上同步,默认为false
- pglogical.replication_set_remove_table(set_name name, relation regclass) 从复制集中删除表。
参数:
-
- set_name - 现有复制集的名称
- relation - 要从集中删除的表的名称或OID
- pglogical.replication_set_add_sequence(set_name name, relation regclass, synchronize_data boolean) 将序列添加到复制集。
参数:
-
- set_name - 现有复制集的名称
- relation - 要添加到集合的序列的名称或OID
- synchronize_data - 如果为true,则序列值将立即同步,默认为false
- pglogical.replication_set_add_all_sequences(set_name name, schema_names text[], synchronize_data boolean) 在给定模式中添加所有序列。仅添加现有序列,将来不会添加将在以后创建的任何序列。
参数:
-
- set_name - 现有复制集的名称
- schema_names - 应添加序列的现有模式的名称数组
- synchronize_data - 如果为true,则序列值将立即同步,默认为false
- pglogical.replication_set_remove_sequence(set_name name, relation regclass) 从复制集中删除表。
参数:
-
- set_name - 现有复制集的名称
- relation - 要从集合中删除的序列的名称或OID
您可以通过查询pglogical.tables 视图来查看有关哪个表在哪个表中的信息 。
2.3.1 为新表自动分配复制集
事件触发器工具可用于描述为新创建的表定义复制集的规则。
CREATE OR REPLACE FUNCTION pglogical_assign_repset() RETURNS event_trigger AS $$ DECLARE obj record; BEGIN FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP IF obj.object_type = 'table' THEN IF obj.schema_name = 'config' THEN PERFORM pglogical.replication_set_add_table('configuration', obj.objid); ELSIF NOT obj.in_extension THEN PERFORM pglogical.replication_set_add_table('default', obj.objid); END IF; END IF; END LOOP; END; $$ LANGUAGE plpgsql; CREATE EVENT TRIGGER pglogical_assign_repset_trg ON ddl_command_end WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS') EXECUTE PROCEDURE pglogical_assign_repset(); |
上面的示例将把在schema中创建的所有新表 config 放入复制集 configuration ,而不是由扩展创建的所有其他新表将转到 default 复制集。
2.4 附加功能
- pglogical.replicate_ddl_command(command text, replication_sets text[]) 在本地执行,然后将指定的命令发送到复制队列,以便在订阅了其中一个指定订阅者的订阅者上执行 replication_sets。
参数:
-
- command - 要执行的DDL查询
- replication_sets - 此命令应与之关联的复制集数组,默认为“{ddl_sql}”
- pglogical.synchronize_sequence(relation regclass) 将序列状态推送给所有订户。与订阅和表同步功能不同,此功能应在提供程序上运行。它强制更新跟踪序列状态,一旦它们复制已执行此功能的事务,所有订户将使用它(复制集过滤仍然适用)。
- 参数:
- relation - 现有序列的名称,可选择限定
2.5 行过滤
PGLogical允许在提供者端和用户端进行基于行的过滤。
- 提供者上的行过滤
在提供程序上,可以通过row_filter为pglogical.replication_set_add_table函数指定参数来完成行过滤。row_filter是普通的PostgreSQL表达式,它对CHECK 约束允许的内容具有相同的限制。
简单row_filter看起来row_filter := 'id > 0'会确保只id复制列值大于零的行。
允许在内部使用volatile函数row_filter但是必须谨慎处理写入,因为任何将执行写操作的表达式都会抛出错误并停止复制。
还值得注意的是,它row_filter在复制会话中运行,因此会话特定的表达式CURRENT_USER将具有复制会话的值,而不是执行写入的会话。
- 订阅者上的行过滤
在订户上,可以使用标准BEFORE TRIGGER 机制来实现基于行的过滤。
需要将标记任何这样的触发器为任一ENABLE REPLICA或ENABLE ALWAYS 否则他们不会由复制过程被执行。
- 冲突
如果节点订阅了多个提供者,或者在订阅者上发生本地写入,则可能会对传入的更改产生冲突。这些是自动检测的,可以根据配置进行操作。
冲突解决程序的配置通过pglogical.conflict_resolution 设置完成 。支持的值 pglogical.conflict_resolution 是:
- error - 如果检测到冲突并且需要手动操作来解析,则复制将在出错时停止
- apply_remote - 始终应用与本地数据冲突的更改,这是默认值
- keep_local - 保留数据的本地版本,并忽略来自远程节点的冲突更改
- last_update_wins - 将保留具有最新提交时间戳的数据版本(可以是本地版本或远程版本)
- first_update_wins - 将保留具有最早时间戳的数据版本(可以是本地版本或远程版本)
可用的设置和默认值取决于PostgreSQL的版本和其他设置。
PostgreSQL中的默认值是apply_remote。
的keep_local,last_update_wins并first_update_wins设置需要track_commit_timestamp的PostgreSQL设置启用。由于track_commit_timestamp在PostgreSQL中不可用9.4 pglogical.conflict_resolution只能是apply_remote或error。
在Postgres-XL中,唯一支持的值和默认值是error。
- pglogical.conflict_log_level设置当pglogical.conflict_resolution设置为除以外的任何其他内容时报告检测到的冲突的日志级别error。
此设置的主要用途是禁止记录冲突。
可能的值与log_min_messagesPostgreSQL设置相同。
默认是LOG。
- pglogical.batch_inserts告诉PGLogical如果可能的话使用批量插入机制。批处理机制使用PostgreSQL内部批量插入模式,COPY命令也使用该模式。
批量插入将改善多个插入到一个表中的事务的复制性能。当事务执行超过5次INSERT时,PGLogical将切换到批处理模式。
只有当表中没有INSTEAD OF INSERT和BEFORE INSERT触发器以及表的列没有带有volatile表达式的默认值时,才能切换到批处理模式。批处理模式也只有在pglogical.conflict_resolution设置为时才有效error。
默认是true。
- pglogical.use_spi告诉PGLogical使用SPI接口,以形成实际的SQL( ,INSERT,UPDATE)DELETE语句以应用的,而不是使用内部低级别接口传入更改。
这主要用于Postgres-XL和调试目的。
PostgreSQL中的默认值是false。
true仅当pglogical.conflict_resolution设置为时,才能将其设置为error。在此状态下,未检测到冲突。
在Postgres-XL中,默认且仅允许设置为true。
- pglogical.temp_directory定义系统路径放置架构同步所需的临时文件的位置。该路径需要存在并且可由运行Postgres的用户写入。
默认为空,这告诉PGLogical根据环境和操作系统设置使用默认临时目录。
- 限制
4.1 超级用户是必需的
目前,pglogical复制和管理需要超级用户权限。它可能稍后扩展到更细粒度的权限。
4.2 UNLOGGED 而 TEMPORARY 不是复制
UNLOGGED 和 TEMPORARY 表不会也不能复制,就像物理流复制一样。
4.3 一次一个数据库
要复制多个数据库,您必须为每个数据库设置单独的提供者/订阅者关系。无法一次为PostgreSQL安装中的所有数据库配置复制。
4.4 需要PRIMARY KEY或REPLICA IDENTITY
UPDATEDELETE对于缺少PRIMARY KEY 其他有效副本标识(如UNIQUE 约束)的表,无法复制s和 s 。由于没有唯一标识符,复制无法找到应更新/删除的元组。
请参阅 http://www.postgresql.org/docs/current/static/sql-altertable.html#SQL-CREATETABLE-REPLICA-IDENTITY http://www.postgresql.org/docs/current/static/sql-altertable。 html#SQL-CREATETABLE-REPLICA-IDENTITY 有关副本标识的详细信息。
4.5 只有一个唯一索引/约束/ PK
如果配置了多个上游或下游接受本地写入,则UNIQUE 下游复制表中只应存在一个 索引。冲突解决方案一次只能使用一个索引,因此ERROR 如果行满足 PRIMARY KEY 但是违反了UNIQUE 下游侧的 约束,则冲突的行可能会发生冲突。这将停止复制,直到修改下游表以删除违规。
如果下游只从上游获取写入而在其他地方获得写入,那么在上游获得额外的唯一约束是很好的。规则是下游约束不得 比上游约束 更严格。
4.6 DDL
不支持自动DDL复制。管理DDL以使提供者和订阅者数据库保持兼容是用户的责任。
pglogical提供了pglogical.replicate_ddl_command 允许DDL在一致点上在提供者和订阅者上运行的 功能。
4.7 没有复制队列刷新
不支持冻结主服务器上的事务并等待从插槽重放所有挂起的排队xact。将来版本中将添加对此上游只读的支持。
这意味着在应用表结构更改时必须小心。如果存在尚未复制的已提交事务,并且提供者和订阅者的表结构同时更改,使订阅者表与排队事务不兼容,则复制将停止。
管理员应确保在进行模式更改之前停止对主服务器的写入,或使用该pglogical.replicate_ddl_command 功能对模式更改进行排队,以便在副本上的一致点重放这些更改。
一旦添加了多主复制支持,那么使用 pglogical.replicate_ddl_command 将是不够的,因为订阅者可能在发布者上提交模式更改之后生成具有旧结构的新xact。用户必须确保在所有节点上停止写入,并且在进行架构更改之前会捕获所有插槽。
4.8 外键
不会对复制过程强制执行外键constaints - 即使FOREIGN KEY 违反了,也会在提供者端成功应用于订阅者 。
4.9 截断
使用 TRUNCATE ... CASCADE 将仅CASCADE 在提供者端应用 选项。
(正确处理这可能需要ON TRUNCATE CASCADE 在PostgreSQL中添加对外键的 支持)。
TRUNCATE ... RESTART IDENTITY 不受支持。身份重新启动步骤不会复制到副本。
4.10 序列
添加到复制集的序列状态会定期复制,而不是实时复制。动态缓冲区用于复制的值,以便订户实际接收序列的未来状态。这最大限度地减少了订阅者的序列last_value落后的概率,但并未完全消除可能性。
可能需要调用 synchronize_sequence 以确保所有订户在数据库中的“重大事件”之后具有关于给定序列的最新信息,例如数据加载或在线升级期间。
一般建议 在多节点系统上使用 bigserial 和 bigint键入序列,因为较小的序列可能快速到达序列空间的末尾。
希望在提供者和订阅者上具有独立序列的用户可以避免将序列添加到复制集并创建步长间隔等于或大于节点数的序列。然后在每个节点上设置不同的偏移量。使用 或 INCREMENT BY 选项 ,然后使用它 来设置起点。CREATE SEQUENCEALTER SEQUENCEsetval(...)
4.11 触发器
应用进程和初始COPY进程都使用session_replication_role set 运行, replica 这意味着将 触发ENABLE REPLICA 和 ENABLE ALWAYS触发器。
4.12 PostgreSQL版本差异
pglogical可以在PostgreSQL主要版本中复制。尽管如此,长期跨版本复制并不被视为设计目标,尽管它可能经常起作用。在跨版本进行复制时,更有可能出现更改在提供程序上有效但在订阅服务器上无效的问题。
从旧版本复制到较新版本更安全,因为PostgreSQL保持稳固的向后兼容性,但只有有限的向前兼容性。
在不同的次要版本之间复制根本没有区别。
4.13 数据库编码差异
PGLogical不支持具有不同编码的数据库之间的复制。我们建议UTF-8在所有复制数据库中使用编码。
4.14 不复制DDl
逻辑解码不直接解码目录更改。所以插件不能只CREATE TABLE 在添加新表时发送 语句。
如果正在解码的数据被应用于另一个PostgreSQL数据库,则其表定义必须通过逻辑解码插件外部的某些方式保持同步,例如:
事件触发器使用DDL deparse来捕获DDL更改,并将它们写入要复制的表并在另一端应用; 要么
通过在所有节点上同步DDL的工具进行DDL管理
4.15 Postgres-XL
Postgres-XL仅作为订阅者支持(不能是提供者)。对于具有许多小事务的工作负载,由于写入延迟增加,复制性能可能会受到影响。另一方面,大量插入(或批量复制)事务经过大量优化,可以使用Postgres-XL非常快速地工作。
此外,任何DDL限制都适用,因此在使用时需要格外小心replicate_ddl_command()。
Postgre-XL更改默认设置和可用设置pglogical.conflict_resolution以及pglogical.use_spi配置选项。
- pglogical与BDR有何不同?
pglogical 基于为BDR开发的技术,并与BDR共享一些代码。它的设计比BDR更灵活,更适用于单主机单向复制,数据收集/合并,非网状多主机拓扑等。
它省略了BDR中的一些功能:
- 网格多主。存在具有冲突解决方案的有限多主机支持,但必须单独添加相互复制连接。
- 分布式序列。而是在每个节点上使用不同的序列偏移。
- DDL复制。用户必须自己保持表定义一致。pglogical提供了队列函数来帮助解决这个问题。
- 全局DDL锁定。没有DDL复制,因此不需要全局锁定....仅适用于表,但会引入相互多主复制的问题。见下一点。
- 全局刷新到一致状态。BDR的DDL锁定的一部分是通过阻止提交新的xacts然后刷新到对等节点来插入所有节点的队列的步骤。这可确保队列中没有xacts,一旦表结构发生更改,就无法应用。pglogical不会这样做,因此尚不支持多主复制(其中节点彼此复制)。请参阅“限制”。
有关详细信息,请参阅“限制和限制”。
它还增加了一些功能:
- 节点之间的灵活连接; 拓扑不限于像BDR那样的网格配置。级联逻辑复制是可能的。
- 松散耦合的输出插件,可以重复用于其他项目
- JSON输出可以检查排队的事务
...但它的主要目的是提供一个更简洁,更简单的基础,不需要修补的PostgreSQL,具有可插拔和可扩展的设计。