Índice
- Replicação mestre-escravo MySQL
- MyCat implementa separação de leitura e escrita
-
- Preparação de um ambiente mestre e um escravo
- Introdução ao mestre duplo e escravos duplos e preparação do ambiente
-
- Configuração
-
- 1. Configuração do banco de dados principal (Master1)
- 2. Configuração da biblioteca principal (Master2)
- 3. Crie uma conta para replicação mestre-escravo
- 4. Configuração da biblioteca escrava (Slave1)
- 5. Configuração da biblioteca escrava (Slave2)
- 6. Configure as duas bibliotecas escravas para associar à biblioteca principal
- 7. Copie um ao outro entre as duas bibliotecas principais
- 8. Teste
- Configuração de separação de leitura e gravação de mestre duplo e escravo duplo
- Soluções para pequenos problemas de rede
Replicação mestre-escravo MySQL
Visão geral
A replicação mestre-escravo consiste em transferir os dados do banco de dados mestre para o servidor de banco de dados escravo por meio do log binário (binlog) e, em seguida, executar novamente esses logs no banco de dados escravo, de modo que os dados do banco de dados escravo e do banco de dados mestre estão sincronizados.
princípio
construir
Prepare dois servidores
Mestre: 192.168.40.137
Escravista: 192.168.40.138
1. Desligue o firewall
[root@mysql-master ~]# systemctl stop firewalld
[root@mysql-master ~]# systemctl disable firewalld
[root@mysql-slaver ~]# systemctl stop firewalld
[root@mysql-slaver ~]# systemctl disable firewalld
2.Instale o mysql
Instale o mysql em ambos os servidores, use ps para verificar se a instalação foi bem-sucedida
[root@mysql-master ~]# ps aux|grep mysqld
[root@mysql-slaver ~]# ps aux|grep mysqld
3. Configuração da biblioteca principal
Modifique o arquivo de configuração da biblioteca principal /etc/my.cnf
# mysql服务器id,保证整个集群环境中唯一
server-id=1
# 是否只读,1代表只读,0代表读写
read-only=0
Reinicie o servidor MySQL
[root@mysql-master ~]# systemctl restart mysqld
Faça login no MySQL, crie uma conta para conexão remota e conceda permissões de replicação mestre-escravo
# 创建root用户,并设置密码,该用户可以在任意主机连接mysql服务
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 为'root'@'%'用户分配主从复制权限
mysql> grant replication slave on *.* to 'root'@'%';
Ver coordenadas binárias
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000004 | 377 | | | |
+---------------+----------+--------------+------------------+-------------------+
4. Configuração da biblioteca
Modifique o arquivo de configuração escravo /etc/my.cnf
# mysql服务器id,保证整个集群环境中唯一
server-id=2
# 是否只读,1代表只读,0代表读写
read-only=1
Reinicie o servidor MySQL
[root@mysql-master ~]# systemctl restart mysqld
Faça login no MySQL e defina a configuração do banco de dados principal
mysql> change replication source to source_host="192.168.40.137",source_user="root",source_password='123456',source_log_fike='binlog.000004',source_log_pos=377;
Habilitar operação de sincronização
mysql> start replica;
Ver o status da replicação mestre-escravo
mysql> show replica status\G;
5. Teste
Crie um banco de dados, depois crie uma tabela e insira os dados para visualizar
mysql> CREATE DATABASE MyDatabase;
Query OK, 1 row affected (0.01 sec)
mysql> USE MyDatabase;
Database changed
mysql> CREATE TABLE MyTable (
-> id INT NOT NULL AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> age INT NOT NULL,
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO MyTable (name, age) VALUES
-> ('张三', 20),
-> ('李四', 25),
-> ('王五', 30);
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>INSERT INTO MyTable (name, age) VALUES
-> ('张三', 20),
-> ('李四', 25),
-> ('王五', 30);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> update MyTable set age=20;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 6 Changed: 2 Warnings: 0
MyCat implementa separação de leitura e escrita
A separação leitura-gravação consiste em separar as operações de leitura e gravação no banco de dados para corresponder a diferentes servidores de banco de dados. A biblioteca mestre fornece operações de gravação e a biblioteca escrava fornece operações de leitura, o que pode efetivamente reduzir a pressão em um único banco de dados.
Preparação de um ambiente mestre e um escravo
Verifique se o ambiente de replicação mestre-escravo anterior está normal. Da mesma forma, se os seguintes efeitos aparecerem, é normal.
Configuração
MyCat controla a separação leitura-gravação e o balanceamento de carga do banco de dados em segundo plano pelo atributo balance da tag datahost no arquivo schema.xml.
valor do saldo
1. Modifique o arquivo schema.xml, especifique a biblioteca lógica e leia e grave o IP do host
<!-- 新建一个逻辑库 dataNode为dn4-->
<schema name="DB_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn4" >
</schema>
<dataNode name="dn4" dataHost="dhost4" database="db1" />
<!--新建一个主机dhost4 负载均衡策略为1-->
<dataHost name="dhost4" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写操作对应的主机-->
<writeHost host="hostM1" url="jdbc:mysql://192.168.40.137:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
<!-- 读操作对应的主机-->
<readHost host="hostS1" url="jdbc:mysql://192.168.40.138:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
</readHost>
</writeHost>
</dataHost>
2. Adicione a permissão do usuário para acessar o banco de dados no arquivo server.xml
3. Reinicie o MyCat
[root@mysql-master mycat]# bin/mycat restart
Visualização de teste
Como a replicação mestre-escravo está configurada, as modificações nos dados no banco de dados escravo não afetarão o banco de dados mestre, portanto, modifique os dados no banco de dados escravo e consulte o banco de dados mestre para ver se os dados consultados são do banco de dados escravo ou do banco de dados escravo. banco de dados mestre.
Percebe-se que os dados da biblioteca foram modificados, e os dados da biblioteca são recuperados, o que realiza a separação entre leitura e escrita.
Introdução ao mestre duplo e escravos duplos e preparação do ambiente
1. Introdução
Um host Master1 é usado para lidar com todas as solicitações de gravação, e seu escravo Slave1 e outro host Master2 e seu escravo Slave2 são responsáveis por todas as solicitações de leitura. Quando o host Master1 fica inativo, o host Master2 é responsável por escrever solicitações, e Master1 e Master2 são máquinas de backup um para o outro.
2. Preparação do ambiente
servidor | instalar software | ilustrar |
---|---|---|
192.168.40.137 | JDK,MyCat,MySQL | Servidor intermediário MyCat |
192.168.40.138 | MySQL | Mestre1 |
192.168.40.139 | MySQL | Escravo1 |
192.168.40.170 | MySQL | Mestre2 |
192.168.40.171 | MySQL | Escravo2 |
Desligue todos os firewalls
systemctl stop firewalld
systemctl disable firewalld
Configuração
1. Configuração do banco de dados principal (Master1)
Modifique o arquivo de configuração /etc/my.cnf
# 主库配置
# mysql服务器id,保证整个集群环境中唯一
server-id=1
# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
# 在作为从数据库的时候,有写入操作也要更新二进制文件
log-slave-updates
Reiniciar serviço
systemctl restart mysqld
2. Configuração da biblioteca principal (Master2)
Modifique o arquivo de configuração /etc/my.cnf
# 主库配置
# mysql服务器id,保证整个集群环境中唯一
server-id=3
# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
# 在作为从数据库的时候,有写入操作也要更新二进制文件
log-slave-updates
Reiniciar serviço
systemctl restart mysqld
3. Crie uma conta para replicação mestre-escravo
Tanto Master1 quanto Master2 executam
# 创建root用户,并设置密码,该用户可以在任意主机连接mysql服务
mysql> create user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 为'root'@'%'用户分配主从复制权限
mysql> grant replication slave on *.* to 'root'@'%';
Veja as coordenadas binárias das duas bibliotecas principais
mysql> show master status;
Mestre1
mysql> show master status;
+---------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+----------------+------------------+-------------------+
| binlog.000004 | 659 | db01,db02,db03 | | |
+---------------+----------+----------------+------------------+-------------------+
1 row in set (0.00 sec)
Mestre2
mysql> show master status;
+---------------+----------+----------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+----------------+------------------+-------------------+
| binlog.000002 | 659 | db01,db02,db03 | | |
+---------------+----------+----------------+------------------+-------------------+
1 row in set (0.00 sec)
4. Configuração da biblioteca escrava (Slave1)
Modifique o arquivo de configuração escravo /etc/my.cnf
# mysql服务器id,保证整个集群环境中唯一
server-id=2
Reinicie o servidor MySQL
systemctl restart mysqld
5. Configuração da biblioteca escrava (Slave2)
Modifique o arquivo de configuração escravo /etc/my.cnf
# mysql服务器id,保证整个集群环境中唯一
server-id=4
Reinicie o servidor MySQL
systemctl restart mysqld
6. Configure as duas bibliotecas escravas para associar à biblioteca principal
Executar em Slave1
mysql> change master to master_host="192.168.40.138",master_user="root",master_password='123456',master_log_file='binlog.000004',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
iniciar repositório
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
Ver o status da replicação mestre-escravo
mysql> show slave status\G;
Executar em Slave2
mysql> change master to master_host="192.168.40.170",master_user="root",master_password='123456',master_log_file='binlog.000002',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
iniciar repositório
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
Ver o status da replicação mestre-escravo
mysql> show slave status\G;
7. Copie um ao outro entre as duas bibliotecas principais
Master1 replica Master2 ,Executado em Master1
mysql> change master to master_host="192.168.40.170",master_user="root",master_password='123456',master_log_file='binlog.000002',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
Inicie a biblioteca escrava e verifique o status da replicação mestre-escravo
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show slave status\G;
Master2 replica Master1 ,Executado em Master2
mysql> change master to master_host="192.168.40.138",master_user="root",master_password='123456',master_log_file='binlog.000004',master_log_pos=659;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
Inicie a biblioteca escrava e verifique o status da replicação mestre-escravo
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show slave status\G;
8. Teste
Crie o banco de dados DB01:
CREATE DATABASE db01;
Selecione o banco de dados DB01:
USE db01;
Crie uma mytable
tabela nomeada com 3 campos:
CREATE TABLE mytable (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age INT NOT NULL,
address VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
mytable
Insira 5 dados chineses na tabela :
INSERT INTO mytable (name, age, address) VALUES
('张三', 20, '北京'),
('李四', 25, '上海'),
('王五', 30, '广州'),
('赵六', 35, '深圳'),
('钱七', 40, '成都');
Um teste simples mostra que as funções dual-master e dual-slave podem ser realizadas.
Configuração de separação de leitura e gravação de mestre duplo e escravo duplo
A separação leitura-gravação e o balanceamento de carga do banco de dados do console MyCat são controlados pelo atributo balance da tag dataHost no arquivo schema.xml e a comutação automática é concluída em caso de falha por meio de writeType e switchType.
Modifique o arquivo schema.xml do MyCat
<!--因为只设置了db01这个库,以它为例-->
<dataNode name="dn4" dataHost="dhost4" database="db01" />
<!--新建一个主机dhost4 负载均衡策略为1-->
<dataHost name="dhost4" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写操作对应的主机 Master1 - Slave1-->
<writeHost host="Master1" url="jdbc:mysql://192.168.40.138:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
<!-- 读操作对应的主机-->
<readHost host="Slave1" url="jdbc:mysql://192.168.40.139:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
</readHost>
</writeHost>
<!-- Master2 - Slave2 -->
<writeHost host="Master2" url="jdbc:mysql://192.168.40.170:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
<!-- 读操作对应的主机-->
<readHost host="Slave2" url="jdbc:mysql://192.168.40.171:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="123456">
</readHost>
</writeHost>
</dataHost>
Reinicie o MyCat
[root@mycat mycat]# bin/mycat restart
Faça login para visualizar
[root@mycat mycat]# mysql -h 192.168.40.137 -P 8066 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.3-release-20210913163959 MyCat Server (OpenCloudDB)
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 databases;
+----------+
| DATABASE |
+----------+
| DB01 |
| DB_RW |
+----------+
2 rows in set (0.00 sec)
mysql> use DB_RW;
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_db01 |
+----------------+
| mytable |
+----------------+
1 row in set (0.02 sec)
Visualização de teste
O teste pode ser feito inserindo dados para visualizar ou deixando o Master1 desligar, e então se o Master2 pode ser iniciado para atingir alta disponibilidade. O teste é relativamente simples, então não vou postar fotos.
Soluções para pequenos problemas de rede
Cancele o NetworkManager assumindo as configurações de rede:
nmcli n off
Configure o NetworkManager para assumir as configurações de rede:
nmcli n on