pg主从数据库搭建

选择两个数据库节点

192.168.1.226         postgres_master        主库
192.168.1.227         postgres_slaver          从库


创建db网络(两个节点均执行)

docker network create dbnet   (docker network create --driver bridge dbnet)

一、配置docker-compose.yml文件

1.主节点

cat docker-compose.yml
version: '3.0'
services:
postgresql:
image: postgres:15.1
restart: always
container_name: postgres_master
environment:
POSTGRES_PASSWORD: postgres
working_dir: /postgresql
networks:
- dbnet
ports:
- "0.0.0.0:5433:5432"
volumes:
- ./pg/data:/var/lib/postgresql/data

networks:
dbnet:
external: true


2.从库
cat docker-compose.yml

version: '3.0'
services:
postgresql:
image: postgres:15.1
restart: always
container_name: postgres_slaver
environment:
POSTGRES_PASSWORD: postgres
working_dir: /postgresql
networks:
- dbnet
ports:
- "0.0.0.0:5433:5432"
volumes:
- ./pg/data:/var/lib/postgresql/data

networks:
dbnet:
external: true

二、部署主库

1.启动容器
docker-compose up --build -d postgresql

2.进入主库

docker exec -it postgres_master /bin/bash

3.在容器中执行
# 切换为postgres用户
su postgres

# 运行 psql
psql
# 创建 replica 角色
CREATE ROLE replica login replication encrypted password 'replica'; #创建用户
#列出数据库用户和角色
\du
exit;

4.配置 postgresql.conf

# 在宿主机目录 ./pg/data 下编辑 postgresql.conf
vi postgresql.conf
改为如下内容

listen_addresses = '*'
archive_mode = on
archive_command = '/bin/date'
max_connections = 300
max_wal_senders = 32
wal_sender_timeout = 60s
wal_keep_size = 16
wal_level = replica


5. 配置 pg_hba.conf

# 新增配置
# 在宿主机目录 ./pg/data 下编辑 pg_hba.conf

vi   pg_hba.conf
host    replication     replica      192.168.1.227/32   trust


重启数据库

docker restart postgres_master


三、部署从库

1.启动数据库

docker-compose up --build -d postgresql

2.进入容器

docker  exec -it postgres_slaver /bin/bash

3.在容器中运行命令


# 此时可能会退出容器,只需要重新登入进去即可
rm -rf /var/lib/postgresql/data/*
# 注 此操作之后立即 运行 pg_basebackup 否则容易报错 无法备份

# 如果退出了,则再次进入
docker exec -it postgres_slaver /bin/bash
# 进入容器之后运行
pg_basebackup -R -D /var/lib/postgresql/data -P -h 192.168.1.226 -p 5433 -U replica
# 显示 26288/26288 kB (100%), 1/1 tablespace
# 退出容器重启 docker
docker restart postgres_slaver

## 查看 ./pg/data 下的 postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica passfile=''/root/.pgpass'' channel_binding=prefer host=192.168.1.226 port=5433 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'


四、查看进程

主库节点

ps -ef | grep postgres

从库节点

ps -ef|grep postgres

五、测试同步


# 在主机容器中
postgres=# create database test12;
CREATE DATABASE
postgres=# \list
List of databases
Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
|          |          |            |            | postgres=CTc/postgres
template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
|          |          |            |            | postgres=CTc/postgres
test12    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
(5 rows)

# 在从机查看已经同步
postgres=# \list
List of databases
Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
|          |          |            |            | postgres=CTc/postgres
template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
|          |          |            |            | postgres=CTc/postgres
test12    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
(5 rows)


 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