• 【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文件也删掉 ^ _ ^
  • 相关阅读:
    图片轮播插件比较(jquerySlide与superSlide)
    footer贴底的纯css实现方法
    input line-height 兼容解决方案
    HBuilder js 自定义代码块
    HBuilder HTML 自定义代码块
    HBuilder CSS 自定义代码块
    Element-ui el-cascader不触发prop?
    css水平垂直居中
    本地存储时注意的问题
    银行卡号,每四位添加空格
  • 原文地址:https://www.cnblogs.com/boluopabo/p/12887441.html
Copyright © 2020-2023  润新知