Балансировка PostgreSQL - Avanpost FAM/MFA+

Общие сведения

В данной инструкции описывается установка pgbouncer и схема разворачивания в отказоустойчивом варианте. При выходе из строя одного из сервера с pgbouncer, другой сервер будет принимать его ip адрес и конфигурационный файл

Настройка балансировки PostgreSQL

  1. Устанавливаем pcs pacemaker corosync на всех серверах

    yum install pcs pacemaker corosync
  2. Задаем пароль для пользователя hacluster на обоих серверах

     passwd hacluster
  3. Запускаем и добавляем в автозагрузку службу pcsd на обоих серверах

    systemctl enable --now pcsd
  4. Проверяем состояние серверов и производим предварительную регистрацию на сервере №1

    sudo pcs cluster auth c7node1 c7node2
  5. Создаем кластер на сервере №1

    sudo pcs cluster setup --name mycluster  c7node1 c7node2 --force
  6. Запускаем кластер на сервере 1

    sudo pcs cluster start
  7. Устанавливаем pgbouncer на обоих серверах

    yum install pgbouncer
  8. Задаем дополнительные параметры

    sudo pcs property set stonith-enabled=false
    sudo pcs property set no-quorum-policy=ignore
  9. Делаем кластер доступным

    sudo  pcs cluster enable --all
  10. Добавляем службы в автозагрузку

    sudo systemctl enable pcsd && sudo systemctl enable  corosync && sudo systemctl enable pacemaker
    sudo systemctl start pcsd && sudo systemctl start corosync && sudo systemctl start pacemaker
    
    
  11. Добавить\изменить настройка в файле /etc/pgbouncer/pgbouncer.ini на Node1 и Node2

    listen_addr = *
    listen_port = 6432
    auth_type = trust
    auth_file = /etc/pgbouncer/userlist.txt
    #idp2 - пользователь для созданной вручную БД idp2 ( например для приложения FAM)
    admin_users = postgres, repmgr, idp2
    stats_users = stats, postgres, repmgr, idp2
    pool_mode = session
    max_client_conn = 5000
    %include /etc/pgbouncer/pgbouncer.database.ini
  12. Создаем файл nano /etc/pgbouncer/pgbouncer.database.ini на Node1 и Node2

    [databases]
    #БД приложения, хост текущей мастер ноды
    idp2= host=i-independent-node1-mashkov
  13. Создаем файл nano /etc/pgbouncer/userlist.txt , заполняем пользователями БД

    "idp" "idp"
    "postgres" "postgres"
  14. Создаем директорию scripts

    mkdir /opt/scripts
  15. Создаем скрипт для автоматической подстановки нового конфига с настройками подключения к БД и делаем владельца пользователя postgres
     nano /opt/scripts/pgbouncer_promote.sh

    #!/usr/bin/env bash
    set -e
    set -u
    function try()
    {
        [[ $- = *e* ]]; SAVED_OPT_E=$?
        set +e
    }
    
    function throw()
    {
        exit $1
    }
    
    function catch()
    {
        export ex_code=$?
        (( $SAVED_OPT_E )) && set +e
        return $ex_code
    }
    
    function throwErrors()
    {
        set -e
    }
    
    function ignoreErrors()
    {
        set +e
    }
    ########################################
    
    PGBOUNCER_DATABASE_INI_NEW="/tmp/pgbouncer.database.ini"
    #ip-адрес или dns-имя серверов в кластере Postgres
    PGBOUNCER_HOSTS="10.10.180.56 10.10.180.59"
    #БД приложения
    DATABASES="idp2"
    
    # Pause pgbouncer
    for h in ${PGBOUNCER_HOSTS}
    do
      for d in ${DATABASES}
      do
          try
    	  (psql -U postgres -h ${h} -p 6432 pgbouncer -tc "pause ${d}")
      done
    done
    
    # Promote server
    /usr/pgsql-12/bin/repmgr -f /opt/repmgr/repmgr.conf standby promote
    
    # Generate new config file for pgbouncer
    echo -e "[databases]\n" > ${PGBOUNCER_DATABASE_INI_NEW}
    for d in ${DATABASES}
    do
      echo -e "${d}= host=$(hostname -f)\n" >> ${PGBOUNCER_DATABASE_INI_NEW}
    done
    
    # Copy new config file, reload and resume pgbouncer
    for h in ${PGBOUNCER_HOSTS}
    do
      for d in ${DATABASES}
      do
          try
    	  (rsync -a ${PGBOUNCER_DATABASE_INI_NEW} ${h}:/etc/pgbouncer/pgbouncer.database.ini)
          try
    	  (psql -U postgres -h ${h} -p 6432 pgbouncer -tc "reload")
          try
    	  (psql -U postgres -h ${h} -p 6432 pgbouncer -tc "resume ${d}")
      done
    done
    
    rm ${PGBOUNCER_DATABASE_INI_NEW}
    
    

Обсуждение