博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker搭建postgresql9.4主从同步复制集群
阅读量:2058 次
发布时间:2019-04-29

本文共 6614 字,大约阅读时间需要 22 分钟。

docker搭建postgresql9.4主从同步复制集群

参考文章

  • Docker + PostgreSQL 主从环境搭建

​ https://yq.aliyun.com/articles/641773

  • postgresql9.5主从复制部署文档

​ https://blog.51cto.com/wn2100/2238996

  • PostgreSQL建立Hot Standby的Replication机制

​ https://note.qidong.name/2018/09/postgresql-hot-standby/

  • PostgreSQL-11.3-主从流复制+手动主备切换

​ https://my.oschina.net/u/4206387/blog/3103570


一、环境说明

  • Docker

  • Ubuntu/CentOS

  • PostgreSQL v9.4

  • 使用的docker搭建postgres9.4主从环境(一主一从环境);

    我的主节点:172.19.32.62 ,对外端口5500

    从节点:172.19.32.73,对外端口5501

1. 运行PostgreSQL

主库和从库执行docker命令,构建相应的容器。注意我的docker容器是在不同的主机节点上的。

1.1 主库

docker run -d --name fct-pgmaster \-p 5500:5432 \-e POSTGRES_PASSWORD=postgres \-v /root/fct/postgresql-cluster/pgmaster:/var/lib/postgresql/data \-d postgres:9.4

1.2 从库

docker run -d --name fct-pgslave1 \-p 5501:5432 \-e POSTGRES_PASSWORD=postgres \-v /root/fct/postgresql-cluster/pgslave1:/var/lib/postgresql/data \-d postgres:9.4

进入以上主、从库对应的实际挂载目录执行下面的操作

2. 配置master(主库)

2.1 编辑pg_hba.conf,在最下面添加如下:

// replication_username: 复制账号; slave_ip: 从库所在的服务器ip    host    replication     replica     172.19.32.73/32          md5

其中,replication表示复制权限;

​ replica表示节点之间复制的账号;

​ 172.19.32.73/32 表示要复制的账号是 172.19.32.73,即从节点的账号

2.2 编辑postgresql.conf,更改如下:

listen_addresses = '*'max_connections = 100                   # (change requires restart)wal_level = hot_standby                 # minimal, archive, hot_standby, or logical                                        # (change requires restart)#fsync = on                             # turns forced synchronization on or offsynchronous_commit = local              # synchronization level;max_wal_senders = 32            # max number of walsender processes                                # (change requires restart)wal_keep_segments = 64          # in logfile segments, 16MB each; 0 disableswal_sender_timeout = 60s        # in milliseconds; 0 disablessynchronous_standby_names = '*'hot_standby = on                        # "on" allows queries during recovery

注意,我配置的配置项中某些并不是必须的,每一项的含义需要自己按照提示去理解体会。

2.3 进入容器,登录PostgreSQL,创建复制账号并验证:

# 1.进入容器        docker exec -it fct-pgmaster /bin/bash# 2.连接PostgreSQL        psql -U postgres -p 5500 # 3.创建用户        set synchronous_commit =off;        #replication_username: 对应上面设置的复制账号; replication_username_password: 认证密码        create role replica login replication encrypted password 'replica';  # 4.验证用户        \du

2.4 重启主节点容器,使配置生效

#重启容器  docker restart fct-pgmaster  #启动容器之后,需要查看容器的日志输出中是否有错误  docker logs fct-pgmaster

3. 配置Slave(从库)

3.1 编辑postgresql.conf(亲测,非必须),更改如下:

hot_standby_feedback = on

3.2 新建recovery.conf,添加如下内容:(该步骤不用做,跳过,在第4步骤中可以自动生产recovery.conf文件)

standby_mode = 'on'#replication_username: 复制账号(同主库); master_ip: 主库所在的服务器ip; master_port: 主库端口; replication_username_password: 认证密码primary_conninfo = 'host=172.19.32.62 port=5500 user=replica password=replica'

4. 同步主从库数据及测试

4.1同步主从库数据(必须)

pg_basebackup命令

