O banco de dados MySQL realiza a sincronização mestre-escravo

Instale o banco de dados MySQL 8.0.32

prefácio

Hoje, vamos aprender o princípio e o processo de sincronização mestre-escravo do banco de dados. O banco de dados é usado principalmente para armazenar dados da WEB, o que é extremamente importante nas empresas. Vamos dar uma olhada nisso juntos.

1.1 A finalidade do banco de dados como mestre-escravo

A replicação mestre-escravo do MySQL é amplamente usada em pequenas e médias empresas e grandes empresas. O objetivo da replicação mestre-escravo do MySQL é obter backup de redundância do banco de dados e sincronizar os dados do banco de dados mestre com o banco de dados escravo em intervalos regulares. Uma vez o banco de dados mascarado está desativado, o banco de dados do aplicativo WEB pode ser configurado Mude rapidamente para o banco de dados escravo para garantir alta disponibilidade de aplicativos WEB.
insira a descrição da imagem aqui

1.2 Arquitetura do princípio mestre-escravo

A sincronização mestre-escravo do MySQL requer pelo menos dois servidores, um para a biblioteca mestre e outro para a biblioteca escrava. Para conseguir a replicação, primeiro você precisa habilitar a função log bin-log no mestre, e o log bin-log é usado para gravar na biblioteca mestre As instruções sql para adicionar, excluir, modificar e atualizar operações executadas em , precisam abrir três threads em todo o processo, ou seja, o mestre inicia o thread IO e o escravo inicia o thread IO e o segmento SQL.
insira a descrição da imagem aqui

1. Prepare o ambiente experimental

Este experimento requer dois servidores, um é o mestre e o outro é o escravo. A preparação antes do experimento requer a operação de ambos os servidores.

1.1 Desligue o selinux e o firewall

Se necessário, ainda é recomendado desligar o selinux. O firewall pode depender da situação. Você pode desligar o firewall diretamente se fizer seus próprios experimentos.

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

1.2 Ver IP local

Verifique o IP local e teste se você pode pingar www.baidu.com

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

1.3 Versão do banco de dados do servidor

Ambas as versões do servidor são CentOS7.9

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

O banco de dados usa a versão da comunidade MySQL 8.0 para fazer este experimento
endereço de download do pacote rpm
O pacote rpm usado neste experimento - versão da comunidade MySQL 8.0 - pode clicar diretamente no anterior para pular, ou você pode copiar diretamente este link: http:// repo.mysql.com/mysql80-community-release-el7.rpm
mostra no formulário:

versão do servidor IP versão do banco de dados
CentOS7.9.2009 192.168.116.166 (mestre principal) MySQL8.0.32 Community Edition
CentOS7.9.2009 192.168.116.128 (do escravo) MySQL8.0.32 Community Edition

2. Instale o MySQL8.0

Aqui também está a necessidade de instalar o banco de dados em ambos os servidores

2.1 Limpe o pacote que vem com o CentOS7

No CentOS7, os arquivos e pacotes mariadb são instalados por padrão e precisam ser excluídos primeiro, caso contrário, isso afetará as instalações subsequentes.

#清空现有的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

Em seguida, procure arquivos sobre mysql e mariadb para excluir.

[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 Baixe e instale o banco de dados 8.0

Use o wget para baixar a fonte rpm copiada do site oficial anterior. Se o comando wget não estiver disponível, você precisará fazer o download do comando wget primeiro.
- pode ser copiado diretamente

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

Depois de instalá-los, você pode iniciar o serviço diretamente;

#启动服务
systemctl restart mysqld

2.3 Encontre a senha de inicialização

As senhas de inicialização dos dois computadores são diferentes. Você pode descobrir as senhas primeiro e depois modificar as senhas do banco de dados dos dois computadores para que sejam iguais.

#查找初始化密码
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

A senha do banco de dados segue os dois pontos:q_gkjqeR1iGA

2.4 Modifique a senha do banco de dados

Recomenda-se alterar as senhas dos dois bancos de dados para que sejam iguais para facilitar os testes 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

Alterar declaração de senha

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

No MySQL8.0, a senha precisa ser modificada da forma mais complicada possível para passar, e você pode usar a instrução para ver o grau de complexidade.

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)

Se deseja habilitar a verificação de senha do usuário.
O local onde o arquivo de senha está armazenado.
O comprimento da senha é de pelo menos 8
caracteres. O número de letras maiúsculas e minúsculas é de pelo menos 1.
Contém pelo menos um número
. Defina o nível de a senha. O nível padrão é médio e
contém pelo menos um caractere.

O conteúdo acima precisa ser operado em ambos os servidores.

3. Operação no mestre principal

O acima define o mestre principal como o IP deste servidor: 192.168.116.166
Para ver visualmente em qual servidor ele está rodando, aqui está a modificação do nome do host, para que seja fácil de distinguir.

3.1 Modifique temporariamente o nome do host

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

3.2 Configurando o banco de dados mestre

Crie um usuário de banco de dados slave21, torne-o remoto e defina uma senha

[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)

