【数据库】【postgres】将docker部署的正在运行的单节点Postgresql调整为主从结构的Postgresql

背景

现有一需求是将线上postgres从单节点提升到主从结构,网上所说方案大多都是从无到有的配置一个主从的pg数据库,对于运行中的pg扩展没有资料,所以本人在测试环境测通了一种方法,在此记录一下,给有类似需求的大兄弟们提供一些方便,可以结合自己的业务情况进行参考。

环境(阿里云)&配置

  • 操作系统:ubuntu 16.4
  • 数据库版本:postgres10
  • docker版本:18.09.7
  • docker-compose版本:1.17.1

postgres的镜像配置

version: '2'
services:
 postgres:
   restart: always
   image: postgres:10
   container_name: postgres
   privileged: true
   ports:
     - 6432:5432
   environment:
     POSTGRES_PASSWORD: postgres
     PGDATA: /var/lib/postgresql/data/pgdata
   volumes:
     - /data/pg_data:/var/lib/postgresql/data/pgdata

操作步骤

简要描述

主节点需要操作的步骤

在挂载出来的配置文件pg_hba.conf,增加replica用户,用于同步。下方的ip换成你的服务器

host    replication     replica     <ip>/32                 md5

然后在docker容器中给postgres设置密码,登录和备份权限。

docker-compose exec postgres bash # 进入容器内部
su postgres # 切换权限
psql # 进入postgres的sql界面
CREATE ROLE replica login replication encrypted password 'replica' # 创建用户,引号中设置你需要的密码

在挂载出来的配置文件postgresql.conf,添加下面的参数

wal_level = hot_standby 
max_wal_senders = 32 
wal_keep_segments = 256 
wal_sender_timeout = 60s 
max_connections = 100 

接下来就重启容器,后续只需要动从的机器就能把主从机器给配置好了。

docker-compose restart postgres

从节点需要操作的步骤

重点思路: 从节点主要是如果要替换掉以前这个文件下所有的文件的话,那么docker容器会不断的重启,导致添加从节点的失败,现在的方案就是同步到另外一个文件夹下面,然后把文件配置的路径指向新的路径。

version: '2'
services:
  postgres:
    restart: always
    image: postgres:10
    container_name: postgres
    privileged: true
    ports:
      - 6432:5432
    environment:
      POSTGRES_PASSWORD: postgres
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - /data/pg_data:/var/lib/postgresql/data/pgdata
      - /data/pg_bak:/var/lib/postgresql/data/pgbak

启动pg服务,然后备份主库数据的命令如下

pg_basebackup -F p --progress -D /var/lib/postgresql/data/pgbak -h <ip> -p 5432 -U replica --password

接下来就是在pgbak中添加recovery.conf文件

宿主机中添加recovery.conf可以直接去挂载的目录下添加,如果是容器内添加recovery.conf得先下载vim,下载vim命令如下:

apt-get update
apt install vim

recovery.conf的内容就得按照自己的情况去做调整

standby_mode = on  # 这个说明这台机器为从库
primary_conninfo = 'host=<ip> port=6432 user=replica password=postgres'  
recovery_target_timeline = 'latest' 

在postgresql.conf添加如下参数

max_connections = 1000 
hot_standby = on  
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 1s
hot_standby_feedback = on 

修改一下docker-compose配置重新启动postgres服务,要删除掉以前的容器。

version: '2'
services:
  postgres:
    restart: always
    image: postgres:10
    container_name: postgres
    privileged: true
    ports:
      - 6432:5432
    environment:
      POSTGRES_PASSWORD: postgres
      PGDATA: /var/lib/postgresql/data/pgbak
    volumes:
      - /data/pg_data:/var/lib/postgresql/data/pgdata
      - /data/pg_bak:/var/lib/postgresql/data/pgbak

下面是要运行的命令

docker-compose stop postgres
docker-compose rm postgres
docker-compose up -d postgres

这样按道理来说就已经好了,最后去主节点上面验证一下就好了,验证的sql在下方。去哪查大家应该知道,就不重复展示了。

select * from pg_stat_replication;

这种方案还是有很多弊端,尤其在数据量偏大的时候会有比较多的问题,有什么更好的方案欢迎留言,下次我可以调试一下新的方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章