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/

相關文章
相關標籤/搜索