MySQL Replicationation进阶

摘要

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

  1、主主复制mysql

  2、半同步复制git

  3、复制过滤器github

  4、总结算法

  5、切分sql

    待续数据库

1、主主复制

  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;

 

 

此时,在二台服务器上均可以写操做,注意主主复制仍是有不少的细节问题,除非数据不重要,不然不建议使用。

 

 

2、半同步复制

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

 

 

 3、复制过滤器

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

实现方式:

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

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

    binlog_ignore_db:binlog的黑名单

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

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

    replicate_do_db: replay时白名单

    replicate_ignore_db: replay时黑名单

    

 4、总结

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) 数据不一致?

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

 

 5、切分

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