MySQL-主从复制-异步复制
文章目录
- MySQL-主从复制-异步复制
- @[toc]
- 一、主从复制
-
- 二、主从复制之异步复制实验
- 2.1 master和slave都要安装相同版本的Mysql
- 2.2 先将Mysql的数据库全备导出,然后再slave上导入,达到两边服务器到的基础数据一样
- 2.3 确保master上开启了[二进制](https://so.youkuaiyun.com/so/search?q=二进制&spm=1001.2101.3001.7020)功能
- 2.4 在master上创建一个可以有复制权限的授权用户,这样slave可以到master服务器里面来复制二进制日志了
- 2.5 在slave上添加授权用户的信息
- 2.6 启动slave角色
- 2.7 验证主从复制的数据是否可以同步
- 2.8 生产环境下的主从复制该怎么做?
- 2.9 什么时候会发生主从切换,主从切换怎么完成?
-
文章目录
- MySQL-主从复制-异步复制
- @[toc]
- 一、主从复制
- 二、主从复制之异步复制实验
- 2.1 master和slave都要安装相同版本的Mysql
- 2.2 先将Mysql的数据库全备导出,然后再slave上导入,达到两边服务器到的基础数据一样
- 2.3 确保master上开启了[二进制](https://so.youkuaiyun.com/so/search?q=二进制&spm=1001.2101.3001.7020)功能
- 2.4 在master上创建一个可以有复制权限的授权用户,这样slave可以到master服务器里面来复制二进制日志了
- 2.5 在slave上添加授权用户的信息
- 2.6 启动slave角色
- 2.7 验证主从复制的数据是否可以同步
- 2.8 生产环境下的主从复制该怎么做?
- 2.9 什么时候会发生主从切换,主从切换怎么完成?
一、主从复制
1.1 什么是主从复制
其实就是复制的是主服务器的二进制日志,从服务器然后再重新根据日志操作一遍,从而达到和主服务器里的数据一样,但是时间上会有延迟。
集群:很多台服务器做一样的事情
此处抛出问题:如何解决延迟的问题?
名词解释:
- master:主服务器
- slave:从服务器
- manager --> master 管理地点
- worker:工作节点
- node:节点,一个节点就是一台服务器
- 集群:cluster --> 很多台服务器做一样的事情
- relay log:中继日志
讲一讲主从复制
两台mysql服务器,一台master,一台slave
-
首先master上面要开启二进制日志,当有数据变化的时候,数据就会存入二进制日志里面,
-
master里面有一个log dump线程,一旦二进制日志里面有变化,就会通知slave里面的I/O线程来读取数据
-
I/o线程读取到数据以后就会将数据写入Relay log 中继日志里面,然后由slave里面的SQL线程进行read和replay操作,达到数据一致性的目的。
master-info文件的作用?
记录master的ip,连接过去
二、主从复制之异步复制实验
实验步骤
2.1 master和slave都要安装相同版本的Mysql
Maste
[root@zkj-mysql ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.37, for linux-glibc2.12 (x86_64) using EditLine wrapper
Slave
[root@Slave ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.37, for linux-glibc2.12 (x86_64) using EditLine wrapper
2.2 先将Mysql的数据库全备导出,然后再slave上导入,达到两边服务器到的基础数据一样
# 先将Mysql的数据库全备导出
[root@zkj-mysql ~]# mysqldump -u root -p 'Sanchuang123#' --all-databases > /backup/mysqlall_db.sql
[root@zkj-mysql ~]# cd /backup/
[root@zkj-mysql backup]# ls
all_da.sql mysqlall_db.sql zkj.sql
# 事先建立好免密通道 将全备份sql文件scp传到slave服务器上面
[root@zkj-mysql backup]# scp mysqlall_db.sql 192.168.40.134:~/
mysqlall_db.sql 100% 203 247.6KB/s 00:00
# 来到slave 可以看见mysql的全备份文件已经收到
[root@Slave ~]# ls
anaconda-ks.cfg mysqlall_db.sql
# 在slave服务器上面导入全备份sql文件
[root@Slave ~]# mysql -uroot -p'Sanchuang123#' < all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
# 可以看到,基础数据已经一致
root@(none) 10:01 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sc |
| sys |
| zengkaijie |
| zkj |
+--------------------+
7 rows in set (0.02 sec)
2.3 确保master上开启了二进制功能
slave也开启二进制日志,也可以不开启,但是需要指定server_id
master:
# binary log
log_bin
server_id = 1
slave:
server_id = 2
2.4 在master上创建一个可以有复制权限的授权用户,这样slave可以到master服务器里面来复制二进制日志了
root@(none) 10:17 mysql>grant replication slave on *.* to 'zeng'@'192.168.40.134%' identified by 'Sanchuang123#';
Query OK, 0 rows affected, 1 warning (0.00 sec)
2.5 在slave上添加授权用户的信息
root@(none) 10:24 mysql>CHANGE MASTER TO MASTER_HOST='192.168.40.134' ,
-> MASTER_USER='zeng',
-> MASTER_PASSWORD='Sanchuang123#',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='localhost-bin.000008',
-> MASTER_LOG_POS=6135;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
添加成功以后,查看slave状态,发现slave两个线程:I/O线程和SQL线程都是关闭状态,所以接下来要将它们开启
root@(none) 10:24 mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.40.134
Master_User: zeng
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000008
Read_Master_Log_Pos: 6135
Relay_Log_File: Slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: localhost-bin.000008
Slave_IO_Running: No
Slave_SQL_Running: No
2.6 启动slave角色
root@(none) 10:25 mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 10:25 mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.40.134
Master_User: zeng
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: localhost-bin.000008
Read_Master_Log_Pos: 6135
Relay_Log_File: network-relay-bin.000001
Relay_Log_Pos: 324
Relay_Master_Log_File: localhost-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
启动了slave角色以后,发现两个线程都已经成功起来。
2.7 验证主从复制的数据是否可以同步
在master机器上面新建一个数据库zengkaijie1,新建两个表t1,t2
root@(none) 11:16 mysql>create database zengkaijie1;
Query OK, 1 row affected (0.00 sec)
root@(none) 11:16 mysql>use zengkaijie1
Database changed
root@zengkaijie1 11:16 mysql>create table t1(id int,name varchar(10));
Query OK, 0 rows affected (0.01 sec)
root@zengkaijie1 11:17 mysql>create table t2(id int,name varchar(10));
Query OK, 0 rows affected (0.00 sec)
root@zengkaijie1 11:17 mysql>show tables;
+----------------------+
| Tables_in_zengkaijie1|
+----------------------+
| t1 |
| t2 |
+----------------------+
2 rows in set (0.00 sec)
slave服务器:发现数据成功同步
root@(none) 12:14 mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| zengkaijie1 |
| mysql |
| performance_schema |
| sc |
| sys |
| zengkaijie |
| zkj |
+--------------------+
10 rows in set (0.00 sec)
root@(none) 12:17 mysql>use zengkaijie1;
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
root@zengkaijie1 12:17 mysql>show tables;
+----------------------+
| Tables_in_zengkaijie1|
+----------------------+
| t1 |
| t2 |
+----------------------+
2 rows in set (0.00 sec)
root@zengkaijie1 12:18 mysql>show processlist;
+----+-------------+-----------+------------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------------+---------+------+--------------------------------------------------------+------------------+
| 2 | root | localhost | zengkaijie1| Query | 0 | starting | show processlist |
| 3 | system user | | NULL | Connect | 655 | Waiting for master to send event | NULL |
| 4 | system user | | NULL | Connect | 428 | Slave has read all relay log; waiting for more updates | NULL |
+----+-------------+-----------+------------+---------+------+--------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
一些其他验证:
1、查看刚才创建的用户是否从slave机器上面连接过来
root@zengkaijie1 12:19 mysql>show processlist;
+----+------+----------------------+------------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+----------------------+------------+-------------+------+---------------------------------------------------------------+------------------+
| 16 | root | localhost | zengkaijie1| Query | 0 | starting | show processlist |
| 17 | zeng | 192.168.40.134:45246 | NULL | Binlog Dump | 669 | Master has sent all binlog to slave; waiting for more updates | NULL |
+----+------+----------------------+------------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
2、查看slave机器上面的一些相关文件
2.8 生产环境下的主从复制该怎么做?
我们刚才在master和slave机器上面做的主从复制都是在非生产状态的情况下完成的,那么如果是要在生产环境下(即数据库在提供服务,数据在不断刷新)进行主从复制怎么办呢?
其实生产环境下的主从复制和非生产环境下的主从复制步骤几乎一致,但是要解决的难题是:
1、在slave机器上面添加用户信息时,因为正在提供服务,二进制日志在变化,position位置点也是在不断变化的。
2、我们无法精准的找到位置点,那么主从复制就无法保证数据的一致性。
3、最好地解决办法就是停止服务,进行主从备份。
有什么方法可以实现在线主从复制? ------- XtraBackup
mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷。一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldump就力不从心了。
Percona-Xtrabackup备份工具,是实现MySQL在线热备工作的不二选择,可进行全量、增量、单表备份和还原。(但当数据量更大时,可能需要考虑分库分表,或使用 LVM 快照来加快备份速度了)
2.9 什么时候会发生主从切换,主从切换怎么完成?
1.什么时候需要主从切换,主从切换如何实现?
主服务器挂了,需要提升原来的从为主 --》主从切换
完全手工去操作:
步骤:
1.stop slave
2.reset master
3.开启二进制日志
4.建立授权复制的用户
5.再启动一台机器做从,配置master信息去拉取二进制日志
如何将网站的新的的流量切到新的master上?
- 直接修改web里的代码里的ip,换成新的master的ip
- 修改域名对应的ip为新的master的ip
- 如果使用中间件,需要在中间件里调整
是否可以自动实现主从切换?
答案: 可以,使用脚本实现。
1、监控master
在另外一台机器扫描端口:nc 3306
直接访问: mysql -h ip -uroot -p’**’ -e ‘show databases;’
每秒钟监控一次
2、马上执行手工操作的步骤,脚本自动执行。
img-MI06jD7K-1662219930414)]