Pg-upgrade » История » Редакция 3
Редакция 2 (Рамиль Абдулбяров, 2020-04-30 18:25) → Редакция 3/5 (Рамиль Абдулбяров, 2020-04-30 18:58)
h1. Pg-upgrade-centos h1. Обновление минорной версии, сначала на SLAVE, потом на MASTER <pre> yum check-update 1 2 3 4 postgres=# checkpoint ; CHECKPOINT postgres=# checkpoint ; CHECKPOINT yum upgrade postgresql96-server postgresql96 </pre> h1. Обновление мажорной версии. Делаем на MASTER SLAVE будет резервом, его рекомендуют обновлять через несколько дней h3. Отключаем автостарт postgres (в centos этого нет) <pre> vi /etc/postgresql/9.6/main/start.conf disabled </pre> h3. Подключаем репозиторий для pg-11 <pre> yum -y install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat11-11-2.noarch.rpm </pre> h3. Устанавливаем PG-11 <pre> yum check-update yum install postgresql11-server postgresql11 Инициализируем новый кластер (На боевом кодировка другая) </pre> <pre> /usr/pgsql-11/bin/initdb -D /var/lib/pgsql/11/data/ --encoding=SQL_ASCII --lc-collate=C --lc-ctype=C </pre> h3. Мёрджим конфиги postgresql.conf и pg_hba.conf (готовые скопировать надо куда-то, т.к. будем чистить хранилище кластера) <pre> diff -u /var/lib/pgsql/9.6/data/postgresql.conf /var/lib/pgsql/11/data/postgresql.conf diff -u /var/lib/pgsql/9.6/data/pg_hba.conf /var/lib/pgsql/11/data/pg_hba.conf </pre> h3. Меняем PORT у PG-11 <pre> /var/lib/pgsql/11/data/postgresql.conf 1 2 - port = 5432 + port = 5433 </pre> h3. Запуск кластера PG-11 /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ -l logfile start h3. Проверяем, что схемы PG-9.6 и PG-11 совместимы <pre> /usr/pgsql-9.6/bin/pg_dumpall -s -f pg_dumpall.dump /usr/pgsql-11/bin/psql -p 5433 -f pg_dumpall.dump > restore-scheme.log </pre> h3. Убеждаемся что ошибок нет после восстановления h3. Останавливаем PG-11, чистим кластер и заново инициализируем <pre> /usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data/ -l postgres-11.log stop rm -rf /var/lib/pgsql/11/data/ </pre> h3. Запускаем тестовый pg_upgrade <pre> 1 2 3 4 5 6 7 8 9 10 11 12 13 /usr/pgsql-11/bin/pg_upgrade \ -b /usr/pgsql-9.6/bin \ -B /usr/pgsql-11/bin \ -d /var/lib/pgsql/9.6/data \ -D /var/lib/pgsql/11/data/ \ -j 4 -k \ -o '-c shared_buffers=10MB' \ -O '-c shared_buffers=10MB' \ -o '-c config_file=/var/lib/pgsql/9.6/data/postgresql.conf' \ -O '-c config_file=/var/lib/pgsql/11/data/postgresql.conf' \ -o '-c huge_pages=off' \ -O '-c huge_pages=off' \ -c </pre> Ошибок также быть не должно. Предварительная работа проделана, далее downtime Если всё ОК, Начинаем даунтайм проекта Выставляем заглушку на сайт Останавливаем cron на бекендах Останаливаем PG-9.6 (PG-11 уже остановлен) /usr/pgsql-9.6/bin/pg_ctl -D /var/lib/pgsql/9.6/data/ -l logfile stop Запускаем pg_upgrade в боевом режиме, без -c pg_upgrade делался ~1 мин Ставим новый PG-11 в автозапуск и запускаем vi /etc/postgresql/9.6/main/start.conf auto systemctl enable postgresql-11.service systemctl start postgresql-11.service Запускаем VACUUM, делался 5 мин ./analyze_new_cluster.sh Включаем cron на бекендах Снимаем заглушку с сайта Downtime закончился Выключаем из автозапуска PG-9.6 vi /etc/postgresql/9.6/main/start.conf disabled systemctl disable postgresql-11.service Удаляем PG-9.6 По итогу даунтайм на тестовом длился ~7 мин. *pg_upgrade ~ 1 мин *vacuum 5 мин Учитывая, что на ней 2 тестовые базы: prunto и prunto2 Тестовая СУБД 20 Gb Боевая СУБД 36 Gb SLAVE рекомендуют обновлять по прошествии нескольких дней, когда точно убедимся, что приложение работает как надо на PG-11