Docker Swarm: Crear clúster Percona
Hoy vamos a crear dentro de nuestro clúster (enjambre) de Docker Swarm, contenedores que van a dar servicio de base de datos mediante Percona XtraDB Cluster 8 (es un procedimiento de laboratorio, ya que usaremos certificados autofirmados)
¿Qué es Percona?
Percona empezó siendo un fork de MySQL, que nos permitía tener las funciones de pago de MySQL sobre una plataforma gratuita. Con los años, se ha convertido en una empresa que crea múltiples herramientas muy interesantes, que siempre hay que tener en cuenta, si trabajas con sistemas open y bases de datos.
Os dejo la web del proyecto, veréis que es un pequeño monstruo dentro de este mundillo: https://www.percona.com/
Cómo crear un clúster de Percona bajo contenedores Docker
Para este manual usaremos la guía oficial, os dejo los enlaces:
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/docker.html
https://hub.docker.com/r/percona/percona-xtradb-cluster/
Nos ponemos manos a la obra…Como en la guía oficial vamos a generar 3 nodos.
Generamos el directorio para la configuración en cada nodo del clúster, que al final será un volumen que montaremos en los contenedores:
1 |
root@swarm00:~# mkdir ~/docker-percona/config -p |
Ahora generamos dentro de la carpeta recién generada de cada host el fichero custom.cnf :
1 |
root@swarm00:~# vi docker-percona/config/custom.cnf |
Con el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[mysqld] ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem [client] ssl-ca = /cert/ca.pem ssl-cert = /cert/client-cert.pem ssl-key = /cert/client-key.pem [sst] encrypt = 4 ssl-ca = /cert/ca.pem ssl-cert = /cert/server-cert.pem ssl-key = /cert/server-key.pem |
Creamos el directorio para los certificados dentro de la ruta que hemos creado y le damos permisos (repetimos en cada host):
1 |
root@swarm00:~# mkdir docker-percona/cert -m 777 -p |
Y generamos los certificados del host :
1 |
docker run --name pxc-cert --rm -v ~/docker-percona/cert:/cert percona/percona-xtradb-cluster:8.0 mysql_ssl_rsa_setup -d /cert |
Se generará de la siguiente forma:
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 |
root@swarm00:~# docker run --name pxc-cert --rm -v ~/docker-percona/cert:/cert percona/percona-xtradb-cluster:8.0 mysql_ssl_rsa_setup -d /cert Unable to find image 'percona/percona-xtradb-cluster:8.0' locally 8.0: Pulling from percona/percona-xtradb-cluster 7a0437f04f83: Already exists 561b85a30126: Pull complete 8f401400db19: Pull complete 820ddab82e4b: Pull complete 508c01d64103: Pull complete 3594c3ec391e: Pull complete 93f0666669cc: Pull complete 6d4ecaa5c229: Pull complete 894d7a872f24: Pull complete 4647eef39d83: Pull complete 373f41736d96: Pull complete 8a38d1daf4f3: Pull complete Digest: sha256:1295af1153c1d02e9d40131eb0945b53f7f371796913e64116bf2caa77dc186d Status: Downloaded newer image for percona/percona-xtradb-cluster:8.0 + '[' m = - ']' + CFG=/etc/mysql/node.cnf + wantHelp= + for arg in "$@" + case "$arg" in + for arg in "$@" + case "$arg" in + for arg in "$@" + case "$arg" in + vault_secret=/etc/mysql/vault-keyring-secret/keyring_vault.conf + '[' -f /etc/mysql/vault-keyring-secret/keyring_vault.conf ']' + file_env XTRABACKUP_PASSWORD xtrabackup + set +o xtrace + file_env CLUSTERCHECK_PASSWORD clustercheck + set +o xtrace ++ hostname -f + NODE_NAME=067c3ef1d5b8 + NODE_PORT=3306 + '[' -n '' ']' + '[' -n '' ']' + : checking incoming cluster parameters ++ hostname -I ++ awk ' { print $1 } ' + NODE_IP=172.17.0.2 + sed -r 's|^[#]?wsrep_node_address=.*$|wsrep_node_address=172.17.0.2|' /etc/mysql/node.cnf + sed -r 's|^[#]?wsrep_node_incoming_address=.*$|wsrep_node_incoming_address=067c3ef1d5b8:3306|' /etc/mysql/node.cnf + [[ -n '' ]] + [[ -n '' ]] + '[' -z '' ']' + '[' mysql_ssl_rsa_setup = mysqld -a -z '' ']' + '[' mysql_ssl_rsa_setup = mysqld -a -z '' ']' + wsrep_start_position_opt= + '[' mysql_ssl_rsa_setup = mysqld -a -z '' ']' + exec mysql_ssl_rsa_setup -d /cert Ignoring -days; not generating a certificate Generating a RSA private key .........................................................................................................+++++ ...............................+++++ writing new private key to 'ca-key.pem' ----- Ignoring -days; not generating a certificate Generating a RSA private key ................................+++++ ...+++++ writing new private key to 'server-key.pem' ----- Ignoring -days; not generating a certificate Generating a RSA private key ....................................................................................................+++++ .....................................................................+++++ writing new private key to 'client-key.pem' ----- |
Podemos revisarlo:
1 2 3 |
root@swarm00:~# ls docker-percona/cert/ ca-key.pem client-cert.pem private_key.pem server-cert.pem ca.pem client-key.pem public_key.pem server-key.pem |
Generamos una red para el cluster de Percona:
1 2 |
root@swarm00:~# docker network create pxc-network d6a8e08d51f1d2a011dc91a74be4c2f29691d13b548f94545c6aeab0513da17f |
Ahora empezamos a generar los nodos:
1 2 3 4 5 6 7 8 |
## NODO 1 de PERCONA (desde un master) docker run -d \ -e MYSQL_ROOT_PASSWORD=elblogdenegu# \ -e CLUSTER_NAME=pxc-cluster1 \ --name=pxc-node1 \ --net=pxc-network \ -v ~/docker-percona/config:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0 |
Vamos los siguientes con los siguientes comandos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
## NODO 2 de PERCONA docker run -d \ -e MYSQL_ROOT_PASSWORD=elblogdenegu# \ -e CLUSTER_NAME=pxc-cluster1 \ -e CLUSTER_JOIN=pxc-node1 \ --name=pxc-node2 \ --net=pxc-network \ -v ~/docker-percona/cert:/cert \ -v ~/docker-percona/config:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0 ## NODO 3 de PERCONA docker run -d \ -e MYSQL_ROOT_PASSWORD=elblogdenegu# \ -e CLUSTER_NAME=pxc-cluster1 \ -e CLUSTER_JOIN=pxc-node1 \ --name=pxc-node3 \ --net=pxc-network \ -v ~/docker-percona/cert:/cert \ -v ~/docker-percona/config:/etc/percona-xtradb-cluster.conf.d \ percona/percona-xtradb-cluster:8.0 |
Ahora intentamos la conexión a uno de los nodos:
1 2 3 4 5 6 7 8 9 10 |
root@swarm00:~# docker exec -it pxc-node1 /usr/bin/mysql -u root -p elblogdenegu# mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 12 ... You are enforcing ssl connection via unix socket. Please consider switching ssl off as it does not make connection via unix socket any more secure mysql> |
Para complementar la instalación, lo que haríamos es crear un servicio de Proxy para el clúster con ProxySQL (https://hub.docker.com/r/perconalab/proxysql/):
1 2 3 4 5 6 7 |
docker run -d -p 3306:3306 -p 6032:6032 --net=$NETWORK_NAME --name=${CLUSTER_NAME}_proxysql \ -e CLUSTER_NAME=$CLUSTER_NAME \ -e ETCD_HOST=$ETCD_HOST \ -e MYSQL_ROOT_PASSWORD=elblogdenegu# \ -e MYSQL_PROXY_USER=proxyuser \ -e MYSQL_PROXY_PASSWORD=s3cret \ perconalab/proxysql |
Para registrar todos los nodos en ProxySQL podemos usar:
1 |
docker exec -it ${CLUSTER_NAME}_proxysql add_cluster_nodes.sh |
Y ya tendríamos nuestro clúster MySQL con Percona mediante contenedores Docker.
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?