searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

浅谈PostgreSQL的两种复制槽

2024-11-12 09:25:11
11
0

PostgreSQL复制槽分两种,物理复制槽(physical replication slot)和逻辑复制槽(logic replication slot),逻辑复制槽在PG10加入。

1.物理复制槽

        物理复制槽是 PostgreSQL 中用于主备同步的一种组件。物理复制涉及将主服务器上的二进制更改流式传输到一个或多个从服务器。这种复制是在较低级别进行的,复制的是实际的数据文件更改,而不是单独的数据记录或事务。物理复制槽的主要作用是确保主服务器上的 WAL 日志(预写式日志)不会在从服务器确认接收之前被删除,从而解决了备库掉线或主库重启导致的数据一致性问题。

        物理复制槽不能跨版本传输数据,因为物理复制涉及到底层数据文件的直接字节级复制。每个 PostgreSQL 版本可能会有不同的数据文件格式、内部索引结构、系统表的布局以及其他底层存储细节。这些差异意味着即使是小的版本升级也可能引入不兼容的更改,从而使得不同版本之间的直接数据文件复制变得不可行。

1.1创建物理复制槽

        修改postgresql.conf,加入wal_level = replica或logical,重启数据库。使用一个至少有replication权限的账号,执行SELECT pg_create_physical_replication_slot('my_replication_slot';创建物理复制槽。
        执行SELECT * FROM pg_replication_slots;可以看到已经创建的复制槽的信息。

1.2使用物理复制槽

        修改备库的postgresql.conf,加入:

primary_conninfo = 'host=master_host port=5432 user=replication_user password=replication_pass sslmode=prefer sslcompression=1 krbsrvname=postgres'
primary_slot_name = 'my_replication_slot'

standby_mode=on

        重启数据库使配置生效。此时备库会执行所有在主库上进行的操作,包括创建和更改表、索引、视图等。

2.逻辑复制槽

        物理复制槽虽然很好地解决了主备同步的问题,实现了数据库备份。但是,当主备库的数据库版本不一致、只需要同步部分表,或是需要在不同的数据库系统间进行同步时,物理复制槽就无能为力。

        与物理复制槽不同,逻辑复制槽允许用户复制表级的更改,而不是整个数据库的物理更改。这使得逻辑复制可以在不同版本的 PostgreSQL 数据库之间,甚至在不同的数据库系统之间进行数据复制。

        逻辑复制槽通过解码 WAL 记录来工作,它将 WAL 记录转换为SQL语句,然后输出到Subscriber。因此它不直接复制底层数据库,比起物理复制槽更慢,性能更差。

        2.1创建逻辑复制槽

        执行SELECT * FROM pg_create_logical_replication_slot('my_slot', 'pgoutput');第二个参数是使用的WAL解码插件,用于解码WAL文件并转换成特定格式,pgoutput是用于逻辑复制的官方输出插件,支持更复杂的复制需求,如表级复制控制。

        2.2创建Publisher

        执行CREATE PUBLICATION publication_name FOR TABLE table_name ,创建Publisher。在这里可以指定需要发布的表,可以指定多个表,用','隔开。发布整个库则使用ALL TABLE。ALTER PUBLICATION  publication_name ADD table_name可增加Publisher发布的表。

        2.3创建订阅者

        在备库,执行CREATE SUBSCRIPTION subseription_name CONNECTION 'dbname=mydb host=your_host user=your_user password=your_password' PUBLICATION publication_name完成对publisher发布的表的同步。

0条评论
0 / 1000
李****恒
2文章数
0粉丝数
李****恒
2 文章 | 0 粉丝
李****恒
2文章数
0粉丝数
李****恒
2 文章 | 0 粉丝
原创

浅谈PostgreSQL的两种复制槽

2024-11-12 09:25:11
11
0

PostgreSQL复制槽分两种,物理复制槽(physical replication slot)和逻辑复制槽(logic replication slot),逻辑复制槽在PG10加入。

1.物理复制槽

        物理复制槽是 PostgreSQL 中用于主备同步的一种组件。物理复制涉及将主服务器上的二进制更改流式传输到一个或多个从服务器。这种复制是在较低级别进行的,复制的是实际的数据文件更改,而不是单独的数据记录或事务。物理复制槽的主要作用是确保主服务器上的 WAL 日志(预写式日志)不会在从服务器确认接收之前被删除,从而解决了备库掉线或主库重启导致的数据一致性问题。

        物理复制槽不能跨版本传输数据,因为物理复制涉及到底层数据文件的直接字节级复制。每个 PostgreSQL 版本可能会有不同的数据文件格式、内部索引结构、系统表的布局以及其他底层存储细节。这些差异意味着即使是小的版本升级也可能引入不兼容的更改,从而使得不同版本之间的直接数据文件复制变得不可行。

1.1创建物理复制槽

        修改postgresql.conf,加入wal_level = replica或logical,重启数据库。使用一个至少有replication权限的账号,执行SELECT pg_create_physical_replication_slot('my_replication_slot';创建物理复制槽。
        执行SELECT * FROM pg_replication_slots;可以看到已经创建的复制槽的信息。

1.2使用物理复制槽

        修改备库的postgresql.conf,加入:

primary_conninfo = 'host=master_host port=5432 user=replication_user password=replication_pass sslmode=prefer sslcompression=1 krbsrvname=postgres'
primary_slot_name = 'my_replication_slot'

standby_mode=on

        重启数据库使配置生效。此时备库会执行所有在主库上进行的操作,包括创建和更改表、索引、视图等。

2.逻辑复制槽

        物理复制槽虽然很好地解决了主备同步的问题,实现了数据库备份。但是,当主备库的数据库版本不一致、只需要同步部分表,或是需要在不同的数据库系统间进行同步时,物理复制槽就无能为力。

        与物理复制槽不同,逻辑复制槽允许用户复制表级的更改,而不是整个数据库的物理更改。这使得逻辑复制可以在不同版本的 PostgreSQL 数据库之间,甚至在不同的数据库系统之间进行数据复制。

        逻辑复制槽通过解码 WAL 记录来工作,它将 WAL 记录转换为SQL语句,然后输出到Subscriber。因此它不直接复制底层数据库,比起物理复制槽更慢,性能更差。

        2.1创建逻辑复制槽

        执行SELECT * FROM pg_create_logical_replication_slot('my_slot', 'pgoutput');第二个参数是使用的WAL解码插件,用于解码WAL文件并转换成特定格式,pgoutput是用于逻辑复制的官方输出插件,支持更复杂的复制需求,如表级复制控制。

        2.2创建Publisher

        执行CREATE PUBLICATION publication_name FOR TABLE table_name ,创建Publisher。在这里可以指定需要发布的表,可以指定多个表,用','隔开。发布整个库则使用ALL TABLE。ALTER PUBLICATION  publication_name ADD table_name可增加Publisher发布的表。

        2.3创建订阅者

        在备库,执行CREATE SUBSCRIPTION subseription_name CONNECTION 'dbname=mydb host=your_host user=your_user password=your_password' PUBLICATION publication_name完成对publisher发布的表的同步。

文章来自个人专栏
数据库相关技术-PG数据库
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0