【MySQL】 主从复制及其配置

1. 为什么需要主从复制?

在业务复杂的系统中,有这么一个情景:如果有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务。使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。


做数据的热备


业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。


2. 什么是主从复制?

MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。


MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中所有的数据库或者特定的数据库,或者特定的表。


3. 原理

master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中。

slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件。

同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中。

从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致。

最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

总结:


从库生成两个线程,一个I/O线程,一个SQL线程,一定要保证这两个是开启的状态。

I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中。

主库会生成一个log dump线程,用来给从库I/O线程传binlog。

SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行。

【MySQL】 主从复制及其配置


4. 配置

4.1 准备两台服务器(已经安装了MySQL)

master:xxx
slave:xxx


4.2 修改配置

两台机子同时创建一个同名的数据库。


create database test_db charset=utf8mb4;


4.2.1 master 主服务器

找到 my.cnf

sudo vim /etc/mysql/my.cnf


【MySQL】 主从复制及其配置


添加这些信息

#在mysqld模块中添加如下配置信息
[mysqld]
log-bin=master-bin #二进制文件名称
binlog-format=ROW  #二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
server-id=1            # 要求各个服务器的id必须不一样
binlog-do-db=test_db   # 同步的数据库名称


配置从服务器登录主服务器的账号授权

grant replication slave on *.* to 'root'@'%' identified by 'root';


刷新权限

flush privileges;


重启master服务器

service mysql restart


在mysql中查看master的status

show master stataus

【MySQL】 主从复制及其配置


4.2.2 slave 从服务器

找到 my.cnf文件

【MySQL】 主从复制及其配置


配置信息

这个server-id记得一定要和主服务器的不一样!

【MySQL】 主从复制及其配置


重启mysql服务

service mysqld restart


连接主服务器

change master to master_host='主服务地址',master_user='root',master_password='root',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154;


这个master_log_file就是上面那个show master stataus的信息。

这个master_log_pos就是上面那个show master stataus的信息。


启动slave

start slave


查看slave

show slave status \G(注意没有分号)


【MySQL】 主从复制及其配置


当我们看着这两个都是YES的时候就可以了,注意不能是其他CONNECTING


停止slave

stop slave


4.2.3 验证

master 主服务器

【MySQL】 主从复制及其配置


slave 子服务器

【MySQL】 主从复制及其配置


两个服务器都是空的状态


那首先我们可以先在master节点上进行插入一条语句

【MySQL】 主从复制及其配置


然后在slave节点上查看

【MySQL】 主从复制及其配置

于是我们看到已经实现主从复制了。


上一篇:【Go实战 | 电商平台】(4) 用户注册


下一篇:【Go语言入门100题】067 洛希极限 (10 分) Go语言 | Golang