让我们使用Ansible来构建PostgreSQL集群配置

以下是针对PostgreSQL的不同集群配置的多种选择。每次构建都很繁琐,所以我个人使用Ansible进行自动化。因为我已经编写了这些Playbooks,所以决定在GitHub上公开它们。在本文中,我将介绍这些名为”Ansible Playbooks for PostgreSQL Clusters”的Playbooks。

Ansible Playbooks for PostgreSQL Clusters 是指用于 PostgreSQL 集群的 Ansible Playbooks。

Ansible Playbooks for PostgreSQL Clusters 是用于构建不同的 PostgreSQL 集群配置的 Ansible Playbooks。此项目遵循 BSD 许可证,代码托管在 GitHub 上。

Ansible Playbooks 用于管理 PostgreSQL 集群
https://github.com/tom-sato/ansible-postgresql-cluster

截至2021年2月,Playbook支持以下集群配置。

    • ストリーミングレプリケーション

 

    • Pgpool-II

Pacemaker + DRBD

Pacemaker + ストリーミングレプリケーション
PostgreSQL Automated Failover (PAF)
repmgr (Replication Manager for PostgreSQL clusters)

今后,我们希望扩大支持的集群配置,如逻辑复制和Patroni等。

所需软件

要使用Ansible Playbooks for PostgreSQL Clusters,需要以下软件才可以。

    • VirtualBox 6.0.x

 

    • Vagrant 2.2.x

 

    • Vagrant ボックス centos/8 または centos/7

Ansible 2.9.x

只要软件的版本比上述的版本更新,应该就没有问题。如果Vagrant Box也是RedHat/CentOS系列的话,其他的Box也应该没问题。但是,除了上面提到的版本,我没有验证其他版本的运行情况,所以可能会存在一些问题。

使用方法

以下是使用Ansible Playbooks部署PostgreSQL集群的方法。

    1. 克隆存储库。

$ git clone https://github.com/tom-sato/ansible-postgresql-cluster.git
正在克隆到 ‘ansible-postgresql-cluster’…
远程:枚举对象:145,完成。
远程:计数对象:100%(145/145),完成。
远程:压缩对象:100%(79/79),完成。
远程:共发送145个对象(已更改44个),重用了135个对象(已更改34个),packing 0
正在接收对象:100%(145/145),29.67 KiB | 5.93 MiB/s, 完成。
正在解决差异:100%(44/44),完成。

切换到存储库目录。

$ cd ansible-postgresql-cluster

启动虚拟机并进行配置。

$ PLAYBOOK=pgpool2 vagrant up –provosion
正在使用’virtualbox’提供程序启动’master’虚拟机…
正在使用’virtualbox’提供程序启动’slave’虚拟机…
省略…
PLAY RECAP *********************************************************************
master : ok=64 changed=47 unreachable=0 failed=0 skipped=28 rescued=0 ignored=0
slave : ok=61 changed=44 unreachable=0 failed=0 skipped=31 rescued=0 ignored=0

PLAYBOOK=pgpool2使用环境变量指定了配置文件。使用此配置文件,将在由3个节点组成的CentOS 8中构建使用Pgpool-II的集群结构。请参考“如何自定义”以了解可以指定的环境变量。

连接到虚拟机并进行操作确认。

$ PLAYBOOK=pgpool2 vagrant ssh master

主机名将为master,slave-1,…等。

如果使用Pgpool-II进行集群配置,例如,可以切换到postgres用户并查看Pgpool-II管理的节点列表,

$ sudo su – postgres
$ psql -h vip-1 -p 9999 -c “SHOW pool_nodes”
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
———+———-+——+——–+———–+———+————+——————-+——————-+——————-+————————+———————
0 | master | 5432 | up | 0.333333 | primary | 0 | false | 0 | | | 2021-02-10 10:52:45
1 | slave-1 | 5432 | up | 0.333333 | standby | 0 | false | 0 | streaming | async | 2021-02-10 10:52:45
2 | slave-2 | 5432 | up | 0.333333 | standby | 0 | true | 0 | streaming | async | 2021-02-10 10:52:45
(3 行)

