安装主节点
此处我用docker-compose安装比较简单不做过多说明
编辑docker-compose.yml
version: "3.7"
services:
postgres:
hostname: postgres
container_name: postgres
restart: always
image: harbor.xxx.com/xxx/postgres:12.14-bullseye
volumes:
- ./data/db:/var/lib/postgresql/data
- ./init:/home/init
environment:
- TZ=Asia/Shanghai
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
network_mode: host
修改postgres.conf文件
listen_addresses = '*'
max_connections = 1000
shared_buffers = 128MB
dynamic_shared_memory_type = posix
max_wal_size = 1GB
min_wal_size = 80MB
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 7d
log_rotation_size = 100MB
log_min_error_statement = error
log_min_duration_statement = 2
log_timezone = 'Asia/Shanghai'
client_min_messages = warning
datestyle = 'iso, mdy'
timezone = 'Asia/Shanghai'
lc_messages = 'en_US.utf8'
lc_monetary = 'en_US.utf8'
lc_numeric = 'en_US.utf8'
lc_time = 'en_US.utf8'
default_text_search_config = 'pg_catalog.english'
wal_level = replica
max_wal_senders = 5
wal_keep_segments = 128
wal_sender_timeout = 60s
max_connections = 200
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
wal_log_hints = on
synchronous_standby_names = 'standby01'
修改pg_hba.conf文件
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all all 10.10.10.0/24 md5
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host replication all 10.10.10.0/24 md5
host all all all md5
启动容器
[root@test-riverxyz postgres]# docker-compose ps
Name Command State Ports
--------------------------------------------------------
postgres docker-entrypoint.sh postgres Up
创建复制用户
CREATE ROLE replica login replication encrypted password 'replica';
部署从库
编辑docker-compose.yml
和主库一样此处略。
启动容器
使用pg_basebackup复制
pg_basebackup -F p --progress -D /deploy/sorts/postgres/data/db -h 10.10.10.103 -p 5432 -U replica --password
此处如果从库的数据目录有数据会提示非空,清除数据即可。
修改postgres.conf
listen_addresses = '*'
port = 5432
max_connections = 1000
shared_buffers = 128MB
dynamic_shared_memory_type = posix
max_wal_size = 1GB
min_wal_size = 80MB
log_timezone = 'Asia/Shanghai'
datestyle = 'iso, mdy'
timezone = 'Asia/Shanghai'
lc_messages = 'en_US.utf8'
lc_monetary = 'en_US.utf8'
lc_numeric = 'en_US.utf8'
lc_time = 'en_US.utf8'
default_text_search_config = 'pg_catalog.english'
primary_conninfo = 'application_name=standby01 host=10.10.10.103 port=5432 user=replica password=replica'
recovery_target_timeline = latest
max_connections = 200
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
max_wal_senders = 15
此处主要是primary_conninfo开始的几行跟主库不一样,需要注意。
启动从库
[root@k8s-master-10 postgres]# docker-compose ps
Name Command State Ports
--------------------------------------------------------
postgres docker-entrypoint.sh postgres Up
验证是否同步
查询主备库是否正常
在主库上查询是否为备库
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
f
(1 row)
这里f代表false说明他是主库不是备库。 在备库上查询是否为备库
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
t
(1 row)
此为t表示true,表示他是个备库
查询流复制状态
postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
pid | state | client_addr | sync_priority | sync_state
-----+-----------+--------------+---------------+------------
45 | streaming | 10.10.10.233 | 1 | sync
sync_state为sync表示为同步流复制
postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
pid | state | client_addr | sync_priority | sync_state
--------+-----------+-------------+---------------+------------
227742 | streaming | 10.255.0.64 | 0 | async
(1 row)
如果sync_state为async表示为异步流复制
复制验证
在主库上创建一张表
可以看到从库也创建了张表
参考链接:
https://zhuanlan.zhihu.com/p/265949547
https://blog.csdn.net/shipeng1022/article/details/109065181
https://blog.csdn.net/weixin_39540651/article/details/103770421