Откат#

Внимание!

Действия, которые будут производиться ниже, нужно выполнять от привилегированного пользователя, имеющего права на sudo.

Перед процессом восстановления версии Pangolin, важно понять на каком этапе в процессе обновления произошла ошибка. В случае возникновения проблем с обновлением продукта, Pangolin изначально попытается откатить изменения, но если сбой произошел после автоматического восстановления, то будет сгенерирован файл в корневой папке пользователя postgres с названием .process_work_statuses. Внутри него будет описана ошибка, например:

  • «В процессе обновления возникла ошибка»;

  • «Восстановление СУБД Pangolin в автоматическом режиме недоступно для этого типа ошибки»;

  • «Восстановление СУБД Pangolin запущено».

Примечание:

Восстанавливать СУБД не нужно, если последней строкой записи является:

  • «Обновление СУБД Pangolin успешно завершено»;

  • «Восстановление СУБД Pangolin успешно завершено».

Описание ключей файла .process_work_statuses при различных ошибках:

{'aggregate': False,
 'components': {'configuration': False,
                'etcd': False,
                'haproxy': False,
                'patroni': False,
                'pg': False,
                'pgbouncer': False},
 'hosts': {'etcd': False, 'master': False, 'replica': False},
 'types': {'pg': {'bootstrap': False,
                  'not_started_db': False,
                  'remove_pgaudit': False,
                  'role_switched': False,
                  'started_db': False}}}
  • Если ошибка произошла при работе механизма обновления, то ключ aggregate должен иметь значение true.

  • В секции components только один ключ должен иметь значение true:

    • Если components.pg равен true, то ошибка произошла в момент обновления самой компоненты PostgreSQL, а обновление компонент etcd, patroni, pgbouncer, haproxy не было начато и восстанавливать необходимо только компоненту PostgreSQL.

    • Если components.etcd равен true, то ошибка произошла в момент обновления компоненты etcd, а обновление компонент patroni, pgbouncer, haproxy не было начато и восстанавливать необходимо только компоненты PostgreSQL и etcd.

    • Если components.patroni равен true, то ошибка произошла в момент обновления компоненты patroni, а обновление компонент pgbouncer, haproxy не было начато и восстанавливать необходимо только компоненты PostgreSQL, etcd и patroni.

    • Если components.pgbouncer равен true, то ошибка произошла в момент обновления компоненты pgbouncer, а обновление компоненты haproxy не было начато и восстанавливать необходимо только компоненты PostgreSQL, etcd, patroni и pgbouncer.

    • Если components.haproxy/components.configuration равен true, то ошибка произошла в момент обновления компоненты haproxy/configuration и восстанавливать необходимо компоненты PostgreSQL, etcd, patroni, pgbouncer и haproxy.

Откат вручную к исходной версии и состоянию кластера#

Внимание!

Данные действия должны быть произведены на всех узлах СУБД, независимо от того, является решение односерверным или кластерным.