可以停止主节点,等待一段时间,然后观察发生的故障转移。

$ /usr/pgsql-13/bin/pg_ctl stop -m i
正在等待服务器停止处理… 完成
服务器已停止
(等待片刻)
$ psql -h vip-1 -p 9999 -c “show pool_nodes”
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
———+———-+——+——–+———–+———+————+——————-+——————-+——————-+————————+———————
0 | master | 5432 | down | 0.333333 | standby | 0 | false | 0 | | | 2021-02-10 11:00:34
1 | slave-1 | 5432 | up | 0.333333 | primary | 0 | true | 0 | | | 2021-02-10 11:00:34
2 | slave-2 | 5432 | up | 0.333333 | standby | 0 | false | 0 | | | 2021-02-10 11:00:36
(3 行)

如何定制

不需要直接编辑Vagrantfile文件,可以通过环境变量来指定Playbook等。可指定的环境变量如下所示。

PLAYBOOK – プレイブックを指定します。デフォルトは postgresql です。

NUM_NODES – ノード数を指定します。デフォルトは 3 ノードで、DRBD のみ 2 ノードです。

BOX – ボックスを指定します。デフォルトは centos/8 です。

PROXY – 仮想マシンに設定するプロキシを指定します。デフォルトは空文字列です。事前に vagrant-proxyconf プラグインのインストールが必要です。

如果要在CentOS 7上构建一个由两个节点组成的流复制集群配置,您可以按照以下方式指定环境变量。

$ NUM_NODES=2 BOX=centos/7 vagrant up

如果已经进行了配置,则可能无法成功进行构建。在这种情况下,建议先运行 “vagrant destroy -f” 命令来销毁虚拟机,然后再试一次。

可以指定的 Playbook 是从存储库的顶级目录中的 *.yml 文件中去除扩展名的内容。

postgresql – ストリーミングレプリケーションによるクラスタ構成を構築します。

pgpool2 – Pgpool-II によるクラスタ構成を構築します。クラスタリングモードはストリーミングレプリケーション、ネイティブレプリケーション、スナップショットアイソレーション (Pgpool-II 4.2 以降)、raw に対応しています。

pacemaker-drbd – Pacemaker + DRBD によるクラスタ構成を構築します。

pacemaker-replication – Pacemaker + ストリーミングレプリケーションによるクラスタ構成を構築します。PostgreSQL 12 以降には対応していません。

pacemaker-paf PAF によるクラスタ構成を構築します。CentOS 8 には対応していません。

repmgr – repmgr によるクラスタ構成を構築します。実験的です。

可以使用角色变量来指定PostgreSQL的版本、数据目录和其他软件设置。所有可指定的角色变量都在README.md中说明。虽然我不知道怎样指定最好,但你可以先将其写在playbook内的vars:中。

如果你想在Pgpool-II的集群配置中指定Pgpool-II的版本为4.1,集群模式为本地复制,PostgreSQL的版本为12,那么你需要在pgpool2.yml文件的vars:部分指定角色变量。从postgresql_extra_config_parameters开始,这些都是需要在playbook中覆盖的角色变量。

---
- hosts: all
  become: yes
  vars:
    pgpool2_version: 4.1
    pgpool2_backend_clustering_mode: native_replication
    postgresql_version: 12
    postgresql_extra_config_parameters: |
      {% if pgpool2_backend_clustering_mode == 'snapshot_isolation' %}
      default_transaction_isolation = 'repeatable read'
      {% endif %}
      restart_after_crash = off
    postgresql_control_as_service: no
    postgresql_setup_stage: "{{ (pgpool2_backend_clustering_mode == 'streaming_replication') | ternary('write_recovery_conf', 'basebackup') }}"
  roles:
    - common
    - hosts
    - locale
    - postgresql
    - pgpool2
广告
将在 10 秒后关闭
bannerAds