MySQL Server Advanced Plugin Monitorización de bases de datos MySQL sobre Unix. Changelog Date Author Change Version 12/03/12 Tomas First Version V1r1 01/07/2013 Mario Cambios en coódigo v1r2 25/04/2014 Mario Cambios en código v1r3 3/09/2022 Alex Cambios en el código v1r4     Introducción Este documento tiene como objetivo la descripción de la monitorización de bases de datos MySQL sobre Unix. Se han elegido una serie de módulos “base” en base a nuestra experiencia en monitorización de sistemas y las necesidades de algunos de nuestros clientes. También se han añadido todas las especificaciones recogidas en diferentes entornos de producción real, tomando especificaciones reales de administradores de bases de datos. Para la extracción de la información se utiliza: • Un fichero de configuración externo donde se define toda la parametrización del plugin. Este fichero de configuración puede hacer llamadas (includes) a otros ficheros. • Se utiliza el software ya instalado en el sistema (MySQL, comandos del sistema, ficheros de alertas de MySQL, etc), para la monitorización realizada por el plugin sin tener que instalar librerías o utilidades de terceros. • Se utiliza un parser de log existente (el de Pandora) para procesar los logs de alertas de MySQL. Este parser debe ser “automático” y se basará en el reporte de todos los mensajes de error críticos con la forma “ERROR *”. • Se realizan una serie de chequeos básicos “por defecto”, aunque se pueden suprimir o personalizar. • Se dispone de una interfaz “abierta” para especificar consultas SQL libres, permitiendo modelar todo tipo de consultas SQL que se realizan con otras herramientas o de forma manual por los administradores. • El sistema se integra con el agente Unix y con la capacidad de distribuir colecciones de ficheros, de forma que se puede distribuir el plugin por un lado y las colecciones de ficheros de forma individual -por agente- y/o por política. Cabe destacar que como el resto de monitorización con Pandora FMS, el plugin de monitorización MySQL se puede usar para recoger información de tipo “cadena de texto” (para tratarlo como eventos) o de tipo numérico (para hacer gestión del rendimiento). Requisitos Los requisitos para que funcione correctamente esta monitorización son los siguientes: • Instalar el agente de Pandora FMS. • Tener perl instalado. • Tener una base de datos MySQL instalada en la máquina donde se va a monitorizar, con conectividad a dicha base de datos. • Especificar el nombre, usuario, password y host de la base de datos MySQL. • Es necesario que el usuario con el que se ejecuta el agente de Pandora FMS, que es el usuario que ejecutará el plugin, tenga acceso a los siguientes recursos de MySQL:    ◦ Directorio MySQL homedir (directorio con la instalación de MySQL, típicamente    /var/lib/mysql).    ◦ Fichero de log de MySQL (típicamente /var/lib/mysql/mysql.log).    ◦ Acceso y permisos de escritura a un directorio para ficheros temporales. Documentacion que debe entregar el Área que requiere la monitorizacion Para la correcta monitorización de MySQL es necesario que el Área técnica envíe cierta información que sera incluida en los ficheros de configuración. Esta información es la siguiente: • Usuario, password, host con acceso a la base de datos MySQL. Dicho usuario debe tener permiso para leer en todas las tablas de las que se quiera extraer información. • Ficheros de log y directorio base de MySQL. • Si desea monitorizar alguna cosa que no venga definida “por defecto” será necesario que provea el código SQL para realizar esa monitorización, así como un ejemplo del dato desalida, especificando si es numérico, o tipo cadena, etc). Matriz de compatibilidad Sistemas donde se ha probado • Ubuntu 10.04 con MySQL 5.0 • OpenSuse 11.2 con MySQL 5.5 Sistemas donde deberia funcionar • Resto de sistemas Unix con MySQL 5.0 o superiores Clasificación de módulos de EndPoints generados Hay que tener en cuenta que la mayoría de estos parámetros deben ser procesados como “delta” o usando el tipo de datos “generic_data_inc” ya que son contadores. Aborted_connects Binlog_cache_disk_use Binlog_cache_use Binlog_stmt_cache_disk_use Binlog_stmt_cache_use Bytes_received Bytes_sent Com_admin_commands Com_assign_to_keycache Com_alter_db Com_alter_db_upgrade Com_alter_event Com_alter_function Com_alter_procedure Com_alter_server Com_alter_table Com_alter_tablespace Com_analyze Com_begin Com_binlog Com_call_procedure Com_change_db Com_change_master Com_check Com_checksum Com_commit Com_create_db Com_create_event Com_create_function Com_create_index Com_create_procedure Com_create_server Com_create_table Com_create_trigger Com_create_udf Com_create_user Com_create_view Com_dealloc_sql Com_delete Com_delete_multi Com_do Com_drop_db Com_drop_event Com_drop_function Com_drop_index Com_drop_procedure Com_drop_server Com_drop_table Com_drop_trigger Com_drop_user Com_drop_view Com_empty_query Com_execute_sql Com_flush Com_grant Com_ha_close Com_ha_open Com_ha_read Com_help Com_insert Com_insert_select Com_install_plugin Com_kill Com_load Com_lock_tables Com_optimize Com_preload_keys Com_prepare_sql Com_purge Com_purge_before_date Com_release_savepoint Com_rename_table Com_rename_user Com_repair Com_replace Com_replace_select Com_reset Com_resignal Com_revoke Com_revoke_all Com_rollback Com_rollback_to_savepoint Com_savepoint Com_select Com_set_option Com_signal Com_show_authors Com_show_binlog_events Com_show_binlogs Com_show_charsets Com_show_collations Com_show_contributors Com_show_create_db Com_show_create_event Com_show_create_func Com_show_create_proc Com_show_create_table Com_show_create_trigger Com_show_databases Com_show_engine_logs Com_show_engine_mutex Com_show_engine_status Com_show_events Com_show_errors Com_show_fields Com_show_function_status Com_show_grants Com_show_keys Com_show_master_status Com_show_open_tables Com_show_plugins Com_show_privileges Com_show_procedure_status Com_show_processlist Com_show_profile Com_show_profiles Com_show_relaylog_events Com_show_slave_hosts Com_show_slave_status Com_show_status Com_show_storage_engines Com_show_table_status Com_show_tables Com_show_triggers Com_show_variables Com_show_warnings Com_slave_start Com_slave_stop Com_stmt_close Com_stmt_execute Com_stmt_fetch Com_stmt_prepare Com_stmt_reprepare Com_stmt_reset Com_stmt_send_long_data Com_truncate Com_uninstall_plugin Com_unlock_tables Com_update Com_update_multi Com_xa_commit Com_xa_end Com_xa_prepare Com_xa_recover Com_xa_rollback Com_xa_start Compression Connections Created_tmp_disk_tables Created_tmp_files Created_tmp_tables Delayed_errors Delayed_insert_threads Delayed_writes Flush_commands Handler_commit Handler_delete Handler_discover Handler_prepare Handler_read_first Handler_read_key Handler_read_last Handler_read_next Handler_read_prev Handler_read_rnd Handler_read_rnd_next Handler_rollback Handler_savepoint Handler_savepoint_rollback Handler_update Handler_write Innodb_buffer_pool_pages_data Innodb_buffer_pool_pages_dirty Innodb_buffer_pool_pages_flushed Innodb_buffer_pool_pages_free Innodb_buffer_pool_pages_misc Innodb_buffer_pool_pages_total Innodb_buffer_pool_read_ahead_rnd Innodb_buffer_pool_read_ahead Innodb_buffer_pool_read_ahead_evicted Innodb_buffer_pool_read_requests Innodb_buffer_pool_reads Innodb_buffer_pool_wait_free Innodb_buffer_pool_write_requests Innodb_data_fsyncs Innodb_data_pending_fsyncs Innodb_data_pending_reads Innodb_data_pending_writes Innodb_data_read Innodb_data_reads Innodb_data_writes Innodb_data_written Innodb_dblwr_pages_written Innodb_dblwr_writes Innodb_have_atomic_builtins Innodb_log_waits Innodb_log_write_requests Innodb_log_writes Innodb_os_log_fsyncs Innodb_os_log_pending_fsyncs Innodb_os_log_pending_writes Innodb_os_log_written Innodb_page_size Innodb_pages_created Innodb_pages_read Innodb_pages_written Innodb_row_lock_current_waits Innodb_row_lock_time Innodb_row_lock_time_avg Innodb_row_lock_time_max Innodb_row_lock_waits Innodb_rows_deleted Innodb_rows_inserted Innodb_rows_read Innodb_rows_updated Innodb_truncated_status_writes Key_blocks_not_flushed Key_blocks_unused Key_blocks_used Key_read_requests Key_reads Key_write_requests Key_writes Last_query_cost Max_used_connections Not_flushed_delayed_rows Open_files Open_streams Open_table_definitions Open_tables Opened_files Opened_table_definitions Opened_tables Performance_schema_cond_classes_lost Performance_schema_cond_instances_lost Performance_schema_file_classes_lost Performance_schema_file_handles_lost Performance_schema_file_instances_lost Performance_schema_locker_lost Performance_schema_mutex_classes_lost Performance_schema_mutex_instances_lost Performance_schema_rwlock_classes_lost Performance_schema_rwlock_instances_lost Performance_schema_table_handles_lost Performance_schema_table_instances_lost Performance_schema_thread_classes_lost Performance_schema_thread_instances_lost Prepared_stmt_count Qcache_free_blocks Qcache_free_memory Qcache_hits Qcache_inserts Qcache_lowmem_prunes Qcache_not_cached Qcache_queries_in_cache Qcache_total_blocks Queries Questions Rpl_status Select_full_join Select_full_range_join Select_range Select_range_check Select_scan Slave_heartbeat_period Slave_open_temp_tables Slave_received_heartbeats Slave_retried_transactions Slave_running Slow_launch_threads Slow_queries Sort_merge_passes Sort_range Sort_rows Sort_scan Ssl_accept_renegotiates Ssl_accepts Ssl_callback_cache_hits Ssl_cipher Ssl_cipher_list Ssl_client_connects Ssl_connect_renegotiates Ssl_ctx_verify_depth Ssl_ctx_verify_mode Ssl_default_timeout Ssl_finished_accepts Ssl_finished_connects Ssl_session_cache_hits Ssl_session_cache_misses Ssl_session_cache_mode Ssl_session_cache_overflows Ssl_session_cache_size Ssl_session_cache_timeouts Ssl_sessions_reused Ssl_used_session_cache_entries Ssl_verify_depth Ssl_verify_mode Ssl_version Table_locks_immediate Table_locks_waited Tc_log_max_pages_used Tc_log_page_size Tc_log_page_waits Threads_cached Threads_connected Threads_created Threads_running Uptime Uptime_since_flush_status Instalación Copiar el plugin al directorio de plugins del agente, o distribuirlo con file collections. Lo mismo con el archivo conf. La llamada desde el agente será similar a esta, pero usando los paths donde esté instalado el plugin y el conf. module_plugin perl /etc/pandora/plugins/pandora_mysql.pl /etc/pandora/plugins/mysql.conf Monitorización El plugin monitoriza “por defecto” los siguientes puntos: • Verificación del conectividad con la base de datos. • Chequear si el proceso de mysql está activo . • Chequeo de memoria del servidor (proceso) . • Número de conexiones TIME_WAIT en el sistema . • Chequeo de espacio en disco del servidor (generalmente /var/lib/mysql). • Tamaño del fichero ibdata1 . • Busqueda de errores en los logs de error de la base de datos (generalmente /var/lib/mysql/mysql.log). Adicionalmente también monitoriza los siguientes parámetros de rendimiento: • Número de conexiones activas MySQL. • Tiempo de actividad del servidor (uptime). • Número de conexiones abortadas por que el cliente no cerró correctamente la conexión. • Número de bytes recibidos por los clientes. • Información de estado del servidor (SHOW GLOBAL STATUS ó SHOW STATUS). • Información de estado de InnoDB (SHOW INNODB STATUS) . • Número de bytes enviados por los clientes. • Número de inserciones en la base de datos. • Número de bloqueos sobre tablas en la base de datos al realizar una transacción. • Bloqueos activos sobre tablas y registros por cada sesión activa. • Peticiones de I/0 pendientes. • Tamaño total de datos en GB. Todos esos módulos vienen parametrizados en el fichero “mysql.conf” que viene en el paquete del plugin. Esos módulos pueden ser eliminados o ampliados por un administrador de MySQL. Parametrización del plugin El plugin se utiliza previa configuración del fichero externo de configuración. NOTA: Es extremadamente importante tener en cuenta que los archivos de configuración pensados para el plugin en UNIX deben estar editados y almacenados con retornos de carro tipo “UNIX” y que si se usan retornos de carro tipo “WINDOWS” el plugin no funcionará adecuadamente. Existen tres bloques funcionales dentro del fichero de configuración: Configuración de acceso a MySQL y datos generales Para que el plugin monitorice la base de datos hay que proporcionarle las credenciales de acceso y algunos datos generales que luego se usarán en las comprobaciones: Usuario, password y host de MySQL Las credenciales de acceso se completarán de la siguiente forma: conf_mysql_user mysql conf_mysql_pass 1234 conf_mysql_host 127.0.0.1 Existe la posibilidad de que tengamos la contraseña en blanco del usuario mysql. En este caso habria que comentar la linea ( # conf_mysql_pass) Datos generales Aquí se especificarán el directorio home de MySQL (generalmente /var/lib/mysql), el fichero de log, un directorio para ficheros temporales y la ruta completa al plugin de parseo de logs de Pandora: conf_mysql_homedir /var/lib/mysql conf_mysql_basedir /var/lib/mysql conf_mysql_logfile /var/log/mysql.log conf_temp /tmp conf_logparser /etc/pandora/plugins/grep_log Parámetros de sistema A continuación se describen los módulos de comprobación específicos del sistema que se encuentran configurados por defecto en el mysql.conf adjunto: Bloque de chequeo de sistema Un bloque de chequeo de sistema en el fichero de configuración es como se muestra a continuación: check_begin # Linea de comentario. check_end A continuación se describen los chequeos del plugin: Verificación del conectividad con la base de datos Mediante este chequeo se comprobará si la base de datos tiene conectividad con otros elementos software. Si este chequeo no es satisfactorio se abortará la monitorización: check_begin check_mysql_service check_end Chequear si el proceso de mysql está activo Este chequeo comprueba que el proceso de MySQL este activo en el sistema: check_begin check_mysql_service check_end Chequeo de memoria del servidor (proceso) Mediante este chequeo se comprueba el uso de memoria por el servidor MySQL. check_begin check_mysql_memory check_end Número de conexiones TIME_WAIT en el sistema Muestra el número de conexiones en estado TIME_WAIT en el sistema: check_begin check_system_timewait check_end Chequeo de espacio en disco del servidor Chequea el espacio es disco (en KB) por parte de la base de datos. Se comprobará el tamaño del directorio MySQL homedir especificado en el apartado de Datos generales: check_begin check_system_diskusage check_end Tamaño del fichero ibdata1 Chequea el tamaño (en KB) del fichero ibdata1 que se encuentra en el directorio MySQL homedir: check_begin check_mysql_ibdata1 check_end Búsqueda de errores en los logs de error de la base de datos Buscará la cadena “ERROR” en el fichero de log indicado en la sección de Datos generales. Este modulo siempre devolverá el tipo de dato async_string y en caso de que la comprobación devuelva datos se ejecutará el comando asociado (explicado en la sección Ejecución de comandos bajo condición): check_begin check_mysql_logs check_end Parámetros de rendimiento A continuación se describen los módulos de comprobación de rendimiento: Bloque de chequeo de rendimiento Similares a los de chequeos de sistema como se muestra a continuación: check_begin # Linea de comentario. check_end A continuación se muestran los bloques de chequeo de rendimiento: Número de conexiones activas MySQL Devuelve el número de conexiones activas en la base de datos: check_begin mysql_status Full processlist check_end  Número de conexiones abortadas por que el cliente no cerró correctamente la conexión . check_begin mysql_status Aborted_connects check_end  Número de bytes recibidos por los clientes check_begin mysql_status Bytes_received check_end  Número de bytes enviados por los clientes check_begin mysql_status Bytes_sent check_end Información de estado del servidor (SHOW GLOBAL STATUS ó SHOW STATUS ) Estas consultas se basan en el comando SHOW GLOBAL STATUS de MySQL. Dentro de los datos devueltos por este comando se podrá realizar la búsqueda de algún token y de su valor asociado: check_begin mysql_status check_end Información de estado de InnoDB (SHOW INNODB STATUS) Estas consultas se basan en el comando SHOW INNODB STATUS de MySQL. Dentro de los datos devueltos por este comando se podrá realizar la búsqueda de algún token y de su valor asociado: check_begin mysql_status Com_insert check_end Número de inserciones en la base de datos Número de transacciones de tipo INSERT hechas en la base de datos:   check_begin check_name mysql_innodb check_end Número de bloqueos sobre tablas en la base de datos al realizar una transacción check_begin mysql_status Com_lock_tables check_end Bloqueos activos sobre tablas y registros por cada sesión activa   check_begin # Number of locks over DB tables mysql_status Table_locks_waited check_end check_begin # Number of row locks mysql_status Innodb_row_lock_waits check_end Peticiones de I/0 pendientes check_begin mysql_status Pending_io check_end Tamaño total de datos en GB   check_begin mysql_status Total_size check_end Monitorización vía SQL Una de las características mas potentes del plugin es la posibilidad de especificar su propia orden SQL para obtener el valor. Veamos algún ejemplo: check_begin check_name num_tables check_schema information_schema check_sql SELECT COUNT(*) FROM tables check_end Check_name El nombre de la comprbación que se verá en la interfaz de Pandora. . Check_sql La query que deberá devolver un dato simple (ya sea número o cadena).. Check_schema El esquema de MySQL al que se conectará el plugin para realizar la query Ejecución de comandos bajo condición En todos los módulos se podrá especificar la ejecución de un comando si se cumple una condición. Dichas condiciones podrán ser: • == (igual a un valor) • != (Diferente de un valor) • < (menor de un valor dado) • > (Mayor de un valor dado). Si la condición se satisface entonces se ejecutará el comando configurado mediante el token post_execution. En el caso del chequeo check_mysql_logs se ejecutará el comando si devuelve algún dato esta comprobación. Un ejemplo de esta configuración es la siguiente: check_begin check_mysql_cpu post_condition > 95 post_execution snmptrap -v 1 -c public x.x.x.x 1.2.4.4.65.6.4.3 6 128 check_end Parametrización del comando asociado a un chequeo Como se comentó anteriormente en cada comprobación se puede configurar un comando a ejecutar si la condición se cumple. Además, se puede utilizar un token en el comando para que si este se ejecuta entonces se sustituya por el valor del chequeo. Por ejemplo, por medio de la macro _DATA_ en este ejemplo se guarda en el fichero /tmp/mysql_cpu_result el contenido del chequeo: check_begin check_mysql_cpu post_condition > 95 post_execution echo _DATA_ >> /tmp/mysql_cpu_result check_end Estado del módulo Complementariamente, los módulos devolverán un estado si se indica con el token de configuración: post_status WARNING O bien: post_status CRITICAL Tipo de dato Por defecto todos los monitores devolverán generic_data, salvo que se indique el siguiente token de configuración. module_type generic_data_inc module_type async_string (o cualquier otro válido) La única excepción es el monitor check_mysql_service automáticamente un módulo de tipo generic_proc. * En los módulos en los que usemos check_name, se puede usar check_type para elegir el tipo de dato del módulo. Tratamiento de datos en comprobaciones de tipo de rendimiento En comprobaciones de tipo de rendimiento y queries SQL se puede configurar para que se devuelva el valor absoluto tal cual lo devuelve MySQL (data_absolute) o la diferencia entre el dato actual y el anterior (data_delta). En la primera ejecución de la comprobación configurada con data_delta no se devolverá dato alguno. A partir de la segunda ejecución se devolverá el incremento. Si se diera el caso que la diferencia entre el dato actual y el anterior fuera negativa, el valor de la comprobación se resetearia y la comprobación no devolverá dato alguno. Por defecto las comprobaciones de tipo de rendimiento serán configuradas como data_absolute. Por ejemplo esta comprobación devolverá el incremento de las sesiones activas en MySQL: check_begin mysql_status Full processlist data_delta check_end