尝试将其复杂化——PostgreSQL流复制篇

大家好!我是Haru。

这次我们将使用PostgreSQL来设置流复制配置。

PostgreSQL复制的类型。

流式复制

流式复制使用WAL(写入前日志)按数据库群集为单位,并实现数据的同步。

将主节点生成的WAL转发到备份节点,并由备份节点进行恢复。备份节点可以根据设置用作参考。

此外,即使在主服务器和备份服务器的PostgreSQL次要版本不同的情况下,也可以进行复制,但如果主服务器和备份服务器的主要版本不同,则无法进行复制。如果操作系统或CPU架构不同,也无法进行复制。

逻辑复制

逻辑复制是通过使用WAL在数据库或表级别实现数据同步的。它与流复制一样,也是使用WAL进行复制,但它会将WAL中记录的更改信息转换(解码)为逻辑层次,然后进行传输。

通过发布和订阅,可以控制复制的对象。通过创建不同的机制,可以实现自由度较高的复制。

    • 異なるメジャーバージョン間のレプリケーション

 

    • テーブル単位でのレプリケーション

 

    スタンバイへの書き込み

在逻辑复制中,虽然可以提高自由度,但也必须考虑到其所带来的限制和注意事项。

    • DDLコマンドと一部のオブジェクトがレプリケーションされない

 

    スタンバイ側が書き込み可能であるため、マスタから転送されてきたデータが一意性制約などの制約に違反するとレプリケーションが停止する(コンフリクト)

这里引用。

使用环境- 在中文使用下述环境

以下是使用的环境。

プライマリ側
OS:RHEL8
DB:PostgreSQL-15
HOST:primary

スタンバイ側
OS:RHEL8
DB:PostgreSQL-15
HOST:standby

准备设置

1.PNG

主要方面的设置

1. postgresql.conf的文件

postgresql.conf 是 PostgreSQL 的基本配置文件。
由于进行冗余操作会使配置本身发生变化,因此我们会修改以下项目的内容。

    • listen_addresses : listen状態にするIPアドレスを指定

 

    • max_wal_senders : WAL senderプロセス数を定義。スタンバイサーバ以上にする必要があるようです。

 

    synchronous_standby_names : スタンバイサーバのapplication_nameを定義します。
[postgres@primary data]$ find / -name postgresql.conf  2> /dev/null  これでファイルの位置を探せます。
/var/lib/pgsql/15/data/postgresql.conf 
[postgres@primary data]$ vi /var/lib/pgsql/15/data/postgresql.conf
listen_addresses = '*'
max_wal_senders = 10
synchronous_standby_names = 'standby'

2. PostgreSQL主机访问控制文件pg_hba.conf。

pg_hba.conf是用于配置与连接到PostgreSQL的客户端认证相关的文件。
该文件允许来自Standby服务器的连接。

[postgres@primary ~]$ find / -name pg_hba.conf  2> /dev/null
/var/lib/pgsql/15/data/pg_hba.conf
[postgres@primary ~]$ vi /var/lib/pgsql/15/data/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                            METHOD
host    replication     all             [スタンバイ側のIPアドレス/**]           trust

将设置应用。

[root@primary data]# systemctl restart postgresql-15

检查’0.0.0.0’的状态。

[root@primary data]# ss -ano | grep 5432
u_str LISTEN     0      128                         /var/run/postgresql/.s.PGSQL.5432 88834                  * 0                    
u_str LISTEN     0      128                                        /tmp/.s.PGSQL.5432 88836                  * 0                    
tcp   LISTEN     0      128                                                   0.0.0.0:5432             0.0.0.0:*

备用方的设置

1. 主备之间的同步

[postgres@standby ~]$ rm -rf ${PGDATA}/*
[postgres@standby ~]$ pg_basebackup -R -D ${PGDATA} -h [プライマリ側のIPアドレス]

如果无法连接,请检查防火墙和之前的设置。

2. 自动配置文件postgresql.auto.conf

通过pg_basebackup命令,会自动生成postgresql.auto.conf文件。将”application_name=在主服务器上设置的synchronous_standby_names”添加到该文件的末尾。

[postgres@standby ~]$ vi /var/lib/pgsql/15/data/postgresql.auto.conf
[postgres@standby ~]$ cat /var/lib/pgsql/15/data/postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=postgres passfile=''/var/lib/pgsql/.pgpass'' channel_binding=prefer host=[プライマリ側のIPアドレス] port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any application_name=standby'

3. PostgreSQL配置文件

执行pg_basebackup后,主服务器的配置将被传送至备用端,因此需要将主服务器未配置的地方如下所示进行注释处理。

[postgres@standby ~]$ vi /var/lib/pgsql/15/data/postgresql.conf
#listen_addresses = '0.0.0.0'
#max_wal_senders = 10
#synchronous_standby_names = 'standby'

开始复制

**スタンバイ側**
[root@standby pgsql]# systemctl start postgresql-15

[postgres@standby ~]$ tail /var/lib/pgsql/15/data/log/postgresql-Wed.log
2022-10-26 10:29:46.781 EDT [3558] LOG:  listening on IPv6 address "::1", port 5432
2022-10-26 10:29:46.781 EDT [3558] LOG:  listening on IPv4 address "127.0.0.1", port 5432
2022-10-26 10:29:46.783 EDT [3558] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2022-10-26 10:29:46.785 EDT [3558] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2022-10-26 10:29:46.788 EDT [3562] LOG:  database system was shut down in recovery at 2022-10-26 10:29:38 EDT
2022-10-26 10:29:46.788 EDT [3562] LOG:  entering standby mode
2022-10-26 10:29:46.790 EDT [3562] LOG:  redo starts at 0/2000028
2022-10-26 10:29:46.790 EDT [3562] LOG:  consistent recovery state reached at 0/3000000
2022-10-26 10:29:46.790 EDT [3558] LOG:  database system is ready to accept read-only connections
2022-10-26 10:29:46.905 EDT [3563] LOG:  started streaming WAL from primary at 0/3000000 on timeline 1


**プライマリ側**
[root@primary pgsql]# tail /var/lib/pgsql/15/data/log/postgresql-Wed.log
2022-10-26 10:26:56.105 EDT [4001] LOG:  checkpoint starting: time
2022-10-26 10:28:31.714 EDT [4001] LOG:  checkpoint complete: wrote 953 buffers (5.8%); 0 WAL file(s) added, 0 removed, 0 recycled; write=95.538 s, sync=0.065 s, total=95.609 s; sync files=249, longest=0.063 s, average=0.001 s; distance=4413 kB, estimate=4413 kB
2022-10-26 10:29:46.955 EDT [4382] LOG:  standby "standby" is now a synchronous standby with priority 1
2022-10-26 10:29:46.955 EDT [4382] STATEMENT:  START_REPLICATION 0/3000000 TIMELINE 1

进行连接测试

在主数据库上执行SQL,并在备份数据库上进行确认。

**プライマリ側**
[postgres@primary ~]$ psql -U postgres
psql (15.0)
"help"でヘルプを表示します。

postgres=# create table test_ta(code int);
CREATE TABLE
postgres=# insert into test_ta(code)

**スタンバイ側**
[postgres@standby ~]$ psql
psql (15.0)
"help"でヘルプを表示します。

postgres=# select i from generate_series(1, 10) as i;
 i
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 行)

我們在主要端創建的表格已經在備用端進行了確認!現在就讓我們結束吧。

这就是以上的内容!

广告
将在 10 秒后关闭
bannerAds