Cómo construir un clúster PXC con una base de datos MySQL

1. Introducción de PXC

El nombre completo de PXC es Percona XtraDB Cluster. Es un conjunto de soluciones de clúster de alta disponibilidad de MySQL. En comparación con la arquitectura de clúster tradicional basada en el modelo de replicación maestro-esclavo, la característica más destacada de PXC es que resuelve el problema de demora en la replicación de datos, difamado durante mucho tiempo, y básicamente puede lograr la sincronización en tiempo real. Y entre nodos, su relación mutua es igual. PXC se preocupa más por la consistencia de los datos, cuando se trata del comportamiento de las cosas, o se ejecuta en todos los nodos o no se ejecuta, su mecanismo de implementación determina que trate el comportamiento de consistencia de manera muy estricta, lo que también puede garantizar la perfección. Consistencia de datos del clúster MySQL.

En segundo lugar, las ventajas y desventajas de PXC

  1. Ventajas La
    mayor ventaja de PXC: gran consistencia, sin retardo de sincronización.
    Totalmente compatible con MySQL.
    En la replicación sincrónica, la transacción se confirma o no en todos los nodos.
    Replicación multimaestro, puede escribir en cualquier nodo.
    Eventos de aplicaciones paralelas en el servidor esclavo, verdadera replicación paralela.
    Los nodos se configuran automáticamente, la coherencia de los datos ya no es una replicación asincrónica.
    Conmutación por error: debido a que admite múltiples escrituras, es fácil realizar la conmutación por error en caso de una falla en la base de datos.
    Clonación automática de nodos: cuando se agregan nuevos nodos o tiempo de inactividad para el mantenimiento, no es necesario realizar una copia de seguridad y proporcionar manualmente los datos incrementales o los datos básicos, el clúster de galera extraerá automáticamente los datos de los nodos en línea y, finalmente, el clúster se volverá consistente;
  2. Desventajas La
    replicación solo admite el motor InnoDB y los cambios en otros motores de almacenamiento no se replican. La
    eficiencia de escritura depende del más lento entre los nodos

Tres, la diferencia entre PXC y Replicación

Replicación PXC
La sincronización de datos es unidireccional, el maestro es responsable de la escritura y luego se replica de forma asincrónica al esclavo; si el esclavo escribe datos, no se replicarán en el maestro. La sincronización de datos es bidireccional, cualquier nodo mysql escribe datos y se sincronizará con otros nodos del clúster.
La replicación asincrónica, el esclavo y el maestro no pueden garantizar la coherencia de los datos Replicación síncrona, las transacciones se confirman al mismo tiempo o no al mismo tiempo en todos los nodos del clúster.

Cuarto, use Docker para construir un clúster PXC

1. Instalación

Para buscar el percona-xtradb-clusterespejo, usamos la 5.7versión.

docker pull percona/percona-xtradb-cluster:5.7

Ejemplo:

[root@localhost ~]# docker pull percona/percona-xtradb-cluster:5.7
Trying to pull repository docker.io/percona/percona-xtradb-cluster ... 
5.7: Pulling from docker.io/percona/percona-xtradb-cluster
524b0c1e57f8: Already exists 
27b947d6be19: Pull complete 
26efa431217c: Pull complete 
7d4afafca533: Pull complete 
05e05cf6b007: Pull complete 
868bb5b06c86: Pull complete 
f0794e3eeb9c: Pull complete 
3a988f4f1cd9: Pull complete 
46f38e1635eb: Pull complete 
75805c1fcaed: Pull complete 
575a6d0fc78f: Pull complete 
c8bb3fa6ebc4: Pull complete 
Digest: sha256:b03a060e9261b37288a2153c78f86dcfc53367c36e1bcdcae046dd2d0b0721af
Status: Downloaded newer image for docker.io/percona/percona-xtradb-cluster:5.7
root@localhost ~]# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
docker.io/percona/percona-xtradb-cluster   5.7                 ad45cffb713a        6 weeks ago         491 MB
docker.io/centos                           latest              831691599b88        7 weeks ago         215 MB
2. Cree una red de clústeres
docker network create pxc-network

Cree una red para la comunicación entre las aplicaciones del clúster de Docker.
Ejemplos:

[root@localhost ~]# docker network create pxc-network
f743566e4ca1e40b4f7cec29b96c83d400afba3effb3dfa61bf7bb27cbd6e5cd
3. Crear volumen de datos

