Es extremadamente importante instalar y configurar un servidor MySQL de producción con los paquetes y herramientas necesarios para facilitar las operaciones a largo plazo. Hemos visto muchos casos en los que la solución de problemas o el ajuste de un servidor de producción (especialmente uno sin acceso público a Internet) suele ser difícil debido a la falta de las herramientas necesarias instaladas en el servidor para ayudar a identificar y resolver el problema.
En esta serie de blogs de dos partes, le mostraremos 9 consejos y trucos sobre cómo preparar un servidor MySQL para uso en producción desde la perspectiva del administrador del sistema. Todos los ejemplos en esta publicación de blog se basan en nuestra configuración de replicación de MySQL maestro-esclavo de dos nodos que se ejecuta en CentOS 7.
Instalar paquetes esenciales
Después de la instalación de los paquetes de servidor y cliente MySQL o MariaDB, debemos preparar el servidor MySQL/MariaDB con todas las herramientas necesarias para hacer frente a todas las operaciones de administración, gestión y supervisión que se van a realizar en el servidor. Si planea bloquear el servidor MySQL en producción, será un poco más difícil instalarlos todos manualmente sin conexión a Internet.
Algunos de los paquetes importantes que deben instalarse en el servidor MySQL/MariaDB para Linux:
- Percona Xtrabackup/MariaDB Backup:copia de seguridad física sin bloqueo del servidor de la base de datos.
- ntp/ntpdate - Sincroniza la hora del servidor.
- pv:supervisa los datos a través de una canalización; también se puede usar para la limitación.
- socat o netcat:herramienta de transmisión de datos, buena para la copia de seguridad de la transmisión.
- net-tools:una colección de herramientas de depuración de red para Linux.
- bind-utils:una colección de herramientas de depuración de DNS para Linux.
- sysstat:una colección de herramientas de supervisión del rendimiento para Linux.
- telnet:cliente Telnet para verificar la disponibilidad del servicio.
- mailx/mailutils - Cliente MTA.
- openssl:kit de herramientas para los protocolos Transport Layer Security (TLS) y Secure Sockets Layer (SSL).
- descomprimir:herramienta para descomprimir.
- htop - Herramienta de monitoreo de host.
- innotop - Herramienta de monitoreo de MySQL.
- vim - Editor de texto con resaltado de sintaxis (o cualquier editor de texto preferido).
- python-setuptools - Administrador de paquetes de Python.
- lm_sensors/ipmitool:para verificar la temperatura del componente del servidor. Solo servidor completo.
Tenga en cuenta que algunos de los paquetes sugeridos solo están disponibles en repositorios de paquetes no predeterminados como EPEL para CentOS. Por lo tanto, para la instalación basada en YUM:
$ yum install epel-release
$ yum install -y wget ntp pv socat htop innotop vim mailx bind-utils net-tools telnet sysstat openssl python-setuptools lm_sensors ipmitool
Mientras que para la instalación basada en APT:
$ apt-get install ntp pv socat htop innotop vim easy_install mailutils bind-utils sysstat net-tools telnet openssl lm_sensors ipmitool
Para la interfaz de línea de comandos de MySQL, podemos usar otra herramienta que no sea el cliente de línea de comandos estándar "mysql" como mycli, con autocompletado y resaltado de sintaxis. Para instalar el paquete, podemos usar pip (administrador de paquetes de Python):
$ pip install mycli
Con mycli, se puede reducir el vector de error humano con una mejor visualización cuando se trata de un servidor de producción, como se muestra en la siguiente captura de pantalla:
Indicador de Shell significativo
Esta parte parece innecesaria en primer lugar, pero probablemente lo salvará de cometer errores tontos en la producción. Como humanos, somos propensos a cometer errores, especialmente cuando ejecutamos comandos destructivos durante un momento intenso, por ejemplo, cuando el servidor de producción está caído.
Eche un vistazo a la siguiente captura de pantalla. De forma predeterminada, el indicador de bash PS1 (indicador principal) se ve bastante aburrido:
Un buen aviso de PS1 debe proporcionar información clara para que los administradores de sistemas sean más conscientes de la entorno, servidor y ruta actual con la que están tratando actualmente. Como resultado, uno sería más cuidadoso y siempre sabría si está en la ruta/servidor/usuario correcto para ejecutar el comando.
Para lograr esto, busque la línea que describe la configuración de PS1 (solicitud principal), comúnmente en /etc/bashrc línea 41:
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[email protected]\h \W]\\$ "
Y reemplácelo con esta línea:
[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[\e[36m\]\u\[\e[m\]@\[\e[32m\]\h\[\e[m\]\[\e[31;47m\]Production\[\e[m\]: \[\e[33m\]\w\[\e[m\]]$ "
Cerrar sesión en la terminal y volver a iniciar sesión. Debería ver algo como esto en la terminal ahora:
Como se muestra en la captura de pantalla anterior, el usuario actual (azul), el servidor nombre de host (verde), nivel de producción (negrita en color rojo con fondo blanco), junto con la ruta completa del directorio actual (amarillo) proporciona un mejor resumen de la sesión actual donde la información importante se distingue fácilmente con diferentes colores.
Puede usar esta herramienta en línea gratuita para personalizar su indicador de bash, según sus gustos.
MOD
Si está administrando un clúster de base de datos con varias funciones, como la replicación de MySQL o MariaDB, es común tener siempre esta sensación de ansiedad al administrar directamente uno de los hosts porque necesitamos realizar verificaciones adicionales para verificar que el el nodo en el que nos encontramos es el que realmente queremos administrar. La topología de replicación tiende a volverse más compleja a medida que su clúster de base de datos se amplía y podría haber muchas funciones en un clúster como maestro intermedio, servidor binlog, maestro de respaldo con replicación semi-sincronizada, esclavos de solo lectura y también servidor de verificación de respaldo.
Será mucho mejor si podemos obtener un resumen del estado de la base de datos cada vez que estemos en ese servidor en particular, solo para darnos una idea de lo que vamos a tratar. Podemos utilizar el Mensaje del día de Linux (MOTD) para automatizar este comportamiento cada vez que iniciamos sesión en el servidor. Usar el /etc/motd predeterminado solo es bueno para el contenido estático, que no es lo que realmente queremos si queremos informar el estado actual de un servidor MySQL.
Para lograr un resultado similar, podemos usar un script Bash simple para producir una salida MOTD significativa para resumir nuestro servidor MySQL/MariaDB, por ejemplo:
$ vim ~/.motd.sh
#!/bin/bash
# Auto-generate MOTD for MySQL/MariaDB Replication
# .motd.sh, to be executed under ~/.bash_profile
#####
# Preferred role of the node, pick one
#PREFER_ROLE='Slave'
PREFER_ROLE='Master'
#####
HOSTNAME=$(hostname)
UPTIME=$(uptime -p)
MYSQL_COMMAND='mysql --connect-timeout=2 -A -Bse'
MYSQL_READONLY=$(${MYSQL_COMMAND} 'SHOW GLOBAL VARIABLES LIKE "read_only"' | awk {'print $2'})
TIER='Production'
MAIN_IP=$(hostname -I | awk {'print $1'})
CHECK_MYSQL_REPLICATION=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Slave_.*_Running: Yes$')
MYSQL_MASTER=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | grep Master_Host | awk {'print $2'})
# The following requires show_compatibility_56=1 for MySQL 5.7 and later
MYSQL_UPTIME=$(${MYSQL_COMMAND} 'SELECT TIME_FORMAT(SEC_TO_TIME(VARIABLE_VALUE ),"%Hh %im") AS Uptime FROM information_schema.GLOBAL_STATUS WHERE VARIABLE_NAME="Uptime"')
# coloring
bold=$(tput bold)
red=$(tput setaf 1)
green=$(tput setaf 2)
normal=$(tput sgr0)
MYSQL_SHOW=1
if [ $MYSQL_READONLY == 'ON' ]; then
CURRENT_MYSQL_ROLE='Slave'
if ${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Slave_.*_Running: Yes$' &>/dev/null ; then
lag=$(${MYSQL_COMMAND} 'SHOW SLAVE STATUS\G' | egrep 'Seconds_Behind_Master:' | awk {'print $2'})
if [ $lag -eq 0 ]; then
REPLICATION_STATUS="${green}Healthy "
else
if [ $lag == 'NULL' ]; then
REPLICATION_STATUS=${red}Unhealthy
else
REPLICATION_STATUS="${red}Lagging ${lag}s"
fi
fi
else
REPLICATION_STATUS=${red}Unhealthy
fi
elif [ $MYSQL_READONLY == 'OFF' ]; then
CURRENT_MYSQL_ROLE='Master'
SLAVE_HOSTS=$(${MYSQL_COMMAND} 'SHOW SLAVE HOSTS' | awk {'print $1'})
else
MYSQL_SHOW=0
fi
if [ $TIER == 'Production' ]; then
TIER=${green}Production
fi
if [ $PREFER_ROLE == $CURRENT_MYSQL_ROLE ]; then
MYSQL_ROLE=${green}$CURRENT_MYSQL_ROLE
else
MYSQL_ROLE=${red}$CURRENT_MYSQL_ROLE
fi
echo
echo "HOST INFO"
echo "========="
echo -e " Hostname : ${bold}$HOSTNAME${normal} \t Server Uptime : ${bold}$UPTIME${normal}"
echo -e " IP Address : ${bold}$MAIN_IP${normal} \t Tier : ${bold}$TIER${normal}"
echo
if [ $MYSQL_SHOW -eq 1 ]; then
echo "MYSQL STATE"
echo "==========="
echo -e " Current role : ${bold}$MYSQL_ROLE${normal} \t\t Read-only : ${bold}$MYSQL_READONLY${normal}"
echo -e " Preferred role : ${bold}$PREFER_ROLE${normal} \t\t DB Uptime : ${bold}$MYSQL_UPTIME${normal}"
if [ $CURRENT_MYSQL_ROLE == 'Slave' ]; then
echo -e " Replication state : ${bold}$REPLICATION_STATUS${normal} \t Current Master : ${bold}$MYSQL_MASTER${normal}"
else
echo -e " Slave Hosts(s) ID : "
for i in $SLAVE_HOSTS; do
echo -e " - ${bold}$i${normal} \t"; done
fi
echo
fi
Elija uno de los roles de MySQL, ya sea maestro o esclavo en la línea 8 o 9 y guarde el script. Este script requiere un archivo de opciones de MySQL para almacenar las credenciales de usuario de la base de datos, por lo que primero debemos crearlo:
$ vim ~/.my.cnf
Y agregue las siguientes líneas:
[client]
user=root
password='YourRootP4ssw0rd'
Reemplace la parte de la contraseña con la contraseña raíz real de MySQL. Luego, aplique el permiso ejecutable al script:
$ chmod 755 ~/.motd.sh
Pruebe el script ejecutable si produce el resultado correcto o no:
$ ~/.motd.sh
Si el resultado se ve bien (sin errores ni advertencias), agregue el script en ~/.bash_profile para que se cargue automáticamente cuando un usuario inicie sesión:
$ whoami
root
$ echo '~/.motd.sh' >> ~/.bash_profile
Vuelva a iniciar sesión en el terminal y debería ver algo como esto en el maestro:
Mientras esté en el esclavo, debería ver algo como esto:
Tenga en cuenta que este script está escrito específicamente para MySQL/MariaDB simple- replicación maestro-esclavo de nivel. Probablemente tenga que modificar el script si tiene una configuración más compleja o si desea utilizar otra tecnología de agrupación en clústeres de MySQL como Galera Cluster, Group Replication o NDB Cluster. La idea es recuperar el estado del nodo de la base de datos y la información justo cuando iniciamos sesión para que sepamos el estado actual del servidor de la base de datos en el que estamos trabajando.
Sensores y Temperatura
Esta parte suele ser ignorada por muchos administradores de sistemas. Monitorear las temperaturas es crucial ya que no queremos llevarnos una gran sorpresa si el servidor se comporta de manera inesperada cuando se sobrecalienta. Un servidor físico comúnmente consta de cientos de partes electrónicas pegadas en una caja y son sensibles a los cambios de temperatura. Un ventilador de enfriamiento defectuoso podría aumentar la temperatura de la CPU hasta alcanzar su límite máximo, lo que finalmente hace que el reloj de la CPU se acelere y afecte el rendimiento del procesamiento de datos en general.
Podemos usar el paquete lm-sensors para este propósito. Para instalarlo, simplemente haga:
$ yum install lm-sensors # apt-get install lm-sensors for APT
Luego, ejecute el programa de detección de sensores para determinar automáticamente qué módulos del kernel necesita cargar para usar lm_sensors con mayor eficacia:
$ sensors-detect
Responde todas las preguntas (normalmente acepta todas las respuestas sugeridas). Algunos hosts, como máquinas virtuales o contenedores, no admiten este módulo. Los sensores realmente necesitan estar al nivel de los hosts (bare-metal). Consulte esta lista para obtener más información.
Luego, ejecute el comando de sensores:
$ sensors
i350bb-pci-0203
Adapter: PCI adapter
loc1: +53.0°C (high = +120.0°C, crit = +110.0°C)
power_meter-acpi-0
Adapter: ACPI interface
power1: 4.29 MW (interval = 1.00 s)
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +55.0°C (high = +85.0°C, crit = +95.0°C)
Core 0: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 1: +51.0°C (high = +85.0°C, crit = +95.0°C)
Core 2: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 3: +51.0°C (high = +85.0°C, crit = +95.0°C)
Core 4: +49.0°C (high = +85.0°C, crit = +95.0°C)
Core 5: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 8: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 9: +49.0°C (high = +85.0°C, crit = +95.0°C)
Core 10: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 11: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 12: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 13: +49.0°C (high = +85.0°C, crit = +95.0°C)
coretemp-isa-0001
Adapter: ISA adapter
Package id 1: +53.0°C (high = +85.0°C, crit = +95.0°C)
Core 0: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 1: +48.0°C (high = +85.0°C, crit = +95.0°C)
Core 2: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 3: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 4: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 5: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 8: +47.0°C (high = +85.0°C, crit = +95.0°C)
Core 9: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 10: +45.0°C (high = +85.0°C, crit = +95.0°C)
Core 11: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 12: +46.0°C (high = +85.0°C, crit = +95.0°C)
Core 13: +46.0°C (high = +85.0°C, crit = +95.0°C)
El resultado anterior muestra la temperatura general de la CPU, junto con cada núcleo de la CPU. Otra herramienta que podemos usar para ver el estado general de los componentes del servidor es ipmitool. Para instalar, simplemente haga:
$ yum -y install ipmitool
Al ejecutar el siguiente comando, podemos saber el estado general de los componentes físicos en el servidor:
$ ipmitool sdr list full
Inlet_Temp | 20 degrees C | ok
PCIe_Inlet_Temp | 37 degrees C | ok
Outlet_Temp | 20 degrees C | ok
CPU0_VR_Temp | 39 degrees C | ok
CPU1_VR_Temp | 41 degrees C | ok
CPU0_Temp | 55 degrees C | ok
CPU1_Temp | 52 degrees C | ok
PCH_Temp | 58 degrees C | ok
DIMMG0_Temp | 35 degrees C | ok
DIMMG1_Temp | 32 degrees C | ok
PSU0_Temp | 0 degrees C | ok
PSU1_Temp | 0 degrees C | ok
SYS_3.3V | 3.30 Volts | ok
SYS_5V | 5 Volts | ok
SYS_12V | 12.10 Volts | ok
CPU0_VCORE | 1.79 Volts | ok
CPU1_VCORE | 1.79 Volts | ok
CPU0_DDR_VDD | 1.23 Volts | ok
CPU1_DDR_VDD | 1.23 Volts | ok
SYS_FAN1_Speed | 4018 RPM | ok
SYS_FAN2_Speed | 4116 RPM | ok
SYS_FAN3_Speed | 4116 RPM | ok
SYS_FAN4_Speed | 4116 RPM | ok
SYS_FAN5_Speed | 4018 RPM | ok
SYS_FAN6_Speed | 4116 RPM | ok
SYS_FAN7_Speed | 4018 RPM | ok
SYS_FAN8_Speed | 4116 RPM | ok
SYS_FAN9_Speed | 4018 RPM | ok
SYS_FAN10_Speed | 4116 RPM | ok
SYS_FAN11_Speed | 4116 RPM | ok
SYS_FAN12_Speed | 4116 RPM | ok
SYS_FAN13_Speed | 4116 RPM | ok
SYS_FAN14_Speed | 4214 RPM | ok
Airflow_rate | 16 CFM | ok
PSU1_PIN | 0 Watts | ok
PSU2_PIN | 0 Watts | ok
PSU1_POUT | 0 Watts | ok
PSU2_POUT | 0 Watts | ok
PSU1_IIN | 0 Amps | ok
PSU2_IIN | 0 Amps | ok
PSU1_VIN | 0 Volts | ok
PSU2_VIN | 0 Volts | ok
CPU_Power | 63 Watts | ok
MEM_Power | 8 Watts | ok
Total_Power | 0 Watts | ok
BP_Power | 8 Watts | ok
FAN_Power | 6 Watts | ok
MB_Power | 0 Watts | ok
La lista es larga pero se explica por sí misma y debería poder supervisar el estado general de los componentes del servidor. Puede haber casos en los que algunos de los ventiladores no funcionen a toda velocidad, lo que aumenta la temperatura de la CPU. Es posible que sea necesario reemplazar el hardware para solucionar el problema.
Tenga en cuenta que el módulo de kernel de la interfaz de administración de plataforma inteligente (IPMI) requiere que el controlador de administración de placa base (BMC) esté habilitado en la placa base. Usa dmesg para verificar si está disponible:
$ dmesg | grep -i bmc
[ 8.063470] ipmi_si IPI0001:00: Found new BMC (man_id: 0x000000, prod_id: 0x02f3, dev_id: 0x20)
De lo contrario, verifique la configuración del BIOS del servidor si este controlador está deshabilitado.
Eso es todo por ahora. La segunda parte de esta serie de blogs cubrirá los 5 temas restantes, como la configuración de la herramienta de copia de seguridad, las pruebas de esfuerzo y el bloqueo del servidor.