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

本文涉及的产品
PolarClaw,2核4GB
简介: 使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群

   bitnami/postgresql



源码: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 上。


   创建 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_USERPOSTGRESQL_REPLICATION_PASSWORD 参数指定 replication 用户。


   创建 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_HOSTPOSTGRESQL_MASTER_PORT_NUMBER 参数连接到 master 并从 master 复制初始数据库。POSTGRESQL_REPLICATION_USERPOSTGRESQL_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: 建立同步提交的类型。可用选项有:onremote_applyremote_writelocaloff。默认值为 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 参数定义不同的复制组。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
505 100
|
7月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
497 99
|
7月前
|
缓存 Docker 容器
优化Docker镜像大小的五个实用技巧
优化Docker镜像大小的五个实用技巧
706 98
|
6月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
749 6
|
7月前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
334 8
|
10月前
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
1402 2
|
关系型数据库 分布式数据库 数据库
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
620 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
802 0
下一篇
开通oss服务