Plano de fundo da arquitetura mestre-escravo
- Segurança de dados, backup de dados pode ser realizado;
- Separação de leitura e escrita, para a maioria dos sistemas empresariais, mais leitura e menos escrita.Se a pressão de acesso for muito alta, a solicitação pode ser distribuída para o servidor escravo, aliviando assim a pressão de acesso ao banco de dados;
- Failover (alta disponibilidade), quando o nó primário ficar inativo, ele passará do serviço para o nó primário para continuar prestando serviços.
Princípio de sincronização
A arquitetura mestre-escravo do Mysql é geralmente implementada por meio de logs de log binário, que registram todas as operações da biblioteca mestre. Após a biblioteca escrava e a biblioteca principal estabelecerem uma conexão TCP, a biblioteca principal é solicitada a transferir o log binário.Neste momento, outro thread de despejo da biblioteca principal transfere o log binário para a biblioteca principal. O log binlog lido da biblioteca é gravado em seu próprio relaylog e outro thread lê o conteúdo no relaylog para reprodução.
Primeiro, os benefícios da construção do Docker
- Os recursos são limitados e são necessários mais hosts;
- A construção da máquina virtual requer configuração da máquina, e as etapas para instalar o mysql são complicadas;
- Vários contêineres do Docker podem ser instalados e executados em uma máquina;
- Os contêineres do Docker são independentes uns dos outros, têm seu próprio IP e não afetam uns aos outros;
- O Docker é fácil de usar e inicia um contêiner em segundos;
2. Etapas de construção do Docker
2.1 Instale o mysql
docker pull mysql
Versão mais recente padrão
2.2 Inicie o contêiner mestre-escravo
Use a imagem msyql para iniciar o container e inicie os containers master e slave respectivamente;
- -p: porta do mapa
- --name: Indica o nome do container
- -e MYSQL_ROOT_PASSWORD: Configura a senha do mysql, parâmetro que deve ser configurado;
- -d mysql Tag: Tag representa o id do espelho;
- Mestre
docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456
-d mysql:latest
- Escravo (de)
docker run -p 3340:3306 --name mysql-slave1 -e MYSQL_ROOT_PASSWORD=123456
-d mysql:latest
- A porta mapeada externamente do Master é 3339 e a porta mapeada externamente do Slave é 3340. Como os contêineres do docker são independentes uns dos outros, cada contêiner tem um IP independente, portanto, contêineres diferentes usando a mesma porta não entrarão em conflito.
Ferramenta de teste Navicat: Conexão bem-sucedida!
2.3 Configurar Mestre
1) Entre no recipiente
- Digite através do comando docker exec -it mysql-master /bin/bash;
- mysql-master: o nome ou id do container também funciona;
2) mudar de diretório
- cd /etc/mysql
3) Edite o arquivo my.cnf
- vim meu.cnf
Se um erro for relatado,
bash: vim: command not found
Execute o seguinte comando,
- apt-get install vim
Se ainda relatar um erro, você precisa atualizar o apt-get e executar o seguinte comando
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
- apt-get update e, em seguida, execute a etapa anterior para concluir a instalação;
4 ) Adicione a seguinte configuração em my.cnf
[mysqld]
## 同一局域网内要唯一
server-id=100
## 开启二进制日志功能,可以随时取消
log-bin=mysql-bin
5) Reinicie o container mysql-master
- docker reinicie o mysql-master
- docker exec -it mysql-master /bin/bash:运行mysql
6) Configure a biblioteca escrava e sincronize os dados
- Digite mysql: mysql -u root -p, digite a senha;
- criar usuário 'slave'@'%' identificado por '123456';
- concede escravo de replicação, cliente de replicação em *.* para 'slave'@'%';
- liberar privilégios; atualizar
sucesso!
Formato de sintaxe: CREATE USER <nome do usuário> [ IDENTIFIED ] BY [ PASSWORD ] <password>
<nome de usuário> | Especifica a criação de uma conta de usuário no formato 'user_name'@'host_name'. Aqui |
SENHA | Senha, opcional, é usada para especificar a senha de hash, ou seja, se a senha for definida em texto não criptografado, a palavra- PASSWORD chave precisa ser ignorada. |
IDENTIFICADO POR |
É usado para especificar a senha correspondente à conta do usuário. Se a conta do usuário não tiver senha, esta cláusula pode ser omitida. |
<senha> | Especifica a senha da conta de usuário, após a IDENTIFIED BY palavra-chave ou palavras- PASSWOED chave. O valor de senha fornecido pode ser um texto simples consistindo apenas de letras e números, ou um valor de hash obtido pela função PASSWORD(). |
Formato de sintaxe: conceder replicação
Para o usuário MySQL recém-criado, ele deve ser autorizado, e a instrução GRANT pode ser usada para realizar a autorização do usuário recém-criado.
- replicação slave: Com esta permissão, você pode visualizar o servidor slave e ler o log binário do servidor master, somente concedendo esta permissão a replicação pode realmente funcionar;
- Cliente de replicação: Com esta permissão, você pode consultar o status do servidor mestre e do servidor escravo, somente concedendo essa permissão a replicação pode realmente funcionar;
2.4 Configurar Escravo (escravo)
Igual à configuração Maser (principal), omitida antes!
1) Adicione o arquivo de configuração do Slave my.cnf
[mysqld]
## 同一局域网内要唯一
server-id=101
## 开启二进制日志功能,以备份Slave作为其他Slave的Master时使用
log-bin=mysql-slave-bin
## 配置中继日志
relay_log=edu-mysql-relay-bin
2) Reinicie o mysql-slave1
2.5 Conecte Mestre e Escravo
1) Digite mysql-master
Executando um pedido:
show master status;
Os valores dos campos Arquivo e Posição serão utilizados posteriormente;
2) Digite mysql-slave1
Executando um pedido:
change master to master_host='172.17.0.3',master_user='slave',
master_password='123456',master_port=3306,
master_log_file='mysql-bin.000005',
master_log_pos=0,master_connect_retry=10,
get_master_public_key=1;
- master_host: O endereço do Master, que é o IP oposto do container, que pode ser visualizado com o seguinte comando
docker inspect --format='{ {.NetworkSettings.IPAddress}}' 容器名称|容器id
- master_port: O número da porta do Master, que é o número da porta do container;
- master_user: o usuário usado para sincronização de dados;
- master_password: a senha usada para sincronizar o usuário;
- master_log_file: Especifica de qual arquivo de log o Slave começa a copiar os dados, ou seja, o valor do campo Arquivo mencionado acima;
- master_log_pos: De qual Posição iniciar a leitura, ou seja, o valor do campo Posição mencionado acima;
- master_connect_retry: Se a conexão falhar, o intervalo de repetição, a unidade é segundos, o padrão é 60 segundos;
Lembre-se de adicionar get_master_public_key=1, porque a criptografia RSA é necessária para transmitir senhas acima do mysql8.0.
Perceber:
Se você usar o IP do container ( master_host ) e PORT ( master_port ), ele deve ser substituído pelo IP do host e mapeado para uma porta externa, para evitar erros. por exemplo
3) Visualize o status de sincronização mestre-escravo
- Digite o terminal mysql no escravo para executar o comando:
show slave status \G;
- Em circunstâncias normais, SlaveIORunning e SlaveSQLRunning são Não, porque o processo de replicação mestre-escravo não foi iniciado. Use o seguinte comando para iniciar a replicação mestre-escravo:
start slave
# 此外 若想关闭则 stop slave;即可
- Consultar o status da replicação mestre-escravo novamente mostrar o status do escravo \G;
Tornou-se sim!
2.6 Solução de problemas de replicação mestre-escravo
Após usar start salve para habilitar a replicação mestre-escravo, se SlaveIORunning estiver sempre Conectando, significa que a replicação mestre-escravo sempre esteve conectada. Esta situação geralmente é causada pelos seguintes motivos, que podem ser descartados de acordo com o prompt Last_IO_Error.
1) Falha de rede
- Verifique ip, porta
2) A senha está incorreta
- Verifique se o usuário a ser criado para sincronização e a senha do usuário estão corretos
3) pos não está certo
- Verifique a posição do mestre
4) O problema da versão do mysql
- mysql8.0 ou criptografia de senha superior, você precisa adicioná-lo ao conceder,
因为mysql8.0以上需要使用RSA加密来传输密码
2.7 Testar a replicação mestre-escravo
Crie um banco de dados no Master e verifique se o banco de dados existe no Slave
- Mestre
- Escravo