zoukankan      html  css  js  c++  java
  • 八、linux-mysql的mysql主从复制原理和实战

    1.mysql主从复制介绍

        mysql支持单向、双向、链式级联、实时、异步复制,在复制过程中,一台服务器充当主服务器(Master),而一个或多个其它服务器充当从服务器(Slave)。

       复制:单向同步复制

     

       复制:单向,一主多从复制

       复制:双向,主主复制

     

     复制:环向复制

     

    此外,还有级联模式,就是主==>主==>从模式。 

    2. mysql主从复制应用场景

        在当前的生产工作中,大多数应用的mysql主从同步都是异步的复制方式,即不是严格实时的数据同步。mysql主从复制有利于数据库架构的健壮性、提升访问速度和易于维护管理。

      2.1  主从互为备份,主库有问题,可以切换到从库上继续提供服务

       mysql 主从同步做不到一条数据不丢,要做到主从切换一条数据不丢,有多种方案,这里主要说明4种:

      1)mysql自身有一个插件,讲主从同步从异步变成半同步,即实时同步。往主库写数据,当从库也写完毕,才是主从同步成功,否则两个都不成功。

      2)切换到从库时,讲主库的bin_log日志在从库中执行一遍

      3)从程序上下功夫,讲主库实时一分钟的数据写到程序上,同步到从库上

      4)双写功能,既写主库又写从库

     

      2.2 读写分离,主写,读从

       中小公司:通过程序

       门户网站:分布式dbproxy(读写分离、hash负载均衡,健康检查)

     

      2.3 根据服务器拆分业务独立并分担压力

         许多公司都是一主多从,主库写,从库不同服务器兼顾不同业务,如果主挂了,可以迅速手工或者自动切换。从库间可以实现集群,可以不同人员访问不同机器等。

     3.mysql主从同步的基本结构

       

      可以看到:

     1 ) 从库生成两个线程,一个I/O线程,一个SQL线程;
     2 ) I/O线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
     3 ) 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
     4 ) SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;通过mysqlbinlog 进行查看
     5 ) 在从库的I/O线程还会生成一个类似记录文件master.info,用来记录每次从主I/O获取的位置和时间还有下次应该从哪个位置进行取日志和位置。
     
    4.主从复制
    4.1.环境准备
         1)具备单机单数据库多实例的环境
         2)两台服务器每个机器一个数据库的环境
    4.2.数据库读法的约定
        主库:master     从库:slave
    4.3.设置server-id值并开启binlog参数(log-bin = /data/3306/my.cnf)
                【mysqld】
                 server-id=1
                 log-bin = /data/3306/mysql-bin
    查看是否生效:
      1)  查看/data/3306下是否有日志
     
     2)   查看参数:mysql -uroot -poldboy124 -S   /data/3306/mysql.sock -e "show variables like 'log_bin';"     

      4.4.建立用于同步的账户rep

       登陆主库建立用于从库复制的账号rep:
        grant replication  slave  on *.* to 'rep'@'192.168.0.104' identified  by 'oldboy124'
        flush privileges;
      4.5.主数据库备份
              1) flush  table  with  read lock  ---添加锁
              2) show master status;  ---查看master-data的位置,在从库master.info会记录当前同步的位置,为下次同步提供起始位置
              

              3)  show master log; --现有的master-data

                

             4)备份:mysqldump -uroot -poldboy124 -S /data/3306/mysql.sock -A -B --events|gzip  /dangjingwei/rep.sql.gz  --压缩本地磁盘备份
             5)备份: mysqldump -uroot -poldboy124 -S /data/3306/mysql.sock -A -B --events --master-data=2 >/dangjingwei/rep.sq l--master-data 标识添加注释
             6) unlock tables; --解锁
             7)可以直接锁定进行备份:mysqldump -uroot -poldboy124 -S /data/3306/mysql.sock -A -B -S --events --master-data=2     >/dangjingwei/rep.sql  
             8)将备份文件导入到从库中: mysql -uroot -poldboy124 -S /data/3307/mysql.sock </dangjingwei/rep.sql 将备份文件添加到从库中
             9)添加master.info ,使从库可以连接主库        
    CHANGE MASTER TO
    MASTER_HOST='192.168.0.104',---主库地址
    MASTER_PORT=3306,--主库端口
    MASTER_USER='rep',--主库用户
    MASTER_PASSWORD='oldboy124', --主库密码
    MASTER_LOG_FILE='mysql-bin.000003', --下次同步的起始页面 ,如果备份参数是--master-data=1,可以去掉
    MASTER_LOG_POS=343;  --下次同步的起始位置 ,如果备份参数是--master-data=1,可以去掉
        检查:从库的实例数据存放的位置下面可以看到
      /data/3307/data/master.info--如果主库不断更新,则bin_log不断更新,从库会不断更新这个内容的起始位置
       19)打开从库同步: start  slave
        检查:查看状态;
           show slave statusG;
       从库的sql线程会读取relay log文件中的日志,此文件从库的位置是从库的实例线程下面
       

     至此,当主库发生增删改的时候,从库相应的进行同步!!!

  • 相关阅读:
    android 自定义Dialog
    【Head First Java 读书笔记】(四)对象的行为
    【Head First Java 读书笔记】(三)primitive主数据类型和引用
    【Android学习】自定义checkbox
    【Java】java中的compareTo和compare的区别
    【Java】对Map按key和value分别排序
    【Andoid学习】GridView学习
    【实习项目记录】(三)调整网络图片固定宽高
    【实习项目记录】(二) JSON
    【实习项目记录】(一)加密算法MD5和RSA
  • 原文地址:https://www.cnblogs.com/dangjingwei/p/11449080.html
Copyright © 2011-2022 走看看