docker搭建postgresql9.4主从同步复制集群
参考文章:
Postgresql实现主从复制,读写分离 https://blog.csdn.net/qq_31905135/article/details/86689735
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/
使用的docker搭建postgres9.4主从环境(一主一从环境);
我的主节点:172.19.32.62 ,对外端口5500
从节点:172.19.32.73,对外端口5501
环境说明
DockerUbuntu/CentOSPostgreSQL v9.4
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
wal_level
= hot_standby
synchronous_commit
= local
max_wal_senders
= 32
wal_keep_segments
= 64
wal_sender_timeout
= 60s
synchronous_standby_names
= '*'
hot_standby
= on
注意,我配置的配置项中某些并不是必须的,每一项的含义需要自己按照提示去理解体会。
2.3 进入容器,登录PostgreSQL,创建复制账号并验证:
docker
exec -it fct-pgmaster /bin/bash
psql -U postgres -p 5500
set synchronous_commit
=off
;
create role replica login replication encrypted password
'replica';
\du
3. 配置Slave(从库)
3.1 编辑postgresql.conf(亲测,非必须),更改如下:
hot_standby_feedback
= on
3.2 新建recovery.conf,添加如下内容:
standby_mode
= 'on'
primary_conninfo
= 'host=172.19.32.62 port=5500 user=replica password=replica'
4. 同步主从库数据及测试
4.1 停止PostgreSQL
docker stop fct-pgmaster
docker stop fct-pgslave1
4.2 同步主从库数据(必须)
pg_basebackup命令
进入从节点容器中,执行直接执行,清除从节点中的数据(该步骤必须的!)
rm -rf /var/lib/postgresql/data/
然后执行备份命令,此时会将主节点中的数据同步到当前从节点的数据目录中;
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:/
Password:
36643/36643 kB
(100%
), 1/1 tablespace
**注意事项:**命令中的-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'
4.3 先后启动主库、从库服务
每次修改相应的配置时候,要想使得配置生效,需要重启容器。
docker restart fct-pgmaster
docker restart fct-pgslave
注意:启动容器之后,需要查看容器的日志输出中是否有错误
docker logs fct-pgmaster
docker logs fct-pgslave
4.4 连接测试
// 查看复制状态
psql -U postgres -x -c
"select * from pg_stat_replication;"
// 进入主库容器
docker
exec -it fct-pgmaster
bash
// 查看复制状态
root@e78673f448d0:/
Password
for user postgres:
-
[ RECORD 1
]----+------------------------------
pid
| 838
usesysid
| 16384
usename
| replica
application_name
| walreceiver
client_addr
| 172.19.32.73
client_hostname
|
client_port
| 55582
backend_start
| 2019-10-28 06:38:33.303482+00
backend_xmin
|
state
| streaming
sent_location
| 0/3000138
write_location
| 0/3000138
flush_location
| 0/3000138
replay_location
| 0/3000100
sync_priority
| 1
sync_state
| sync
root@e78673f448d0:/
Password
for user postgres:
psql
(9.4.21
)
Type
"help" for help.
postgres
=
client_addr
| sync_state
--------------+------------
172.19.32.73
| sync
(1 row
)
standby_mode
= 'on'
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 standby
DETAIL: 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 server
HINT: 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 表示指定一个备份的标识。
原创不易,如果觉得好,就点个赞! 如果不好,欢迎大家讨论!