Olhando para esta foto, parece que há muito conteúdo, mas na verdade são apenas algumas frases;

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

O significado desta instrução é criar um usuário slave21. O nome do usuário pode ser definido por você mesmo; @'%' significa que você pode usar login remoto no banco de dados. Esta instrução é uma redação fixa do MySQL8.0, identified with mysql_native_password byque significa definir uma senha para ele.

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

Esta declaração significa autorizar as permissões de banco de dados para este usuário, *.*basicamente para dar todas as permissões, o primeiro * significa todos os bancos de dados e o segundo significa tabelas de banco de dados.

flush privileges;

Esta instrução significa atualizar o banco de dados, para que o conteúdo definido anteriormente possa ser sincronizado com o banco de dados.

show grants for 'slave21'@'%';

Verifique se as permissões definidas anteriormente foram gravadas no banco de dados e o conteúdo exibido indica que a gravação foi bem-sucedida.

3.3 Modifique o arquivo de configuração do banco de dados

[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 O ID exclusivo do serviço de banco de dados
log-bin=mysql-bin Defina o local de armazenamento do log binlog
binlog_do_db=test Defina o banco de dados para sincronização, se esta linha não estiver escrita, significa que todos os bancos de dados estão sincronizados
binlog_ignore_db=mysql Definir o banco de dados para não sincronização

Lembre-se que após a configuração, existe outro comando que precisa reiniciar o serviço.

3.4 Visualize o status do mestre principal

Depois de definir o arquivo de configuração, efetue login no sistema de banco de dados mysql para verificar as informações do mestre.

[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 que você precisa verificar essas informações, porque elas precisam ser usadas ao configurar o banco de dados escravo.

File é o arquivo de armazenamento do log-bin que acabamos de configurar, que é usado para gravar o arquivo de log da operação do mysql.
A posição indica o deslocamento
Binlog_Do_DB, o banco de dados que precisa ser sincronizado,
Binlog_Ignore_DB, o banco de dados que não precisa ser sincronizado

Neste ponto, não continue a operar o primeiro banco de dados mestre para evitar a alteração do deslocamento.

4. Operar a partir do escravo

Aqui você precisa ir para o segundo servidor para operar e aqui também modificar o nome do host para aumentar o reconhecimento.

4.1 Modifique temporariamente o nome do host

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

4.2 Modifique o arquivo de configuração

O servidor escravo só precisa escrever o ID único. server-id=22O conteúdo deste id não precisa ser igual ao anterior. Desde que não seja igual ao número do id anterior, você pode defini-lo como não o que importa.

#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

Não se esqueça que você precisa reiniciar o serviço

4.3 Vincule o servidor mestre 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)

A instrução que realmente precisa ser executada;

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= #O IP do primeiro mestre principal deve ser preenchido posteriormente
  • master_user= #escreve o nome de usuário criado no mestre principal antes
  • master_password= #escreva a senha do nome de usuário criado no master master antes
  • master_log_file= #Arquivo de log, use show master status no master; o valor exibido nessa etapa.
  • master_log_pos= #offset
start slave;

Ativar replicação de dados síncrona

show slave status \G

Depois de executar esta instrução, verifique se os dois valores de Slave_IO_Running: Yes e Slave_SQL_Running: Yes são sim. Se sim, significa que a sincronização está em andamento, o que também significa que nosso experimento desta vez foi bem-sucedido.

Claro, também há casos em que esses dois valores não são sim depois que os pequenos parceiros terminam, e pode haver situações em que um valor é não, ou ambos os valores são não.

4.4 Como resolver o problema de não

Você pode parar o escravo primeiro e redefini-lo novamente até que ambos estejam sim.

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)

Você também pode copiar o conteúdo do banco de dados a ser sincronizado para o servidor escravo primeiro, para que o conteúdo do banco de dados a ser sincronizado pelos dois servidores seja exatamente o mesmo e, em seguida, usar esse método novamente para vincular e iniciar.

5. Resultados do teste

5.1 Crie um banco de dados no master master

Terminamos os experimentos acima, e é hora de começar a criar um banco de dados para verificação. O banco de dados que escolhemos para sincronizar é então testcriaremos testum banco de dados e escreveremos tabelas, dados, etc.

#主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 Visualização do banco de dados no escravo

Você pode ver que testo banco de dados foi sincronizado. Entre testno banco de dados para visualizar os dados nele e também está sincronizado.

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)

As informações nas tabelas do banco de dados existem, indicando que não há problema em selecionar o banco de dados para sincronização test.

Resumir

Depois de fazer o experimento acima, você descobrirá que o banco de dados principal só pode ser sincronizado a partir do banco de dados. Então, ambos podem ser sincronizados entre si com base nisso? A resposta é sim. Este método é a sincronização principal e principal. É é o servidor mestre, é o escravo quando sincroniza os dados e é o mestre quando escreve os dados, o que será revelado no próximo artigo. Se você acha que o conteúdo acima está bom, você pode gostar e apoiá-lo!
insira a descrição da imagem aqui

Acho que você gosta

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