当前位置:   article > 正文

PostgreSQL-流复制(主从复制)-异步复制_pg数据库 异步流复制

pg数据库 异步流复制

1.主机规划

角色主机名IP操作系统PostgreSQL版本
masterpg0110.186.56.133CentOS 7postgresql(16.2)
slavepg0210.186.56.184CentOS 7postgresql(16.2)

2.环境准备

  • 配置IP:
  1. #配置ip
  2. vi /etc/sysconfig/network-scripts/ifcfg-eth0
  3. IPADDR="10.186.56.133"
  4. systemctl restart network
  5. vi /etc/sysconfig/network-scripts/ifcfg-eth0
  6. IPADDR="10.186.56.184"
  7. systemctl restart network
  • 修改主机名
  1. --修改主机名
  2. hostnamectl set-hostname pg01
  3. hostnamectl set-hostname pg02
  4. --master,slave 两节点都要操作
  5. vi /etc/hosts
  6. 10.186.56.133 pg01
  7. 10.186.56.184 pg02
  •  编译好pg(主从都要做),不要初始化

        见:内容管理-CSDN创作中心,编译安装postgresql

3.配置主库

  1. ##初始化新数据库
  2. initdb -E UTF8 --locale C -D /home/postgres/pgdata16 -W
  3. --修改 postgresql.conf
  4. listen_addresses = '*'
  5. wal_level = replica
  6. wal_log_hints = on
  7. logging_collector = on
  8. archive_mode=on
  9. archive_command='/bin/date'
  10. ##配置 pg_hba.conf,运行主库接受流复制连接,这里配置 2 条是因为主库和备库的角色
  11. 是可以互换的
  12. host replication repl 10.186.56.133/24 scram-sha-256
  13. host replication repl 10.186.56.184/24 scram-sha-256
  14. ##启动数据库
  15. pg_ctl start
  16. ##创建复制用户
  17. psql -p 5432
  18. create user repl replication password 'repl';

 4.生成备库

  1. ##从主库备份过来
  2. su - postgres
  3. pg_basebackup -h pg01 -Urepl -R -Fp -P -D /home/postgres/pgdata16
  4. ##参数说明
  5. -h,主库 IP
  6. -U,复制用户
  7. -F,p 是默认输出格式,输出数据目录和表空间相同的布局,t 表示 tar 格式输出
  8. -P,同--progress,显示进度
  9. -D,输出到指定目录;
  10. -R 创建一个 standby.signal 文件,10 版本以前生成的是 recovery.conf 文件
  11. ##备份完成后,自动创建 standby.signal 文件
  12. ##同时在 postgresql.auto.conf 文件中添加如下内容
  13. primary_conninfo = 'user=repl password=repl channel_binding=prefer host=pg01
  14. port=5432 sslmode=prefer sslcompression=0 sslsni=1
  15. ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres
  16. target_session_attrs=any'
  17. ##启动备库
  18. pg_ctl start

 5.检查同步状态

  1. --主库:
  2. ##查看主库状态
  3. postgres=# select * from pg_stat_replication;
  4. postgres=# \x on ##竖排显示结果相当于MySQL /G
  5. Expanded display is on.
  6. postgres=#
  7. postgres=# select * from pg_stat_replication;
  8. -[ RECORD 1 ]----+------------------------------
  9. pid | 19905
  10. usesysid | 16388
  11. usename | repl
  12. application_name | walreceiver
  13. client_addr | 10.186.56.184
  14. client_hostname |
  15. client_port | 54894
  16. backend_start | 2024-05-03 08:01:26.367784+00
  17. backend_xmin |
  18. state | streaming
  19. sent_lsn | 0/3000060
  20. write_lsn | 0/3000060
  21. flush_lsn | 0/3000060
  22. replay_lsn | 0/3000060
  23. write_lag |
  24. flush_lag |
  25. replay_lag |
  26. sync_priority | 0
  27. sync_state | async
  28. reply_time | 2024-05-03 08:02:36.405198+00
  29. postgres=#
  30. ##查看主备库延迟(单位:字节):
  31. postgres=# select pg_wal_lsn_diff(pg_current_wal_lsn (),replay_lsn) from
  32. pg_stat_replication;
  33. ##主库后台进程:
  34. ps -ef|grep wal
  35. [postgres@pg01 ~]$ ps -ef|grep wal
  36. postgres 19905 28897 0 08:01 ? 00:00:00 postgres: walsender repl 10.186.56.184(54894) streaming 0/3000060
  37. --备库
  38. ##查看备库状态
  39. postgres=# select pg_is_in_recovery();
  40. pg_is_in_recovery
  41. -------------------
  42. t
  43. t:true,意味着处于 recovery 状态
  44. f:false,意味着处于正常服务状态
  45. [postgres@pg02 ~]$ pg_controldata | grep state
  46. Database cluster state: in archive recovery
  47. ##备库后台进程,一个进程负责接收,一个负责 recovery:
  48. ps -ef|grep postgres
  49. ##查看 pg_stat_wal_receiver 视图
  50. postgres=# select * from pg_stat_wal_receiver;
  51. pid: wal receiver 的 PID。
  52. status: wal receiver 的状态, 只有“streaming”是正常状态。
  53. receive_start_lsn: wal receiver 启动时使用的第一个 WAL 日志的位置。
  54. receive_start_tli:wal receiver 启动时使用的第一个时间线编号。
  55. received_lsn: 已经接收到并且已经被写入磁盘的最后一个 WAL 日志的位置。
  56. received_tli: 已经接收到并且已经被写入磁盘的最后一个 WAL 日志的时间线编号。
  57. last_msg_send_time: 接收到最后一条 WAL 日志消息后, 向主库发回确认消息的
  58. 发送时间。
  59. last_msg_receipt_time: 备库接收到最后一条 WAL 日志消息的接收时间。
  60. latest_end_lsn: 报告给主库最后一个 WAL 日志的位置。
  61. latest_end_time: 报告给主库最后一个 WAL 日志的时间。
  62. slot_name: 使用的复制槽的名称。
  63. conninfo: 连接主库的连接串, 密码等安全相关的信息会被隐去

