Advertising:
Upgrade de Zabbix 5.0.3 a 6.0.0 PostgreSQL 12 a 13 y TimescaleDB de 1.7.1 a 2.3.1
Instalación Actual | Upgrade | Requerimientos mínimos |
---|---|---|
OS : CentOS Linux release 7.8.2003 (Core) Zabbix : 5.0.3 PostgreSQL : 12 TimescaleDB : 1.7.1 PHP : 7.3.21 |
OS : Oracle Linux Server release 8.4 Zabbix : 6.0.0 PostgreSQL : 13 TimescaleDB : 2.3.1 PHP : 7.4.6 |
PostgreSQL : 13.X TimescaleDB : 2.0.1 a 2.3 PHP : 7.2.0 a 7.2.5 |
Instalación de PostgreSQL con la misma versión que producción
URL: https://www.postgresql.org/download/linux/redhat/ Select version: 12 Select platform: Red Hat Enterprise, Rocky, CentOS or Oracle version 8 Select architecture: x86_64
Instalar el repositorio
# dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm # dnf repolist
Desactivar Repositorios no necesarios
# dnf config-manager --set-disabled pgdg96 # dnf config-manager --set-disabled pgdg10 # dnf config-manager --set-disabled pgdg11 # dnf config-manager --set-disabled pgdg14
# dnf clean all # dnf repolist repo id repo name ol8_UEKR6 Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (x86_64) ol8_appstream Oracle Linux 8 Application Stream (x86_64) ol8_baseos_latest Oracle Linux 8 BaseOS Latest (x86_64) ol8_developer_EPEL Oracle Linux 8 EPEL (x86_64) pgdg-common PostgreSQL common RPMs for RHEL/CentOS 8 - x86_64 pgdg12 PostgreSQL 12 for RHEL/CentOS 8 - x86_64 pgdg13 PostgreSQL 13 for RHEL/CentOS 8 - x86_64
Instalamos PostgreSQL
# dnf -qy module disable postgresql # dnf install -y postgresql12 postgresql12-server
Crear el ROL de replica y actualizar pg_hba.conf (Todo con usuario postgres)
- Ejecutar en MASTER # su - postgres - Creamos el usuario para la replicacion $ createuser --replication -P -e replica Enter password for new role: (xxxxx) Enter it again: (xxxx) $ exit $ echo "host replication replica [IP_REMOTA]/32 md5" >> $PGDATA/pg_hba.conf - Recargamos el pg_hba.conf sin reiniciar postgres $ psql -U postgres -c "select pg_reload_conf();" pg_reload_conf ---------------- t (1 row)
Instalación de TSDB 1.7.1 misma versión que producción
Nota: Verificar la versión productiva con rpm -qa | grep timescaledb-postgresql, en este caso es timescaledb-postgresql-12-1.7.2-0.el7.x86_64
- Creamos el repositorio e instalamos TSDB 1.7.1 tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL [timescale_timescaledb] name=timescale_timescaledb baseurl=https://packagecloud.io/timescale/timescaledb/el/$(rpm -E %{rhel})/\$basearch repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOL
# dnf clean all # dnf install -y timescaledb-postgresql-12-1.7.1-0.el8 Nota: Verificamos las versiones disponibles con el siguiente comando dnf provides */timescaledb-1.7.1.so
- Verificamos las librerías instaladas # ls -la /usr/pgsql-12/lib/time*
Configurar el Environment y lanzar la replicación
Nota: Toda la operatoria la hacemos en la maquina slave con el usuario postgres
Creamos el environment de Postgres
Creamos el .pgsql_profile de Postgres
# su - postgres $ cat <<EOF >>/var/lib/pgsql/.pgsql_profile alias pg12='. /var/lib/pgsql/entorno_bd.sh 12' alias pg13='. /var/lib/pgsql/entorno_bd.sh 13' export PATH echo " " echo "################################################################" echo "# #" echo "# To load environment variables: #" echo "# #" echo "# pg12 -> . /var/lib/pgsql/entorno_bd.sh 12 #" echo "# pg13 -> . /var/lib/pgsql/entorno_bd.sh 13 #" echo "# #" echo "################################################################" echo " " EOF
Actualizamos el bash_profile de Postgres
$ cat <<EOF >>/var/lib/pgsql/.bash_profile alias l='ls -la' [ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile EOF
Creamos el script que carga los entornos de PostgreSQL
$ tee /var/lib/pgsql/entorno_bd.sh <<EOF ######################## #VARIABLES MODIFICACLES# ######################## export V_DBVERSION=\$1 ############################### #!!VARIABLES NO MODIFICABLES!!# ############################### export V_PGSOFT=/usr/pgsql-\$V_DBVERSION export V_ADMIN_HOME=/var/lib/pgsql export PGDATA=/var/lib/pgsql/\$V_DBVERSION/data export PATH=\$V_PGSOFT/bin:\$PATH export LD_LIBRARY_PATH=\$V_PGSOFT/lib echo "Environment Postgres \$V_DBVERSION cargado!" echo EOF
$ chmod 750 /var/lib/pgsql/entorno_bd.sh $ chown postgres:postgres /var/lib/pgsql/entorno_bd.sh
Lanzamos la replicación
IMPORTANTE: Desactivar en Zabbix la autenticación vía LDAP antes de lanzar la copia y luego volver a activarla.
$ . /var/lib/pgsql/entorno_bd.sh 12 Environment Postgres 12 cargado!
$ pg_basebackup -h 10.151.0.69 -U replica -D $PGDATA -P -v -Xs -c fast -C -S pgstandby2 Password: xxxxx pg_basebackup: initiating base backup, waiting for checkpoint to complete pg_basebackup: checkpoint completed pg_basebackup: write-ahead log start point: B5BB/A6000028 on timeline 1 pg_basebackup: starting background WAL receiver pg_basebackup: created replication slot "pgstandby2" 7220671/181730815 kB (3%), 0/1 tablespace (...sql/12/data/base/16402/165107136) ... 181863935/181863935 kB (100%), 1/1 tablespace pg_basebackup: write-ahead log end point: B5BD/5F2BDCF8 pg_basebackup: waiting for background process to finish streaming ... pg_basebackup: syncing data to disk ... pg_basebackup: base backup completed
Descripción de los parámetros del pg_basebackup
-h [HOST ORIGEN] -U [USUARIO DE REPLICACIOM] -D [PGDATA] -P # mostrar información de progreso -v # Activa el modo Verbose -Xs # incluye los archivos WAL necesarios, en el modo especificado (s=STREAM) -c fast # utilizar checkpoint rápido o extendido -C # crear un slot de replicación -S [SLOTNAME]
TIPs útiles
Eliminar el slot de replicación no utilizado en MASTER
$ psql -U postgres -c "select * FROM pg_replication_slots ;" # Nota: Ejecutar en MASTER. $ psql -U postgres -c "select pg_drop_replication_slot('pgstandby2');" # Nota: Ejecutar en MASTER.
Ver los WAL que faltan aplicar
- Buscamos el Filename del WAL B5BD/5F2BDCF8 $ psql -U postgres -c "SELECT pg_walfile_name('B5BD/5F2BDCF8');" # Nota: Ejecutar en MASTER. pg_walfile_name -------------------------- 000000010000B5BE00000084 (1 row)
- Listar los WALs del SLAVE $ ls -la /var/lib/pgsql/12/data/pg_wal
Actualizar la PSW del ROL de REPLICA
$ alter user replica password 'xxxxxx';
Ver los Slots de replicación activos
$ psql -U postgres -x -c "SELECT * FROM pg_replication_slots;" # Nota: Ejecutar en MASTER. -[ RECORD 2 ]-------+-------------- slot_name | pgstandby2 plugin | slot_type | physical datoid | database | temporary | f active | t active_pid | 14634 xmin | catalog_xmin | restart_lsn | B5BB/CE000000 confirmed_flush_lsn |
$ psql -U postgres -x -c "select * from pg_stat_replication;" # Nota: Ejecutar en MASTER.
Arrancamos la BD y verificamos que TSDB tenga datos
# systemctl start postgresql-12.service Nota: Este proceso tarda unos minutos porque tiene que aplicar los REDOLOGS que se generaron entre que se lanzo el backup y que este finalizo. Mirando el fichero de LOG hay que esperar a que salga el mensaje "LOG: database system is ready to accept connections" - Analizamos el LOG de arranque. $ tail -f $(date +'/var/lib/pgsql/12/data/log/postgresql-%a.log') 2021-10-18 11:46:18.019 CEST [6870] LOG: database system was interrupted; last known up at 2021-10-18 11:42:05 CEST 2021-10-18 11:46:18.382 CEST [6870] LOG: redo starts at B646/D65CC540 Tiempo de espera... 2021-10-18 11:47:42.011 CEST [6870] LOG: consistent recovery state reached at B647/4B6BC940 2021-10-18 11:47:42.011 CEST [6870] LOG: redo done at B647/4B6BC940 Tiempo de espera... 2021-10-18 11:48:23.219 CEST [6868] LOG: database system is ready to accept connections 2021-10-18 11:48:23.236 CEST [6902] LOG: TimescaleDB background worker launcher connected to shared catalogs
# systemctl status postgresql-12.service # psql -U postgres -d zabbix -c "SELECT * FROM timescaledb_information.compressed_chunk_stats;"
Replicamos entorno de Zabbix 5.0.3 en la nueva maquina
Update de PHP de la version 7.2.4 a la 7.4.6
Nota: Zabbix necesita como mínimo 7.2.0 pero esto nos evitara tener que actualizarlo en upgrades posteriores.
# dnf module list php # Nota: Listear los modulos de PHP existentes y su estado
# dnf -y module reset php # Nota: Es recomendado remover todo el contenido instalado de un modulo utilizando el comando reset. Luego del reset podremos habilitar otro nuevo stream. # dnf -y module install php:7.4 # Nota: Instalamos el modulo de PHP 7.4.X # dnf -y install php-* # Nota: Instalamos módulos de PHP adicionales para que Zabbix funcione correctamente.
# dnf changelog php | less
Instalación de ZABBIX con la misma versión que producción
# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm # dnf clean all # dnf -y install zabbix-server-pgsql-5.0.3-1.el8 zabbix-web-pgsql-5.0.3-1.el8 zabbix-nginx-conf-5.0.3-1.el8 zabbix-agent2-5.0.3-1.el8 # Nota: Listar los paquetes del Repo dnf --showduplicates list zabbix-server-pgsql
Reconfiguramos Zabbix Server y arrancamos Zabbix FrontEnd
Hacemos un backup de la configuración del Zabbix Server recién instalado
# cp /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.original
Copiamos el fichero de configuración original del Zabbix Server en la nueva maquina
# scp 10.151.0.69:/etc/zabbix/zabbix_server.conf 10.151.0.128:/etc/zabbix/zabbix_server.conf
El único parámetro a modificar es el DBHost
perl -p -i -e 's/^DBHost=.*/DBHost=10.151.0.128/g' /etc/zabbix/zabbix_server.conf
Reconfiguramos el Zabbix Frontend
perl -p -i -e 's/^#.*listen.*/ listen 80;/g' /etc/nginx/conf.d/zabbix.conf perl -p -i -e 's/^#.*server_name.*/ server_name 10.151.0.128;/g' /etc/nginx/conf.d/zabbix.conf
Reconfiguramos Timezone de PHP
echo php_value[date.timezone] = Europe/Madrid >>/etc/php-fpm.d/zabbix.conf
Reiniciamos los servicios y nos conectamos para reconfigurar el Frontend via GUI
# systemctl restart nginx php-fpm # systemctl status nginx php-fpm
URL SETUP: http://10.151.0.128/setup.php
Actualizar TimescaleDB 1.7.1 a TimescaleDB 2.3.1 con PostgreSQL 12
Instalamos las librerías de TSDB 2
# dnf -y install timescaledb-2-postgresql-12-2.3.1-0.el8 timescaledb-2-loader-postgresql-12-2.3.1-0.el8 # Nota: Buscamos la versión compatible 2.3 para PG12 dnf provides *pg12*/timescaledb-2.3*
Verificamos las librerías instaladas
# ls -la /usr/pgsql-12/lib/time*
Actualizar la extensión de TimescaleDB
# psql -U postgres -X -d zabbix
zabbix=# ALTER EXTENSION timescaledb UPDATE TO "2.3.1"; ALTER EXTENSION
zabbix=# \dx timescaledb List of installed extensions Name | Version | Schema | Description -------------+---------+--------+------------------------------------------------------------------- timescaledb | 2.3.1 | public | Enables scalable inserts and complex queries for time-series data (1 row)
Actualizar PostgreSQL 12 a PostgreSQL 13 con TimescaleDB 2.2 instalada
Instalación del PG13
# dnf -y install postgresql13 postgresql13-server # /usr/pgsql-13/bin/postgresql-13-setup initdb
Instalación de TSDB 2.3.1 para PG13
# dnf -y install timescaledb-2-postgresql-13-2.3.1-0.el8 timescaledb-2-loader-postgresql-13-2.3.1-0.el8
Upgrade de PG12 a PG13 vía pg_upgrade
Generamos copias de seguridad
- Resguardamos los .conf de PG13 Originales # cp /var/lib/pgsql/13/data/postgresql.conf /var/lib/pgsql/13/data/postgresql.conf.original # cp /var/lib/pgsql/13/data/pg_hba.conf /var/lib/pgsql/13/data/pg_hba.conf.original
- Pasamos los de la version 12 a PGDATA de las 13 # cp -p /var/lib/pgsql/12/data/postgresql.conf /var/lib/pgsql/13/data/postgresql.conf # cp -p /var/lib/pgsql/12/data/pg_hba.conf /var/lib/pgsql/13/data/pg_hba.conf
- Cambiamos los puertos de PG13 a 5432 y actualizamos algunos parametros # vi /var/lib/pgsql/13/data/postgresql.conf # port = 5432 # wal_keep_segments = 700 # ESTE PARAMETRO YA NO EXISTE EN PG13 wal_keep_size = 120497 # in megabytes; 0 disables
- Cambiamos los puertos de PG12 a 5433 perl -p -i -e 's/#port = 5432/port = 5433/g' /var/lib/pgsql/12/data/postgresql.conf
Ejecutamos el pg_upgrade
Nota: hay 2 opciones, si es en el mismo FS podemos utilizar la opcion -k que via hardlinks nos evita copiar datos y es casi instantaneo el upgrade. Con la opcion --check realiza la comprobacion pero no ejecuta el upgrade. # systemctl stop postgresql-12 # systemctl stop postgresql-13
- Realiza un chequeo sin actualizar Opción: --check como POSTGRES # su - postgres $ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data -k --check
- Actualiza sobre los mismos datos sin duplicar el espacio, es mas rapido $ /usr/pgsql-13/bin/pg_upgrade -b /usr/pgsql-12/bin -B /usr/pgsql-13/bin -d /var/lib/pgsql/12/data -D /var/lib/pgsql/13/data -k
Reconfiguramos el Environment
- Creamos el .pgsql_profile de Postgres si se elimino cat <<EOF >>/var/lib/pgsql/.pgsql_profile alias pg12='. /var/lib/pgsql/entorno_bd.sh 12' alias pg13='. /var/lib/pgsql/entorno_bd.sh 13' export PATH echo " " echo "################################################################" echo "# #" echo "# To load environment variables: #" echo "# #" echo "# pg12 -> . /var/lib/pgsql/entorno_bd.sh 12 #" echo "# pg13 -> . /var/lib/pgsql/entorno_bd.sh 13 #" echo "# #" echo "################################################################" echo " " EOF
Arrancamos PG13 y Desinstalamos PG12 como ROOT
# systemctl start postgresql-13.service # systemctl status postgresql-13.service # tail -f $(date +'/var/lib/pgsql/13/data/log/postgresql-%a.log')
- Realizamos el vacuum de las tablas como POSTGRES $ time ./analyze_new_cluster.sh -> Realiza un Vacumm de las tablas. Proceso Lento, en mi BD tardo unas 7hs. $ ./delete_old_cluster.sh -> Elimina la instalación antigua. Si hacemos un hardlink no perdemos la información nueva.
- Desinstalamos el PG12 # dnf -y remove postgresql12* # rm -fr /var/lib/pgsql/12
- Desactivar Repositorios no necesarios # dnf config-manager --set-disabled pgdg12 # dnf config-manager --set-disabled timescale_timescaledb
Upgrade de Zabbix 5.0.3 a Zabbix 6
Pre Upgrade - Actualizaciones criticas
- PostgreSQL 13.X - TimescaleDB 2.0.1-2.3 - Minimum required PHP version upped from 7.2.0 to 7.2.5.
Stop Zabbix processes y Proxys
# systemctl stop zabbix*
Back up configuration files, PHP files and Zabbix binaries
Nota: Hacer un Snap del server nuevo o aplicar el siguiente procedimiento.
# mkdir /opt/zabbix-backup/ # cp /etc/zabbix/zabbix_server.conf /opt/zabbix-backup/ # cp /etc/nginx/conf.d/zabbix.conf /opt/zabbix-backup/ # cp -R /usr/share/zabbix/ /opt/zabbix-backup/ # cp -R /usr/share/doc/zabbix-* /opt/zabbix-backup/
Update repository configuration package
# rpm -Uvh https://repo.zabbix.com/zabbix/5.5/rhel/8/x86_64/zabbix-release-5.5-1.el8.noarch.rpm # dnf clean all
Upgrade Zabbix components
# dnf upgrade zabbix-* Upgrading: zabbix-agent2 zabbix-server-pgsql zabbix-web zabbix-web-pgsql Installing dependenc zabbix-web-deps
# dnf -y install zabbix-sql-scripts zabbix-web-service Nota zabbix-web-service: https://www.zabbix.com/documentation/6.0/manual/concepts/web_service
Ajustes de la configuracion del zabbix_server.conf v6
Nota: Al insntalar Zabbix 6 no reemplaza los ficheros de configuracion, los nuevos quedan con el nombre /etc/zabbix/zabbix_server.conf.rpmnew Resguarden el /etc/zabbix/zabbix_server.conf de la version anterior y actualicen los parametros de la version nueva. # cp /etc/zabbix/zabbix_server.conf /etc/zabbix/zabbix_server.conf.5.0.3 # cp /etc/zabbix/zabbix_server.conf.rpmnew /etc/zabbix/zabbix_server.conf # vi /etc/zabbix/zabbix_server.conf Editar y actualizar todos los parametros personalizados por vosotros.
Start Zabbix Server y controlar vía log el Upgrade
Preparamos el log para poder analizar el upgrade en otro sesion
# >/var/log/zabbix/zabbix_server.log # chown zabbix:zabbix /var/log/zabbix/zabbix_server.log # tail -f /var/log/zabbix/zabbix_server.log 20533:20211018:162546.435 Starting Zabbix Server. Zabbix 6.0.0alpha4 (revision e58e4c62e5). 20533:20211018:162546.435 ****** Enabled features ****** 20533:20211018:162546.435 SNMP monitoring: YES 20533:20211018:162546.435 IPMI monitoring: YES 20533:20211018:162546.435 Web monitoring: YES 20533:20211018:162546.435 VMware monitoring: YES 20533:20211018:162546.435 SMTP authentication: YES 20533:20211018:162546.435 ODBC: YES 20533:20211018:162546.435 SSH support: YES 20533:20211018:162546.435 IPv6 support: YES 20533:20211018:162546.435 TLS support: YES 20533:20211018:162546.435 ****************************** 20533:20211018:162546.435 using configuration file: /etc/zabbix/zabbix_server.conf 20533:20211018:162547.265 TimescaleDB version: 20301 20533:20211018:162547.359 current database version (mandatory/optional): 05000000/05000002 20533:20211018:162547.359 required mandatory version: 05050072 20533:20211018:162547.359 starting automatic database upgrade <----------- Inicio del Upgrade de la DB 20533:20211018:162548.689 completed 0% of database upgrade 20533:20211018:162553.076 slow query: 4.060433 sec, "commit;" 20533:20211018:162553.165 completed 1% of database upgrade 20533:20211018:162553.590 completed 2% of database upgrade 20533:20211018:162553.672 completed 3% of database upgrade .... 20533:20211018:162849.909 completed 96% of database upgrade 20533:20211018:162850.046 completed 97% of database upgrade 20533:20211018:162850.142 completed 98% of database upgrade 20533:20211018:162850.149 completed 99% of database upgrade 20533:20211018:162850.154 completed 100% of database upgrade 20533:20211018:162850.154 database upgrade fully completed <----------- DB esta actualizada!!!! 20533:20211018:162850.676 server #0 started [main process] 20906:20211018:162850.678 server #1 started [service manager #1] 20907:20211018:162850.679 server #2 started [configuration syncer #1]
Iniciamos Zabbix 6 por primera vez
# /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf