postgresql主从复制

用vmware 搭建的两台虚拟机

操作系统:Ubuntu 24.04 Server版

数据库:postgresql 16.2

主库:192.168.2.11

从库:192.168.2.12

如果遇到网络无法上网,可参考一下 Vmware 搭建的Ubuntu 24.04 网络配置-CSDN博客

1.两台服务器安装数据库

Ubuntu 24.04默认有postgresql 16.2的数据库,

复制代码
sudo apt-get install postgresql-16
2.主库 192.168.2.1
登陆到postgresql

参数说明:-u postgre 使用postgres用户 执行psql命令(不然很大可能会报无权限)

bash 复制代码
sudo -u postgres psql -U postgres 
创建用于主从复制的角色

参数说明

login:这个选项允许登录到数据库;

replication:这个选项赋予角色复制权限

encrypted:这个选项指示数据库在存储密码时应该使用加密方式

sql 复制代码
create role replica1 login replication encrypted password 'replica1';
修改pg_hba.conf文件
bash 复制代码
 sudo vim /etc/postgresql/16/main/pg_hba.conf

在原来的基础上新增以下行:主要是为了允许备库(192.168.2.2)访问主库

host replication replica1 192.168.2.2/24 md5

host all postgres 192.168.2.2/24 trust

修改postgresql.conf文件
bash 复制代码
sudo vim /etc/postgresql/16/main/postgresql.conf

参数说明可以参考一下:

20.6. 复制 (postgres.cn)

PostgresqlCO.NF: PostgreSQL configuration for humans

listen_addresses = '*'

max_connections = 100

wal_level = replica

max_wal_senders = 10

wal_keep_size = 64

wal_sender_timeout = 60

配置好之后重启服务

bash 复制代码
sudo service postgresql restart
3.备库 192.168.2.2
登陆到postgresql
bash 复制代码
sudo -u postgres psql -U postgres 
创建用于主从复制的角色
sql 复制代码
create role replica1 login replication encrypted password 'replica1';
修改pg_hba.conf文件
bash 复制代码
 sudo vim /etc/postgresql/16/main/pg_hba.conf

在原来的基础上新增以下行:主要是为了允许主库(192.168.2.1)访问备库(用于主库宕机后,通过连接备库同步最新数据)

host replication replica1 192.168.2.1/24 md5

host all postgres 192.168.2.1/24 trust

修改postgresql.conf文件
bash 复制代码
sudo vim /etc/postgresql/16/main/postgresql.conf

listen_addresses = '*'

max_connections = 120 #这个参数要比主库的大一点

max_wal_senders = 10

wal_keep_size = 64

wal_sender_timeout = 60

配置好之后重启服务

bash 复制代码
sudo service postgresql restart

从主库中备份数据:

bash 复制代码
pg_basebackup -h 192.168.2.1  -D /var/lib/postgresql/16/main -p 5432 -U replica1 -Fp -Xs -Pv -R --checkpoint=fast

备份完成后修改postgresql.auto.conf文件

bash 复制代码
su postgres
vim /var/lib/postgresql/16/main/ postgresql.auto.conf

postgresql.auto.conf

primary_conninfo = 'user=replica1 password=replica1 host=192.168.2.1 port=5432'

recovery_target_timeline = latest

hot_standby = on

max_standby_streaming_delay = 30s

wal_receiver_status_interval = 10s

hot_standby_feedback = on

max_connections = 120

4.试验

分别在主库、备库测试一下能不能相互连接:

备库执行:

bash 复制代码
sudo -u postgres psql -h 192.168.2.1 -U postgres

主库执行:

bash 复制代码
sudo -u postgres psql -h 192.168.2.2 -U postgres

如果都能相互连通,那么就可以进行下一步操作

在192.168.2.1上创建数据库 create database testdb1;看看在192.168.2.2上是否同步;

模拟192.168.2.1 宕机

192.168.2.1上执行,停止服务

bash 复制代码
sudo service postgresql stop

在 192.168.2.2执行,把192.168.2.2提升为主服务:

bash 复制代码
pg_ctl promote -D $PGDATA 

如果找不到pg_ctl和$PGDATA,则使用

bash 复制代码
 /usr/lib/postgresql/16/bin/pg_ctl promote -D /var/lib/postgresql/16/main

在192.168.2.1执行,切换到postgres用户,删除/var/lib/postgresql/16/main下的所有文件

bash 复制代码
su postgres
cd /var/lib/postgresql/16/main
rm -rf *

pg_basebackup -h 192.168.2.2  -p 5432 -U postgres -D /var/lib/postgresql/16/main -Fp -P -Xs -R -v -l postgresbak

执行完上面步骤后,可以在192.168.2.1看到数据同步了过来,但这个时候192.168.2.1是备库,数据库是处于只读状态的,而192.168.2.2属于主库。如果想把192.168.2.1又变成主库,可以在192.168.2.1上执行pg_ctl promote -D $PGDATA

相关推荐
Coder_Boy_3 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
helloworldandy3 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道5 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707535 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha5 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_5 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance5 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋5 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.6 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
光蛋6 小时前
Docker Compose 助力阿里云 Linux 3 PostgreSQL 高可用部署
postgresql