zoukankan      html  css  js  c++  java
  • MySQL Replicationation进阶

    摘要

    上一篇: MySQL Replication 基础       下一篇 MySQL Replication-MHA

      一、主主复制

      二、半同步复制

      三、复制过滤器

      四、总结

      五、切分

        待续

    一、主主复制

      MySQL的主主复制通过互为主从来实现,此时负载均衡调度器较为容易实现,但是由于多台服务器都为Master,但是存在着严重的问题,需要慎重使用:
        1. 数据不一致问题,无法解决,详情见paxos算法说明
        2. auto_increment id问题

          如何解决?以2台为例,一台用奇数,一台用偶数即可

      配置步骤:

        (1)  各节点使用一个唯一的server_id

        (2)  都启动二进制日志和中继日志

        (3) 创建拥有复制权限的用户账号

        (4) 定义自动增长id字段的数值范围为奇数和偶数

        (5) 互为主从,都启动复制线程
      

      演示如下:

      (1) Master和Slave修改配置,主要是以下参数
      

    log-bin=master-bin
    
    relay_log=relay_log
    
    auto_increment_offset=2
    
    auto_increment_increment=2
    
    server_id=1

      (2)  Master和Slave都创建拥有复制权限的账号

     GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

    注意:复制的权限非常大,不能使用上述通配符的方式,最好是单ip授权

     (3)  互为主从

    SHOW MASTER STATUS;
    CHANGE MASTER TO MASTER_HOST='192.168.1.202', MASTER_USER='repl',MASTER_PASSWORD='111111',MASTER_LOG_FILE='master-bin.000003',MASTER_POS=506;
    START SLAVE;

    此时,在二台服务器上都可以写操作,注意主主复制还是有很多的细节问题,除非数据不重要,否则不建议使用。

    二、半同步复制

    Master至少要等待一个Slave有所响应的策略

    由谷歌研发的插件 ,所以要查看semisync_master.so 和semisync_slave.so是否被当前的数据库支持,一般MariaDB默认就是会安装的

    配置步骤:

        (1)  各节点使用一个唯一的server_id

        (2)  Master启动二进制日志, Slave中继日志

        (3)  Master创建拥有复制权限的用户账号

        (4) 以半同步方式连接Master和Slave

    安装插件方式: HELP INSTALL

      INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'

      INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'

    演示如下:

    (1) Master 配置,安装插件  

    log-bin=master-bin
    log-bin-index=master-bin-index
    server-id       = 1

    启动mysql:

    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'192.168.1.%' IDENTIFIED BY '111111';

    (2) Slave配置,安装插件

    relay-log-index=slave-relay-bin.index
    relay-log=slave-relay-bin
    server-id       = 2

    启动mysql:

    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'

    (3) SHOW GLOBAL VARIABLES LIKE '%semi%';

      MASTER上

    set global rpl_semi_sync_master_enabled='ON';

    (4) SHOW GLOBAL STATUS LIKE '%semi%';

      SLAVE上

    set global rpl_semi_sync_slave_enabled='ON';

    (5) Connect SLAVE TO MASTER

     

     三、复制过滤器

    让从节点仅仅复制指定的数据库,或者指定数据库中的指定表

    实现方式:

      (1) 主服务器仅仅向二进制日志记录特定数据库相关的事件,不建议使用

        binlog_do_db: binlog的白名单,使用逗号隔开

        binlog_ignore_db:binlog的黑名单

      (2) 从服务器SQL_THREAD在replay中继日志中事件时,仅仅读取与特定数据库(特定表)相关的事件并应用到本地;

        问题:同步了没必要的数据,会造成网络以及磁盘IO的浪费

        replicate_do_db: replay时白名单

        replicate_ignore_db: replay时黑名单

        

     四、总结

    MySQL的分布式系统满足CAP原则,AP且对A妥协。注意到MySQL Replication只是对读操作进行了分摊,不管Master Slave和双主模型,都没有分摊写操作。

    问题:

      1. 如何限制从服务器为只读?

        (1) 首先可以在slave上设置read_only=ON; 但是此限制对拥有SUPER权限的用户无效

        (2) 阻止所有用户:施加一个全局的读锁

          mysql> FLUSH TABLES WITH READ LOCK;

      2. 如何保证中从复制的事务安全?

        Master:无非某些IO操作不使用内存BUFFER,每次操作都刷到硬盘上。

          sync_binlog=ON 必须

          innodb_flush_logs_at_trx_commit=ON

          innodb_support_xa=ON

          sync_master_info=ON 可选

      Slave上:

        skip_slave_start=ON

        sync_relay_log_info可选

        sync_relay_log可选

    跟复制功能相关的文件:

      master.info: 用于保存slave连接至master的相关信息,例如账号,密码,服务器地址等等

      relay_log.info: 保存当前slave节点上已经复制的当前二进制日志和本地repay log日志信息

     

    维护和监控常用命令:
    (1) 如何清理日志?

    URL: https://mariadb.com/kb/en/sql-commands-purge-logs/
    
    Examples:
    PURGE BINARY LOGS TO 'mysql-bin.010';
    PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

    (2) 复制监控

      SHOW MASTER STATUS;
      SHOW SLAVE STATUS;
      SHOW BINARY LOGS;
    
      SHOW BINLOG EVENTS;
      SHOW PROCESSLIST;

    (3) 从服务器是否落后于主服务器

     SHOW SLAVE STATUS中的字段Seconds_Behind_Master:0信息

    (4) 如何确定主从节点数据是否一致;

    需要专门的工具,例如percona-tools中就有这个工具

    (5) 数据不一致?

    选一台重新复制,数据应该已经丢失了,只能人工判断。

     

     五、切分

    http://haitian299.github.io/2016/05/26/mysql-partitioning/

     

  • 相关阅读:
    《Geometric Deep Learning综述介绍》
    《和想象不太一样的'Graph Neural Network + Zero Shot'》
    《几何深度学习前沿》
    《【Paper Live】滴滴出行-探索资源约束的Contextual Bandits问题 & KDD Cup滴滴出行比赛解读>
    《PDP: 解决约束满足问题的神经网络架构 | 刘晶 | 集智俱乐部图网络论文读书会20190819》
    《NeuroSAT: Learning a SAT Solver from Single-Bit Supervision》
    《OR Talk NO.5 | Facebook 田渊栋:用深度(强化)学习为组合优化寻找更好的启发式搜索策略》
    《OR Talk NO.15 | 在业界实验室做AI设计师是一种什么体验?》
    超级跳马 —— 矩阵快速幂优化DP
    图SLAM:Noob的同时本地化和映射指南
  • 原文地址:https://www.cnblogs.com/carl10086/p/5995245.html
Copyright © 2011-2022 走看看