Aquí, construimos un clúster de 3 nodos, por lo que necesitamos crear tres volúmenes de datos.

# 第一个数据卷
docker volume create --name v1
# 第二个数据卷
docker volume create --name v2
# 第三个数据卷
docker volume create --name v3

Crear tres volúmenes de datos, y el nombre v1, v2, v3. Estos tres volúmenes de datos se montan en los contenedores de tres nodos respectivamente.
Ejemplos:

[root@localhost ~]# docker volume create --name v1
v1
[root@localhost ~]# docker volume create --name v2
v2
[root@localhost ~]# docker volume create --name v3
v3

Si falla la creación de un espejo usando un volumen de datos, el volumen de datos también necesita ser eliminado y recreado.

docker volume rm v1
4. Cree un contenedor de nodos

Crea el primer nodo.

docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 ad45cffb713a

Ejemplo:

[root@localhost ~]# docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 ad45cffb713a
e6f309f355466e7187b5e23a8a0d4d18e0d164addbdff3533e08ba99f7f57935

-diEjecute el contenedor en modo interactivo para que se ejecute en segundo plano.
--name=pn1El contenedor actual se llama pn1
--net=pxc-networkÚnete a la red del clúster y se usa para la comunicación entre varios nodos.
-p 9000:3306Asigne el puerto 9000 del servidor actual al puerto 3306 del contenedor.
-v v1:/var/lib/mysqlAsigne el v1volumen de datos al /var/lib/mysqldirectorio del contenedor .
--privilegedOtorgue privilegios de root (privilegios especiales) para
MYSQL_ROOT_PASSWORD=123456establecer la contraseña de acceso a la base de datos.
-eConfiguración de variables de entorno

Utilice el ID de la imagen como ad45cffb713aimagen PXC para crear el contenedor.


Luego, cree el segundo nodo a su vez.

docker run -di --name=pn2 --net=pxc-network -p 9001:3306 -v v2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 ad45cffb713a

El puerto del servidor 9001 se asigna al
v2volumen de datos 3306 del contenedor asignado al /var/lib/mysqldirectorio del contenedor , lo que
-e CLUSTER_JOIN=pn1significa que --name=pn1el nodo está sincronizado con el nodo.

Tercer nodo

docker run -di --name=pn3 --net=pxc-network -p 9002:3306 -v v3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 ad45cffb713a

El puerto del servidor 9002 se asigna al
v3volumen de datos 3306 del contenedor y el /var/lib/mysqldirectorio del contenedor
CLUSTER_JOIN=pn2se asigna para indicar la sincronización con el segundo nodo.

La creación del último nodo agrega CLUSTER_JOINvariables de entorno en comparación con el primer nodo , que representa un nodo de sincronización.
Ejemplo:

[root@localhost ~]# docker run -di --name=pn2 --net=pxc-network -p 9001:3306 -v v2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 ad45cffb713a
4f0bae62f8544708580dfc014e3daf6f86c442983dfce0132eac3888a2ab913d
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                   NAMES
4f0bae62f854        ad45cffb713a        "/entrypoint.sh my..."   3 seconds ago       Up 3 seconds        4567-4568/tcp, 0.0.0.0:9001->3306/tcp   pn2
e6f309f35546        ad45cffb713a        "/entrypoint.sh my..."   39 seconds ago      Up 39 seconds       4567-4568/tcp, 0.0.0.0:9000->3306/tcp   pn1
[root@localhost ~]# docker run -di --name=pn3 --net=pxc-network -p 9002:3306 -v v3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 ad45cffb713a
ea638d2cde30a0100061c95055606052818261381366db56fabf78a5d0b4253a
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                   NAMES
ea638d2cde30        ad45cffb713a        "/entrypoint.sh my..."   3 seconds ago       Up 2 seconds        4567-4568/tcp, 0.0.0.0:9002->3306/tcp   pn3
4f0bae62f854        ad45cffb713a        "/entrypoint.sh my..."   15 seconds ago      Up 14 seconds       4567-4568/tcp, 0.0.0.0:9001->3306/tcp   pn2
e6f309f35546        ad45cffb713a        "/entrypoint.sh my..."   51 seconds ago      Up 51 seconds       4567-4568/tcp, 0.0.0.0:9000->3306/tcp   pn1
5. Verificación de estado

Entrar pn1nodo

