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 |
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 |
firewall-cmd --permanent --add-port=5432/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd –reload |
已关闭防火墙的不用执行上述操作。
1.1.1.2 修改用户密码:
1.1.1.3 开启远程访问
# 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 |
curl https://access.2ndquadrant. com/api/repository/dl/default/release/9.4/rpm | bash yum install postgresql94-pglogical |
1.2.2.1 修改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
# 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 |
CREATE EXTENSION pglogical; |
CREATE EXTENSION pglogical_origin; |
SELECT pglogical.create_node( node_name := 'provider1', dsn := 'host=providerhost port=5432 dbname=db' ); |
SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); |
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' ); |
可以使用SQL接口动态添加和删除节点。
参数:
参数:
当创建节点,因为它的接口也与所创建的 dsn 指定 create_node ,并与相同的名称的节点。此接口允许将具有不同连接字符串的备用接口添加到现有节点。
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
复制集提供了一种机制来控制将复制数据库中的哪些表以及将复制这些表上的哪些操作。
如果每个复制组可以分别指定 INSERTs, UPDATEs, DELETEs 并 TRUNCATEs 在集被复制。每个表都可以在多个复制集中,每个订阅者也可以订阅多个复制集。复制的结果表和操作集是表所在的集合的并集。在将表添加到复制集之前,不会复制表。
有三个预先存在的复制集,名为“default”,“default_insert_only”和“ddl_sql”。定义“默认”复制集以复制对表的所有更改。“default_insert_only”仅复制INSERT,适用于没有主键的表(有关详细信息,请参阅限制部分)。定义“ddl_sql”复制集以复制由其指定的架构更改pglogical.replicate_ddl_command
提供了以下用于管理复制集的函数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
参数:
您可以通过查询pglogical.tables 视图来查看有关哪个表在哪个表中的信息 。
事件触发器工具可用于描述为新创建的表定义复制集的规则。
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 复制集。
参数:
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 是:
可用的设置和默认值取决于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。
此设置的主要用途是禁止记录冲突。
可能的值与log_min_messagesPostgreSQL设置相同。
默认是LOG。
批量插入将改善多个插入到一个表中的事务的复制性能。当事务执行超过5次INSERT时,PGLogical将切换到批处理模式。
只有当表中没有INSTEAD OF INSERT和BEFORE INSERT触发器以及表的列没有带有volatile表达式的默认值时,才能切换到批处理模式。批处理模式也只有在pglogical.conflict_resolution设置为时才有效error。
默认是true。
这主要用于Postgres-XL和调试目的。
PostgreSQL中的默认值是false。
true仅当pglogical.conflict_resolution设置为时,才能将其设置为error。在此状态下,未检测到冲突。
在Postgres-XL中,默认且仅允许设置为true。
默认为空,这告诉PGLogical根据环境和操作系统设置使用默认临时目录。
目前,pglogical复制和管理需要超级用户权限。它可能稍后扩展到更细粒度的权限。
UNLOGGED 和 TEMPORARY 表不会也不能复制,就像物理流复制一样。
要复制多个数据库,您必须为每个数据库设置单独的提供者/订阅者关系。无法一次为PostgreSQL安装中的所有数据库配置复制。
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 有关副本标识的详细信息。
如果配置了多个上游或下游接受本地写入,则UNIQUE 下游复制表中只应存在一个 索引。冲突解决方案一次只能使用一个索引,因此ERROR 如果行满足 PRIMARY KEY 但是违反了UNIQUE 下游侧的 约束,则冲突的行可能会发生冲突。这将停止复制,直到修改下游表以删除违规。
如果下游只从上游获取写入而在其他地方获得写入,那么在上游获得额外的唯一约束是很好的。规则是下游约束不得 比上游约束 更严格。
不支持自动DDL复制。管理DDL以使提供者和订阅者数据库保持兼容是用户的责任。
pglogical提供了pglogical.replicate_ddl_command 允许DDL在一致点上在提供者和订阅者上运行的 功能。
不支持冻结主服务器上的事务并等待从插槽重放所有挂起的排队xact。将来版本中将添加对此上游只读的支持。
这意味着在应用表结构更改时必须小心。如果存在尚未复制的已提交事务,并且提供者和订阅者的表结构同时更改,使订阅者表与排队事务不兼容,则复制将停止。
管理员应确保在进行模式更改之前停止对主服务器的写入,或使用该pglogical.replicate_ddl_command 功能对模式更改进行排队,以便在副本上的一致点重放这些更改。
一旦添加了多主复制支持,那么使用 pglogical.replicate_ddl_command 将是不够的,因为订阅者可能在发布者上提交模式更改之后生成具有旧结构的新xact。用户必须确保在所有节点上停止写入,并且在进行架构更改之前会捕获所有插槽。
不会对复制过程强制执行外键constaints - 即使FOREIGN KEY 违反了,也会在提供者端成功应用于订阅者 。
使用 TRUNCATE ... CASCADE 将仅CASCADE 在提供者端应用 选项。
(正确处理这可能需要ON TRUNCATE CASCADE 在PostgreSQL中添加对外键的 支持)。
TRUNCATE ... RESTART IDENTITY 不受支持。身份重新启动步骤不会复制到副本。
添加到复制集的序列状态会定期复制,而不是实时复制。动态缓冲区用于复制的值,以便订户实际接收序列的未来状态。这最大限度地减少了订阅者的序列last_value落后的概率,但并未完全消除可能性。
可能需要调用 synchronize_sequence 以确保所有订户在数据库中的“重大事件”之后具有关于给定序列的最新信息,例如数据加载或在线升级期间。
一般建议 在多节点系统上使用 bigserial 和 bigint键入序列,因为较小的序列可能快速到达序列空间的末尾。
希望在提供者和订阅者上具有独立序列的用户可以避免将序列添加到复制集并创建步长间隔等于或大于节点数的序列。然后在每个节点上设置不同的偏移量。使用 或 INCREMENT BY 选项 ,然后使用它 来设置起点。CREATE SEQUENCEALTER SEQUENCEsetval(...)
应用进程和初始COPY进程都使用session_replication_role set 运行, replica 这意味着将 触发ENABLE REPLICA 和 ENABLE ALWAYS触发器。
pglogical可以在PostgreSQL主要版本中复制。尽管如此,长期跨版本复制并不被视为设计目标,尽管它可能经常起作用。在跨版本进行复制时,更有可能出现更改在提供程序上有效但在订阅服务器上无效的问题。
从旧版本复制到较新版本更安全,因为PostgreSQL保持稳固的向后兼容性,但只有有限的向前兼容性。
在不同的次要版本之间复制根本没有区别。
PGLogical不支持具有不同编码的数据库之间的复制。我们建议UTF-8在所有复制数据库中使用编码。
逻辑解码不直接解码目录更改。所以插件不能只CREATE TABLE 在添加新表时发送 语句。
如果正在解码的数据被应用于另一个PostgreSQL数据库,则其表定义必须通过逻辑解码插件外部的某些方式保持同步,例如:
事件触发器使用DDL deparse来捕获DDL更改,并将它们写入要复制的表并在另一端应用; 要么
通过在所有节点上同步DDL的工具进行DDL管理
Postgres-XL仅作为订阅者支持(不能是提供者)。对于具有许多小事务的工作负载,由于写入延迟增加,复制性能可能会受到影响。另一方面,大量插入(或批量复制)事务经过大量优化,可以使用Postgres-XL非常快速地工作。
此外,任何DDL限制都适用,因此在使用时需要格外小心replicate_ddl_command()。
Postgre-XL更改默认设置和可用设置pglogical.conflict_resolution以及pglogical.use_spi配置选项。
pglogical 基于为BDR开发的技术,并与BDR共享一些代码。它的设计比BDR更灵活,更适用于单主机单向复制,数据收集/合并,非网状多主机拓扑等。
它省略了BDR中的一些功能:
有关详细信息,请参阅“限制和限制”。
它还增加了一些功能:
...但它的主要目的是提供一个更简洁,更简单的基础,不需要修补的PostgreSQL,具有可插拔和可扩展的设计。