服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - PostgreSQL - 在 Kubernetes 上运行 Pgpool-Il 实现 PostgreSQL 查询(读)负载均衡和连接池

在 Kubernetes 上运行 Pgpool-Il 实现 PostgreSQL 查询(读)负载均衡和连接池

2023-05-07 03:12未知服务器之家 PostgreSQL

介绍 因为 PostgreSQL 是一个有状态的应用程序,并且管理 PostgreSQL 有非常具体的要求(例如备份、恢复、自动故障转移等),Kubernetes 的内置功能无法处理这些任务。因此,需要一个扩展 Kubernetes 功能以创建和管理 PostgreSQL 的 Operator。

介绍

因为 PostgreSQL 是一个有状态的应用程序,并且管理 PostgreSQL 有非常具体的要求(例如备份、恢复、自动故障转移等),Kubernetes 的内置功能无法处理这些任务。因此,需要一个扩展 Kubernetes 功能以创建和管理 PostgreSQL 的 Operator。

PostgreSQL operator 有好几种,比如 Crunchy PostgreSQL Operator、Zalando PostgreSQL Operator 和 KubeDB。但是,这些 operator 不提供查询负载均衡功能。

  • Crunchy PostgreSQL Operator

https://github.com/CrunchyData/postgres-operator

  • Zalando PostgreSQL Operator

https://github.com/zalando/postgres-operator

  • KubeDB

https://github.com/kubedb/operator

结合 PostgreSQL Operator 和 Pgpool-II 在 Kubernetes 上部署具有查询负载均衡和连接池能力的 PostgreSQL 集群。Pgpool-II 可以与上面提到的任何 PostgreSQL Operator 结合使用。

架构

在 Kubernetes 上运行 Pgpool-Il 实现 PostgreSQL 查询(读)负载均衡和连接池

前提条件

在开始配置过程之前,请检查以下前提条件。

  • 确保你有一个 Kubernetes 集群,并且安装了 kubectl。
  • PostgreSQL Operator 和 PostgreSQL cluster 已安装。

部署 Pgpool-II

Kubernetes 不需要 Pgpool-II 的健康检查、自动故障转移、watchdog 和在线恢复功能。您只需要启用负载平衡和连接池。

Pgpool-II pod 应该使用以下最低配置:

backend_hostname0 = '<primary service name>'
backend_hostname1 = '<replica service name>'
backend_port0 = '5432'
backend_port1 = '5432'
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'

failover_on_backend_error = off

sr_check_period = 10 (when using streaming replication check)
sr_check_user='username of PostgreSQL user' (when using streaming replication check)

load_balance_mode = on
connection_cache = on
listen_addresses = '*'

有两种配置 Pgpool-II 的方法。

1.使用环境变量

https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

2.使用 ConfigMap

https://kubernetes.io/docs/concepts/configuration/configmap/

您可能需要在生产环境中配置客户端身份验证和更多参数。在生产环境中,我们建议使用 ConfigMap 来配置 pgpool.conf 和 pool_hba.conf。

使用环境变量配置 Pgpool-II

Kubernetes 环境变量可以传递给 pod 中的容器。您可以在部署清单中定义环境变量来配置 Pgpool-II 的参数。pgpool-deploy-minimal.yaml 是一个示例清单,包括环境变量的最小设置。您可以下载 pgpool-deploy-minimal.yaml 并修改此清单中的环境变量。

$ curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-minimal.yaml

以 PGPOOL_PARAMS_ 开头的环境变量可以转换为 Pgpool-II 的配置参数,这些值可以覆盖默认设置。

在 Kubernetes 上,您只需要指定两个后端节点。根据您的 PostgreSQL 集群信息更新 pgpool-deploy-minimal.yaml。将主服务名称指定为 backend_hostname0。将副本服务名称指定为 backend_hostname1。因为故障转移由 Kubernetes 管理,所以将 DISALLOW_TO_FAILOVER 标志指定给两个节点的 backend_flag,并将 ALWAYS_PRIMARY 标志指定给 backend_flag0。 backend_data_directory 的设置不是必需的。

  • backend_hostname

