標籤:二進位 許可權 查看 htm start 修改 binary 示範 有用
摘要
上一篇: 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-binrelay_log=relay_logauto_increment_offset=2auto_increment_increment=2server_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有所響應的策略
由Google研發的外掛程式 ,所以要查看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-binlog-bin-index=master-bin-indexserver-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.indexrelay-log=slave-relay-binserver-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/
MySQL Replicationation進階