bitnami-docker-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 上。

第 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 实例配置为异步复制。为了保证更高的数据稳定性(以牺牲一些性能为代价),可以使用以下环境变量设置同步提交(即,在将事务提交写入一组副本之前,事务提交不会将成功返回给客户端)。

使用 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 参数定义不同的复制组。

更多

使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群的更多相关文章

  1. 用Docker swarm快速部署Nebula Graph集群

    用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...

  2. docker swarm快速部署redis分布式集群

    环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...

  3. KingbaseES R6 主备流复制集群创建级联复制案例

    案例环境: 数据库: test=# select version(); version -------------------------------------------------------- ...

  4. 使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA

    什么是 PostgreSQL HA? 此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器(replication manager),这是一种用于管理 PostgreSQL 集 ...

  5. 超快速使用docker在本地搭建hadoop分布式集群

    超快速使用docker在本地搭建hadoop分布式集群 超快速使用docker在本地搭建hadoop分布式集群 学习hadoop集群环境搭建是hadoop入门的必经之路.搭建分布式集群通常有两个办法: ...

  6. PostgreSQL数据库单机扩展为流复制

    primary:10.189.102.118 standby:10.189.100.195 1. 配置ssh互信机制 在primary主库执行 $ ssh-keygen -t rsa $ cp ~/. ...

  7. Docker swarm结合Openresty部署rabbitmq集群

    Docker swarm结合Openresty部署rabbitmq集群 大家好,年底了,年味儿越来越浓了.2019年的寒冬被定义为未来10年中最好的一年,对于这一说法悲观的人和乐观的人的理解是不一样的 ...

  8. Harbor快速部署到Kubernetes集群及登录问题解决

    Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...

  9. kubernetes(K8S)快速安装与配置集群搭建图文教程

    kubernetes(K8S)快速安装与配置集群搭建图文教程 作者: admin 分类: K8S 发布时间: 2018-09-16 12:20 Kubernetes是什么? 首先,它是一个全新的基于容 ...

随机推荐

  1. gitLab上dev分支上的内容都拉取到本地了

    从dev分支上更新代码 1.与远程仓库建立连接:git remote add origin XXXXX.git 2.使用git branch 查看本地是否具有dev分支 3.如果没有 git fetc ...

  2. li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法

    li 与 li 之间有空白间隔是什么原因引起的,有什么解决办法 原因 浏览器会把inline元素间的空白字符(空格.换行.Tab等)渲染成一个空格.而为了美观,我们通常是一个 放在一行,这导致 换行后 ...

  3. idea 下 Vue

    一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...

  4. Dubbo 可以对结果进行缓存吗?

    为了提高数据访问的速度.Dubbo 提供了声明式缓存,以减少用户加缓存的工作 量 <dubbo:reference cache="true" /> 其实比普通的配置文件 ...

  5. python 装饰器函数基础知识

    1.装饰器的本质--一个闭包函数 2.装饰器的功能--在不改变原函数及其调用方式情况下对原函数功能进行拓展 3.带参数和返回值的装饰器 def timer(func): @wraps(func) #使 ...

  6. kafka的message格式是什么样的?

    一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成 ...

  7. Java如何声明一个数组?JS如何声明一个数组?如何获取数组长度

    1 Long[] numbers; //一般使用的定义方式,可分为静态和动态两种定义方式,下有说明. 2 Long numbers[]; //跟上面用法一致. 3 Long... numbers; / ...

  8. Python中module文件夹里__init__.py的功能

    怎么引用模块 环境:win7 + python3.5.2文档结构: -project -data -src  -filterCorpus.py  -translateMonolingual.py 问题 ...

  9. CSS学习(二):背景图片如何定位?

    我们都知道background-position属性用来指定背景图片应该出现的位置,可以使用关键字.绝对值和相对值进行指定.在CSS Sprites中,这个属性使用比较频繁,使用过程中,我常混淆,经常 ...

  10. IMWEB 前端面试题汇总

    1.什么是盒子模型? CSS中的思维模型,每一个元素都包含margin,padding,boder,content区域,占一个盒子形状,整体称为盒模型. 2.简述一下src与href的区别? Href ...