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.
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.
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 by
que 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=22
O 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 test
criaremos test
um 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 test
o banco de dados foi sincronizado. Entre test
no 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!