赞
踩
角色 | 主机名 | IP | 操作系统 | PostgreSQL版本 |
master | pg01 | 10.186.56.133 | CentOS 7 | postgresql(16.2) |
slave | pg02 | 10.186.56.184 | CentOS 7 | postgresql(16.2) |
- #配置ip
- vi /etc/sysconfig/network-scripts/ifcfg-eth0
- IPADDR="10.186.56.133"
-
- systemctl restart network
-
- vi /etc/sysconfig/network-scripts/ifcfg-eth0
- IPADDR="10.186.56.184"
-
- systemctl restart network
- --修改主机名
-
- hostnamectl set-hostname pg01
-
- hostnamectl set-hostname pg02
-
- --master,slave 两节点都要操作
- vi /etc/hosts
- 10.186.56.133 pg01
- 10.186.56.184 pg02
见:内容管理-CSDN创作中心,编译安装postgresql
- ##初始化新数据库
- initdb -E UTF8 --locale C -D /home/postgres/pgdata16 -W
-
- --修改 postgresql.conf
- listen_addresses = '*'
- wal_level = replica
- wal_log_hints = on
- logging_collector = on
- archive_mode=on
- archive_command='/bin/date'
-
-
- ##配置 pg_hba.conf,运行主库接受流复制连接,这里配置 2 条是因为主库和备库的角色
- 是可以互换的
- host replication repl 10.186.56.133/24 scram-sha-256
- host replication repl 10.186.56.184/24 scram-sha-256
-
-
- ##启动数据库
- pg_ctl start
-
- ##创建复制用户
- psql -p 5432
- create user repl replication password 'repl';
4.生成备库
-
- ##从主库备份过来
- su - postgres
-
- pg_basebackup -h pg01 -Urepl -R -Fp -P -D /home/postgres/pgdata16
-
-
-
- ##参数说明
- -h,主库 IP
- -U,复制用户
- -F,p 是默认输出格式,输出数据目录和表空间相同的布局,t 表示 tar 格式输出
- -P,同--progress,显示进度
- -D,输出到指定目录;
- -R 创建一个 standby.signal 文件,10 版本以前生成的是 recovery.conf 文件
-
- ##备份完成后,自动创建 standby.signal 文件
- ##同时在 postgresql.auto.conf 文件中添加如下内容
- primary_conninfo = 'user=repl password=repl channel_binding=prefer host=pg01
- port=5432 sslmode=prefer sslcompression=0 sslsni=1
- ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres
- target_session_attrs=any'
-
-
- ##启动备库
- pg_ctl start
- --主库:
- ##查看主库状态
- postgres=# select * from pg_stat_replication;
-
- postgres=# \x on ##竖排显示结果相当于MySQL /G
- Expanded display is on.
- postgres=#
- postgres=# select * from pg_stat_replication;
- -[ RECORD 1 ]----+------------------------------
- pid | 19905
- usesysid | 16388
- usename | repl
- application_name | walreceiver
- client_addr | 10.186.56.184
- client_hostname |
- client_port | 54894
- backend_start | 2024-05-03 08:01:26.367784+00
- backend_xmin |
- state | streaming
- sent_lsn | 0/3000060
- write_lsn | 0/3000060
- flush_lsn | 0/3000060
- replay_lsn | 0/3000060
- write_lag |
- flush_lag |
- replay_lag |
- sync_priority | 0
- sync_state | async
- reply_time | 2024-05-03 08:02:36.405198+00
-
- postgres=#
-
-
- ##查看主备库延迟(单位:字节):
- postgres=# select pg_wal_lsn_diff(pg_current_wal_lsn (),replay_lsn) from
- pg_stat_replication;
-
- ##主库后台进程:
- ps -ef|grep wal
- [postgres@pg01 ~]$ ps -ef|grep wal
- postgres 19905 28897 0 08:01 ? 00:00:00 postgres: walsender repl 10.186.56.184(54894) streaming 0/3000060
-
- --备库
- ##查看备库状态
- postgres=# select pg_is_in_recovery();
- pg_is_in_recovery
- -------------------
- t
-
- t:true,意味着处于 recovery 状态
- f:false,意味着处于正常服务状态
-
- [postgres@pg02 ~]$ pg_controldata | grep state
- Database cluster state: in archive recovery
-
- ##备库后台进程,一个进程负责接收,一个负责 recovery:
- ps -ef|grep postgres
-
- ##查看 pg_stat_wal_receiver 视图
- postgres=# select * from pg_stat_wal_receiver;
-
-
- pid: wal receiver 的 PID。
- status: wal receiver 的状态, 只有“streaming”是正常状态。
- receive_start_lsn: wal receiver 启动时使用的第一个 WAL 日志的位置。
- receive_start_tli:wal receiver 启动时使用的第一个时间线编号。
- received_lsn: 已经接收到并且已经被写入磁盘的最后一个 WAL 日志的位置。
- received_tli: 已经接收到并且已经被写入磁盘的最后一个 WAL 日志的时间线编号。
- last_msg_send_time: 接收到最后一条 WAL 日志消息后, 向主库发回确认消息的
- 发送时间。
- last_msg_receipt_time: 备库接收到最后一条 WAL 日志消息的接收时间。
- latest_end_lsn: 报告给主库最后一个 WAL 日志的位置。
- latest_end_time: 报告给主库最后一个 WAL 日志的时间。
- slot_name: 使用的复制槽的名称。
- conninfo: 连接主库的连接串, 密码等安全相关的信息会被隐去
- --在主库上建一张测试表, 然后插入几条数据
- CREATE TABLE t1(id int,info text);
- insert into t1 values(1,'aaa');
- insert into t1 values(2,'bbb');
- insert into t1 values(3,'ccc');
-
- --在备库上查看,数据是否同步过来
- postgres=# \d
- #主备都创建目录
- mkdir /home/postgres/archives
-
- vim /home/postgres/pgdata16/postgresql.conf
- archive_command = 'cp %p /home/postgres/archives%f'
-
- #不用重启服务,重启加载生效
- pg_ctl reload
-
- pg_ctl stop -m fast
-
- [postgres@pg01 ~]$ pg_ctl stop -m fast
- waiting for server to shut down.... done
- server stopped
- [postgres@pg01 ~]$
-
- --执行 promote 命令
- pg_ctl promote
-
- [postgres@pg02 pgdata16]$ pg_ctl promote
- waiting for server to promote.... done
- server promoted
- [postgres@pg02 pgdata16]$
-
- #执行之后发现 standby.signal 被删除了
-
- --查看最新状态:
- pg_controldata | grep state
- Database cluster state: in production
- 注意:将 postgresql.auto.conf 文件中的 primary_conninfo 信息注释掉,否则虽然现在
- 是主库了,但是配置还是当作备库,自相矛盾。
-
- --查看后台进程,发现 walsender 进程要等备库正常启动后才会启动,备库关闭时该进程
- 也自动中断
- ps-ef|grep postgres
-
- #注:Standby 提升为 Primary 后,时间线加 1,而旧 Primary 仍停在原来的时间线。
- #编辑配置文件
- [postgres@pg02 ~]$ vim /home/postgres/pgdata16/pg_hba.conf
- # IPv6 local connections:
- host all all ::1/128 trust
- host all all 10.186.56.0/24 scram-sha-256
-
- [postgres@pg02 pgdata16]$ pg_ctl reload
- server signaled
-
-
- --若有数据变化,需要在备库上对当前的数据进行回退,然后才可以变成备库,避免全量
- 的数据恢复。
- --前提是必须启用 wal_log_hints 才能正常使用 pg_rewind 工具。还必须是 superuser 才
- 能使用。
-
- #原主库执行
-
- pg_rewind --target-pgdata $PGDATA --source-server='host=pg02 port=5432 user=postgres password=P@ssw0rd dbname=postgres' -R
-
- [postgres@pg01 ~]$ pg_rewind --target-pgdata $PGDATA --source-server='host=pg02 port=5432 user=postgres password=P@ssw0rd dbname=postgres' -R
- pg_rewind: servers diverged at WAL location 0/40000A0 on timeline 1
- pg_rewind: no rewind required #原因是没有数据变更,忽略
- [postgres@pg01 ~]$
-
-
- --启动原主库, 这时该主库变成了备库。
- [postgres@pg01 ~]$ pg_ctl start
- server started
-
- --查看后台进程:
- ps -ef|grep postgres
-
-
- --测试数据是否同步
- 略
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。