进入从节点容器中,执行直接执行,清除从节点中的数据(该步骤必须的!

rm -rf  /var/lib/postgresql/data/

如果出现如下错误

root@f42b3ae4014c:/# rm -rf  /var/lib/postgresql/data rm: cannot remove '/var/lib/postgresql/data': Device or resource busy

则建议,直接删除容器外的挂盘目录,这里是/root/fct/postgresql-cluster/pgslave1,直接执行;

然后在容器中执行备份命令,此时会将主节点中的数据同步到当前从节点的数据目录中;

pg_basebackup -h 172.19.32.62 -p 5500 -U replica -F p -x -P -R -D /var/lib/postgresql/data/ -l postgresbackup20190129

执行完后结果如下,会有进度条显示执行成功!

root@29e514bcfa3c:/# pg_basebackup -h 172.19.32.62 -p 5500 -U replica -F p -x -P -R -D /var/lib/postgresql/data/ -l postgresbackup20190129Password: 36643/36643 kB (100%), 1/1 tablespace

**注意事项1:**命令中的-U replica执行的用户名是replica,这是前面创建配置的节点数据复制的用户名角色和密码;不是使用的前面的postgres的账号密码!切记!

(执行完之后,容器自动退出;)

此时在从库的外部容器挂载目录下会自动常见相应的pg_hba.conf文件和recovery.conf文件。

recovery.conf文件内容如下:

standby_mode = 'on'primary_conninfo = 'user=replica password=replica host=172.19.32.62 port=5500 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'

注意事项2:pg_basebackup命令从属于容器的命令,需要在容器内部执行,并且指明-U replica的复制权限的用户名;注意master节点的对外端口-p 5500也要指定正确。

4.2 先后启动主库、从库服务

每次修改相应的配置时候,要想使得配置生效,需要重启容器。

docker restart fct-pgmaster     docker restart fct-pgslave

注意:启动容器之后,需要查看容器的日志输出中是否有错误

docker logs fct-pgmaster     docker logs fct-pgslave

4.3 连接测试

1.查看同步节点状态是否成功

查看主从同步是否成功的命令psql -U postgres -x -c "select * from pg_stat_replication;"

操作步骤如下

// 进入主库容器docker exec -it fct-pgmaster /bin/bash// 查看复制状态 root@e78673f448d0:/# psql -U postgres -h 172.19.32.62 -p 5500 -x -c "select * from pg_stat_replication;"Password for user postgres: -[ RECORD 1 ]----+------------------------------pid              | 838usesysid         | 16384usename          | replicaapplication_name | walreceiverclient_addr      | 172.19.32.73client_hostname  | client_port      | 55582backend_start    | 2019-10-28 06:38:33.303482+00backend_xmin     | state            | streamingsent_location    | 0/3000138write_location   | 0/3000138flush_location   | 0/3000138replay_location  | 0/3000100sync_priority    | 1sync_state       | sync
root@e78673f448d0:/# psql -U postgres -h 172.19.32.62 -p 5500Password for user postgres: psql (9.4.21)Type "help" for help.postgres=# select client_addr,sync_state from pg_stat_replication; client_addr  | sync_state --------------+------------ 172.19.32.73 | sync(1 row)

2.查看slave节点的外部挂载目录下时候有如下文件recovery.conf

standby_mode = 'on'primary_conninfo = 'user=repl password=repl host=172.19.32.62 port=5510 sslmode=prefer sslcompression=0 krbsrvname=postgres target_session_attrs=any'
#或者自己配置:standby_mode = 'on'#replication_username: 复制账号(同主库); master_ip: 主库所在的服务器ip; master_port: 主库端口; replication_username_password: 认证密码primary_conninfo = 'host=172.19.32.62 port=5500 user=replica password=replica'recovery_target_timeline = 'latest'

5.常见错误总结:

1.DETAIL: The primary’s identifier is , the standby’s identifier is

FATAL:  database system identifier differs between the primary and standbyDETAIL:  The primary's identifier is 6752676860246843428, the standby's identifier is 6752661973687021603.

这是因为从库没有与主库的数据同步,导致启动时候报错!

确保数据同步,是必须做的步骤 !

2.hot standby is not possible because wal_level was not set to “hot_standby” or higher on the master server

FATAL:  hot standby is not possible because wal_level was not set to "hot_standby" or higher on the master serverHINT:  Either set wal_level to "hot_standby" on the master, or turn off hot_standby here.

修改配置文件中相关选项, 按照配置项提示修改即可。


补充知识

pg_basebackup -h 172.19.32.62 -p 5500 -U replica -F p -x -P -R -D /var/lib/postgresql/data/ -l postgresbackup20190129

备份过程实际上就是从主库的data目录里物理拷贝数据的过程。

参数说明

-F 指定了输出的格式,支持p(原样输出)或者t(tar格式输出)。

-x 表示备份开始后,启动另一个流复制连接从主库接收WAL日志。

-p 表示允许在备份的过程中实时的打印备份的进度。

-R 表示会在备份结束后自动生成recovery.conf文件,这样就避免了手动创建。

-D 指定把备份写到哪个目录,注意:在做基础备份之前从库的数据目录需要手动清空。

-1 表示指定一个备份的标识。

转载地址:http://gmvlf.baihongyu.com/

你可能感兴趣的文章
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>