Upgrade de Zabbix 5.0.3 a 6.0.0 PostgreSQL 12 a 13 y TimescaleDB de 1.7.1 a 2.3.1

From Zabbix-ES
Jump to navigation Jump to search
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