docker
版postgresql
主从配置
注意项:当前操作主路径:~/dockerEnv
【示例路径】
操作目录结构如下:
- dockerEnv
-- dbInit
--- a_create_user.sql
-- pg_data
--- ......
--- ......
- 创建
sql
文件,文件路径dockerEnv/dbInit/a_create_user.sql
-- 主从同步账号
CREATE ROLE replicator REPLICATION LOGIN PASSWORD 'abc';
-- 添加用户
create user swmg with password 'abc';
-- 创建数据库
create database sis_server;
-- 将数据库的管理权授予用户
grant all privileges on database sis_server to swmg;
1.0、主从数据库的容器yml
文件
注意: 如果在同一个宿主机操作,注意多个yml
文件的端口映射,不要冲突!
- 挂载宿主机
sql
文件夹到容器的docker-entrypoint-initdb.d
路径下,容器启动时,会按照文件夹内的sql
文件命名顺序自动执行sql
文件。
-
主数据库
docker-compose.yml
文件version: '3' services: dbServer: image: "postgres:12.5" restart: always container_name: pg_server_master environment: POSTGRES_DB: sis_server POSTGRES_USER: postgres POSTGRES_PASSWORD: swissmic PGDATA: /var/lib/postgresql/data TZ: 'Asia/Shanghai' volumes: - ./data:/var/lib/postgresql/data:rw - ../dbInit:/docker-entrypoint-initdb.d/:rw ports: - "10000:5432" command: ["docker-entrypoint.sh", "postgres"]
-
从数据库
docker-compose.yml
文件从数据库,仅比主数据库多了一个中转文件夹
backup_data
的挂载,主要是为了方便从主数据库备份数据库文件后,迁移使用。version: '3' services: dbServer: image: "postgres:12.5" restart: always container_name: pg_server_slave environment: POSTGRES_DB: sis_server POSTGRES_USER: postgres POSTGRES_PASSWORD: swissmic PGDATA: /var/lib/postgresql/data TZ: 'Asia/Shanghai' volumes: - ./data:/var/lib/postgresql/data:rw - ./data-transfer:/var/lib/postgresql/backup_data:rw - ../dbInit:/docker-entrypoint-initdb.d/:rw ports: - "10000:5432" command: ["docker-entrypoint.sh", "postgres"]
1.1、主数据库
-
修改
pg_hba.conf
文件,追加如下内容:# 允许replicator账号进行连接 host replication replicator 0.0.0.0/0 md5
-
修改
postgresql.conf
文件,追加如下内容:hot_standby = on # 打开热备 wal_level = replica # 设置 WAL 日志级别为 replica max_wal_senders = 3 # 允许的 WAL 发送者数量,根据需要进行调整 archive_mode = on # 启用归档模式。PostgreSQL 会将 WAL 日志归档到指定的归档目录中。 # 归档模式,指定wal日志归档路径(手动创建archive路径) archive_command = 'cp "%p" /var/lib/postgresql/data/archive/%f'
-
手动创建
archive
归档路径,并重启容器
1.2、从数据库
- 进入容器的
/var/lib/postgresql/backup_data
路径下,执行以下命令,拉取主数据库信息。(子数据库启动时,yml
多挂在了一个中转数据的文件夹)- 备份主数据库数据,会要求使用空文件夹,所以挂载了一个
backup_data
路径,备份数据后,方便在宿主机直接操作替换 - 备份的主数据文件中,多了一个
standby.signal
文件,此文件保留不动,不用增加内容 - 同时,
postgresql.auto.conf
内会自动生成主服务器的连接地址,此文件不需要改动
- 备份主数据库数据,会要求使用空文件夹,所以挂载了一个
# 这个命令,会从主数据库拉取备份,从数据库使用拉取的数据,实现主从同步
pg_basebackup -h 192.168.2.59 -p 40001 -U replicator -D . -Fp -Xs -Pv -R --checkpoint=fast
-
执行完后,关闭
从数据库
容器。 -
在宿主机中,将
data-transfer
文件夹替换掉pg_data
文件夹(删掉pg_data
,将data-transfer
改名为pg_data
),然后重启子数据库容器(让子数据库使用主数据库拉取的数据库文件,重启子数据库,会自动进行主从同步)。
故障恢复
主数据库故障
当主数据库故障时,删除子数据库的standby.signal
文件,重启子数据库容器,则从数据库将恢复成生产模式,系统再修改数据库连接,指向子数据库的ip端口
即可。