使用场景

  • 主数据库服务器故障后,可切换到从数据库继续工作
  • 不影响主数据库的性能的工作,比如在从数据库作备份、数据统计等工作

常见问题及解决方案

  • 复制延迟

    可以利用同步复制机制(Semi-sync)解决,但是影响性能,当主机写入时,确认更新已经同步到备机之后,再返回写操作成功。
    主从架构是一种高可用的解决方案,并不是处理高并发的,处理高并发可利用redis缓存来解决。
    

运行原理

从一个mysql instance(master)复制到另一个mysql instance(slave)的过程我们称之为mysql主从复制。在mysql复制的过程中,主要由3个线程完成sql线程和IO线程在slave,另一个IO线程在matser。

mysql复制的基本过程如下:

  1. slave上的IO线程连接master,请求日志文件指定位置或者最开始的位置之后的日志内容
  2. master接收请求,并通过负责复制的IO线程根据请求的信息读取日志文件内容,将日志信息和master端的Binary Log文件的名称以及在Binary Log中的位置返回给slave的IO线程
  3. slaveIO线程接收到信息后,将日志内容写到Relay Log文件最末尾,并将master端的bin-log的文件名和位置记录到master-info文件中。下次请求时可告知master需要请求的位置
  4. slave的sql线程检测到Relay Log文件新增后,执行此日志文件的sql语句

实施环境

 系统环境:centos7
 MySQL版本:5.7.17
 主服务器(master)IP:192.168.20.101
 从服务器(slave)IP:192.168.20.99

配置

  • 配置master服务器

    [root] # vim /etc/my.cnf
    

    修改如下内容:

    server-id=101 #设置服务器唯一的id,默认是1 log-bin=mysql-bin #启用二进制日志

  • 配置slave服务器

    [root] # vim /etc/my.cnf
    

    修改如下内容:

    server-id=99 #设置服务器唯一的id,默认是1 replicate-do-db=cto #只同步cto库 slave-skip-errors=all #忽略因复制出现的所有错误

  • 重启主从mysql服务

    [root] # service mysqld restart
    
  • 在master上给slave授权

    [root] # >grant replication slave on *.* to slave@192.168.20.99 identified by "123456789";
    

  • 查看master上数据库状态

    [root] # >show master status;
    

- 在slave执行sql语句的同步

```
[root] # >change master to master_host='192.168.20.101', master_user='slave', master_password=rd='123456789', master_log_file='mysql-bin.000001', master_log_pos=442;
```
![](http://i2.51cto.com/images/blog/201804/10/aeb2590b148a1f5d2e7cbe9c380ff0f4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
  • 开启salve同步
[root] # >start slave;

  • 查看slave同步状态
[root] # >show slave status \G;

  • 检验 主(master)

    从(slave)