В случае, если обновление закончилось неудачей и автоматический откат тоже привел к ошибке, ниже описаны шаги для выполнения ручного отката:

  1. Разблокируйте трафик:

    1. Проверьте, заблокирован ли трафик:

      sudo iptables -L
      
    2. Если есть строки в выводе, выполните:

      sudo iptables -F
      
  2. Проверьте наличие исполняемых и конфигурационных файлов (в случае отсутствия какого-либо файла, дальнейшие шаги невозможны):

    • ll /tmp/PGSE/backups/home/postgres/.bash_profile;

    • ll /tmp/PGSE/backups/postgresql/pgsql-se-04/bin/;

    • ll /tmp/PGSE/backups/postgresql/pgdata/04/data/;

    • Конфигурации без patroni:

      • ll /tmp/PGSE/backups/etc/systemd/system/postgresql.service (конфигурации без patroni);

    • Конфигурации с patroni:

      • ll /tmp/PGSE/backups/etc/systemd/system/patroni.service (конфигурации с patroni);

      • ll /tmp/PGSE/backups/patroni/etc/patroni/postgres.yml (конфигурации с patroni);

      • ll /tmp/PGSE/backups/patroni/patroni_venv/bin/ (конфигурации с patroni);

    • Конфигурации с pgBouncer:

      • ll /tmp/PGSE/backups/etc/systemd/system/pgbouncer.service (конфигурации с pgBouncer);

      • ll /tmp/PGSE/backups/pgbouncer/etc/pgbouncer/userlist.txt (конфигурации с pgBouncer);

      • ll /tmp/PGSE/backups/pgbouncer/etc/pgbouncer/pgbouncer.ini (конфигурации с pgBouncer);

      • ll /tmp/PGSE/backups/etc/logrotate.d/pgbouncer (конфигурации с pgBouncer);

      • ll /tmp/PGSE/backups/pgbouncer/usr/local/bin/pgbouncer (конфигурации с pgBouncer);

      • ll /tmp/PGSE/backups/pgbouncer/usr/local/share/doc/ (конфигурации с pgBouncer);

      • ll /tmp/PGSE/backups/pgbouncer/usr/local/share/man (конфигурации с pgBouncer);

    • Конфигурации с Confd:

      • ll /tmp/PGSE/backups/pgbouncer/etc/confd/templates/pgbouncer.tmpl (конфигурации с Confd);

    • Конфигурации с HAProxy:

      • ll /tmp/PGSE/backups/haproxy/etc/haproxy/haproxy.cfg (конфигурации с HAProxy);

  3. Произведите остановку всех сервисов:

    sudo systemctl stop patroni
    ps -aux | grep patroni
    pg_ctl -D /pgdata/04/data/ stop
    ps -aux | grep postgres
    sudo systemctl stop etcd
    ps -aux | grep etcd
    sudo systemctl stop pgbouncer
    ps -aux | grep pgbouncer
    sudo systemctl stop confd
    ps -aux | grep confd
    sudo systemctl stop haproxy
    ps -aux | grep haproxy
    
  4. Корректно удалите Pangolin, patroni и почистите БД etcd:

    sudo yum remove postgresql-sber-edition
    sudo rm -rf /usr/pgsql-se-04
    
  5. В директории /usr/local/pgsql, в случае ее наличия, удалите все, кроме директории (и ее содержимого) /usr/local/pgsql/postgres_venv;

    • Если что-либо из components.patroni, components.etcd, components.configuration, components.haproxy или components.pgbouncer имеет значение true:

      sudo rm -rf /var/lib/etcd
      
    • Если что-либо из components.patroni, components.configuration, components.haproxy или components.pgbouncer имеет значение true:

      sudo rm -rf /usr/local/pgsql/postgres_venv
      sudo rm -rf /usr/local/pgsql
      sudo rm -rf /usr/patroni/patroni_venv
      
  6. Скопируйте файлы/данные, необходимые для восстановления:

    sudo mkdir /usr/pgsql-se-04
    sudo chown -R postgres:postgres /usr/pgsql-se-04  
    sudo mkdir -p /usr/patroni/patroni_venv
    sudo chown -R postgres:postgres /usr/patroni
    cp -rf /tmp/PGSE/backups/postgresql/pgsql-se-04/* /usr/pgsql-se-04
    cp -rf /tmp/PGSE/backups/patroni/patroni_venv/* /usr/patroni/patroni_venv/
    cp -r /tmp/PGSE/backups/postgresql/pgdata/04/data/* /pgdata/04/data/
    cp /tmp/PGSE/backups/home/postgres/.bash_profile /home/postgres
    source /home/postgres/.bash_profile
    cp /tmp/PGSE/backups/patroni/etc/patroni/postgres.yml /etc/patroni/ #конфигурации с patroni
    sudo cp /tmp/PGSE/backups/etc/systemd/system/patroni.service /etc/systemd/system/ #конфигурации с patroni
    sudo cp /tmp/PGSE/backups/etc/systemd/system/postgresql.service /etc/systemd/system/ #конфигурации без patroni
    
    • Если что-либо из components.patroni, components.etcd, components.configuration, components.haproxy или components.pgbouncer имеет значение true:

      sudo cp -rf /tmp/PGSE/backups/etcd/db_backup/etcd/ /var/lib/
      sudo chown -R etcd:etcd /var/lib/etcd
      
    • Если что-либо из components.patroni, components.configuration, components.haproxy или components.pgbouncer имеет значение true:

      • для версий от 4.3.0:

        sudo mkdir -p /usr/patroni/patroni_venv
        sudo chown -R postgres:postgres /usr/patroni
        cp -rf /tmp/PGSE/backups/patroni/patroni_venv/* /usr/patroni/patroni_venv/
        
    • Если что-либо из components.configuration, components.haproxy или components.pgbouncer имеет значение true:

      • Конфигурации с pgBouncer:

        sudo mkdir /etc/pgbouncer
        sudo cp /tmp/PGSE/backups/etc/systemd/system/pgbouncer.service /etc/systemd/system/
        sudo cp -r /tmp/PGSE/backups/pgbouncer/etc/pgbouncer/ /etc
        sudo cp /tmp/PGSE/backups/etc/logrotate.d/pgbouncer /etc/logrotate.d/pgbouncer
        sudo cp -r /tmp/PGSE/backups/pgbouncer/usr/local/bin/ /usr/local/
        sudo cp -r /tmp/PGSE/backups/pgbouncer/usr/local/share/ /usr/local/
        
      • Конфигурации с Confd:

        cp /tmp/PGSE/backups/pgbouncer/etc/confd/templates/pgbouncer.tmpl /etc/confd/templates/pgbouncer.tmpl
        sudo chown -R postgres:postgres /etc/pgbouncer
        
    • Если что-либо из components.configuration или components.haproxy имеет значение true:

      • Конфигурации с HAProxy:

        cp /tmp/PGSE/backups/haproxy/etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
        
  7. Выполните команду:

    sudo systemctl daemon-reload
    
  8. Запустите кластер:

    1. Выполните команду:

      sudo systemctl start etcd
      
    2. Проверьте запуск etcd:

      ps -aux | grep etcd
      
    3. Выполните команду на active, дождитесь когда поднимется БД, а затем выполните ее же на standby:

      sudo systemctl start patroni
      
    4. Проверьте запуск patroni:

      ps -aux | grep patroni
      
    5. Проверьте, что patroni не в паузе и БД запустилась. Иначе:

      pg_ctl -D /pgdata/04/data/ star
      curl -X PATCH -u patroniyml:<password> http://localhost:8008/config -d '{"pause":false}'
      
    6. Проверьте запуск Pangolin:

      ps -aux | grep postgres
      
    7. Выполните команду:

      sudo systemctl start pgbouncer
      
    8. Проверьте запуск pgBouncer:

      ps -aux | grep pgbouncer
      
    9. Выполните команду:

      sudo systemctl start haproxy
      
    10. Проверьте запуск HAProxy:

      ps -aux | grep haproxy
      
  9. Проверьте работоспособность БД (обязательно перезайдите под postgres):

    sudo su - postgres
    psql
    select version();
    \du
    \q
    

    Для patroni:

    list
    
  10. Проверьте подключения к БД, например, по LDAP.