掘金 后端 ( ) • 2024-04-09 09:56

使用主从复制的原因(优点)

主要原因包括提高性能、实现高可用性、数据备份和灾难恢复。

读写分离: 主从复制允许在主服务器上执行写操作,而在从服务器上执行读操作。这可以分担主服务器的负载,提高整体性能。从服务器可以分担读查询、报表生成等任务,减轻主服务器的压力。

高可用性: 当主服务器发生故障时,从服务器可以接管服务,从而提供高可用性。通过将从服务器配置为备份,可以确保在主服务器不可用时,系统仍然能够继续提供服务。

数据备份: 从服务器可以用作实时备份,以便在主服务器发生数据损坏或误操作时进行恢复。备份可以从从服务器上进行,而不会对主服务器的性能产生负面影响。

灾难恢复: 在发生灾难性事件(如硬件故障、数据中心故障等)时,从服务器可以用作快速恢复数据的副本。通过配置合适的地理位置分布,可以提高系统的灾难恢复能力。

数据分布: 主从复制还允许在不同地理位置的服务器上维护相同的数据副本。这对于全球分布的应用程序或具有多个地理位置的用户群体非常有用,可以提高用户访问数据的速度。

主从复制的过程(原理)

了解两大线程( I/O 和 SQL)

I/O线程:

目的:I/O线程主要负责与MySQL服务器之外的其他MySQL服务器进行通信,以便复制(replication)数据。 功能: 当一个MySQL服务器作为主服务器(master)时,I/O线程会将变更日志(binary log)中的事件传输给从服务器(slave)。从服务器上的I/O线程负责接收主服务器的二进制日志,并将这些事件写入本地的中继日志(relay log)。 配置: 在MySQL配置文件中,你可以通过配置参数如和来启用二进制日志和指定服务器ID。log-bin server-id

SQL线程:

目的:SQL线程主要负责执行从I/O线程接收到的二进制日志事件,将这些变更应用到从服务器上的数据库。

功能: 从服务器上的SQL线程会读取中继日志中的事件,并在从服务器上执行相应的SQL语句,以确保从服务器的数据与主服务器保持同步。

配置: 在从服务器上,你需要配置一些参数,如、和来启用二进制日志、指定服务器ID和指定中继日志。log-bin server-id relay-log

核心原理

就是主从复制的工作原理

了解以下部分就能对本章节 易如指掌

启用二进制日志: 主服务器在配置文件中启用二进制日志,记录所有对数据库的更改。这通过在主服务器的配置文件中设置log-bin选项来实现。二进制日志包含了对数据的所有修改操作,例如插入、更新和删除。

生成二进制日志事件: 当在主服务器上执行任何更改时,MySQL会将这些更改记录为二进制日志事件。每个事件都有一个唯一的标识,包括操作类型、受影响的表和相应的数据。

从服务器连接主服务器: 从服务器通过MySQL的复制线程连接到主服务器。在主从复制设置中,从服务器充当复制的被动一方,而主服务器则是主动一方。

获取主服务器的二进制日志信息: 从服务器向主服务器发送请求,获取主服务器上的二进制日志信息。从服务器要求主服务器提供自己的位置(File和Position),这将作为复制的起始点。

主服务器发送二进制日志: 主服务器从请求的起始点开始发送二进制日志信息给从服务器。这些二进制日志文件包含了在主服务器上执行的所有更改操作。

从服务器应用二进制日志: 从服务器接收到二进制日志后,将这些日志逐个应用到自己的数据库中。这样,从服务器的数据会与主服务器保持同步。

维护复制位置: 从服务器会定期记录自己复制的位置,以便在重新连接时从正确的位置开始复制。这通常由MySQL的relay-log和relay-log-index文件来管理。

处理主从同步延迟: 在一些情况下,由于网络延迟、从服务器负载等原因,可能会导致主从同步延迟。可以通过适当的调整和优化来降低同步延迟,确保从服务器的数据尽快与主服务器同步。

1.主从复制实验

通过以下实验深刻的理解

1.实验环境

注意事项:尽量使用同一版本的mysql

实验环境两个安装mysql5.7的CentOs7

每台的配置:关闭防火墙 selinux 配置静态ip 域名解析
第一台:master1        192.168.180.180
第二台:master2        192.168.180.181

域名解析:
vim /etc/hosts
加入
192.168.180.180 master1
192.168.180.181 master2
2.配置主服务器(master1)
开启二进制文件
vim /etc/my.cnf
log-bin=master-bin
server-id=1
 
systemctl restart mysqld

注释:

log-bin=master-bin:这一行配置启用二进制日志,并设置了二进制日志的文件名为 "master-bin"。二进制日志用于记录对数据库执行的更改操作,这对于主从复制是必要的。

server-id=1:这一行配置为服务器分配唯一的ID,即服务器ID。在主从复制中,每个参与复制的MySQL服务器都必须有唯一的服务器ID,以便在复制时进行标识。在这里,服务器ID被设置为1。

创建用户

grant replication slave on . to 'rep'@'192.168.180.%' identified by 'Sunshao-123';

查看状态

用于从服务器

MASTER_LOG_FILE='二进制文件',   MASTER_LOG_POS=154;

来使用

show master status;

File:当前二进制日志文件的名称。

Position:二进制日志文件中的位置。

Binlog_Do_DB:要复制的数据库(如果指定)。

Binlog_Ignore_DB:复制期间要忽略的数据库(如果指定)。

查看端口号

SHOW VARIABLES LIKE 'port';

3.从服务器(master2)

vim /etc/my.cnf
server-id=2        *******标识符改为2
 
systemctl restart mysqld

从复制主配置(核心命令)

CHANGE MASTER TO
  MASTER_HOST='主服务器Ip或主机名',
  MASTER_PORT=数据库的端口号(默认3306),
  MASTER_USER='创建的用户',
  MASTER_PASSWORD='用户密码',
  MASTER_LOG_FILE='二进制文件',
  MASTER_LOG_POS=154;

主服务器show master status;

查看出的参数写入以下两个选项当中

MASTER_LOG_FILE='二进制文件',‘

’MASTER_LOG_POS=154;

端口号也是一样

启动复制

START SLAVE;

查看状态

show slave status \G;

测试

主服务器创建一个库表并且插入数据

mysql> create database test;
Query OK, 1 row affected (0.01 sec)
 
mysql> use test;
Database changed
 
mysql> insert into t1 values(1111),(2222);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
 
mysql> select * from t1;
+------+
| id   |
+------+
| 1111 |
| 2222 |
+------+
2 rows in set (0.00 sec)
 

从服务器测试

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.00 sec)
 
 
mysql> use test;
Database changed
mysql> show tables
    -> ;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)
 
mysql> select * from t1;
+------+
| id   |
+------+
| 1111 |
| 2222 |
+------+
2 rows in set (0.00 sec)