用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命令(不然很大可能会报无权限)
sudo -u postgres psql -U postgres
创建用于主从复制的角色
参数说明
login:这个选项允许登录到数据库;
replication:这个选项赋予角色复制权限
encrypted:这个选项指示数据库在存储密码时应该使用加密方式
create role replica1 login replication encrypted password 'replica1';
修改pg_hba.conf文件
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文件
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
配置好之后重启服务
sudo service postgresql restart
3.备库 192.168.2.2
登陆到postgresql
sudo -u postgres psql -U postgres
创建用于主从复制的角色
create role replica1 login replication encrypted password 'replica1';
修改pg_hba.conf文件
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文件
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
配置好之后重启服务
sudo service postgresql restart
从主库中备份数据:
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文件
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.试验
分别在主库、备库测试一下能不能相互连接:
备库执行:
sudo -u postgres psql -h 192.168.2.1 -U postgres
主库执行:
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上执行,停止服务
sudo service postgresql stop
在 192.168.2.2执行,把192.168.2.2提升为主服务:
pg_ctl promote -D $PGDATA
如果找不到pg_ctl和$PGDATA,则使用
/usr/lib/postgresql/16/bin/pg_ctl promote -D /var/lib/postgresql/16/main
在192.168.2.1执行,切换到postgres用户,删除/var/lib/postgresql/16/main下的所有文件
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