# 1.进入节点
docker exec -it pn1 /usr/bin/mysql -uroot -p123456
# 2.查看状态
mysql> show status like 'wsrep%';

Ejemplos:

mysql> show status like 'wsrep%';
+----------------------------------+-------------------------------------------------------+
| Variable_name                    | Value                                                 |
+----------------------------------+-------------------------------------------------------+
| wsrep_local_state_uuid           | 944d2133-d956-11ea-982d-e7a1f0fcefe6                  |
| wsrep_protocol_version           | 9                                                     |
| wsrep_last_applied               | 18                                                    |
| wsrep_last_committed             | 18                                                    |
| wsrep_replicated                 | 0                                                     |
| wsrep_replicated_bytes           | 0                                                     |
| wsrep_repl_keys                  | 0                                                     |
| wsrep_repl_keys_bytes            | 0                                                     |
| wsrep_repl_data_bytes            | 0                                                     |
| wsrep_repl_other_bytes           | 0                                                     |
| wsrep_received                   | 10                                                    |
| wsrep_received_bytes             | 812                                                   |
| wsrep_local_commits              | 0                                                     |
| wsrep_local_cert_failures        | 0                                                     |
| wsrep_local_replays              | 0                                                     |
| wsrep_local_send_queue           | 0                                                     |
| wsrep_local_send_queue_max       | 1                                                     |
| wsrep_local_send_queue_min       | 0                                                     |
| wsrep_local_send_queue_avg       | 0.000000                                              |
| wsrep_local_recv_queue           | 0                                                     |
| wsrep_local_recv_queue_max       | 2                                                     |
| wsrep_local_recv_queue_min       | 0                                                     |
| wsrep_local_recv_queue_avg       | 0.100000                                              |
| wsrep_local_cached_downto        | 0                                                     |
| wsrep_flow_control_paused_ns     | 0                                                     |
| wsrep_flow_control_paused        | 0.000000                                              |
| wsrep_flow_control_sent          | 0                                                     |
| wsrep_flow_control_recv          | 0                                                     |
| wsrep_flow_control_interval      | [ 173, 173 ]                                          |
| wsrep_flow_control_interval_low  | 173                                                   |
| wsrep_flow_control_interval_high | 173                                                   |
| wsrep_flow_control_status        | OFF                                                   |
| wsrep_cert_deps_distance         | 0.000000                                              |
| wsrep_apply_oooe                 | 0.000000                                              |
| wsrep_apply_oool                 | 0.000000                                              |
| wsrep_apply_window               | 0.000000                                              |
| wsrep_commit_oooe                | 0.000000                                              |
| wsrep_commit_oool                | 0.000000                                              |
| wsrep_commit_window              | 0.000000                                              |
| wsrep_local_state                | 4                                                     |
| wsrep_local_state_comment        | Synced                                                |
| wsrep_cert_index_size            | 0                                                     |
| wsrep_cert_bucket_count          | 22                                                    |
| wsrep_gcache_pool_size           | 1728                                                  |
| wsrep_causal_reads               | 0                                                     |
| wsrep_cert_interval              | 0.000000                                              |
| wsrep_open_transactions          | 0                                                     |
| wsrep_open_connections           | 0                                                     |
| wsrep_ist_receive_status         |                                                       |
| wsrep_ist_receive_seqno_start    | 0                                                     |
| wsrep_ist_receive_seqno_current  | 0                                                     |
| wsrep_ist_receive_seqno_end      | 0                                                     |
| wsrep_incoming_addresses         | e6f309f35546:3306,4f0bae62f854:3306,ea638d2cde30:3306 |
| wsrep_cluster_weight             | 3                                                     |
| wsrep_desync_count               | 0                                                     |
| wsrep_evs_delayed                |                                                       |
| wsrep_evs_evict_list             |                                                       |
| wsrep_evs_repl_latency           | 0/0/0/0/0                                             |
| wsrep_evs_state                  | OPERATIONAL                                           |
| wsrep_gcomm_uuid                 | 9d4853de-d956-11ea-b64e-6b6d80ffcf54                  |
| wsrep_cluster_conf_id            | 3                                                     |
| wsrep_cluster_size               | 3                                                     |
| wsrep_cluster_state_uuid         | 944d2133-d956-11ea-982d-e7a1f0fcefe6                  |
| wsrep_cluster_status             | Primary                                               |
| wsrep_connected                  | ON                                                    |
| wsrep_local_bf_aborts            | 0                                                     |
| wsrep_local_index                | 0                                                     |
| wsrep_provider_name              | Galera                                                |
| wsrep_provider_vendor            | Codership Oy <[email protected]>                     |
| wsrep_provider_version           | 3.43(ra60e019)                                        |
| wsrep_ready                      | ON                                                    |
+----------------------------------+-------------------------------------------------------+
71 rows in set (0.05 sec)

