Продолжение инструкции Балансировка Postgres .

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

  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}