En la publicación de blog anterior, hemos cubierto 4 componentes básicos de administración utilizando el cliente de línea de comandos MaxCtrl. En esta publicación de blog, cubriremos la parte restante de los componentes de MaxScale que se usan comúnmente en un clúster de MariaDB:
- Gestión de filtros
- Administración de MaxScale
- Gestión de registros
Todos los comandos de esta publicación de blog se basan en MaxScale 2.5.3.
Administración de filtros
El filtro es un módulo en MaxScale que actúa como motor de procesamiento y enrutamiento para un servicio MaxScale. El filtrado se produce entre la conexión del cliente a MaxScale y la conexión de MaxScale a los servidores de base de datos back-end. Esta ruta (el lado del cliente de MaxScale hacia los servidores de bases de datos reales) se puede considerar una canalización, luego se pueden colocar filtros en esa canalización para monitorear, modificar, copiar o bloquear el contenido que fluye a través de ella.
Hay muchos filtros que se pueden aplicar para ampliar las capacidades de procesamiento de un servicio de MaxScale, como se muestra en la siguiente tabla:
Nombre del filtro | Descripción |
Binlog | Replica selectivamente los eventos de registro binario a servidores esclavos combinados con un servicio binlogrouter. |
Caché | Un caché simple que es capaz de almacenar en caché el resultado de SELECT, de modo que MaxScale sirve directamente SELECT idénticos posteriores, sin que las consultas se enruten a ninguna servidor. |
Lectura crítica consistente | Permite que se realicen lecturas críticas consistentes a través de MaxScale al mismo tiempo que permite escalar horizontalmente las lecturas no críticas. |
Cortafuegos de base de datos | Bloquea las consultas que coinciden con un conjunto de reglas. Este filtro debe verse como una solución de mejor esfuerzo destinada a proteger contra el uso indebido accidental en lugar de ataques maliciosos. |
Sugerencia | Agrega sugerencias de enrutamiento a un servicio, indicando al enrutador que enrute una consulta a cierto tipo de servidor. |
Insertar transmisión | Convierte inserciones masivas en flujos de datos CSV que consume el servidor backend a través del mecanismo LOAD DATA LOCAL INFILE |
Lua | Llama a un conjunto de funciones en un script Lua. |
Enmascaramiento | Oculta el valor devuelto de una columna en particular |
Maxrows | Restringir el número de filas que un SELECT, una declaración preparada o un procedimiento almacenado podría devolver a la aplicación cliente. |
Servidor con nombre | Dirige las consultas a los servidores en función de las coincidencias de expresiones regulares (regex). |
Consultar todo el registro | Registra el contenido de la consulta en un archivo en formato CSV. |
Regex | Reescribe el contenido de la consulta utilizando coincidencias de expresiones regulares y sustitución de texto. |
Camiseta | Haga copias de las solicitudes del cliente y envíe las copias a otro servicio dentro de MariaDB MaxScale. |
Acelerador | Reemplaza y amplía la funcionalidad limit_queries del filtro de firewall de base de datos |
Arriba | Supervisa el rendimiento de la consulta de la instrucción SQL seleccionada que pasa por el filtro. |
Supervisión del rendimiento de transacciones | Supervisa cada instrucción SQL que pasa por el filtro, agrupada por transacción, para el análisis del rendimiento de la transacción. |
Crear un filtro
Cada filtro MaxScale tiene su propia forma de configurarse. En este ejemplo, vamos a crear un filtro de enmascaramiento para enmascarar nuestros datos confidenciales para la columna "card_no" en nuestra tabla "credit_cards". El enmascaramiento requiere un archivo de reglas, escrito en formato JSON. En primer lugar, cree un directorio para alojar nuestros archivos de reglas:
$ mkdir /var/lib/maxscale/rules
Luego, crea un archivo de texto:
$ vi /var/lib/maxscale/rules/masking.json
Especifique las líneas de la siguiente manera:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Las reglas simples anteriores simplemente ofuscarán la salida de la columna card_no para cualquier tabla, para proteger los datos confidenciales para que los vea el cliente MariaDB.
Después de que se haya creado el archivo de reglas, podemos crear el filtro usando el siguiente comando:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Tenga en cuenta que algunos filtros requieren parámetros diferentes. En cuanto a este filtro de enmascaramiento, el parámetro básico es "reglas", donde debemos especificar el archivo de regla de enmascaramiento creado en formato JSON.
Adjuntar un filtro a un servicio
Un filtro solo se puede activar asociándolo a un servicio. La modificación de un servicio existente usando MaxCtrl solo es compatible con algunos parámetros, y agregar un filtro no es uno de ellos. Tenemos que agregar el componente de filtro en el archivo de configuración del servicio de MaxScale para adjuntar básicamente el filtro. En este ejemplo, vamos a aplicar el filtro "Tarjeta ofuscada" a nuestro servicio rotativo existente llamado rr-service.
Vaya al directorio /var/lib/maxscale/maxscale.cnf.d y busque rr-service.cnf, ábralo con un editor de texto y luego agregue la siguiente línea:
filters=Obfuscates-card
Se requiere reiniciar MaxScale para cargar el nuevo cambio:
$ systemctl restart maxscale
Para probar el filtro, usaremos un cliente MariaDB y compararemos la salida conectándonos a dos servicios diferentes. Nuestro servicio rw está conectado a un oyente que escucha en el puerto 3306, sin ningún filtro configurado. Por lo tanto, deberíamos ver la respuesta sin filtrar de MaxScale:
$ mysql -ucard_user -p -hmaxscale_host -p3306 -e "SELECT * FROM secure.credit_cards LIMIT 1"
+----+-----------+-----------------+-------------+-----------+---------+
| id | card_type | card_no | card_expiry | card_name | user_id |
+----+-----------+-----------------+-------------+-----------+---------+
| 1 | VISA | 425388910909238 | NULL | BOB SAGAT | 1 |
+----+-----------+-----------------+-------------+-----------+---------+
Al conectarse al servicio de escucha rr en el puerto 3307, que se configuró con nuestro filtro, nuestro valor "card_no" se ofusca con un resultado incomprensible:
$ mysql -ucard_user -p -hmaxscale_host -p3307 -e "SELECT * FROM secure.credit_cards LIMIT 1"
+----+-----------+-----------------+-------------+-----------+---------+
| id | card_type | card_no | card_expiry | card_name | user_id |
+----+-----------+-----------------+-------------+-----------+---------+
| 1 | VISA | ~W~p[=&^M~5f~~M | NULL | BOB SAGAT | 1 |
+----+-----------+-----------------+-------------+-----------+---------+
Este filtrado lo realiza MaxScale, siguiendo las reglas de coincidencia dentro de masking.json que hemos creado anteriormente.
Filtros de lista
Para listar todos los filtros creados, use el comando "listar filtros":
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
En los ejemplos anteriores, hemos creado 3 filtros. Sin embargo, solo el filtro Ofuscates-card está vinculado a un servicio.
Para mostrar todos los servicios en detalle:
maxctrl: show filters
O si desea mostrar un servicio en particular:
maxctrl: show filter Obfuscates-card
┌────────────┬──────────────────────────────────────────────────────┐
│ Filter │ Obfuscates-card │
├────────────┼──────────────────────────────────────────────────────┤
│ Module │ masking │
├────────────┼──────────────────────────────────────────────────────┤
│ Services │ rr-service │
├────────────┼──────────────────────────────────────────────────────┤
│ Parameters │ { │
│ │ "check_subqueries": true, │
│ │ "check_unions": true, │
│ │ "check_user_variables": true, │
│ │ "large_payload": "abort", │
│ │ "prevent_function_usage": true, │
│ │ "require_fully_parsed": true, │
│ │ "rules": "/var/lib/maxscale/rules/masking.json", │
│ │ "treat_string_arg_as_field": true, │
│ │ "warn_type_mismatch": "never" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Eliminar un filtro
Para eliminar un filtro, primero debe desvincularse de los servicios asociados. Por ejemplo, considere los siguientes filtros en MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
Para el filtro qla, simplemente podemos usar el siguiente comando para eliminarlo:
maxctrl: destroy filter qla
OK
Sin embargo, para el filtro de la tarjeta Ofuscates, debe desvincularse del servicio rr y, desafortunadamente, esto requiere una modificación del archivo de configuración y un reinicio de MaxScale. Vaya al directorio /var/lib/maxscale/maxscale.cnf.d y busque rr-service.cnf, ábralo con un editor de texto y luego elimine la siguiente línea:
filters=Obfuscates-card
También puede eliminar la cadena "Obfuscates-card" de la línea anterior y dejar que la línea "filters" sea igual a un valor vacío. Luego, guarde el archivo y reinicie el servicio MaxScale para cargar los cambios:
$ systemctl restart maxscale
Solo entonces podemos eliminar el filtro Ofuscates-card de MaxScale usando el comando "destroy filter":
maxctrl: destroy filter Obfuscates-card
OK
Administración de MaxScale
Lista de usuarios
Para enumerar todos los usuarios de MaxScale, use el comando "listar usuarios":
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Crear un usuario de MaxScale
De forma predeterminada, un usuario creado es un usuario de solo lectura:
maxctrl: create user dev mySecret
OK
Para crear un usuario administrador, especifique el comando --type=admin:
maxctrl: create user dba mySecret --type=admin
OK
Eliminar un usuario de MaxScale
Para eliminar un usuario, simplemente use el comando "destruir usuario":
maxctrl: destroy user dba
OK
El último usuario administrativo restante no se puede eliminar. Cree un usuario administrativo de reemplazo antes de intentar eliminar el último usuario administrativo.
Mostrar parámetros de MaxScale
Para mostrar todos los parámetros cargados para la instancia de MaxScale, use el comando "show maxscale":
maxctrl: show maxscale
┌──────────────┬──────────────────────────────────────────────────────────────────────┐
│ Version │ 2.5.3 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Commit │ de3770579523e8115da79b1696e600cce1087664 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Started At │ Mon, 21 Sep 2020 04:44:49 GMT │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Activated At │ Mon, 21 Sep 2020 04:44:49 GMT │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Uptime │ 1627 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Parameters │ { │
│ │ "admin_auth": true, │
│ │ "admin_enabled": true, │
│ │ "admin_gui": true, │
│ │ "admin_host": "127.0.0.1", │
│ │ "admin_log_auth_failures": true, │
│ │ "admin_pam_readonly_service": null, │
│ │ "admin_pam_readwrite_service": null, │
│ │ "admin_port": 8989, │
│ │ "admin_secure_gui": true, │
│ │ "admin_ssl_ca_cert": null, │
│ │ "admin_ssl_cert": null, │
│ │ "admin_ssl_key": null, │
│ │ "auth_connect_timeout": 10000, │
│ │ "auth_read_timeout": 10000, │
│ │ "auth_write_timeout": 10000, │
│ │ "cachedir": "/var/cache/maxscale", │
│ │ "connector_plugindir": "/usr/lib/x86_64-linux-gnu/mysql/plugin", │
│ │ "datadir": "/var/lib/maxscale", │
│ │ "debug": null, │
│ │ "dump_last_statements": "never", │
│ │ "execdir": "/usr/bin", │
│ │ "language": "/var/lib/maxscale", │
│ │ "libdir": "/usr/lib/x86_64-linux-gnu/maxscale", │
│ │ "load_persisted_configs": true, │
│ │ "local_address": null, │
│ │ "log_debug": false, │
│ │ "log_info": false, │
│ │ "log_notice": false, │
│ │ "log_throttling": { │
│ │ "count": 0, │
│ │ "suppress": 0, │
│ │ "window": 0 │
│ │ }, │
│ │ "log_warn_super_user": false, │
│ │ "log_warning": false, │
│ │ "logdir": "/var/log/maxscale", │
│ │ "max_auth_errors_until_block": 10, │
│ │ "maxlog": true, │
│ │ "module_configdir": "/etc/maxscale.modules.d", │
│ │ "ms_timestamp": true, │
│ │ "passive": false, │
│ │ "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
│ │ "piddir": "/var/run/maxscale", │
│ │ "query_classifier": "qc_sqlite", │
│ │ "query_classifier_args": null, │
│ │ "query_classifier_cache_size": 0, │
│ │ "query_retries": 1, │
│ │ "query_retry_timeout": 5000, │
│ │ "rebalance_period": 0, │
│ │ "rebalance_threshold": 20, │
│ │ "rebalance_window": 10, │
│ │ "retain_last_statements": 0, │
│ │ "session_trace": 0, │
│ │ "skip_permission_checks": false, │
│ │ "sql_mode": "default", │
│ │ "syslog": true, │
│ │ "threads": 1, │
│ │ "users_refresh_interval": 0, │
│ │ "users_refresh_time": 30000, │
│ │ "writeq_high_water": 16777216, │
│ │ "writeq_low_water": 8192 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
Modificar los parámetros de MaxScale
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- autenticación_admin
- admin_log_auth_failures
- pasivo
El resto de los parámetros deben configurarse dentro de /etc/maxscale.conf, lo que requiere un reinicio de MaxScale para aplicar los nuevos cambios.
GUI de MaxScale
MaxGUI es una nueva herramienta basada en navegador para configurar y administrar MaxScale, introducida en la versión 2.5. Se puede acceder a él a través del puerto 8989 del host MaxScale en la interfaz del host local, 127.0.0.1. De manera predeterminada, se requiere establecer admin_secure_gui=true y configurar los parámetros admin_ssl_key y admin_ssl_cert. Sin embargo, en esta publicación de blog, permitiremos la conectividad a través de HTTP simple agregando la siguiente línea en la directiva [maxctrl] dentro de /etc/maxscale.cnf:
admin_secure_gui = false
Reinicie el servicio MaxScale para cargar el cambio:
$ systemctl restart maxscale
Dado que la GUI está escuchando en la interfaz localhost, podemos usar túneles SSH para acceder a la GUI desde nuestra estación de trabajo local:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Luego, abra un navegador web, apunte la URL a http://127.0.0.1:8989/ e inicie sesión. MaxGUI usa las mismas credenciales que maxctrl, por lo que la contraseña predeterminada es "admin" con la contraseña "mariadb". Por motivos de seguridad, se debe crear un nuevo usuario administrador con una contraseña más segura específicamente para este propósito. Una vez que haya iniciado sesión, debería ver el panel de MaxGUI como se muestra a continuación:
La mayoría de los comandos de administración de MaxCtrl que hemos mostrado en esta serie de blogs pueden realizarse directamente desde esta GUI. Si hace clic en el botón "Crear nuevo", aparecerá el siguiente cuadro de diálogo:
Como puede ver, todos los componentes importantes de MaxScale se pueden administrar directamente desde la interfaz gráfica de usuario, con un aspecto agradable e intuitivo, hace que las cosas sean mucho más sencillas y fáciles de administrar. Por ejemplo, se puede asociar un filtro directamente desde la interfaz de usuario, sin necesidad de reiniciar el servicio MaxScale, como se muestra en la sección "Adjuntar un filtro a un servicio" en esta publicación de blog.
Para obtener más información sobre esta nueva GUI, consulte esta guía de MaxGUI.
Gestión de registros
Mostrar parámetros de registro
Para mostrar los parámetros de registro, use el comando "mostrar registro":
maxctrl: show logging
┌────────────────────┬────────────────────────────────┐
│ Current Log File │ /var/log/maxscale/maxscale.log │
├────────────────────┼────────────────────────────────┤
│ Enabled Log Levels │ alert │
│ │ error │
│ │ warning │
│ │ notice │
├────────────────────┼────────────────────────────────┤
│ Parameters │ { │
│ │ "highprecision": true, │
│ │ "log_debug": false, │
│ │ "log_info": false, │
│ │ "log_notice": true, │
│ │ "log_warning": true, │
│ │ "maxlog": true, │
│ │ "syslog": true, │
│ │ "throttling": { │
│ │ "count": 10, │
│ │ "suppress_ms": 10000, │
│ │ "window_ms": 1000 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Editar parámetros de registro
Todos los parámetros de registro, como se muestra arriba, se pueden configurar a través del comando MaxCtrl en tiempo de ejecución. Por ejemplo, podemos activar log_info usando el comando "alterar registro":
maxctrl: alter logging log_info true
Rotar registros
De forma predeterminada, MaxScale proporciona un archivo de configuración de rotación de registros en /etc/logrotate.d/maxscale_logrotate. Según la configuración de rotación de registros, el archivo de registro se rota mensualmente y utiliza el comando "rotar registros" de MaxCtrl. Podemos forzar que la rotación de registros ocurra inmediatamente con el siguiente comando:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Verifique con el siguiente comando:
$ ls -al /var/log/maxscale/
total 1544
drwxr-xr-x 2 maxscale maxscale 4096 Sep 21 05:53 ./
drwxrwxr-x 10 root syslog 4096 Sep 20 06:25 ../
-rw-r--r-- 1 maxscale maxscale 75 Sep 21 05:53 maxscale.log
-rw-r--r-- 1 maxscale maxscale 253250 Sep 21 05:53 maxscale.log.1
-rw-r--r-- 1 maxscale maxscale 1034364 Sep 18 06:25 maxscale.log.2
-rw-r--r-- 1 maxscale maxscale 262676 Aug 1 06:25 maxscale.log.3
Conclusión
Hemos llegado al final de la serie de implementación y administración de MaxScale utilizando el cliente MaxCtrl. En esta serie de blogs, hemos utilizado un par de versiones diferentes de MaxScale más recientes (en relación con la fecha de redacción) y hemos visto muchas mejoras significativas en cada versión.
Felicitaciones al equipo de MariaDB MaxScale por su arduo trabajo para hacer de MaxScale una de las mejores herramientas de balanceo de carga de bases de datos del mercado.