zoukankan      html  css  js  c++  java
  • 十七、Mysql的主从(一)--主从原理

           随着访问量的不断增加,单台MySQL数据库服务器压力不断增加,需要对MYSQL进行优化和架构改 造,MYQSL优化如果不能明显改善压力情况,可以使用高可用、主从复制、读写分离来、拆分库、拆分 表来进行优化。 ​ MYSQL主从复制集群在中小企业、大型企业中被广泛使用,MYSQL主从复制的目的是实现数据库冗余 备份,将Master数据库数据定时同步至Slave库中,一旦Master数据库宕机,可以将WEB应用数据库配 置快速切换至Slave数据库,确保WEB应用较高的可用性。

    一、主从复制的前提

     
    1、主从复制的前提
    1.1 两台以上mysql实例
       多台物理机
       多个mysql实例
    1.2 主库要开启二进制日志,建议从库也开启二进制日志
    
    1.3 主库要提供复制相关的用户
        replication slave,一个比较特殊的权限
        grant replication slave on *.* to repl@'10.0.0.%' identified by '123456';
    1.4 从库需要将和主库相差的数据,进行追加
        一般情况是手动备份主库数据,恢复到从库上
    1.5 从库恢复到主库备份的时间点,开始自动从主库获取新的二进制日志开始应用
        因此需要人为告诉从库,从哪开始自动开始复制二进制日志(file+position),另外还需要告诉从库user,passwd,port,ip
        
    mysql>CHANGE MASTER TO
      MASTER_HOST='主库的ip地址',
      MASTER_USER='replication的用户名',
      MASTER_PASSWORD='replication用户名的密码',
      MASTER_PORT=3306,端口号
      MASTER_LOG_FILE='master2-bin.001',binlog日志
      MASTER_LOG_POS=4, position号
      MASTER_CONNECT_RETRY=10; 连接次数

    二、主从复制的线程及文件

    1、主库线程
    Dump(IO) thread:在复制过程中,主库发送二进制日志的线程
    2、从库线程
    IO thread:向主库请求二进制日志,并且接受二进制日志的线程
    SQL thread:执行请求过来的二进制的线程
    
    3、主库文件
    binlog文件(mysql-bin.000001文件):主库的二进制日志
    4、从库文件
    relaylog(vm01-relay-bin.000001):中继日志,存储请求过来的二进制日志
    master.info:
        1、从库连接主库的重要参数(user,passwd,ip,port)
        2、上次获取过的主库二进制日志的位置
    relay-log.info
        存储从库SQL线程已经执行过的relaylog日志位置

    三、主从复制原理

     

    主从复制的工作原理
    1 从库,IO线程,读取master.info中的信息,
        获取到连接参数(userpasswdipport)+上次请求过的主库的binlog的位置(例子:mysql-bin.000003,position=640)
    2 IO线程使用链接到主库,拿着位置信息(mysql-bin.000003,position=640),问主库有没有比这个更新的二进制日志。
    3 主库查询二进制日志,并对比从库发送过来的位置信息(mysql-bin.000003,position=640),如果有新的二进制日志,会通过
        dump thread发送给从库。
    4 从库通过IO线程,接受主库发来的二进制日志,存储到TCP/IP缓存中,并且返回“ACK”确认给主库,这时主库收到ACK后,
        就认为复制完成了,可以继续其他工作了。
    5 从库更新master.info,二进制日志位置更新为新的位置信息。
    6 从库IO线程会将TCP/IP缓存中的日志,存储到relay-log中继日志文件中。
    7 从库SQL线程,读取relay-log.info,获取到上次执行到的relaylog日志位置,以这个位置信息作为起点,往后继续执行中继日志。
    8 SQL线程执行完成所有relaylog之后,会更新relay-log.info信息为新位置信息。
    
    到此为止,一次完整的复制过程就完成了。

    第一次主从复制

    1.change master to 时,master端ip、port、user、password、binlog、position写入到master.info进行记录
    2. start slave 时,从库会启动IO线程和SQL线程
    3.IO_T,读取master.info信息,获取主库信息连接主库
    4. 主库会生成一个准备binlog DUMP线程,来响应从库
    5. IO_T根据master.info记录的binlog文件名和position号,请求主库DUMP最新日志
    6. DUMP线程检查主库的binlog日志,如果有新的,TP(传送)给从从库的IO_T
    7. IO_T将收到的日志存储到了TCP/IP 缓存,立即返回ACK给主库 ,主库工作完成
    8.IO_T将缓存中的数据,存储到relay-log日志文件,更新master.info文件binlog 文件名和postion,IO_T工作完成
    9.SQL_T读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点,回放relay-log
    10.SQL_T回放完成之后,会更新relay-log.info文件。
    11. relay-log会有自动清理的功能。
    细节:
    1.主库一旦有新的日志生成,会发送“信号”给binlog dump ,IO线程再请求
  • 相关阅读:
    打造自己的LINQ Provider(上):Expression Tree揭秘
    asp.net MVC 开篇
    .net面试基础
    asp.net MVC3.0
    数字万用表的四位半,三位半都是什么意思?
    lpsz,sz, 变量的命名规范
    老毛桃PE系统安装篡改主页3456.com和强制安装绿色浏览器lvseie.exe
    PC电源厂商及品牌篇(台厂及国际品牌篇)(第二版)
    Borland C++ 语法摘要
    Win8打开文件夹卡顿
  • 原文地址:https://www.cnblogs.com/yaokaka/p/14078630.html
Copyright © 2011-2022 走看看