La base de datos MySQL realiza la sincronización maestro-esclavo

Instalar la base de datos MySQL 8.0.32

prefacio

Hoy, aprendamos el principio y el proceso de la sincronización maestro-esclavo de la base de datos. La base de datos se utiliza principalmente para almacenar datos WEB, que es extremadamente importante en las empresas. Echémosle un vistazo juntos.

1.1 El propósito de la base de datos como maestro-esclavo

La replicación maestro-esclavo de MySQL se usa ampliamente en pequeñas y medianas empresas y grandes empresas. El propósito de la replicación maestro-esclavo de MySQL es lograr una copia de seguridad redundante de la base de datos y sincronizar los datos de la base de datos maestra con la base de datos esclava a intervalos regulares. la base de datos del enmascarador está inactiva, la base de datos de la aplicación WEB se puede configurar Cambie rápidamente a la base de datos esclava para garantizar una alta disponibilidad de las aplicaciones WEB.
inserte la descripción de la imagen aquí

1.2 Arquitectura del principio maestro-esclavo

La sincronización maestro-esclavo de MySQL requiere al menos dos servidores, uno para la biblioteca maestra y otro para la biblioteca esclava. Para lograr la replicación, primero debe habilitar la función de registro bin-log en el maestro, y el registro bin-log es utilizado para grabar en la biblioteca maestra Las instrucciones SQL para agregar, eliminar, modificar y actualizar las operaciones ejecutadas en , deben abrir tres subprocesos en todo el proceso, a saber, el maestro inicia el subproceso IO y el esclavo inicia el subproceso IO y el hilo SQL.
inserte la descripción de la imagen aquí

1. Preparar el entorno experimental

Este experimento requiere dos servidores, uno es el maestro y el otro es el esclavo, la preparación antes del experimento requiere la operación de ambos servidores.

1.1 Desactivar selinux y cortafuegos

Si es necesario, aún se recomienda apagar selinux. El firewall puede depender de la situación. Puede apagar el firewall directamente si hace sus propios experimentos.

#关闭防火墙
systemctl stop firewalld
iptables -F
#关闭selinux
setenforce 0

1.2 Ver la IP local

Verifique la IP local y pruebe si puede hacer ping a www.baidu.com

ifconfig 
192.168.116.166   #第一台服务器IP作为主master
192.168.116.128   #第二台服务器IP作为从slave

1.3 Versión de la base de datos del servidor

Ambas versiones del servidor son CentOS7.9