http://www.zzvips.com/uploads/allimg/5w5yevwcxm0.html data-id="ucd67dc5-YYc975qb">

  • backend_flag
  • http://www.zzvips.com/uploads/allimg/tulblkjxczo.html data-id="ucd67dc5-tQo1Icql">

  • backend_data_directory
  • http://www.zzvips.com/uploads/allimg/xxi1crrpnxq.html data-id="pd157317-wwUPpcNp">例如,清单中定义的以下环境变量,

    env:
    - name: PGPOOL_PARAMS_BACKEND_HOSTNAME0
    value: "mypostgres"
    - name: PGPOOL_PARAMS_BACKEND_HOSTNAME1
    value: "mypostgres-replica"
    - name: PGPOOL_PARAMS_BACKEND_FLAG0
    value: "ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER"
    - name: PGPOOL_PARAMS_BACKEND_FLAG1
    value: "DISALLOW_TO_FAILOVER"

    将在 pgpool.conf 中转换为以下配置参数。

    backend_hostname0 = 'mypostgres'
    backend_hostname1 = 'mypostgres-replica'
    backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
    backend_flag1 = 'DISALLOW_TO_FAILOVER'

    然后,您需要定义包含 PostgreSQL 用户的用户名和密码的环境变量,用于客户端身份验证。

    配置清单后,运行以下命令部署 Pgpool-II。

    kubectl apply -f pgpool-deploy-minimal.yaml

    使用 ConfigMap 配置 Pgpool-II

    或者,您可以使用 Kubernetes ConfigMap 来存储整个 pgpool.conf 和 pool_hba.conf。ConfigMap 可以作为卷挂载到 Pgpool-II 的容器中。

    您可以从以下存储库下载定义 ConfigMap 和 Deployment 的示例清单文件。

    • pgpool2_on_k8s

    https://github.com/pgpool/pgpool2_on_k8s

    curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-configmap.yaml
    curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy.yaml

    定义 ConfigMap 的清单采用以下格式。您可以根据您的配置偏好对其进行更新。要使用 pool_hba.conf 进行客户端身份验证,您需要打开 enable_pool_hba。默认为关闭。

    • enable_pool_hba

    http://www.zzvips.com/uploads/allimg/lbr4ozn14lh.html class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">apiVersion: v1
    kind: ConfigMap
    metadata:
    name: pgpool-config
    labels:
    name: pgpool-config
    data:
    pgpool.conf: |-
    listen_addresses = '*'
    port = 9999
    socket_dir = '/var/run/pgpool'
    pcp_listen_addresses = '*'
    pcp_port = 9898
    pcp_socket_dir = '/var/run/pgpool'
    backend_hostname0 = 'postgres'
    ...
    pool_hba.conf: |-
    local all all trust
    host all all 127.0.0.1/32 trust
    host all all ::1/128 trust
    hostssl all all 0.0.0.0/0

    然后,您需要定义包含 PostgreSQL 用户的用户名和密码的环境变量,用于客户端身份验证。

    运行以下命令创建 ConfigMap 并部署引用此 ConfigMap 的 Pgpool-II pod。

    kubectl apply -f pgpool-configmap.yaml
    kubectl apply -f pgpool-deploy.yaml

    部署 Pgpool-II 后,您可以使用 kubectl get pod 和 kubectl get svc 命令查看 Pgpool-II pod 和服务。

    Pgpool-II 配置

    后端设置

    在 Kubernetes 上,您只需要指定两个后端节点。指定主服务名称为 backend_hostname0,副本服务名称为 ackend_hostname1。

    backend_hostname0 = '<primary service name>'
    backend_hostname1 = '<replica service name>'
    backend_port0 = '5432'
    backend_port1 = '5432'

    自动故障转移

    Pgpool-II 能够定期连接到已配置的 PostgreSQL 后端并检查 PostgreSQL 的状态。如果检测到错误,Pgpool-II 将触发故障转移。在 Kubernetes 上,Kubernetes 会监控 PostgreSQL 的 Pod,如果一个 Pod 宕机,Kubernetes 会重启一个新的 Pod。您需要禁用 Pgpool-II 的自动故障转移,因为 Kubernetes 不需要 Pgpool-II 的自动故障转移。

    将 PostgreSQL node 0 指定为主节点 (ALWAYS_PRIMARY),因为即使主节点或副本 pod 扩展、重新启动或发生故障转移,服务名称也不会更改。

    backend_flag0 ='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
    backend_flag1 ='DISALLOW_TO_FAILOVER'
    failover_on_backend_error = off

    将密码注册到 pool_passwd

    Pgpool-II 使用包含 PostgreSQL 用户密码的 pool_passwd 文件执行身份验证。

    • pool_passwd

    http://www.zzvips.com/uploads/allimg/gf14n2utwdt.html data-id="pd157317-24Eejg1q">在 Pgpool-II pod 启动时,Pgpool-II 自动执行 pg_md5 命令,根据 _USERNAME 和 _PASSWORD 格式定义的环境变量生成 pool_passwd。

    • pg_md5

    https://www.pgpool.net/docs/42/en/html/pg-md5.html

    代表 PostgreSQL 用户的用户名和密码的环境变量必须按以下格式定义:

    username: <some string>_USERNAME
    password: <some string>_PASSWORD

    使用 Secret 定义环境变量是保证用户凭据安全的推荐方法。在大多数 PostgreSQL Operators 中,创建 PostgreSQL 集群时会自动创建几个定义 PostgreSQL 用户凭据的 Secret。使用 kubectl get secret 命令检查现有的 Secret。

    例如,创建 mypostgres-postgres-secret 来存储 postgres 用户的用户名和密码。要引用这个 secret,您可以定义如下环境变量:

    env:
    - name: POSTGRES_USERNAME
    valueFrom:
    secretKeyRef:
    name: mypostgres-postgres-secret
    key: username
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    name: mypostgres-postgres-secret
    key: password

    启动 Pgpool-II pod 时,会在 /opt/pgpool-II/etc 下自动生成 pool_passwd 和 pcp.conf。

    $ kubectl exec <pgpool pod> -it -- cat /opt/pgpool-II/etc/pool_passwd
    postgres:md53175bce1d3201d16594cebf9d7eb3f9d

    $ kubectl exec <pgpool pod> -it -- cat /opt/pgpool-II/etc/pcp.conf
    postgres:e8a48653851e28c69d0506508fb27fc5

    流复制检查

    Pgpool-II 能够定期连接到已配置的 PostgreSQL 后端并检查复制延迟。要使用此功能,需要 sr_check_user 和 sr_check_password。如果 sr_check_password 留空,Pgpool-II 将尝试从 pool_passwd 获取 sr_check_user 的密码。

    • sr_check_user

    http://www.zzvips.com/uploads/allimg/omb1s4zj0ve.html data-id="ucd67dc5-gcxKv6M7">

  • sr_check_password
  • http://www.zzvips.com/uploads/allimg/otddeh0jpmo.html data-id="pd157317-6fTXBS3B">下面是一个使用 postgres 用户每隔 10 秒连接到 PostgreSQL 以执行流式复制检查的示例。因为 sr_check_password 留空,所以 Pgpool-II 会从 pool_passwd 中获取 postgres 用户的密码。

    sr_check_period = 10
    sr_check_user='postgres'

    创建 secret 存储 sr_check_user 中指定的 PostgreSQL 用户的用户名和密码,并配置环境变量以引用创建的 Secret。在大多数 PostgreSQL Operators 中,创建 PostgreSQL 集群时会自动创建几个定义 PostgreSQL 用户凭据的 secret。使用 kubectl get secret 命令检查现有的 secret。

    例如,下面的环境变量引用了 Secret mypostgres-postgres-secret。

    env:
    - name: POSTGRES_USERNAME
    valueFrom:
    secretKeyRef:
    name: mypostgres-postgres-secret
    key: username
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    name: mypostgres-postgres-secret
    key: password

    但是,在 Kubernetes 上,Pgpool-II 连接到任何副本,而不是连接到所有副本。即使有多个副本,Pgpool-II 也将它们作为一个副本进行管理。因此,Pgpool-II 可能无法正确确定复制延迟。要禁用此功能,请配置以下参数:

    sr_check_period = 0

    SSL 设置

    打开 ssl 以启用 SSL 连接。

    ssl = on

    当 ssl = on 时,在 Pgpool-II 启动时,会在 /opt/pgpool-II/certs/ 下自动生成私钥文件和证书文件。 ssl_key 和 ssl_cert 会自动配置私钥文件和证书文件的路径。

    此外,要仅允许 SSL 连接,请将以下记录添加到 pool_hba.conf 中。

    hostssl    all         all         0.0.0.0/0             md5

    带监控的 Pgpool-II

    Pgpool-II Exporter 是 Pgpool-II 指标的 Prometheus 导出器。

    • Pgpool-II Exporter

    https://github.com/pgpool/pgpool2_exporter

    示例清单 pgpool-deploy-metrics.yaml 用于在 Pgpool-II Pod 中部署 Pgpool-II 容器和 Pgpool-II Exporter 容器。

    spec:
    containers:
    - name: pgpool
    image: pgpool/pgpool
    ...
    - name: pgpool-stats
    image: pgpool/pgpool2_exporter
    ...

    下载示例清单 pgpool-deploy-metrics.yaml。

    $ curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-metrics.yaml

    然后,配置 Pgpool-II 和 Pgpool-II Exporter。以下是 Pgpool-II Exporter 容器中用于连接 Pgpool-II 的环境变量的设置。

    env:
    - name: POSTGRES_USERNAME
    valueFrom:
    secretKeyRef:
    name: mypostgres-postgres-secret
    key: username
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    name: mypostgres-postgres-secret
    key: password
    - name: PGPOOL_SERVICE
    value: "localhost"
    - name: PGPOOL_SERVICE_PORT
    value: "9999"

    配置 Pgpool-II 和 Pgpool-II Exporter 后,部署 Pgpool-II Pod。

    kubectl apply -f pgpool-configmap.yaml
    kubectl apply -f pgpool-deploy-metrics.yaml


    延伸 · 阅读

    精彩推荐
    • PostgreSQL分布式 PostgreSQL之Citus 架构

      分布式 PostgreSQL之Citus 架构

      节点 Citus 是一种 PostgreSQL 扩展,它允许数据库服务器(称为节点)在“无共享(shared nothing)”架构中相互协调。这些节点形成一个集群,允许 PostgreSQL 保存比单...

      未知802023-05-07
    • PostgreSQLPostgresql开启远程访问的步骤全纪录

      Postgresql开启远程访问的步骤全纪录

      postgre一般默认为本地连接,不支持远程访问,所以如果要开启远程访问,需要更改安装文件的配置。下面这篇文章主要给大家介绍了关于Postgresql开启远程...

      我勒个去6812020-04-30
    • PostgreSQLpostgresql 中的to_char()常用操作

      postgresql 中的to_char()常用操作

      这篇文章主要介绍了postgresql 中的to_char()常用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

      J符离13432021-04-12
    • PostgreSQLRDS PostgreSQL一键大版本升级技术解密

      RDS PostgreSQL一键大版本升级技术解密

      一、PostgreSQL行业位置 (一)行业位置 在讨论PostgreSQL(下面简称为PG)在整个数据库行业的位置之前,我们先看一下阿里云数据库在全球的数据库行业里的...

      未知1192023-05-07
    • PostgreSQLPostgresql查询效率计算初探

      Postgresql查询效率计算初探

      这篇文章主要给大家介绍了关于Postgresql查询效率计算的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Postgresql具有一定的参考学习价...

      轨迹4622020-05-03
    • PostgreSQLPostgreSQL标准建表语句分享

      PostgreSQL标准建表语句分享

      这篇文章主要介绍了PostgreSQL标准建表语句分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

      码上得天下7962021-02-27
    • PostgreSQL深入理解PostgreSQL的MVCC并发处理方式

      深入理解PostgreSQL的MVCC并发处理方式

      这篇文章主要介绍了深入理解PostgreSQL的MVCC并发处理方式,文中同时介绍了MVCC的缺点,需要的朋友可以参考下 ...

      PostgreSQL教程网3622020-04-25
    • PostgreSQLpostgresql 数据库中的数据转换

      postgresql 数据库中的数据转换

      postgres8.3以后,字段数据之间的默认转换取消了。如果需要进行数据变换的话,在postgresql数据库中,我们可以用"::"来进行字段数据的类型转换。...

      postgresql教程网12482021-10-08