Проект

Общее

Профиль

Pg-upgrade » История » Редакция 4

Редакция 3 (Рамиль Абдулбяров, 2020-04-30 18:58) → Редакция 4/5 (Рамиль Абдулбяров, 2020-04-30 19:02)

h1. Pg-upgrade-centos 

 h1. Обновление минорной версии, сначала на SLAVE, потом на MASTER 

 <pre> 
 yum check-update 

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

 h3. Ошибок также быть не должно. 
 Предварительная работа проделана, далее downtime 
 

 h1. Если всё ОК, Начинаем даунтайм проекта 
 Выставляем заглушку на сайт 
 Останавливаем cron на бекендах 
 Останаливаем PG-9.6 (PG-11 уже остановлен) 

 <pre> 
 /usr/pgsql-9.6/bin/pg_ctl -D /var/lib/pgsql/9.6/data/ -l logfile stop 
 </pre> 

 h3. Запускаем pg_upgrade в боевом режиме, без -c 
 pg_upgrade делался ~1 мин 
 Ставим новый PG-11 в автозапуск и запускаем 

 <pre> 
 vi /etc/postgresql/9.6/main/start.conf 
 auto 
 systemctl enable postgresql-11.service 
 systemctl start postgresql-11.service 
 </pre> 

 h3. Запускаем VACUUM, делался 5 мин 

 <pre> 
 ./analyze_new_cluster.sh 
 </pre> 

 h3. Включаем cron на бекендах 
 Снимаем заглушку с сайта 

 h3. 


 Downtime закончился 
 Выключаем из автозапуска PG-9.6 

 <pre> 
 vi /etc/postgresql/9.6/main/start.conf 
 disabled 
 systemctl disable postgresql-11.service 
 </pre> 

 h3. Удаляем PG-9.6 

 h3. По итогу даунтайм на тестовом длился ~7 мин. 
 *pg_upgrade ~ 1 мин 
 *vacuum 5 мин 
 Учитывая, что на ней 2 тестовые базы: prunto и prunto2 
 Тестовая СУБД 20 Gb 
 Боевая СУБД 36 Gb 
 

 h3. SLAVE рекомендуют обновлять по прошествии нескольких дней, когда точно убедимся, что приложение работает как надо на PG-11