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
- 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; - 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-cluster
espejo, usamos la 5.7
versió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
-di
Ejecute el contenedor en modo interactivo para que se ejecute en segundo plano.
--name=pn1
El contenedor actual se llamapn1
--net=pxc-network
Únete a la red del clúster y se usa para la comunicación entre varios nodos.
-p 9000:3306
Asigne el puerto 9000 del servidor actual al puerto 3306 del contenedor.
-v v1:/var/lib/mysql
Asigne elv1
volumen de datos al/var/lib/mysql
directorio del contenedor .
--privileged
Otorgue privilegios de root (privilegios especiales) para
MYSQL_ROOT_PASSWORD=123456
establecer la contraseña de acceso a la base de datos.
-e
Configuración de variables de entorno
Utilice el ID de la imagen como ad45cffb713a
imagen 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
v2
volumen de datos 3306 del contenedor asignado al/var/lib/mysql
directorio del contenedor , lo que
-e CLUSTER_JOIN=pn1
significa que--name=pn1
el 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
v3
volumen de datos 3306 del contenedor y el/var/lib/mysql
directorio del contenedor
CLUSTER_JOIN=pn2
se asigna para indicar la sincronización con el segundo nodo.
La creación del último nodo agrega CLUSTER_JOIN
variables 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 pn1
nodo
# 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_addresses
La 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