[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

La base de datos usa la versión comunitaria MySQL 8.0 para hacer este experimento
dirección de descarga del paquete rpm
El paquete rpm usado en este experimento (versión comunitaria MySQL 8.0 ) puede hacer clic directamente en el anterior para saltar, o puede copiar directamente este enlace: http:/ / repo.mysql.com/mysql80-community-release-el7.rpm
muestra en forma:

versión del servidor IP versión de la base de datos
CentOS7.9.2009 192.168.116.166 (maestro principal) MySQL8.0.32 Edición de la comunidad
CentOS7.9.2009 192.168.116.128 (desde esclavo) MySQL8.0.32 Edición de la comunidad

2. Instalar MySQL8.0

Aquí también está la necesidad de instalar la base de datos en ambos servidores.

2.1 Borrar el paquete que viene con CentOS7

En CentOS7, los archivos y paquetes de mariadb se instalan de manera predeterminada, y estos deben eliminarse primero; de lo contrario, afectará las instalaciones posteriores.

#清空现有的mariadb和mysql相关的文件
[root@localhost ~]# rpm -qa | grep mysql
[root@localhost ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
[root@localhost ~]# rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps

A continuación, busque archivos sobre mysql y mariadb para eliminar.

[root@localhost ~]# find / -name mariadb
[root@localhost ~]# find / -name mysql
/etc/selinux/targeted/active/modules/100/mysql
/usr/lib64/mysql
[root@localhost ~]# rm -rf /etc/selinux/targeted/active/modules/100/mysql /usr/lib64/mysql

2.2 Descargar e instalar la base de datos 8.0

Use wget para descargar la fuente rpm copiada del sitio web oficial anterior.Si el comando wget no está disponible, primero debe descargar el comando wget.
– se puede copiar directamente

yum install wget -y 
wget http://repo.mysql.com/mysql80-community-release-el7.rpm
rpm -ivh mysql80-community-release-el7.rpm 
yum install mysql-community-server

Después de instalarlos, puede iniciar el servicio directamente;

#启动服务
systemctl restart mysqld

2.3 Encuentra la contraseña de inicialización

Las contraseñas de inicialización de las dos computadoras son diferentes. Primero puede averiguar las contraseñas y luego modificar las contraseñas de la base de datos de las dos computadoras para que sean iguales.

#查找初始化密码
grep -i 'password' /var/log/mysqld.log 
2023-03-23T06:39:43.463553Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: q_gkjqeR1iGA

La contraseña de la base de datos sigue a los dos puntos:q_gkjqeR1iGA

2.4 Modificar la contraseña de la base de datos

Se recomienda cambiar las contraseñas de las dos bases de datos para que sean iguales para facilitar las pruebas posteriores.

#使用密码登录数据库修改成新密码
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> alter user 'root'@'localhost' identified by '#Admin$5^!';
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

Cambiar declaración de contraseña

alter user 'root'@'localhost' identified by '#Admin$5^!';

En MySQL8.0, la contraseña debe modificarse lo más complicada posible para pasar, y puede usar la declaración para ver el grado de complejidad.

mysql> show variables like 'validate%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     | 
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

Si habilitar la verificación de contraseña de usuario.
La ubicación donde se almacena el archivo de contraseña.
La longitud de la contraseña es de al menos 8
caracteres. El número de letras mayúsculas y minúsculas es de al menos 1.
Contiene al menos un número
. Establezca el nivel de la contraseña El nivel predeterminado es medio y
contiene al menos un carácter.

El contenido anterior debe operarse en ambos servidores.

3. Operación en el maestro principal

Lo anterior define el maestro principal como la IP de este servidor: 192.168.116.166
Para ver visualmente en qué servidor se está ejecutando, aquí está la modificación del nombre de host, para que sea fácil de distinguir.

3.1 Modificar temporalmente el nombre de host

[root@localhost ~]# hostname master
[root@localhost ~]# bash
[root@master ~]# 

3.2 Configuración de la base de datos maestra

Cree un usuario de base de datos slave21, hágalo remoto y establezca una contraseña

[root@master ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create user 'slave21'@'%' identified with mysql_native_password by '#slvae21!@3LL';
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'slave21'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'slave21'@'%';
+-------------------------------------------------+
| Grants for slave21@%                            |
+-------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `slave21`@`%` |
+-------------------------------------------------+
1 row in set (0.00 sec)

Mirando esta imagen, parece que hay mucho contenido, pero en realidad solo hay unas pocas oraciones;

create user 'slave21'@'%' identified with mysql_native_password by '#slvae21!@3LL';

El significado de esta declaración es crear un usuario esclavo21. El nombre del usuario puede definirlo usted mismo; @'%' significa que puede usar el inicio de sesión remoto en la base de datos. Esta declaración es una redacción fija de MySQL8.0, identified with mysql_native_password byque significa establecer una contraseña para él.

grant replication slave on *.* to 'slave21'@'%';

Esta declaración significa autorizar los permisos de la base de datos para este usuario, *.*básicamente otorgar todos los permisos, el primer * significa todas las bases de datos y el segundo significa las tablas de la base de datos.

flush privileges;

Esta declaración significa actualizar la base de datos, de modo que el contenido establecido previamente se pueda sincronizar con la base de datos.

show grants for 'slave21'@'%';

Compruebe si los permisos establecidos anteriormente se han escrito en la base de datos y el contenido que se muestra indica que la escritura se ha realizado correctamente.

3.3 Modificar el archivo de configuración de la base de datos

[root@master ~]# vim /etc/my.cnf
[root@master ~]# sed 4,+4p -n /etc/my.cnf
[mysqld]
server-id=21
log-bin=mysql-bin
binlog_do_db=test
binlog_ignore_db=mysql
#重启服务
[root@master ~]# systemctl restart mysqld

server-id=21 El ID único del servicio de base de datos
log-bin=mysql-bin Establece la ubicación de almacenamiento del registro binlog
binlog_do_db=test Establece la base de datos para sincronización, si esta línea no está escrita, significa que todas las bases de datos están sincronizadas
binlog_ignore_db=mysql Establecer la base de datos para la no sincronización

Recuerde que después de la configuración, hay otro comando que necesita reiniciar el servicio.

3.4 Ver el estado del maestro principal

Después de configurar el archivo de configuración, inicie sesión en el sistema de base de datos mysql para verificar la información principal.

[root@master ~]# !m
mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      157 | test         | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

¿Por qué necesita verificar esta información, porque debe usarse al configurar la base de datos esclava?

El archivo es el archivo de almacenamiento del contenedor de registro que acabamos de configurar, que se usa para registrar el archivo de registro de la operación mysql.
La posición indica el desplazamiento
Binlog_Do_DB, la base de datos que debe sincronizarse,
Binlog_Ignore_DB, la base de datos que no necesita sincronizarse

En este punto, no continúe operando la primera base de datos maestra para evitar cambiar el desplazamiento.

4. Operar desde esclavo

Aquí debe ir al segundo servidor para operar, y aquí también modificar el nombre de host para aumentar el reconocimiento.

4.1 Modificar temporalmente el nombre de host

[root@localhost ~]# hostname slave22
[root@localhost ~]# bash
[root@slave22 ~]# 

4.2 Modificar el archivo de configuración

El servidor esclavo solo necesita escribir la identificación única. server-id=22El contenido de esta identificación no tiene que ser el mismo que el de arriba. Siempre que no sea el mismo que el número de identificación del anterior, puede configurarlo como no. importa que.

#mysql的配置文件
[root@slave22 ~]# vim /etc/my.cnf
[root@slave22 ~]# sed 4,+1p -n /etc/my.cnf
[mysqld]
server-id=22
[root@slave22 ~]# systemctl restart mysqld

No olvides que necesitas reiniciar el servicio.

4.3 Vincular el servidor maestro principal

[root@slave22 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to master_host='192.168.116.166',master_user='slave21',master_password='#slvae21!@3LL',master_log_file='mysql-bin.000001',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.116.166
                  Master_User: slave21
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 157
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 157
              Relay_Log_Space: 540
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 21
                  Master_UUID: 7d57e7f4-c945-11ed-b2a1-000c29b5625a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

La declaración que realmente necesita ser ejecutada;

change master to master_host='192.168.116.166',master_user='slave21',master_password='#slvae21!@3LL',master_log_file='mysql-bin.000001',master_log_pos=157;
  • master_host= #La IP del primer maestro principal se debe completar más tarde
  • master_user= #escribe el nombre de usuario creado en el maestro principal antes
  • master_password= #escriba la contraseña del nombre de usuario creado en el maestro maestro antes
  • master_log_file= #Archivo de registro, use mostrar el estado del maestro en el maestro; el valor que se muestra en ese paso.
  • master_log_pos= #desplazamiento
start slave;

Habilitar la replicación de datos síncrona

show slave status \G

Después de ejecutar esta declaración, verifique si los dos valores de Slave_IO_Running: Yes y Slave_SQL_Running: Yes son Sí. Si es así, significa que la sincronización está en progreso, lo que también significa que nuestro experimento esta vez es exitoso.

Por supuesto, también hay casos en los que estos dos valores no son sí después de que se terminan los socios pequeños, y puede haber situaciones en las que un valor es no, o ambos valores son no.

4.4 Cómo resolver el problema de no

Puede detener el esclavo primero y redefinirlo nuevamente hasta que ambos sean sí.

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.116.166
                  Master_User: slave21
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 157
               Relay_Log_File: localhost-relay-bin.000003
                Relay_Log_Pos: 373
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 157
              Relay_Log_Space: 767
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 21
                  Master_UUID: 7d57e7f4-c945-11ed-b2a1-000c29b5625a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)

También puede copiar el contenido de la base de datos que se sincronizará con el servidor esclavo primero, de modo que el contenido de la base de datos que sincronizarán los dos servidores sea exactamente el mismo, y luego use este método nuevamente para enlazar e iniciar.

5. Resultados de la prueba

5.1 Crear una base de datos en el maestro maestro

Hemos terminado los experimentos anteriores y es hora de comenzar a crear una base de datos para la verificación. La base de datos que elegimos para sincronizar es entonces testcrearemos testuna base de datos y escribiremos tablas, datos, etc. en ella.

#主master上创建
mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> create database abc;
Query OK, 1 row affected (0.00 sec)

mysql> use test
Database changed
mysql> create table test1(id int,name varchar(20) not null default 'username');
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test1 values(1,'zhangsan'), (2,'lisi'), (3,'wangwu');
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> desc test1;
+-------+-------------+------+-----+----------+-------+
| Field | Type        | Null | Key | Default  | Extra |
+-------+-------------+------+-----+----------+-------+
| id    | int         | YES  |     | NULL     |       |
| name  | varchar(20) | NO   |     | username |       |
+-------+-------------+------+-----+----------+-------+
2 rows in set (0.01 sec)

mysql> select id,name from test1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
+------+----------+
3 rows in set (0.00 sec)

5.2 Vista desde la base de datos en el esclavo

Puede ver que testla base de datos se ha sincronizado. Ingrese testa la base de datos para ver los datos debajo de ella, y también está sincronizada.

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

mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

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

mysql> desc test1;
+-------+-------------+------+-----+----------+-------+
| Field | Type        | Null | Key | Default  | Extra |
+-------+-------------+------+-----+----------+-------+
| id    | int         | YES  |     | NULL     |       |
| name  | varchar(20) | NO   |     | username |       |
+-------+-------------+------+-----+----------+-------+
2 rows in set (0.00 sec)

mysql> select id,name from test1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
+------+----------+
3 rows in set (0.00 sec)

La información de las tablas en la base de datos existe, lo que indica que no hay problema en seleccionar la base de datos para la sincronización test.

Resumir

Después de hacer el experimento anterior, encontrará que la base de datos principal solo se puede sincronizar desde la base de datos. Entonces, ¿se pueden sincronizar ambos entre sí sobre esta base? La respuesta es sí. Este método es la sincronización principal y principal. Es es el servidor maestro, es el esclavo cuando sincroniza datos y es el maestro cuando escribe datos, lo cual se revelará en el próximo artículo. Si crees que el contenido anterior está bien, ¡puedes darle me gusta y apoyarlo!
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/rhn_111/article/details/129693002
Recomendado
Clasificación