单机流复制搭建 异步

1.创建流复制用户

postgres=# create user lfz_u01;
CREATE ROLE

2.授权流复制用户

postgres=# alter user lfz_u01 Replication;
ALTER ROLE

3.生成基础备份(备库) pgdata_standby

pg_basebackup [option ...]
-D :指定备份的目标目录,即备份到哪儿
-F :指定输出的格式
-Fp:原样输出,即把主数据库中的各个数据文件、配置文件、目录结构都完全一样地写到备份目录中,这种情况下"format"指定为"p"或"plain";
-Ft:tar格式输出,相当于把输出的备份文件打包到一个tar文件中,这种情况下"format"指定为"t"或"tar";
-R :--write-recovery-conf: 是否生成 recovery.conf 文件;
-P :允许在备份过程中实时地打印备份进度;打印的进度不是百分之百准确的,因为在备份的过程中,数据库的数据还在发生变化,还会不断的产生WAL日志;
-v : 或 --verbose 详细模式;当使用了 -P 参数时,还会打印出正在备份哪个具体文件的详细信息;
-h : 或 --host 指定连接的服务器主机名或IP地址;
-p : 或 --port 指定连接的端口;
-U :或 --username 指定连接的用户名
注:其他一般不常用的参数,不在此列出。有 -r -X -z -Z -c -l -V -w -W;
pg_basebackup -D /pgccc/pgdata_standby -Fp -R -P -v -U lfz_u01

4.修改备份(备库)的配置

--这里只修改了port

[postgres@pgccc pgdata_standby]$ pwd
/pgccc/pgdata_standby
[postgres@pgccc pgdata_standby]$ vim postgresql.conf
port = 5433

5.启动备库

pg_ctl -D /pgccc/pgdata_standby start

6.测试

--查看主库和备库的相关进程

[postgres@pgccc ~]$ ps -axjf | grep postgres
  1790   1890   1890   1790 pts/0      2043 S        0   0:00  |       \_ su - postgres
  1891   2044   2043   1790 pts/0      2043 S+    1001   0:00  |               \_ grep --color=auto postgres
  1855   1988   1988   1855 pts/1      2027 S        0   0:00  |       \_ su - postgres
     1   1941   1941   1941 ?            -1 Ss    1001   0:00 /pgccc/app/15.2/bin/postgres -D /pgccc/pgdata.new
  1941   1942   1942   1942 ?            -1 Ss    1001   0:00  \_ postgres: logger
  1941   1943   1943   1943 ?            -1 Ss    1001   0:00  \_ postgres: checkpointer
  1941   1944   1944   1944 ?            -1 Ss    1001   0:00  \_ postgres: background writer
  1941   1946   1946   1946 ?            -1 Ss    1001   0:00  \_ postgres: walwriter
  1941   1947   1947   1947 ?            -1 Ss    1001   0:00  \_ postgres: autovacuum launcher
  1941   1948   1948   1948 ?            -1 Ss    1001   0:00  \_ postgres: archiver
  1941   1949   1949   1949 ?            -1 Ss    1001   0:00  \_ postgres: logical replication launcher
  1941   1986   1986   1986 ?            -1 Ss    1001   0:00  \_ postgres: walsender lfz_u01 [local] streaming 7/40000D8
     1   1980   1980   1980 ?            -1 Ss    1001   0:00 /pgccc/app/15.2/bin/postgres -D pgdata_standby
  1980   1981   1981   1981 ?            -1 Ss    1001   0:00  \_ postgres: logger
  1980   1982   1982   1982 ?            -1 Ss    1001   0:00  \_ postgres: checkpointer
  1980   1983   1983   1983 ?            -1 Ss    1001   0:00  \_ postgres: background writer
  1980   1984   1984   1984 ?            -1 Ss    1001   0:00  \_ postgres: startup recovering 000000010000000700000004
  1980   1985   1985   1985 ?            -1 Ss    1001   0:00  \_ postgres: walreceiver streaming 7/40000D8
  1980   2028   2028   2028 ?            -1 Ss    1001   0:00  \_ postgres: postgres postgres [local] idle
[postgres@pgccc ~]$

--主库建表 插入数据

[postgres@pgccc pgdata_standby]$ psql
psql (14.7)
Type "help" for help.

postgres=# 

postgres=# create table t_baoyw (id int,name varchar(20));
CREATE TABLE
postgres=# insert into t_baoyw values(1,'小宝大人');
INSERT 0 1
postgres=# select * from t_baoyw;
 id |  name
----+--------
  1 | 小宝大人
(1 row)

postgres=#

--备库直接查询

[postgres@pgccc pgdata_standby]$ psql -p 5433
psql (14.7)
Type "help" for help.

postgres=# \dt
                      List of relations
 Schema |        Name         |       Type        |  Owner
--------+---------------------+-------------------+----------
 public | t_baoyw             | table             | postgres
(1 rows)

postgres=# select * from t_baoyw;
 id |  name
----+-----------
  1 | 小宝大人
(1 row)

postgres=#

7.相关视图

pg_stat_replication

--在主库上,通过查看视图 pg_stat_replication ,获得备库的流复制状态;

postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------ -+---------------------------------------------------------------
pid              | 1986                           # 数据库中WAL walsender 进程的进程ID
usesysid         | 25994                          # 登录主库的流复制用户OID
usename          | lfz_u01                        # 登录主库的流复制用户的名称
application_name | walreceiver                    # 流复制连接中连接参数 "application_name" 中指定的字符串
client_addr      |                                # Standby 的IP地址
client_hostname  |                                # Standby 的主机地址.注意:只有在配置文件中打开 log_hostname 配置项和同时使用了IP连接时,这列才会显示主机名,否则显示为空
client_port      | -1                             # 流复制连接中 Standby 端的 socket 端口
backend_start    | 2023-08-01 15:01:11.506636+08  # WAL Sender 进程启动的时间。实际也是 Standby 连接过来的时间,因为只有 Standby 连接后,才会启动一个 walsender 进程。连接中断后 walsender 进程也会中断。
backend_xmin     |                                # Standby 的 xmin 范围
state            | streaming                      # WAL Sender 进程的状态
sent_lsn         | 7/40000D8                      # 流复制连接上WAL时的发送位置
write_lsn        | 7/40000D8                      # Standby 端写WAL日志的位置
flush_lsn        | 7/40000D8                      # Standby 端写WAL日志刷新到磁盘的位置
replay_lsn       | 7/40000D8                      # Standby 端重放WAL日志的位置
write_lag        |                                # 写的延迟间隔
flush_lag        |                                # 刷新的磁盘的延迟间隔
replay_lag       |                                # 应用的延迟间隔
sync_priority    | 0                              # 同步复制时,不同 Standby 的优先级。对于异步复制,此字段的值总是"0"
sync_state       | async                          # 同步的状态,可以为"sync(同步)" ,"async(异步)","potential(潜在的)"
reply_time       | 2023-08-01 15:02:22.526653+08  # 最新一次同步时间
            ----+------------------------------  -+-------------------------------------------------------------

--查看同步状态

--##异步

postgres=# select client_addr,state,sync_state from pg_stat_replication;
-[ RECORD 1 ]----------
client_addr |
state       | streaming
sync_state  | async

postgres=#

pg_stat_wal_receiver

--在备库,通过查看视图 pg_stat_wal_receiver ,查看流复制状态

--显示备库上,walreceiver 接收进程的状态

postgres=# \x
postgres=# select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+-------------------------------------------------
pid                   | 1985                                            # WAL接收进程的PID
status                | streaming                                        # 状态。只有"streaming"是正常状态;
receive_start_lsn     | 7/3000000                                        # 接收进程启动时,使用的第一个WAL日志的位置;
receive_start_tli     | 1                                                # 接收进程启动时,使用的第一个时间线的编号;
written_lsn           | 7/40000D8                                        # 已经接收到并写入磁盘的最后一个WAL日志的位置;
flushed_lsn           | 7/40000D8                                        # 已经接收到并写入磁盘的最后一个WAL日志刷新到磁盘的位置;
received_tli          | 1                                                # 已经接收到并写入磁盘的最后一个WAL日志的时间线;
last_msg_send_time    | 2023-08-01 15:03:42.530803+08                    # 接收到最后一条WAL日志消息后,向主库发送回确认消息的发送时间
last_msg_receipt_time | 2023-08-01 15:03:42.530824+08                    # 备库接收最一条WAL日志的接收时间
latest_end_lsn        | 7/40000D8                                        # 报告给主库最后一个WAL日志的位置
latest_end_time       | 2023-08-01 15:01:12.321381+08                    # 报告给主库最后一个WAL日志的时间
slot_name             |                                                  # 使用的复制槽的名称
sender_host           | /tmp                                             
sender_port           | 5555
conninfo              | user=lfz_u01 passfile=/home/postgres/.pgpass channel_binding=disable dbname=replication port=5555 fallback_application_name=walreceiver sslmode=disable sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any  # 连接主库的连接串。

postgres=#

8.其他

--如果判断数据库处于"备库"的状态 函数返回的值是 "f"表示主库; “t”表示备库

--如果在主库上 函数返回的值是 "f"
[postgres@pgccc ~]$ psql
psql (14.7)
Type "help" for help.

postgres=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 f
(1 row)

postgres=#
--如果在主库上,函数返回的值是"t"
[postgres@pgccc ~]$ psql -p 5433
psql (14.7)
Type "help" for help.

postgres=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t
(1 row)

postgres=#

--流复制用户查看

postgres=#
postgres=# select * from pg_user;
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 postgres |       10 | t           | t        | t       | t            | ******** |          |
 lfz_u01  |    32768 | f           | f        | t       | f            | ******** |          |
(2 rows)

postgres=#
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 lfz_u01   | Replication                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=#

--判断主备库的状态

[postgres@pgccc ~]$ pg_controldata -D pgdata | grep state
Database cluster state:             in production
[postgres@pgccc ~]$ pg_controldata -D pgdata_standby | grep state
Database cluster state:             in archive recovery

--同步:等待WAL日志先落盘

--异步:会有主从延迟