尝试将其复杂化——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. 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 行)
我們在主要端創建的表格已經在備用端進行了確認!現在就讓我們結束吧。
这就是以上的内容!