Paso a paso de como montar un cluster de MariaDB Maxscale para dotar resiliencia, HA y Balanceo a tus SQLs

Tenia esto post en mente desde hace tiempo, ya que llevo usando Maxscale desde hace tiempo y no se ha hablado mucho nunca de proxies de bases de datos, con lo que molan, jo.

Pues este es el post del proxy que yo creo que es mejor que SQLProxy, ya que aunque es mas lento, tiene mas funcionalidad que el otro, que es casi in HAProxy para SQL.

Que es Maxscale?

Pues en una palabra, es un proxy de bases de datos, que desde que los descubri el
año pasado, no paro de usarlo.

No solo eso, si no que poco a poco han ido añadiendo mas funciones, entre las que destacan por ejemplo:

  • Filtrado o Masking de datos
  • Router de Binlog

Yo lo vengo usando desde hace tiempo ya y he visto como se ha ido convirtiendo en parte imprescindible de mi stack de cluster de base de datos.

Las posibilidades que te da, como la de tener los servidores de MariaDB totalmente resguardados, asi como poder filtrar datos depende de que usuario acceda a ella ( hola GDPR! ) son basicas. Ademas, como te permite definir varios endpoints de bases de datos, yo tengo 2 bestias fisicas que corren multiples instancias de MariaDB, cada una en su puerto. Maxscale las redirije a cada una de ellas segund de donde entren, con lo que, cada entorno tiene su propio endpoint de acceso a la bd y yo los meto todos en varios servidores fisicos, vamos, el concepto BlackBox :)
(Te recomiendo que le eches un vistazo a la web, en la seccion de Links
mas abajo y veas las bondades de las que es capaz)

Yo aqui voy a explicar un poco como configurarlo para tener un nivel basico de cluster, ya que he visto poco o nada de Maxscale en nuestro idioma, casi todo en ingles.

Ingredientes

Tenemos 5 nodos:

  • maxscale-1
  • maxscale-2
  • mariadb-1
  • mariadb-2
  • mariadb-3

Tenemos 3 redes:

  • red publica de acceso a la bd > 10.10.0.0/24
  • red interna de datos > 192.168.0.0/24
  • red de gestion (si la quereis, que deberiais ) 10.100.0.0/24
  • una ip virtual gestionada por keepalived en los MAXSCALE
    *
    Este va a ser un manual de alto nivel, no voy a entrar en pormenores porque entiendo que para eso, esta al manual de maxscale. Es mas, lo siento pero cada vez estoy mas acostumbrado a no tocar ficheros de configuracion ni con un palo, asi que todo lo hago con Ansible, con lo cual, puede que explique como va la logica y luego ponga el Playbook :)

Diagrama

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
              +-------+
| VIP |
+-------+
+----------------------------------+
| | |
| +----------+ | +----------+ |
| | <--+ | | |
| | MAXSCALE | | MAXSCALE | |
| | MASTER | | SLAVE | |
| +----X-----+ +----------+ |
| X |
| XXXXXXXXXXXXXXXXXX |
| X X |
| +----X-----+ +----X-----+ |
| | | | | |
| | | | | |
| | | | | |
| | DB-1 | | DB-2 | |
| | | | | |
| | | | | |
| +----------+ +----------+ |
| |
+----------------------------------+

Proceso

  1. Instalamos el SO y el Maxscale, MariaDB, etc.
  2. Configuramos en los maxscale la ip virtual (vIP) con un MASTER y SLAVE usando keepalived
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived-dbproxy

global_defs {
lvs_id HOST.NAME
notification_email {
ME@HOST.NAME
}
notification_email_from FROM@HOST.NAME
smtp_server MAIL-RELAY.HOST.NAME
router_id MAXSCALE.HOST.NAME
}

vrrp_script chk_maxscale {
script "pidof maxscale"
interval 2
}

vrrp_instance <NOMBRE DE LA INSTACIA, POR EJEMPLO CLUSTER-DEV> {
interface <IFACE>
state MASTER / BACKUP # ( MASTER PARA EL MASTER Y BACKUP PARA EL BACKUP )
virtual_router_id 55
priority 100

authentication {
auth_type AH
auth_pass <PASSWORD>
}

virtual_ipaddress {
10.25.152.150 #<LA IP VIRTUAL O NO VIRTUAL>
}
track_script {
chk_maxscale
}
smtp_alert
}
  1. Como sabemos que maxscale esta vivo? con el vrrp_script que busca el PID de maxscale cada 2 segundos
  2. Configuramos las ips de la red tanto publica como interna. La interna NO necesita de gateway
  3. Si hemos elegido tener una tercera red de gestion, en la red publica solo publicamos el 3306 (3307, 3308 si queremos tener mas un servicio funcionando en la misma vIP)
  4. Este seria el archivo de configuracion del Maxscale, os lo voy comentando sobre el fichero mismo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
################################################
# ___ ___ ___ ___ _____ ____ __
# | \| _ ) _ \ _ \/ _ \ \/ /\ \ / /
# | |) | _ \ _/ / (_) > < \ V /
# |___/|___/_| |_|_\\___/_/\_\ |_| _ ___
# | \/ | /_\ \ \/ / __|/ __| /_\ | | | __|
# | |\/| |/ _ \ > <\__ \ (__ / _ \| |__| _|
# |_| |_/_/ \_\/_/\_\___/\___/_/ \_\____|___|
#
################################################
# Ansible managed
# LAST MODIFIED ON: 2018-06-06
################################################
[maxscale]
threads=auto #dejamos que se organize el mismo con los threads
syslog=1
maxlog=1
log_to_shm=1
log_warning=1
log_notice=1
log_info=1
log_debug=0

