使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群

bitnami-docker-postgresql 仓库
流复制相关环境变量
使用以下环境变量,可以使用 Bitnami PostgreSQL Docker 镜像 轻松设置流复制集群:
POSTGRESQL_REPLICATION_MODE: replication 模式。可能的值master/slave。没有默认值。POSTGRESQL_REPLICATION_USER: 首次运行时在主服务器上创建的 replication 用户。没有默认值。POSTGRESQL_REPLICATION_PASSWORD: replication 用户密码。 没有默认值。POSTGRESQL_REPLICATION_PASSWORD_FILE: 包含 replication 用户密码的文件的路径。这将覆盖POSTGRESQL_REPLICATION_PASSWORD中指定的值。没有默认值。POSTGRESQL_MASTER_HOST: replication master(slave 参数)Hostname/IP。没有默认值。POSTGRESQL_MASTER_PORT_NUMBER: replication master 的服务器端口(slave 参数)。默认是5432。
在复制(replication)集群中,您可以拥有一个主(master)服务器和零个或多个从(slave)服务器。 启用复制后,master 节点处于读写模式,而 slave 节点处于只读模式。 为了获得最佳性能,建议将读取限制在 slave 上。
第 1 步:创建 replication master
第一步是启动 master。
$ docker run --name postgresql-master \
-e POSTGRESQL_REPLICATION_MODE=master \
-e POSTGRESQL_USERNAME=my_user \
-e POSTGRESQL_PASSWORD=password123 \
-e POSTGRESQL_DATABASE=my_database \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
bitnami/postgresql:latest
在此命令中,我们使用 POSTGRESQL_REPLICATION_MODE=master 参数将容器配置为 master 容器。使用 POSTGRESQL_REPLICATION_USER 和 POSTGRESQL_REPLICATION_PASSWORD 参数指定 replication 用户。
步骤 2:创建 replication slave
接下来我们启动一个 replication slave 容器。
$ docker run --name postgresql-slave \
--link postgresql-master:master \
-e POSTGRESQL_REPLICATION_MODE=slave \
-e POSTGRESQL_MASTER_HOST=master \
-e POSTGRESQL_MASTER_PORT_NUMBER=5432 \
-e POSTGRESQL_REPLICATION_USER=my_repl_user \
-e POSTGRESQL_REPLICATION_PASSWORD=my_repl_password \
bitnami/postgresql:latest
在上面的命令中,使用 POSTGRESQL_REPLICATION_MODE 参数将容器配置为slave。 在 replication slave 启动之前,slave 容器使用 POSTGRESQL_MASTER_HOST 和 POSTGRESQL_MASTER_PORT_NUMBER 参数连接到 master 并从 master 复制初始数据库。POSTGRESQL_REPLICATION_USER 和 POSTGRESQL_REPLICATION_PASSWORD 凭证用于向 master 进行身份验证。为了改变 pg_hba.conf 的默认设置,slave 需要知道是否设置了 POSTGRESQL_PASSWORD。
使用这两个命令,您现在可以启动并运行一个两节点 PostgreSQL 主从(master-slave)流复制集群。 您可以通过添加/删除从(slave)服务器来扩展集群,而不会导致任何停机。
Note: 集群完整地复制 master 服务器,包括所有用户和数据库。
如果 master 服务器宕机,您可以重新配置一个 slave 服务器作为 master 服务器并通过创建触发器文件 /tmp/postgresql.trigger.5432 开始接受写入。例如,以下命令将 postgresql-slave 重新配置为 master 服务器:
$ docker exec postgresql-slave touch /tmp/postgresql.trigger.5432
Note: 需要更新集群中其他
slave服务器的配置,以便他们知道新的master服务器。这将要求您根据我们的示例使用--link postgresql-slave:master重新启动其他slave服务器。
使用 Docker Compose,可以使用以下方式设置主从复制:
version: '2'
services:
postgresql-master:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
postgresql-slave:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_MASTER_PORT_NUMBER=5432
volumes:
postgresql_master_data:
使用以下方法缩放 slave 的数量:
$ docker-compose up --detach --scale postgresql-master=1 --scale postgresql-slave=3
上面的命令将 slave 的数量增加到 3。你可以用同样的方法缩小。
Note: 您不应该扩大/缩小主节点的数量。始终只运行一个主节点。
同步提交
默认情况下,slave 实例配置为异步复制。为了保证更高的数据稳定性(以牺牲一些性能为代价),可以使用以下环境变量设置同步提交(即,在将事务提交写入一组副本之前,事务提交不会将成功返回给客户端)。
POSTGRESQL_SYNCHRONOUS_COMMIT_MODE: 建立同步提交的类型。可用选项有:on、remote_apply、remote_write、local和off。 默认值为on。有关更多信息,请查看官方 PostgreSQL 文档。POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS: 确定将启用同步复制的副本数。此数量不得超过您在集群中配置的slave的数量。
使用 Docker Compose,可以按如下方式设置带有同步提交的主从复制:
version: '2'
services:
postgresql-master:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
volumes:
- 'postgresql_master_data:/bitnami/postgresql'
environment:
- POSTGRESQL_REPLICATION_MODE=master
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_USERNAME=my_user
- POSTGRESQL_PASSWORD=my_password
- POSTGRESQL_DATABASE=my_database
- POSTGRESQL_SYNCHRONOUS_COMMIT_MODE=on
- POSTGRESQL_NUM_SYNCHRONOUS_REPLICAS=1
volumes:
- '/path/to/postgresql-persistence:/bitnami/postgresql'
postgresql-slave:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_MASTER_PORT_NUMBER=5432
postgresql-slave2:
image: 'bitnami/postgresql:latest'
ports:
- '5432'
depends_on:
- postgresql-master
environment:
- POSTGRESQL_REPLICATION_MODE=slave
- POSTGRESQL_REPLICATION_USER=repl_user
- POSTGRESQL_REPLICATION_PASSWORD=repl_password
- POSTGRESQL_MASTER_HOST=postgresql-master
- POSTGRESQL_MASTER_PORT_NUMBER=5432
在上面的示例中,提交需要同时写入主服务器和其中一个从服务器才能被接受。另一个 slave 将继续使用异步复制。使用以下 SQL 查询对其进行检查:
postgres=# select application_name as server, state,
postgres-# sync_priority as priority, sync_state
postgres-# from pg_stat_replication;
| server | state | priority | sync_state |
|-------------|-----------|----------|------------|
| walreceiver | streaming | 0 | sync |
| walreceiver | streaming | 0 | async |
Note: 对于更高级的设置,您可以通过设置
POSTGRESQL_CLUSTER_APP_NAME环境变量,使用application_name参数定义不同的复制组。
更多
- Pgpool-II 4.3 中文手册-前言
- pgpool-II 4.3 中文手册 - 入门教程
- 「在 Kubernetes 上运行 Pgpool-Il」实现 PostgreSQL 查询(读)负载均衡和连接池
使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群的更多相关文章
- 用Docker swarm快速部署Nebula Graph集群
用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...
- docker swarm快速部署redis分布式集群
环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...
- KingbaseES R6 主备流复制集群创建级联复制案例
案例环境: 数据库: test=# select version(); version -------------------------------------------------------- ...
- 使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA
什么是 PostgreSQL HA? 此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器(replication manager),这是一种用于管理 PostgreSQL 集 ...
- 超快速使用docker在本地搭建hadoop分布式集群
超快速使用docker在本地搭建hadoop分布式集群 超快速使用docker在本地搭建hadoop分布式集群 学习hadoop集群环境搭建是hadoop入门的必经之路.搭建分布式集群通常有两个办法: ...
- PostgreSQL数据库单机扩展为流复制
primary:10.189.102.118 standby:10.189.100.195 1. 配置ssh互信机制 在primary主库执行 $ ssh-keygen -t rsa $ cp ~/. ...
- Docker swarm结合Openresty部署rabbitmq集群
Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...
- Harbor快速部署到Kubernetes集群及登录问题解决
Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...
- kubernetes(K8S)快速安装与配置集群搭建图文教程
kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...
随机推荐
- 半吊子菜鸟学Web开发 -- PHP学习 4 --异常
PHP异常处理 1 抛出一个异常 与Python的try except类似,PHP用try catch来捕获异常 基本语法 try{ //可能出现错误或异常的代码 //catch表示捕获,Except ...
- 学习廖雪峰的git教程6--版本控制
1git log 查看提交的版本 2git reset --hard HEAD^回退到上一个版本 3git reset --hard 版本号 回到某一个版本
- 说说对 SQL 语句优化有哪些方法?(选择几条)
1.Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可 以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后. 2.用 EXISTS 替代 ...
- spring-boot-learning 日志相关
sprint-boot 日志 市面上的日志框架: JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.... SpringBoot:底层是Spring ...
- 攻防世界 NaNNaNNaNNaN-Batman
NaNNaNNaNNaN-Batman 下载出一个文件我们一开始不知道是个啥,我们拉入到sublime中看一下 我们可以发现在最开始的位置有一个_是一段函数变量,最后的eva()那个是执行函数代码,但 ...
- 5-Pandas数据分组的函数应用(df.apply()、df.agg()和df.transform()、df.applymap())
将自己定义的或其他库的函数应用于Pandas对象,有以下3种方法: apply():逐行或逐列应用该函数 agg()和transform():聚合和转换 applymap():逐元素应用函数 一 ...
- Numpy使用Matplotlib实现可视化绘图
Numpy使用Matplotlib实现可视化绘图 可以直接将Numpy的数组传给Matplotlib实现可视化绘图: 曲线图 饼图 柱状图 直方图 1. 绘制正弦曲线 2. 绘制饼图 3. 柱状图 4 ...
- Simulink仿真时间、步长、精度和解法器设置
在Simulink模型中Configuration Parameters里的Solver页设置仿真时间.步长.精度和解法器. 一.仿真时间:注意这里的时间概念与真实的时间并不一样,只是计算机仿真中对时 ...
- 什么是RESTFUL?REST的请求方法有哪些,有什么区别?
这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [什么是REST ...
- 关于小程序websocket全套解决方案,Nginx代理wss
需求对话 提问 我在本地web能够使用ws协议去链接websocket,但是小程序不能使用. 回答 由于小程序使用的是SSL加密协议,所以需要使用wss.这里wss与ws的关系就相当于https于ht ...