Откат#

Внимание!

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

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

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

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

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

Примечание:

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

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

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

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

{'aggregate': False,
 'components': {'configuration': False,
                'etcd': 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, Pangolin Manager, Pangolin Pooler, не было начато и восстанавливать необходимо только компоненту PostgreSQL.

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

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

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

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

Внимание!

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

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

  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/;

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

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

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

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

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

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

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/etc/systemd/system/pangolin-pooler.service (конфигурации с Pangolin Pooler);

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/etc/pangolin-pooler/userlist.txt (конфигурации с Pangolin Pooler);

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/etc/pangolin-pooler/pangolin-pooler.ini (конфигурации с Pangolin Pooler);

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/etc/logrotate.d/pgbouncer (конфигурации с Pangolin Pooler);

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/pgbouncer/usr/local/bin/pgbouncer (конфигурации с Pangolin Pooler);

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/pgbouncer/usr/local/share/doc/ (конфигурации с Pangolin Pooler);

      • ll /pgarclogs/backups/Pangolin_update/{{ ansible_date_time.date }}-T{{ ansible_date_time.hour }}{{ ansible_date_time.minute }}/pgbouncer/usr/local/share/man (конфигурации с Pangolin Pooler);

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

    sudo systemctl stop pangolin-manager
    ps -aux | grep pangolin-manager
    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
    
  4. Корректно удалите Pangolin, Pangolin Manager и очистите БД etcd:

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

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

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

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

    sudo mkdir /usr/pgsql-se-04
    sudo chown -R postgres:postgres /usr/pgsql-se-04
    cp -rf /tmp/PGSE/backups/postgresql/pgsql-se-04/* /usr/pgsql-se-04
    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/pangolin-manager/postgres.yml /etc/pangolin-manager/ #конфигурации с Pangolin Manager
    sudo cp /tmp/PGSE/backups/etc/systemd/system/pangolin-manager.service /etc/systemd/system/ #конфигурации с Pangolin Manager
    sudo cp /tmp/PGSE/backups/etc/systemd/system/postgresql.service /etc/systemd/system/ #конфигурации без Pangolin Manager
    
    • Если что-либо из components.patroni, components.etcd, components.configuration или 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.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.pgbouncer имеет значение true:

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

        sudo mkdir /etc/Pangolin Pooler
        sudo cp /pgarclogs/backups/etc/systemd/system/pangolin-pooler.service /etc/systemd/system/
        sudo cp -r /pgarclogs/backups/pangolin-pooler/etc/pangolin-pooler/ /etc
        sudo cp /pgarclogs/backups/etc/logrotate.d/pangolin-pooler /etc/logrotate.d/pangolin-pooler
        sudo cp -r /pgarclogs/backups/pangolin-pooler/usr/local/bin/ /usr/local/
        sudo cp -r /pgarclogs/backups/pangolin-pooler/usr/local/share/ /usr/local/
        
  7. Выполните команду:

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

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

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

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

      sudo systemctl start pangolin-manager
      
    4. Проверьте запуск Pangolin Manager:

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

      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 pangolin-pooler
      
    8. Проверьте запуск Pangolin Pooler:

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

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

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

    Для Pangolin Manager:

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