wsrep_incoming_addressesLa dirección aquí está en ID:端口forma de tres contenedores correspondientes . Demuestre que los tres nodos se han vinculado correctamente.

6. Comprobación de nodo

Verificación de la integridad del clúster:

Atributos sentido
wsrep_cluster_state_uuid El valor de todos los nodos del clúster debe ser el mismo y los nodos con valores diferentes indican que no están conectados al clúster.
wsrep_cluster_conf_id En circunstancias normales, el valor es el mismo en todos los nodos. Si el valor es diferente, significa que el nodo está "particionado" temporalmente. El mismo valor debe restaurarse cuando se restablezca la conexión de red entre los nodos.
wsrep_cluster_size Si este valor es coherente con el número esperado de nodos, todos los nodos del clúster están conectados.
wsrep_cluster_status El estado de la composición del conglomerado. Si no es "Primario", significa que hay una condición de "partición" o "cerebro dividido".

Verificación del estado del nodo:

Atributos sentido
wsrep_ready El valor está activado, lo que indica que se puede aceptar la carga de SQL. Si está desactivado, debe marcar wsrep_connected
wsrep_connected Si el valor es Desactivado y el valor de wsrep_ready también está Desactivado, significa que el nodo no está conectado al clúster. (Puede deberse a errores de configuración como wsrep_cluster_address o wsrep_cluster_name. Para errores específicos, consulte el registro de errores)
wsrep_local_state_comment Si wsrep_connected está activado, pero wsrep_ready está desactivado, puede verificar el motivo en este elemento

Copiar verificación de estado:

Atributos sentido
wsrep_flow_control_paused Indica cuánto tiempo ha estado detenida la replicación. Es decir, indica qué tan lento es el clúster debido al retraso del esclavo. El valor es 0 ~ 1, cuanto más cerca de 0, mejor, el valor 1 significa que la replicación está completamente detenida. El valor de wsrep_slave_threads se puede optimizar para mejorar
wsrep_cert_deps_distance Cuántas transacciones se pueden procesar en paralelo. El valor establecido por wsrep_slave_threads no debe ser mucho mayor que este valor
wsrep_flow_control_sent Indica cuántas veces ha dejado de replicarse el nodo
* wsrep_local_recv_queue_avg Indica la longitud promedio de la cola de transacciones esclavas. Un signo de cuello de botella esclavo. El nodo más lento tiene los valores más altos de wsrep_flow_control_sent y wsrep_local_recv_queue_avg. Si estos dos valores son más bajos, es relativamente mejor

Detecte problemas de red lentos:

Atributos sentido
wsrep_local_send_queue_avg Un signo de un cuello de botella en la red. Si este valor es relativamente alto, puede haber un cuello de botella en la red.

Número de conflictos o interbloqueos:

Atributos sentido
wsrep_last_committed Número de últimas transacciones comprometidas
wsrep_local_cert_failures 和 wsrep_local_bf_aborts Retroceso, número de conflictos detectados
7. Verificación de la sincronización del clúster

Entramos en uno de los nodos, como el segundo. La asignación de puertos es cuando se crea 9001:3306, por lo que para el inicio de sesión externo, use el siguiente comando para completar.

mysql -h192.168.56.101 -uroot -p123456

Cree una base de datos, una tabla y vea si otras bases de datos están sincronizadas

# 1.创建数据库
create database test;
# 2.创建表

Ejemplo:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database test;
Query OK, 1 row affected (0.03 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test;
Database changed
mysql> create table users(id int ,name varchar(30));
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

Cambiar consulta de cuenta

mysql -h192.168.56.101 -uroot -p123456 -P9000

Ejemplo:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test;
Database changed

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

Puede ver que los datos se sincronizan normalmente.


Parte del contenido proviene de Internet:
Gracias: Construcción de clústeres MySQL PXC

Supongo que te gusta

Origin blog.csdn.net/u013866352/article/details/107879033
Recomendado
Clasificación