(文章目录)


前言

MySQL异步复制是MySQL数据库中的一种数据复制方式,主要用于在多个MySQL实例之间复制数据。与同步复制不同,异步复制并不要求每个MySQL实例都必须立即接收新数据的更新。相反,更新在主MySQL实例上执行后,异步地传输给从MySQL实例,所以数据的同步可能需要花费一定的时间。

异步复制的特点

MySQL异步复制具有以下特点:

1.高可用性:当主MySQL实例出现故障时,从实例可以自动接管读写操作,提高了整个系统的可用性。

2.节省带宽:由于更新在主MySQL实例上异步传输,因此从实例不需要立即接收新的更新。这意味着可以控制从实例接收更新的速度,从而节省了带宽和网络资源。

3.较低的延迟:尽管异步复制存在一些延迟,但通常不会对系统的性能造成太大影响。在许多情况下,异步复制比同步复制更快。

4.灵活性:MySQL异步复制支持多个从MySQL实例,并且可以根据需求配置不同的复制拓扑结构,例如环形、星形或链式结构。

实验目的

在两台mysql服务器上实现基础的异步复制

实验步骤

一、准备一台mysql从服务器,安装好mysql,mysql版本最好一致,不建议直接克隆主服务器

二、将主服务器的数据复制到从服务器

master:

先通过mysqldump将master目前的数据导出再通过scp发送到从服务器上

[root@master mysql]# mkdir /backup
[root@master mysql]# mysqldump -uroot -p'Zh_000000' --all-databases >/backup/all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master mysql]# scp /backup/all_db.sql 192.168.10.148:/root
The authenticity of host '192.168.10.148 (192.168.10.148)' can't be established.
ECDSA key fingerprint is SHA256:R2xbX1mlnOg+W2ULu+xpsbHcAd1PIBCeQAuxCJDka4Q.
ECDSA key fingerprint is MD5:a9:47:3b:77:ea:16:3f:16:b6:91:a7:e8:ba:a5:fa:3e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.148' (ECDSA) to the list of known hosts.
root@192.168.10.148's password: 
all_db.sql                                                                                   100%  867KB  46.7MB/s   00:00    

slave:

在slave上导入数据

root@(none) 15:58  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
[root@slave ~]# mysql -uroot -p'Zh_000000' <all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
root@(none) 16:05  mysql>show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hunan              |
| my_database        |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
| zh001              |
+--------------------+
8 rows in set (0.01 sec)

三、确保master开启二进制日志,slave可以不开启,但需要指定server_id

master:

[root@master mysql]# vim /etc/my.cnf
[mysqld]
# binlog
log_bin
server_id = 1
[root@master ~]# service mysqld restart

slave:

[root@slave ~]# vi /etc/my.cnf
[mysqld]
# slave_id
server_id = 2
[root@slave ~]# service mysqld restart

四、在master上创建一个可以有复制权限的授权用户

slave可以通过该用户到master服务器里来复制二进制日志

master:

创建并授权一个新用户

root@(none) 16:23  mysql>grant replication slave on *.* to 'zhi'@'192.168.10.%' identified by 'Zh_000000';
Query OK, 0 rows affected, 1 warning (0.00 sec)

主机部分如果考虑安全性可以只指定单个ip,我这里直接指定了当前的网段

五、在slave上添加授权用户的信息

slave:

根据自己的设置情况在mysql中执行下面的语句:

CHANGE MASTER TO MASTER_HOST='192.168.10.146',	# master主机
 MASTER_USER='zhi',		# master授权的slave用户
 MASTER_PASSWORD='Zh_000000',
 MASTER_PORT=3306,		# master的mysqld端口
 MASTER_LOG_FILE='master-bin.000001',	# master当前使用的二进制日志名
 MASTER_LOG_POS=154;	# 即当前的位置号

可以在master上使用下面的命令查看当前日志名和位置号:

root@(none) 16:37  mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

执行:

root@(none) 16:40  mysql>CHANGE MASTER TO MASTER_HOST='192.168.10.146',
    ->  MASTER_USER='zhi',
    ->  MASTER_PASSWORD='Zh_000000',
    ->  MASTER_PORT=3306,
    ->  MASTER_LOG_FILE='master-bin.000001',
    ->  MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)	# 执行不成功要查看信息是否打错,或者检查防火墙

使用命令查看slave状态信息:

root@(none) 16:43  mysql>show slave status\G;		# 返回结果从开头截取了一部分
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 192.168.10.146
                  Master_User: zhi
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: No	# 因为还没启动slave,所以这两个进程还没启动
            Slave_SQL_Running: No

六、启动slave角色

slave:

# 启动slave服务
root@(none) 16:43  mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
# 再次查看slave状态
root@(none) 16:44  mysql>show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.146
                  Master_User: zhi
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001	# 从服务器已经处理的最后一个二进制日志文件
          Read_Master_Log_Pos: 154	# 最后处理的位置号
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

七、验证主从复制数据是否同步

master:

root@zh001 16:51  mysql>create table t5(id int,name varchar(10),age tinyint);
Query OK, 0 rows affected (0.01 sec)

root@zh001 16:53  mysql>insert into t5(id,name,age) values(101,'只何',18);
Query OK, 1 row affected (0.00 sec)

root@zh001 16:53  mysql>select * from t5;
+------+--------+------+
| id   | name   | age  |
+------+--------+------+
|  101 | 只何   |   18 |
+------+--------+------+
1 row in set (0.00 sec)

slave:

root@(none) 16:44  mysql>select * from zh001.t5;
+------+--------+------+
| id   | name   | age  |
+------+--------+------+
|  101 | 只何   |   18 |
+------+--------+------+
1 row in set (0.01 sec)

可以看到在master上执行建表和插入数据后在slave上立马就能同步数据,实验结束

总结

MySQL异步复制是一种灵活、高可用性和低延迟的数据复制方式,可以满足大多数应用程序的需求。本文只是简单实现,异步复制需要更多的配置才能更好的应对多种业务请求,并且需要注意的是,在异步复制中,可能存在数据丢失的风险,因此需要仔细考虑数据库的可靠性和数据安全性。