Entornos HA con Percona XtraDB Cluster
Introducción
Pandora FMS se fundamenta en una base de datos MySQL para configurar y almacenar datos. Conocemos que para escalar (crecer) “horizontalmente” existe la Metaconsola de Pandora FMS para la monitorización de todos los dispositivos necesarios. Sin embargo hay ciertos escenarios que se puedan quedar pequeños para el uso de la Metaconsola, con la dificultad que provoca en su gestión, así como pueden ser demasiado grandes como almacenar todos los datos en una única base de datos.
Para solventar esta problemática se confia en Percona XtraDB Cluster, que ofrece la posibilidad de poder usar en modo multimaster (varios servidores principales) para las tareas de lectura y escritura de dichos servidores. De esta forma se reparte la carga entre los distintos servidores donde se aloje este clúster dando más capacidad de procesamiento a la base de datos que la que puede ofrecer un nodo standalone (nodo singular). Así se puede incrementar el número de métricas a monitorizar en un solo nodo de Pandora FMS.
La representación de este esquema ofrece la posibilidad de instalar en un mismo servidor, un nodo de replicación de Percona XtraDB Cluster junto al servidor de Pandora FMS y la Consola web o bien separar la instalación de los mismos. Bastará con apuntar cada uno de los servidores o Consolas web de Pandora FMS al nodo donde se necesite que escriba o lea, pudiendo repartir la carga del entorno como sea más conveniente en cada entorno.
El número mínimo de nodos para el funcionamiento del clúster es de 3 nodos y siempre debe haber 2 de ellos activos para que la base de datos esté operativa.
Instalación Percona XtraDB Cluster
Para realizar una correcta instalación de Percona XtraDB Cluster, primero se debe instalar en todos los nodos el servidor y el cliente de Percona XtraDB Cluster.
Los datos de los nodos a usar en el ejemplo van a ser los siguientes:
NODO 1:
pandora001 192.168.80.111
NODO 2:
pandora002 192.168.80.112
NODO 3:
pandora003 192.168.80.113
Ejecución en todos los nodos
# yum install Percona-XtraDB-Cluster-server-57 Percona-XtraDB-Cluster-client-57
Una vez instalado en todos los nodos, inicie el servicio en cada uno de ellos y configure una contraseña que sea común para el usuario root, así como un usuario (en este caso sstuser
) que se utilizará para la replicación entre todos los nodos. Ejecute:
# systemctl start mysqld
Obtenga una contraseña provisional para root y acceda con ella al servidor MySQL (recuerde que se debe ejecutar en todos los nodos):
# mysql -uroot -p$(grep "temporary password" /var/log/mysqld.log | \ rev | cut -d' ' -f1 | rev)> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('Pandor4!'); > UNINSTALL PLUGIN validate_password; > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('pandora');
Ahora proceda a crear al usuario sstuser
:
mysql> create user sstuser@'%' identified by 'pandora';> grant all on *.* to sstuser@'%'; > flush privileges; > quit
Detenga el servicio mysql
en todos los nodos tras finalizar esta configuración:
# systemctl stop mysqld
Una vez haya detenido todos los servidores, debe iniciar uno de ellos en modo bootstrap, para que actúe como servidor principal para realizar la replicación entre los otros dos nodos.
Para ello hay que añadir una configuración específica en el nodo que elija como principal, en este caso el nodo pandora001
.
Modifique el fichero /etc/my.cnf
del nodo pandora001
añadiendo correctamente los parámetros indicados entre las dos líneas # Modified for PFMS
:
[mysqld] # Modified for PFMS\ server-id=1 # Modified for PFMS/ datadir=/var/lib/mysql character-set-server=utf8 skip-character-set-client-handshake # Add configuration for Percona XtraDB Cluster. # Cache size depends on the server resources. Recommended 1G - 10 GB. # Modified for PFMS\ wsrep_provider_options="gcache.size=10G; gcache.page_size=10G" wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_name=pandora-cluster wsrep_cluster_address=gcomm:// wsrep_node_name=pandora001 wsrep_node_address=192.168.80.111 wsrep_sst_method=xtrabackup-v2 wsrep_sst_auth=sstuser:pandora # Modified for PFMS/ pxc_strict_mode=PERMISSIVE # Mysql optimizations for Pandora FMS node with 4G RAM max_allowed_packet = 64M innodb_buffer_pool_size = 1G innodb_lock_wait_timeout = 90 innodb_file_per_table innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M innodb_io_capacity = 100 innodb_autoinc_lock_mode=2 thread_cache_size = 8192 thread_stack = 256K max_connections = 8192 wait_timeout = 900 key_buffer_size=4M read_buffer_size=128K read_rnd_buffer_size=128K sort_buffer_size=128K join_buffer_size=4M query_cache_type = 0 query_cache_size = 0 sql_mode="" binlog_format=ROW expire_logs_days=1
Inicie con esta configuración el servicio de mysql
en el nodo pandora001
, en modo bootstrap:
# systemctl start mysql@bootstrap
En los nodos pandora002
y pandora003
modifique el fichero /etc/my.cnf
indicando los siguientes parámetros indicados entre las dos líneas # Modified for PFMS
:
- Nodo
pandora002
:
[mysqld] server-id=2 datadir=/var/lib/mysql character-set-server=utf8 skip-character-set-client-handshake # add configuration for Percona XtraDB Cluster. # Cache size depends on the server resources. Recommended 1G - 10 GB. # Modified for PFMS\ wsrep_provider_options="gcache.size=10G; gcache.page_size=10G" wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_name=pandora-cluster wsrep_cluster_address=gcomm:pandora001,pandora003 wsrep_node_name=pandora002 wsrep_node_address=192.168.80.112 wsrep_sst_method=xtrabackup-v2 wsrep_sst_auth=sstuser:pandora pxc_strict_mode=PERMISSIVE # Modified for PFMS/ # Mysql optimizations for Pandora FMS max_allowed_packet = 64M innodb_buffer_pool_size = 1G innodb_lock_wait_timeout = 90 innodb_file_per_table innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M innodb_io_capacity = 100 innodb_autoinc_lock_mode=2 thread_cache_size = 8192 thread_stack = 256K max_connections = 8192 wait_timeout = 900 key_buffer_size=4M read_buffer_size=128K read_rnd_buffer_size=128K sort_buffer_size=128K join_buffer_size=4M query_cache_type = 0 query_cache_size = 0 sql_mode="" binlog_format=ROW expire_logs_days=1
- Nodo
pandora003
:
[mysqld] server-id=3 datadir=/var/lib/mysql character-set-server=utf8 skip-character-set-client-handshake # add configuration for Percona XtraDB Cluster. # Cache size depends on the server resources. Recommended 1G - 10 GB. # Modified for PFMS\ wsrep_provider_options="gcache.size=10G; gcache.page_size=10G" wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_name=pandora-cluster wsrep_cluster_address=gcomm:pandora001,pandora003 wsrep_node_name=pandora002 wsrep_node_address=192.168.80.112 wsrep_sst_method=xtrabackup-v2 wsrep_sst_auth=sstuser:pandora pxc_strict_mode=PERMISSIVE # Modified for PFMS/ # Mysql optimizations for Pandora FMS max_allowed_packet = 64M innodb_buffer_pool_size = 1G innodb_lock_wait_timeout = 90 innodb_file_per_table innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M innodb_io_capacity = 100 innodb_autoinc_lock_mode=2 thread_cache_size = 8192 thread_stack = 256K max_connections = 8192 wait_timeout = 900 key_buffer_size=4M read_buffer_size=128K read_rnd_buffer_size=128K sort_buffer_size=128K join_buffer_size=4M query_cache_type = 0 query_cache_size = 0 sql_mode="" binlog_format=ROW expire_logs_days=1
Inicie en los nodos pandora002
y pandora003
el servicio mysqld
para que iniciar la sincronía:
#systemctl start mysqld
En este punto puede realizar la instalación de la base de datos de Pandora FMS sobre el nodo 1 y observar cómo se replica correctamente entre los otros dos servidores.
Una vez comprobado el correcto funcionamiento de la replicación, detenga el nodo que ha iniciado en modo bootstrap (en este caso el nodo pandora001
):
(NODO1) # systemctl stop mysql@bootstrap
Cambie dentro del fichero my.cnf
del NODO 1 el parámetro wsrep_cluster_address
para añadir los otros 2 nodos del clúster al mismo, ha de quedar de la siguiente forma:
wsrep_cluster_address=gcomm:pandora002,pandora003
Inicie de nuevo el servicio mysqld
en el nodo pandora001
, pero esta vez en modo normal, para que se sincronice con los otros 2 nodos ya activos.
systemctl start mysqld
Cambios al esquema de Pandora FMS para su correcto funcionamiento
Para evitar problemas con los deadlocks (bloqueos de registros) por las constantes escrituras y lecturas que se producen en paralelo es necesario modificar las siguientes tablas de Pandora FMS con las siguientes modificaciones:
alter table tagent_access add column `id_tagent_access` bigint(20) unsigned NOT NULL; alter table tagent_access add primary key (id_tagent_access); alter table tagent_access modify id_tagent_access bigint(20) auto_increment; alter table tagente_datos add column `id_tagente_datos` bigint(20) unsigned NOT NULL; alter table tagente_datos add primary key (id_tagente_datos); alter table tagente_datos modify id_tagente_datos bigint(20) auto_increment; alter table tagente_datos_inc add column `id_tagente_datos_inc` bigint(20) unsigned NOT NULL; alter table tagente_datos_inc add primary key (id_tagente_datos_inc); alter table tagente_datos_inc modify id_tagente_datos_inc bigint(20) auto_increment; alter table tagente_datos_string add column `id_tagente_datos_string` bigint(20) unsigned NOT NULL; alter table tagente_datos_string add primary key (id_tagente_datos_string); alter table tagente_datos_string modify id_tagente_datos_string bigint(20) auto_increment; alter table tagente_datos_inventory add column `id_tagente_datos_inventory` bigint(20) unsigned NOT NULL; alter table tagente_datos_inventory add primary key (id_tagente_datos_inventory); alter table tagente_datos_inventory modify id_tagente_datos_inventory bigint(20) auto_increment; alter table torigen add primary key (`origen`); alter table tusuario add primary key (`id_user`);
Para su corrrecto funcionamiento, deben aplicarse estos cambios con la base de datos sin datos, solo con el esquema.
Aplicar cambios en un entorno con datos previos
Ante este escenario, es necesario reconstruir las tablas donde se han añadido las modificaciones necesarias para evitar los deadlocks en el entorno. El proceso sería el siguiente:
1.- Hacer DUMP
(exportar datos) de todas las tablas implicadas por separado, excluyendo los campos DROP y create TABLE:
#mysqldump -u root -p pandora tagent_access --skip-add-drop-table --complete-insert --no-create-info> tagent_access.sql #mysqldump -u root -p pandora tagente_datos --skip-add-drop-table --complete-insert --no-create-info> tagente_datos.sql #mysqldump -u root -p pandora tagente_datos_inc --skip-add-drop-table --complete-insert --no-create-info> tagente_datos_inc.sql #mysqldump -u root -p pandora tagente_datos_string --skip-add-drop-table --complete-insert --no-create-info> tagente_datos_string.sql #mysqldump -u root -p pandora tagente_datos_inventory --skip-add-drop-table --complete-insert --no-create-info> tagente_datos_inventory.sql
2.- Eliminar las tablas afectadas:
mysql>drop table tagent_access; mysql>drop table tagente_datos; mysql>drop table tagente_datos_inc; mysql>drop table tagente_datos_string; mysql>drop table tagente_datos_inventory;
3.- Crear de nuevo todas las tablas con todos los ALTER
y con todas las nuevas columnas para que funcione el entorno sin problemas. Para crear las tablas de nuevo es necesario usar el create table
del fichero /var/www/html/pandora_console/pandoradb.sql
de las tablas tagent_access
, tagente_datos_inc
, tagente_datos_string
, tagente_datos_inventory
.
4.- Incorporar con source todos los datos DUMP
creados en el paso 1.
#mysql -u root -p pandora mysql> source tagent_access.sql: mysql> source tagente_datos.sql: mysql> source tagente_datos_inc; mysql> source tagente_datos_string; mysql> source tagente_datos_inventory;
Al finalizar el proceso, se habrán quedado todas las tablas con los id incrementales creados desde 0 en todas ellas.