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