Mysql的异步复制

Mysql的主从复制技术

  • mysql的主从复制又叫replication,AB复制。
复制的用途
  • 故障切换
  • 可创建读写分离,提供更好的查询服务
  • 把备份等操作都放在从服务器上进行,减少对业务的影响
复制存在的问题
  • 主机拓机后,数据可能丢失
  • 从库只有一个sql thread,主库写压力大时,复制可能延时
  • 一主多从,从机不宜过多,主服务器需要同时向多台服务器中写入数据,压力会很大,这个时候就需要使用集群了
复制原理
  • mysql主从复制是一个异步复制的过程。从一个实例(master)复制到另一个实例(slave),整个过程要由master上的I/O进程和slave上的sql进程和I/O进程共同完成。
  • 首先master必须打开binary log(bin-log),因为整个复制过程实际上就是slave端从master端获取相应的二进制日志,然后在本地完全顺序的执行日志中纪录的各种操作。
主从复制过程
  • Slave 端的 IO 进程连接上 Master,向 Master 请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
  • Master 接收到来自 Slave 的 IO 进程的请求后,负责复制的 IO 进程根据 Slave 的请求信息,读取相应日志内容,返回给 Slave 的IO进程,并将本次请求读取的 bin-log 文件名及位置一起返回给 Slave 端
  • Slave 端的 IO 进程接收到信息后,将接收到的日志内容依次添加到 Slave 端的 relay-log(中继日志) 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master :”我需要从某个 bin-log 的哪个位置开始往后的日志内容,请发给我”;
  • Slave 端的 Sql 进程检测到 relay-log (中继日志)中新增加了内容后,会马上解析 relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容,并在本地执行。

异步复制机制

  • 主要依据两个线程,I/O线程和sql线程,slave开启I/O线程和master进行通信,获取二进制日志,sql线程负责回放。并不master做一步,slave就跟着做一步。

异步复制原理

在这里插入图片描述

  • 异步复制:配置文件/etc/my.cnf最后写了同步方式,是使用二进制日志的方式进行复制,master做的任何操作都会记录在日志里,master不会等待slave复制完之后再开始下一步,一直都是自己做自己的,不会管slave的状态,自己做好了就写在自己的日志里,能否同步成功取决于slave自身,而slave能否同步成功取决于两个线程,I/O线程和sql线程,I/O线程不是yes,则获取不到master的日志,(master的dumper线程会和slave的I/O线程进行通信),slave把二进制日志拿过来之后,先把master所作的事情写在中继日志relay_log里,然后sql线程回放(replay),把relay_log日志里的事再做一次,所以异步复制slave的数据比master稍慢一些。master主机不会管slave两个线程的状态异常,如果状态异常,这就会导致数据不同步。
  • 异步复制失败的原因可能是两台主机数据不同步,master数据比slave数据多太多。同步之前数据已经不一样(所以官网会先备份所有数据库)
    在这里插入图片描述

实验环境

主机(ip)功能
server1(172.25.24.1)master
server2(172.25.24.2)slave

实验步骤

server1(master)
  • 获得mysql的安装包
    在这里插入图片描述

  • 将安装包解包,删掉我们用不到的包,只留下以下5个,进行安装。

[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# yum install *.rpm -y

在这里插入图片描述

  • 修改配置文件,开启服务。
[root@server1 ~]# vim /etc/my.cnf   #配置文件中加入
 29 log-bin=mysql-bin
 30 server-id=1
[root@server1 ~]# systemctl start mysqld
  • 获取一个密码,进行安全初始化。
[root@server1 ~]# cat /var/log/mysqld.log | grep password
[root@server1 ~]# mysql_secure_installation 设置一个复杂一点的密码,7版本的新密码必须大小写,数字,符号组成 

在这里插入图片描述
在这里插入图片描述

  • 登陆,创建用户并给用户授予复制的权限,刷新授权表,查看此时master的状态。
[root@server1 ~]# mysql -uroot -pWsp+123ld
show databases;
mysql> CREATE USER 'repl'@'172.25.24.%' IDENTIFIED BY 'Wsp+123ld';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.24.%';
mysql> flush privileges;
mysql> show master status;

在这里插入图片描述

server2(slave)
  • 安装mysql
[root@server2 ~]# ls
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server2 ~]# yum install * -y

在这里插入图片描述

  • 编写配置文件,开启服务。
[root@server2 ~]# vim /etc/my.cnf
 29 server-id=2
[root@server2 ~]# systemctl start mysqld
  • 获取密码,登陆数据库,进行数据库的安全初始化,并查看数据库。
[root@server2 ~]# cat /var/log/mysqld.log | grep password
2019-07-27T04:58:29.105997Z 1 [Note] A temporary password is generated for root@localhost: It+HjJDH&8d_
[root@server2 ~]# mysql_secure_installation 

在这里插入图片描述

  • slave的设置,log_file和log_pos都写为master设备上的数值。
[root@server2 ~]# mysql -uroot -pWsp+123ld
mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.25.24.1',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='Wsp+123ld',
    -> MASTER_LOG_FILE='mysql-bin.000002',
    -> MASTER_LOG_POS=1567;
mysql> star slave;
mysql> show slave status\G   #两个线程都为yes才ok

在这里插入图片描述

测试
  • server1向数据库中插入数据。
server1登陆之后:
[root@server1 ~]# mysql -uroot -pWsp+123ld
mysql> create database zhang;
mysql> use zhang;
mysql> create table userlist(
    -> username varchar(10) not null,
    -> password varchar(10) not null);
mysql> desc userlist;
mysql> insert into userlist values('zhang','111');
mysql> select * from userlist;
mysql> exit

在这里插入图片描述

  • server2查看数据库数据是否同步
mysql> select * from zhang.userlist;
+----------+----------+
| username | password |
+----------+----------+
| zhang    | 111      |
+----------+----------+
1 row in set (0.00 sec)

在这里插入图片描述

  • 另外,数据库备份命令:
mysqldump --all-databases --single-transaction --routines --triggers --events --host=127.0.0.1 --port=3306 --user=root --password=Wsp+123ld > zyw.sql
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值