6.测试数据同步

  1. --在主库上建一张测试表, 然后插入几条数据
  2. CREATE TABLE t1(id int,info text);
  3. insert into t1 values(1,'aaa');
  4. insert into t1 values(2,'bbb');
  5. insert into t1 values(3,'ccc');
  6. --在备库上查看,数据是否同步过来
  7. postgres=# \d

7.出从切换

  • 配置归档(主从都要做)
  1. #主备都创建目录
  2. mkdir /home/postgres/archives
  3. vim /home/postgres/pgdata16/postgresql.conf
  4. archive_command = 'cp %p /home/postgres/archives%f'
  5. #不用重启服务,重启加载生效
  6. pg_ctl reload
  •  停掉主库
  1. pg_ctl stop -m fast
  2. [postgres@pg01 ~]$ pg_ctl stop -m fast
  3. waiting for server to shut down.... done
  4. server stopped
  5. [postgres@pg01 ~]$
  • 提升备库为主库
  1. --执行 promote 命令
  2. pg_ctl promote
  3. [postgres@pg02 pgdata16]$ pg_ctl promote
  4. waiting for server to promote.... done
  5. server promoted
  6. [postgres@pg02 pgdata16]$
  7. #执行之后发现 standby.signal 被删除了
  8. --查看最新状态:
  9. pg_controldata | grep state
  10. Database cluster state: in production
  11. 注意:将 postgresql.auto.conf 文件中的 primary_conninfo 信息注释掉,否则虽然现在
  12. 是主库了,但是配置还是当作备库,自相矛盾。
  13. --查看后台进程,发现 walsender 进程要等备库正常启动后才会启动,备库关闭时该进程
  14. 也自动中断
  15. ps-ef|grep postgres
  16. #注:Standby 提升为 Primary 后,时间线加 1,而旧 Primary 仍停在原来的时间线。
  • 恢复原主库为备库
  1. #编辑配置文件
  2. [postgres@pg02 ~]$ vim /home/postgres/pgdata16/pg_hba.conf
  3. # IPv6 local connections:
  4. host all all ::1/128 trust
  5. host all all 10.186.56.0/24 scram-sha-256
  6. [postgres@pg02 pgdata16]$ pg_ctl reload
  7. server signaled
  8. --若有数据变化,需要在备库上对当前的数据进行回退,然后才可以变成备库,避免全量
  9. 的数据恢复。
  10. --前提是必须启用 wal_log_hints 才能正常使用 pg_rewind 工具。还必须是 superuser 才
  11. 能使用。
  12. #原主库执行
  13. pg_rewind --target-pgdata $PGDATA --source-server='host=pg02 port=5432 user=postgres password=P@ssw0rd dbname=postgres' -R
  14. [postgres@pg01 ~]$ pg_rewind --target-pgdata $PGDATA --source-server='host=pg02 port=5432 user=postgres password=P@ssw0rd dbname=postgres' -R
  15. pg_rewind: servers diverged at WAL location 0/40000A0 on timeline 1
  16. pg_rewind: no rewind required #原因是没有数据变更,忽略
  17. [postgres@pg01 ~]$
  18. --启动原主库, 这时该主库变成了备库。
  19. [postgres@pg01 ~]$ pg_ctl start
  20. server started
  21. --查看后台进程:
  22. ps -ef|grep postgres
  23. --测试数据是否同步

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/780325
推荐阅读
相关标签
  

闽ICP备14008679号