【MySQL】剖析MySQL读写分离技术

  • 主从技术的一个基本流程图:

  • 如何实现主从复制的呢:

 

MySQL  Master(主节点)

1》当一个请求来时,首先由【mysqld】写入到我们的主【data】中

2》然后【mysqld】将所有的sql语句存储到【binlog】日志文件中

MySQL Slave(从节点)

1》首先将主节点中的【binlog】数据拷贝到从节点【relay binlog】中

2》再由【SQL Thread】 将sql语句从【relay binlog】中读取出来,存储到从节点的【data】库中

  • 实践一下

1》看一下主从节点的信息

mysql> show binary logs; 
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000013 |      4291 | No        |
| binlog.000014 |       155 | No        |
| binlog.000015 |       155 | No        |
| binlog.000016 |      2504 | No        |
| binlog.000017 |      2413 | No        |
+---------------+-----------+-----------+

2》看一下主节点状态:

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000017 |     2708 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.08 sec)

3》看一下主节点详情操作: 

  mysql> show binlog events in 'binlog.000017';

结果如下(内容太多,所以没有截全):

4》我们随便找个表,然后新增个数据:

mysql> insert into user (name,age)values('杨老七',22);

5》再次看一下主节点状态:

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000017 |     3003 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.08 sec)

此时可以看出【Position】的变化

6》有兴趣同学也可以看下主节点详情操作,也会多出很多行新增操作,由于内容太多,这里就不做展示了。

7》还有以下几个指令同学们了解一下:

#查看从节点操作详情
mysql> show relaylog events;

#查看某一个从节点操作详情
mysql> show relaylog events in '【某从节点】'
  • 每一种集群架构都是一把双刃剑,有优点就有缺点,我们来瞅瞅主从模式有什么缺点:

1》可能出现脏读问题:当我们写入一条数据时,然后马上做查询,可能会查询不到

2》数据不一致:如果我们写入一条数据,然后突然网络断掉,到时slave和master数据不同步

解决方式:采用半同步的解决方式

    • 写入数据时,产生一个同步等待处理,然后写入binlog
    • 从节点relay binlog此时同步主节点binlog,当binlog同步结束后,通知主节点同步结束
    • 主节点得知从节点binlog同步后,再通知Server写入数据结束

如图:

 

为什么是半同步?

    • 因为数据只是同步到binlog,如果是全同步则需要同步至Slave数据库中,这样写入效率会提高一些

这样会出现一些缺点:

    • 写入会慢,网络不稳定,主库持续等待。

解决措施: 

    • 通知只设置一个节点(S1)进行半同步操作
    • 连不上S1的时候会自动转为异步 
    • 设置10秒超时,超时10秒转为异步 
    • S1网络,硬件要好,不提供服务,只能接管。

  • 最后有一句很关键的话送给大家:如果有一天不消息把数据库删掉了,只要binlog文件还在,我们就可以恢复数据库。所以删库跑路一定要把binlog文件也删掉 ^ _ ^
原文地址:https://www.cnblogs.com/boluopabo/p/12887441.html