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


    image

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

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

    更多

  • 相关阅读:
    Java类和对象(一)
    电脑电源灯一闪一闪开不了机怎么办
    [javascrip]构造树形数据实现
    【数据分析】2022年北京交通大学计算机学院学术型博士录取数据分析
    vue快速入门(三十六)组件通信-子传父
    C语言C位出道心法(五):内存管理
    Java如何并行多个if语句呢?
    精度误差问题与eps
    ChatGPT扇动翅膀后带来的蝴蝶效应
    【Java进阶】学好常用类,code省时省力
  • 原文地址:https://www.cnblogs.com/hacker-linner/p/16177739.html