timorunge.proxysql
proxysql
Actualmente, este rol no es compatible con ProxySQL >= v2.0.1.
Este rol solo es compatible con Ansible 2.7.9 o superior debido a un error en la migración de MySQLdb a PyMySQL (#40123) en el módulo MySQL utils.
La versión 0.3.0 es compatible con Ansible 2.7.0 o inferior.
Este rol instala y configura ProxySQL - un proxy de alto rendimiento, alta disponibilidad y que maneja protocolos para MySQL.
Desde la versión 2.3.0, Ansible ofrece un módulo para configurar ProxySQL. Este rol de Ansible utiliza esta funcionalidad, pero añade algunas características (esperemos que útiles):
- Instalación automática para diferentes sistemas operativos
- (Pre-) generación de proxysql.cnf
- Gestionar un ProxySQL-Cluster (con un módulo personalizado que añade funcionalidad para configurar servidores ProxySQL)
- Diferenciar entre
global_variables
dinámicos y estáticos - reiniciar ProxySQL si es necesario
Por favor, también revisa la sección "Problemas conocidos o: Buenas prácticas" en este documento.
Requisitos
Este rol requiere Ansible 2.5.0 o superior.
Puedes usar pip para instalar (y definir) una versión estable:
pip install ansible==2.7.9
Todos los requisitos de plataforma están listados en el archivo de metadatos.
Instalación
ansible-galaxy install timorunge.proxysql
Variables del rol
Las variables que se pueden pasar a este rol. Para todas las variables, consulta defaults/main.yml.
# Habilitar / deshabilitar ProxySQL como un servicio.
# Tipo: Bool
proxysql_service_enabled: True
# Reiniciar ProxySQL si cambian variables estáticas. Para una lista de variables estáticas, revisa `proxysql_non_dynamic_variables` en `vars/main.yml`.
# Tipo: Bool
proxysql_restart_on_static_variables_change: True
# Repositorio
# Si tanto `proxysql_use_official_repo` como `proxysql_use_percona_repo` están configurados en `False`, el módulo descargará automáticamente la versión definida de `proxysql_version` como un paquete de Github e instalará la misma.
# Utilizar el repositorio oficial de ProxySQL.
# Tipo: Bool
proxysql_use_official_repo: True
# Utilizar el repositorio de Percona.
# Tipo: Bool
proxysql_use_percona_repo: False
# Definir la versión del repositorio para el repositorio de Percona.
# Tipo: Str
proxysql_percona_release: latest
# La versión de ProxySQL que se debe instalar si no se utiliza el repositorio de ProxySQL.
# Tipo: Int
proxysql_version: 1.4.15
# Configuración
# La ruta donde ProxySQL debe guardar su base de datos y registros.
# Tipo: Str
proxysql_datadir: /var/lib/proxysql
# Define la plantilla de proxysql.cnf
# Tipo: Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2
# Define la plantilla de proxysql-admin.cnf
# Tipo: Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2
# Las variables de inicio de sesión para la configuración de ProxySQL. Se utilizan solo dentro del archivo `main.yml` y aquí para simplificar la configuración.
# Tipo: Str
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
# Variables globales
# `admin_variables` en `proxysql_global_variables_kv`: contiene variables globales que controlan la funcionalidad de la interfaz de administración.
# `admin_variables` están precedidas por `admin-`.
# `mysql_variables`: en `proxysql_global_variables_kv` contiene variables globales que controlan la funcionalidad para manejar el tráfico MySQL entrante.
# `mysql_variables` están precedidas por `mysql-`.
# Las variables deben ser un string o un entero. Debes marcar un valor booleano como un string, por ejemplo "True" o "False".
# Para una referencia completa consulta:
# https://github.com/sysown/proxysql/wiki/Global-variables
# Formato:
# Tipo: Dict
# proxysql_global_variables:
# load_to_runtime: "True"
# save_to_disk: "True"
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
proxysql_global_variables:
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
# Formato:
# Tipo: Dict
# proxysql_global_variables_kv:
# clave: valor
# p.ej.:
# proxysql_global_variables_kv:
# admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
# admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
# mysql-interfaces: 0.0.0.0:6033
# mysql-commands_stats: "True"
# mysql-threads: 4
proxysql_global_variables_kv: {}
# Servidores de backend
# `proxysql_backend_servers`: contiene filas de la tabla mysql_servers de la interfaz de administración. Básicamente, estos definen los servidores de backend hacia los cuales se enruta el tráfico MySQL entrante.
# Para una referencia completa consulta:
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Importante: Este módulo utiliza `hostgroup` (que es el nombre correcto en la base de datos) en lugar de `hostgroup_id` (que es el valor predeterminado en el módulo de Ansible)!
# Formato:
# Tipo: Dict
# proxysql_backend_servers:
# mysql-srv1-hg1:
# comment: mysql-srv1-hg1
# hostgroup: 1
# hostname: 172.16.77.101
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 1000
# max_replication_lag: 0
# status: ONLINE
# weight: 1
# mysql-srv1-hg2:
# comment: mysql-srv1-hg2
# hostgroup: 2
# hostname: 172.16.77.101
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 1000
# max_replication_lag: 0
# status: ONLINE
# weight: 1
proxysql_backend_servers: {}
# Servidores ProxySQL
# `proxysql_proxysql_servers`: contiene filas para la tabla proxysql_servers de la interfaz de administración. Básicamente, estos definen los servidores ProxySQL que se utilizan para el clustering.
# Para una referencia completa consulta:
# `library/proxysql_proxysql_servers.py`, ya que no es parte del paquete oficial de Ansible.
# Formato:
# Tipo: Dict
# proxysql_proxysql_servers:
# proxysql-srv-1:
# comment: proxysql-srv-1
# hostname: 172.16.77.201
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# weight: 0
# proxysql-srv-2:
# comment: proxysql-srv-2
# hostname: 172.16.77.202
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# weight: 0
proxysql_proxysql_servers: {}
# Grupos de host de replicación
# `proxysql_replication_hostgroups`: representan un par de writer_hostgroup y reader_hostgroup. ProxySQL monitorizará el valor de read_only para todos los servidores en los grupos de host especificados y, según el valor de read_only, asignará el servidor a los grupos de hosts de escritura o lectura.
# Para una referencia completa consulta:
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html
# Formato:
# Tipo: Dict
# proxysql_replication_hostgroups:
# Cluster:
# comment: Cluster
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# reader_hostgroup: 2
# writer_hostgroup: 1
proxysql_replication_hostgroups: {}
# Usuarios
# `proxysql_mysql_users`: contiene filas para la tabla mysql_users de la interfaz de administración. Básicamente, estos definen los usuarios que pueden conectarse al proxy y los usuarios con los que el proxy puede conectarse a los servidores de backend.
# Para una referencia completa consulta:
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html
# Formato:
# Tipo: Dict
# proxysql_mysql_users:
# user1:
# active: 1
# backend: 1
# default_hostgroup: 1
# fast_forward: 0
# frontend: 1
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 10000
# password: Passw0rd
# transaction_persistent: 1
# username: user1
# user2:
# active: 1
# backend: 1
# default_hostgroup: 2
# fast_forward: 0
# frontend: 1
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# max_connections: 1000
# password: dr0wssaP
# transaction_persistent: 1
# username: user2
proxysql_mysql_users: {}
# Reglas de consulta
# `proxysql_query_rules` contiene filas para la tabla mysql_query_rules desde la interfaz de administración. Básicamente, estas definen las reglas utilizadas para clasificar y enrutar el tráfico MySQL entrante, según varios criterios (patrones coincidentes, usuario que ejecuta la consulta, etc.).
# Para una referencia completa consulta:
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html
# Formato:
# Tipo: Dict
# proxysql_query_rules:
# catchall:
# active: 1
# apply: 1
# destination_hostgroup: 1
# flagIN: 0
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# match_pattern: .*@.*
# negate_match_pattern: 0
# rule_id: 1
# selectforupdate:
# active: 1
# apply: 1
# destination_hostgroup: 1
# flagIN: 0
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# match_pattern: ^SELECT.*FOR UPDATE
# negate_match_pattern: 0
# rule_id: 2
# select:
# active: 1
# apply: 0
# destination_hostgroup: 2
# flagIN: 0
# login_host: "{{ proxysql_login_admin_host }}"
# login_password: "{{ proxysql_login_admin_password }}"
# login_port: "{{ proxysql_login_admin_port }}"
# login_user: "{{ proxysql_login_admin_user }}"
# match_pattern: ^SELECT.*
# negate_match_pattern: 0
# rule_id: 3
proxysql_query_rules: {}
# Herramienta de administración de Percona ProxySQL
# La solución ProxySQL Admin (proxysql-admin) configura los nodos del clúster Percona XtraDB en ProxySQL.
# Para una referencia completa consulta:
# https://github.com/percona/proxysql-admin-tool
# Formato:
# Tipo: Dict
# proxysql_percona_admin_tool:
# PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
# PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
# PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
# PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
# PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"
# CLUSTER_USERNAME: admin
# CLUSTER_PASSWORD: admin
# CLUSTER_HOSTNAME: localhost
# CLUSTER_PORT: 3306
# MONITOR_USERNAME: monitor
# MONITOR_PASSWORD: monit0r
# CLUSTER_APP_USERNAME: proxysql_user
# CLUSTER_APP_PASSWORD: passw0rd
# WRITE_HOSTGROUP_ID: 10
# READ_HOSTGROUP_ID: 11
# MODE: singlewrite
proxysql_percona_admin_tool:
PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"
Ejemplos
1) Ejemplo completo de configuración
Aquí puedes ver un ejemplo completo de configuración de ProxySQL. En este caso, el rol descargará el paquete 1.4.15
directamente y no usará el repositorio (proxysql_use_official_repo
está configurado en False
).
Esto es básicamente (con algunos pequeños cambios) el archivo test.yml que se utiliza para las pruebas.
- hosts: proxysql
gather_facts: True
vars:
proxysql_version: 1.4.15
proxysql_service_enabled: True
proxysql_use_official_repo: True
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
proxysql_global_variables:
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
proxysql_global_variables_kv:
admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
mysql-commands_stats: "True"
mysql-connect_retries_on_failure: 10
mysql-connect_timeout_server: 3000
mysql-default_charset: utf8
mysql-default_query_delay: 0
mysql-default_query_timeout: 300000
mysql-default_schema: information_schema
mysql-default_sql_mode: >
STRICT_TRANS_TABLES,
ERROR_FOR_DIVISION_BY_ZERO,
NO_AUTO_CREATE_USER,
NO_ENGINE_SUBSTITUTION
mysql-interfaces: 127.0.0.1:6033
mysql-max_connections: 8192
mysql-monitor_read_only_interval: 1500
mysql-monitor_read_only_timeout: 500
mysql-ping_timeout_server: 500
mysql-poll_timeout: 2000
mysql-query_retries_on_failure: 1
mysql-sessions_sort: "True"
mysql-threads: 4
proxysql_backend_servers:
mysql-srv1-hg1:
comment: mysql-srv1-hg1
hostgroup: 1
hostname: 172.16.77.101
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 1000
max_replication_lag: 0
status: ONLINE
weight: 1
mysql-srv1-hg2:
comment: mysql-srv1-hg2
hostgroup: 2
hostname: 172.16.77.101
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 1000
max_replication_lag: 0
status: ONLINE
weight: 1
mysql-srv2-hg2:
comment: mysql-srv2-hg2
hostgroup: 2
hostname: 172.16.77.102
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 2000
max_replication_lag: 5
status: ONLINE
weight: 1
mysql-srv3-hg2:
comment: mysql-srv3-hg2
hostgroup: 2
hostname: 172.16.77.103
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 2000
max_replication_lag: 5
status: OFFLINE_HARD
weight: 1
proxysql_proxysql_servers:
proxysql-srv-1:
comment: proxysql-srv-1
hostname: 172.16.77.201
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
port: 6032
weight: 0
proxysql-srv-2:
comment: proxysql-srv-2
hostname: 172.16.77.202
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
port: 6032
weight: 0
proxysql_replication_hostgroups:
Cluster:
comment: Cluster
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
reader_hostgroup: 2
writer_hostgroup: 1
proxysql_mysql_users:
user1:
active: 1
backend: 1
default_hostgroup: 1
fast_forward: 0
frontend: 1
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 10000
password: Passw0rd
transaction_persistent: 1
username: user1
user2:
active: 1
backend: 1
default_hostgroup: 1
fast_forward: 0
frontend: 1
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
max_connections: 1000
password: dr0wssaP
transaction_persistent: 1
username: user2
proxysql_query_rules:
catchall:
active: 1
apply: 1
destination_hostgroup: 1
flagIN: 0
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
match_pattern: .*@.*
negate_match_pattern: 0
rule_id: 1
selectforupdate:
active: 1
apply: 1
destination_hostgroup: 1
flagIN: 0
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
match_pattern: ^SELECT.*FOR UPDATE
negate_match_pattern: 0
rule_id: 2
select:
active: 1
apply: 0
destination_hostgroup: 2
flagIN: 0
login_host: "{{ proxysql_login_admin_host }}"
login_password: "{{ proxysql_login_admin_password }}"
login_port: "{{ proxysql_login_admin_port }}"
login_user: "{{ proxysql_login_admin_user }}"
match_pattern: ^SELECT.*
negate_match_pattern: 0
rule_id: 3
roles:
- timorunge.proxysql
2) Instalación desde el repositorio oficial
Usa el repositorio ProxySQL (proxysql_use_official_repo
está configurado en True
). ProxySQL en sí no proporciona paquetes en el repositorio para Ubuntu > 16.04.
Solo establece proxysql_use_official_repo
en False
para versiones más nuevas de Ubuntu o usa el repositorio de Percona.
Consulta la sección de pruebas para la cobertura del repositorio oficial.
- hosts: proxysql
vars:
proxysql_use_official_repo: True
proxysql_use_percona_repo: False
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
3) Instalación desde el repositorio de Percona
Usa el repositorio ProxySQL (proxysql_use_percona_repo
está configurado en True
).
Consulta la sección de pruebas para la cobertura del repositorio de Percona.
- hosts: proxysql
vars:
proxysql_use_official_repo: False
proxysql_use_percona_repo: True
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
4) Instalación desde un paquete deb o rpm
Puedes instalar ProxySQL directamente desde un lanzamiento de GitHub. Solo define la proxysql_version
. Establece proxysql_use_official_repo
y proxysql_use_percona_repo
en False
.
- hosts: proxysql
vars:
proxysql_version: 1.4.15
proxysql_use_official_repo: False
proxysql_use_percona_repo: False
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
5) No reiniciar ProxySQL después de un cambio de variable estática
Si deseas reiniciar ProxySQL por tu cuenta después de un cambio de configuración de variables estáticas, debes establecer proxysql_restart_on_static_variables_change
en False
.
En este caso, estás enfrentando un problema conocido que no es un drama. En este caso, las pruebas de idempotencia fallarán.
No necesitas aplicar Ansible nuevamente después de un reinicio manual.
- hosts: proxysql
vars:
proxysql_use_official_repo: False
proxysql_restart_on_static_variables_change: False
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin
...
Problemas conocidos o: Buenas prácticas
1) ProxySQL > 1.4.7 en Ubuntu 16.04 (arreglado)
En Ubuntu 16.04, Ansible (la versión no importa) / ProxySQL > 1.4.7 parece tener problemas para comunicarse correctamente a través de mysql-python
/ python-mysqldb
.
Error de ejemplo:
"unable to modify server.. (1045, 'unrecognized token: \"\\'\\n AND compression = 0\\n AND weight = 1\\n AND use_ssl = 0\\n AND max_connections = 2000\\n AND max_latency_ms = 0\\n AND max_replication_lag = 5\"')"
Nota:
He hecho una pequeña investigación con mysql-python
instalado a través de pip
en Ubuntu 16.04. No te preocupes, también falla con python-mysqldb
.
En la biblioteca python MySQLdb, el método execute
(clase BaseCursor
) genera una consulta de la siguiente manera:
query = query % tuple([db.literal(item) for item in args])
db.literal
es parte de la clase Connection
y devuelve objetos individuales como un string y múltiples objetos como una secuencia mientras convierte cada secuencia también.
def literal(self, o):
# ...
return self.escape(o, self.encoders)
self.escape
debería escapar todos los caracteres especiales en el objeto dado y está utilizando un diccionario de mapeo para proporcionar funciones de comillas para cada tipo. Este es self.encoders
que - por defecto y sin establecer diferente - utiliza MySQLdb.converters
.
El mapeo para un string es StringType: Thing2Literal
. Así que el string será escapado con el método Thing2Literal
.
def Thing2Literal(o, d):
# ...
return string_literal(o, d)
string_literal
debería convertir nuestro objeto string en un literal de cadena SQL. Esto significa que todos los caracteres especiales de SQL están escapados y está encerrado en comillas simples. En otras palabras, realiza:
"'%s'" % escape_string(str(obj))
Al escapar el string, los objetos string se eliminan y devuelven solo una comilla simple ('
).
Como en las pruebas no se cambió nada más que la versión de ProxySQL, asumo que un cambio en ProxySQL (diff 1.4.7 vs. 1.4.8) está causando que Ansible falle. Porque ProxySQL en sí - si no se activa a través de Ansible - funciona perfectamente bien.
Por último...
Este problema se soluciona instalando mysqlclient - que es un fork de MySQLdb - a través de pip.
2) Paquetes para Ubuntu > 16.04 (arreglado)
ProxySQL en sí no está proporcionando paquetes "actualizados" para Ubuntu > 16.04. Este rol de Ansible trabaja alrededor de esto descargando la versión de 16.04 para Ubuntu > 16.04 e instalando la misma (este comportamiento puede cambiar en el futuro).
Hay una dependencia de paquete para libcrypto++6
y libssl1.0.0
a partir de Ubuntu >= 18.04 (lo cual se resuelve automáticamente).
3) Variables globales no dinámicas
ProxySQL tiene algunas global_variables
que no se pueden cambiar durante el tiempo de ejecución (ver proxysql_non_dynamic_variables
en vars/main.yml). Dicho esto, esto por sí mismo no es un problema, ya que este rol de ProxySQL se encarga (generando proxysql.cnf
) y proporciona la posibilidad de reiniciar automáticamente si tal variable cambia (establecer proxysql_restart_on_static_variables_change
en True
).
Este rol también está configurando este valor en la base de datos de ProxySQL y aquí comienza el problema:
Si cambias más de un valor estático, técnicamente todo está bien. ProxySQL se reinicia y toma el nuevo valor de proxysql.cnf
. Pero solo el primer valor se cambia en la base de datos.
No es un "gran problema" ya que el valor real se toma correctamente del archivo de configuración, pero verás un conjunto de cambios en la siguiente ejecución de Ansible que:
- Reiniciará ProxySQL una vez más
- Las pruebas de idempotencia fallarán (si no estás iniciando desde cero)
Una solución potencial podría ser no establecer proxysql_non_dynamic_variables
en la base de datos de ProxySQL.
4) Clustering de ProxySQL
El clustering de ProxySQL todavía es experimental. Una cita de la documentación de clustering: "debido a que esta característica sigue siendo experimental, la tabla no se carga automáticamente desde el disco".
Para la inicialización desde el proxysql.cnf
es importante que se definan hostname
(obviamente) y port
(no toma el valor predeterminado).
5) ProxySQL y el repositorio de Percona en CentOS...
...no funciona debido a algunos problemas de dependencia.
Técnicamente necesitamos los siguientes paquetes para aplicar Ansible correctamente:
proxysql_dependency_pkgs:
- MySQL-python
- mysql
Con el repositorio de Percona habilitado, las dependencias de paquetes para MySQL-python
y mysql
chocan.
yum install MySQL-python
...
============================================================================================
Paquete Arch Versión Repositorio Tamaño
============================================================================================
Instalando:
MySQL-python x86_64 1.2.5-1.el7 base 90 k
Instalando para dependencias:
Percona-Server-shared-56 x86_64 5.6.43-rel84.3.el7 percona-release-x86_64 619 k
Resumen de transacción
============================================================================================
Instalar 1 Paquete (+1 Paquete Dependiente)
yum install mysql
...
============================================================================================
Paquete Arch Versión Repositorio Tamaño
============================================================================================
Instalando:
Percona-Server-client-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 6.8 M
Instalando para dependencias:
Percona-Server-shared-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 748 k
Percona-Server-shared-compat-57 x86_64 5.7.24-27.1.el7 percona-release-x86_64 1.2 M
Resumen de transacción
============================================================================================
Instalar 1 Paquete (+2 Paquetes Dependientes)
Como puedes ver, MySQL-python
depende de Percona-Server-shared-56
mientras que mysql
depende de Percona-Server-shared-57
.
Pruebas
Las pruebas se realizan con Docker y docker_test_runner que levantan los siguientes contenedores con diferentes configuraciones ambientales:
- CentOS 7
- Debian 9 (Stretch)
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 18.04 (Bionic Beaver)
Ansible 2.7.9 está instalado en todos los contenedores y se aplica un playbook de prueba.
Para más detalles y comprobaciones adicionales, consulta la configuración de docker_test_runner y el punto de entrada de Docker. Una visión general a alto nivel se puede encontrar en la siguiente tabla:
Distribución | Versión | Repositorio oficial | Repositorio de Percona | Paquete |
---|---|---|---|---|
CentOS | 7 | sí | no | 1.4.15 |
Debian | 9 | sí | sí | 1.4.15 |
Ubuntu | 16.04 | sí | sí | 1.4.15 |
Ubuntu | 18.04 | no | sí | 1.4.15 |
# Pruebas locales:
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml
Dado que el tiempo de construcción en Travis está limitado para los repositorios públicos, las pruebas automáticas están limitadas a:
- CentOS 7
- Debian 8 (Jessie)
- Debian 9 (Stretch)
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 18.04 (Bionic Beaver)
Dependencias
- proxysql_proxysql_servers.py que se añade a la carpeta de la biblioteca de este rol.
Licencia
Licencia BSD 3-Cláusulas "Nueva" o "Revisada"
Información del autor
- Timo Runge
This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.
ansible-galaxy install timorunge.proxysql