拆分配置

如何将单一Pigsty配置清单文件拆分为多个小配置文件。

Pigsty采用遵循Ansible规则的配置文件,默认使用单个YAML文件 pigsty.yml进行配置。

用户可以使用任何符合Ansible规则的配置管理方式。详情请参考:拆分单一配置文件。

建议在调整配置组织方式前,首先熟悉Ansible的Inventory组织模式。

定制方式

一种典型的配置拆分方式是,按照数据库集群进行拆分。即,每一个数据库集群的定义有一个单独的配置清单。

这样做的好处是如果发生误操作,影响范围会局限在这个集群中。

试想一下如果有用户绕过重重阻挠执行数据库清除操作,本想清理一个集群,结果把整个生产环境的所有数据库都抹掉了,这肯定令人无法接受。

在这种要求下,我们会将全局变量与集群定义相剥离。

  • group_vars/all.yml 包含所有全局变量部分
  • pgsql/<cluster>.yml包含<cluster>数据库集群的定义

那么使用时,您必须通过-i pgsql/<cluster>.yml 显式指明需要操作的集群。而不再是使用-l <cluster>筛选目标集群。

处理方式

以Pigsty沙箱配置文件为例:

pigsty
 |
 ^- group_vars               # group variables definition
 |     ^------ all.yml       # global variablies
 |
 ^- pgsql
       ^------ meta.yml      # meta node definition
       ^------ pg-meta.yml   # pg-meta database cluster definition
       ^------ pg-test.yml   # pg-test database cluster definition
       ^------ <cluster>.yml # <cluster> database cluster definition

全局变量

group_vars/all.yml 包含了原pigsty.ymlall.vars中对应的内容,形如:

#!/usr/bin/env ansible-playbook
---
#==============================================================#
# File        :   group_vars/all.yml
# Ctime       :   2020-11-24
# Mtime       :   2021-02-22
# Desc        :   PostgreSQL Inventory Global Vars
# Path        :   group_vars/all.yml
# Maintainer  :   Ruohang Feng
# Copyright (C) 2019-2021 Ruohang Feng
#==============================================================#


#-----------------------------
# CONNECTION PARAMETERS
#-----------------------------
# ansible_user: admin               # admin user with ssh access and sudo privilege

# proxy_env: {}
proxy_env: # global proxy env when downloadinidg packages
  no_proxy: "localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.pigsty,*.aliyun.com"

#-----------------------------
# REPO PROVISION
#-----------------------------
# this section defines how to build a local repo
repo_enabled: true                            # build local yum repo on meta nodes?
repo_name: pgsql-el7                          # local repo name
...

注意这里所有的全局变量都是顶层键值

集群定义

每一个集群都使用独立的清单文件定义。

即,原本pigsty.ymlall.children中的每一个配置项(集群定义),都被单独拆分为位于pgsql/<cluster_name>.yml中的一个文件。文件的内容都是all.children.<cluster>对应的配置项,但需要保留顶层的all.children结构。

例如,pg-test集群的分立定义文件如下所示:

all:
  children:
    pg-test:
      # - cluster members - #
      hosts:
        10.10.10.11: {pg_seq: 1, pg_role: primary, ansible_host: node-1}
        10.10.10.12: {pg_seq: 2, pg_role: replica, ansible_host: node-2}
        10.10.10.13: {pg_seq: 3, pg_role: replica, ansible_host: node-3, pg_offline_query: true}

      # - cluster configs - #
      vars:
        # basic settings
        pg_cluster: pg-test                 # define actual cluster name
        pg_version: 13                      # define installed pgsql version
        node_tune: tiny                     # tune node into oltp|olap|crit|tiny mode
        pg_conf: tiny.yml                   # tune pgsql into oltp/olap/crit/tiny mode

        # business users, adjust on your own needs
        pg_users:
          - name: test                      # example production user have read-write access
            password: test                  # example user's password
            roles: [dbrole_readwrite]       # dborole_admin|dbrole_readwrite|dbrole_readonly|dbrole_offline
            pgbouncer: true                 # production user that access via pgbouncer
            comment: default test user for production usage

        pg_databases:                       # create a business database 'test'
          - name: test                      # use the simplest form

        pg_default_database: test           # default database will be used as primary monitor target

        # proxy settings
        vip_enabled: true                   # enable/disable vip (require members in same LAN)
        vip_address: 10.10.10.3             # virtual ip address
        vip_cidrmask: 8                     # cidr network mask length
        vip_interface: eth1                 # interface to add virtual ip

编辑与使用

进行拆分后,执行剧本时需要显式指定需要操作的集群。如:

./pgsql -i pgsql/pg-test.yml 

Caveat

一些基于完整全量Inventory的功能,目前仍然需要完整的全量Inventory,例如,生成所有Haproxy实例的导航界面。

如果用户使用拆分式配置文件,生成的页面只包含该集群内的实例成员。这一问题将在后续版本中解决

最后修改 2021-03-01: update doc (2acec6d)