###############################
#CLI
[CLI]
type=service
router=cli

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
socket=default

###############################
#ESTO ES PARA SACAR METRICAS A PROMETHEUS
#METRICS
[MaxInfo]
type=service
router=maxinfo
user=<MONITORUSER>
passwd=<PASSWORD>

[MaxInfo JSON Listener]
type=listener
service=MaxInfo
protocol=HTTPD
port=8003

[MaxInfo Listener]
type=listener
service=MaxInfo
protocol=MySQLClient
port=9313

###############################
#AQUI DEFINIMOS SI QUEREMOS UN MASKING Y CUANDO LO APLICAMOS, LEED MAS EN LA WEB DE MAXSCALE
#OFUSCATION STREAM
[Enigma-1]
type=filter
module=masking
warn_type_mismatch=always
large_payload=abort
rules=/etc/maxscale/masking/enigma-1.json

###############################
#ESTOS SON LOS SERVICIOS QUE VAMOS A DAR A TRAVES DE MAXSCALE, SE PODRIA DECIR QUE SON LAS BBDD QUE VAMOS A
#OFRECER A LOS CLIENTES A TRAVES DE EL. SE COMPONEN SIEMPRE DE UN SERVICIO, QUE ESCUCHA EN UN LISTENER QUE TIENE UN #MONITOR PARA QUE MAXSCALE SEPA EN QUE ESTADO ESTA EL NODO
#INSTANCES

#dev1 INSTANCE
[dev1 service]
type=service
router=readwritesplit
servers=db-11,db-12
user=<MAXSCALE-SQL-USER>
passwd=<PASSWORD>
filters=Enigma-1

[dev1 listener]
type=listener
service=dev1 service
protocol=MySQLClient
port=3306

[dev1 Monitor]
type=monitor
module=galeramon
servers=db-11,db-12
user=<MAXSCALE-SQL-USER>
passwd=<PASSWORD>

#qa INSTANCE
[qa service]
type=service
router=readwritesplit
servers=db-21,db-22
user=<MAXSCALE-SQL-USER>
passwd=<PASSWORD>
filters=Enigma-1

[qa listener]
type=listener
service=qa service
protocol=MySQLClient
port=3307

[qa Monitor]
type=monitor
module=galeramon
servers=db-21,db-22
user=<MAXSCALE-SQL-USER>
passwd=<PASSWORD>

###############################
#ESTOS SON LOS SERVIDORES DONDE SE VAN A DAR LOS SERVICIOS. AL TENER VARIAS INSTANCIAS EN EL MISMO, USO EL MISMO SERVER, DISTINTO PUERTO.
#SERVERS FOR ALL INSTANCES
###############################

[db-11]
type=server
address=192.168.150.10
port=3306
protocol=MySQLBackend

[db-12]
type=server
address=192.168.150.11
port=3306
protocol=MySQLBackend

[db-21]
type=server
address=192.168.150.10
port=3307
protocol=MySQLBackend

[db-22]
type=server
address=192.168.150.11
port=3307
protocol=MySQLBackend
  1. Ya casi tenemos todo, solo nos quedaria configurar el filtrado o masking, que en este caso, seria algo asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
"rules": [
{
"replace": {
"column": "Firstname"
},
"with": {
"fill": "x"
},
"applies_to": ["'usuario'@'%'"]
},
{
"replace": {
"column": "Surname"
},
"with": {
"fill": "x"
},
"applies_to": ["'usuario'@'%'"]
},
{
"replace": {
"column": "AddressLine1"
},
"with": {
"fill": "x"
},
"applies_to": ["'usuario'@'%'"]

},
{
"replace": {
"column": "AddressLine2"
},
"with": {
"fill": "x"
},
"applies_to": ["'usuario'@'%'"]
}
]
}
  1. Le cambiamos el usuario y le damos 775 a toda la carpeta y ficheros del maxscale y reiniciamos.
  2. Si todo ha ido bien, deberia de reiniciar y podriais hacer sudo maxadmin list servers y sudo maxadmin list services y os saldria algo que asi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
maxadmin list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server | Address | Port | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
db-11 | 192.168.150.10 | 3306 | 94 | Slave, Synced, Running
db-12 | 192.168.150.11 | 3306 | 94 | Master, Synced, Running
db-21 | 192.168.150.10 | 3307 | 0 | Master, Synced, Running
db-22 | 192.168.150.11 | 3307 | 0 | Slave, Synced, Running
db-31 | 192.168.150.10 | 3308 | 107 | Master, Synced, Running
db-32 | 192.168.150.11 | 3308 | 107 | Slave, Synced, Running
db-1 | 192.168.150.10 | 3306 | 0 | Running
-------------------+-----------------+-------+-------------+--------------------

maxadmin list services
Services.
--------------------------+-------------------+--------+----------------+-------------------
Service Name | Router Module | #Users | Total Sessions | Backend databases
--------------------------+-------------------+--------+----------------+-------------------
CLI | cli | 2 | 217694 |
MaxInfo | maxinfo | 2 | 321937 |
dev1 service | readwritesplit | 99 | 35207 | db-11, db-12
qa service | readwritesplit | 1 | 1 | db-21, db-22
corp service | readwritesplit | 110 | 5315 | db-31, db-32
--------------------------+-------------------+--------+----------------+-------------------

Voila!
Espero que os haya servido de utilidad, dejad vuestros comentarios abajo si os place.
Ah….y perdonar la ausencia. Demasiado lio que ire contando poco a poco, porque tengo aprox 5 post casi listos.

Buenas noches, que son las 1:28 AM :(

Links

MariaDB Maxscale


Comentarios

⬆︎TOP