看房自己的网站建设多少钱,网店平台排名,施工企业安全生产管理规范最新版,wordpress仿微信订阅主题PostgreSQL 笔记#xff1a;PostgreSQL 主从复制
博客地址#xff1a;TMDOG 的博客
在现代应用程序中#xff0c;数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能#xff0c;可以在多个数据库实例之间复制数据#xff0c;以实现冗余和负载均衡。本…PostgreSQL 笔记PostgreSQL 主从复制
博客地址TMDOG 的博客
在现代应用程序中数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能可以在多个数据库实例之间复制数据以实现冗余和负载均衡。本文将介绍如何在 Docker 环境中构建PostgreSQL 主从复制环境。
1. 主从复制原理
PostgreSQL 的主从复制是通过将主服务器的 WALWrite-Ahead Logging日志复制到从服务器实现的。以下是主要原理 预写式日志WAL PostgreSQL 使用预写式日志记录事务更改确保在任何时刻数据的完整性。在执行写入操作之前系统会将更改先写入 WAL这样即使发生崩溃也可以通过 WAL 恢复数据。 主服务器Master: 负责处理所有写入操作。当数据被写入时它首先记录到 WAL 中然后再应用到数据文件。 从服务器Slave: 被配置为从主服务器接收和应用 WAL 日志以保持数据一致性。它可以处于热备份状态随时接收主服务器的更新。 复制角色: 从服务器需要一个具备复制权限的角色如 repl通过此角色进行身份验证和连接。 异步与同步复制: PostgreSQL 支持异步和同步复制。异步复制可以提高性能但主服务器不会等待从服务器确认接收到数据而同步复制则确保数据在主服务器和从服务器之间一致性。
2. 创建网络环境
首先我们需要为 PostgreSQL 实例创建一个 Docker 网络以便它们可以相互通信。
docker network create pg-network3. 创建主服务器
接下来启动一个 PostgreSQL 主服务器容器。我们将数据存储在宿主机上以便在容器重启时数据不会丢失。
docker run --networkpg-network --name pgsmaster -p 5500:5432 -e POSTGRES_PASSWORD123456 -v /var/lib/pgsmaster:/var/lib/postgresql/data -d postgres:16.44. 创建从属服务器
同样我们创建一个 PostgreSQL 从属服务器容器。它将用于接收主服务器的数据复制。
docker run --networkpg-network --name pgsslave -p 5501:5432 -e POSTGRES_PASSWORD123456 -d postgres:16.45. 获取 IP 地址
为了配置主从复制我们需要获取主从服务器的 IP 地址
docker inspect pgsmaster | grep IPAddress
docker inspect pgsslave | grep IPAddress6. 配置主服务器
编辑主服务器的 postgresql.conf 文件添加从属连接信息。使用上一步获取的 IP 地址。
cat /var/lib/pgsmaster/postgresql.conf -EOF
primary_conninfo host主服务器IP port5432 userrepl passwordrepl
EOF7. 更新 pg_hba.conf
为了允许从属服务器连接到主服务器我们需要更新 pg_hba.conf 文件
cat /var/lib/pgsmaster/pg_hba.conf -EOF
host replication repl 从属服务器IP/32 md5
EOF8. 重启主服务器
重启主服务器以使配置更改生效
docker restart pgsmaster9. 进入主服务器容器控制台
现在我们进入主服务器的容器
docker exec -it pgsmaster /bin/bash10. 创建复制角色
在从属服务器上我们需要创建一个角色来处理复制
psql -U postgres
# 关闭同步提交从属服务器不会等待主服务器确认数据已写入后再提交事务。
set synchronous_commit off;
# 创建复制角色
create role repl login replication encrypted password repl;
# 查看角色
\du
\q
exit我们看到repl角色说明创建成功
11. 进入从属服务器
现在我们进入从属服务器的容器
docker exec -it pgsslave /bin/bash12. 数据备份
使用 pg_basebackup 从主服务器备份数据 此次备份是将整个数据库文件从主服务器中备份下来而不是通过流的形式备份
pg_basebackup -Fp --progress -D /home/opt/postgresql-16.0/data/ -R -h 主服务器IP -p 5432 -U repl --password输入密码repl exit退出
13. 复制数据到宿主机
将从属服务器的数据复制到宿主机以便我们可以在新的从属服务器中使用
docker cp pgsslave:/home/opt/postgresql-16.0/data/ /var/lib/pgsslave我们查看/var/lib/pgsslave包含完整的数据库文件 14. 删除从属服务器
删除旧的从属服务器容器
docker rm -f pgsslave15. 使用复制的数据创建新的从属服务器
重新创建从属服务器使用之前备份的数据
docker run --networkpg-network --name pgsslave -p 5501:5432 -e POSTGRES_PASSWORD123456 -v /var/lib/pgsslave:/var/lib/postgresql/data -d postgres:16.416. 查看从属服务器日志
最后查看从属服务器的日志以确保复制正常运行
docker logs -f pgsslave我们发现日志中包含“recovery”、“WAL”等字样 测试
我们连接两个数据库 在主服务器上创建表并插入数据
我们打开从属服务器发现数据同步了 我们想在从属服务器插入数据发现插入失败 查看主服务器的复制日志表发现复制记录 总结
通过以上步骤我们成功地在 Docker 中创建了 PostgreSQL 主从复制环境。主从复制不仅提高了数据的可靠性还可以帮助我们在负载较高时进行负载均衡、实现读写分离增强数据库的吞吐量。