postgresql集群

1.环境说明

  • 主机 ip 192.168.3.182

[root@pg_master ~]# cat /etc/redhat-release

CentOS Linux release 7.7.1908 (Core)

  • 从机 ip 192.168.3.183

[root@pg_slave postgres]# cat /etc/redhat-release

CentOS Linux release 7.7.1908 (Core)

 

 

2.部署

  • 分别(分别在192.168.3.182和192.168.3.183中执行)拉取postgres镜像

docker pull docker.io/postgres:12.2

  • 分别创建工作目录

mkdir -p /docker/postgres

cd /docker/postgres

注: 所有操作均在 /docker/postgres目录下执行

  • 分别创建postgres启动脚本
    主库启动脚本:postgres-master.sh

docker stop postgres-master

docker rm postgres-master

docker run \

--privileged=true \

--restart=always \

--name postgres-master \

-v /docker/postgres/data-master:/var/lib/postgresql/data \

-p 5432:5432 \

-e POSTGRES_PASSWORD=postgres \

-d docker.io/postgres:12.2

从库启动脚本:postgres-slave.sh

docker stop postgres-slave

docker rm postgres-slave

docker run \

--privileged=true \

--restart=always \

--name postgres-slave \

-v /docker/postgres/data-slave:/var/lib/postgresql/data \

-p 5432:5432 \

-e POSTGRES_PASSWORD=postgres \

-d docker.io/postgres:12.2

  • 分别修改权限

chmod 741 postgres-master.sh

chmod 741 postgres-slave.sh

  • 分别启动(创建初始数据)

./postgres-master.sh

./postgres-slave.sh

主库操作(192.168.3.182中)

首先进入容器中创建复制账户

docker exec -it postgres-master bash

su postgres

psql

CREATE ROLE replica login replication encrypted password '123456';

CREATE DATABASE replica;

\du   # 查看用户列表

\q     # 退出数据库

exit   # 退出 postgres 用户

exit   # 退出容器

修改 /docker/postgres/data-master/pg_hba.conf配置文件,最后加入

host    replication     replica         192.168.3.183/32        md5

检查 /docker/postgres/data-master/postgresql.conf 配置文件中以下的配置项是否打开

listen_addresses = '*'

max_connections = 100

archive_mode = on

archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f'

wal_level = replica

wal_keep_segments = 16

wal_sender_timeout = 60s

# 开启日志  不开日志可忽略

logging_collector = on

log_directory = 'log'

log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

log_file_mode = 0600

重启

./postgres-master.sh

从库操作(192.168.3.183中)

进入容器中拉取主库中的数据

docker exec -it postgres-slave bash

su postgres  # 切换为 postgres  用户

pg_basebackup -h 192.168.3.182 -p 5432 -U replica -Fp -Xs -Pv -R -D /var/lib/postgresql/data-bak

exit   # 退出 postgres 用户

exit   # 退出容器

退出容器后拷贝容器中备份的数据到宿主机中

即将容器中的 /var/lib/postgresql/data-bak 目录拷贝到宿主主机的 /docker/postgres/ 目录下

docker cp postgres-slave:/var/lib/postgresql/data-bak /docker/postgres/

停止并删除容器

docker stop postgres-slave

docker rm postgres-slave

删除 data-slave 目录(容器初始化的时候自动创建的目录), 重命名 data-bak (从容器中拷贝出来的数据)为 data-slave

rm -rf ./data-slave

mv ./data-bak ./data-slave

检查 /docker/postgres/data-slave/postgresql.conf 配置文件中以下的配置项是否打开

listen_addresses = '*'

primary_conninfo = 'host=192.168.3.182 port=5432 user=replica password=123456'

recovery_target_timeline = latest

max_connections = 120 # 大于等于主节点

hot_standby = on

max_standby_streaming_delay = 30s

wal_receiver_status_interval = 10s

hot_standby_feedback = on

重启

./postgres-slave.sh

注意:以上 192.168.3.182, 192.168.3.183需要换成你自己的ip

3.检查是否成功

进入主库(192.168.3.182中)

docker exec -it postgres-master bash

su postgres

psql

select client_addr,sync_state from pg_stat_replication;

显示以下内容则配置成功

 client_addr  | sync_state

---------------+------------

 192.168.3.183 | async

(1 row)

或修改主库数据(新增数据库,新增表,删除数据等写相关操作)看从库是否同步更新

 

posted @ 2022-01-05 16:08  水务大牛  阅读(681)  评论(0)    收藏  举报