MySQL主從複製模式與複製過濾
本公眾號內容大多由平時操作記錄,如果有錯誤地方歡迎留言指
在前一篇文章《mysql多實例與複製應用》中只對mysql的複製做了簡單的介紹,本篇內容專門介紹一下mysql的複製。
MySQL複製
mysql複製是指將主資料庫的DDL和DML操作通過二進位日誌傳到複製伺服器(從庫)上,然後在從庫上對這些日誌重新執行(也叫重做),從而使從庫的數據與主庫保持一致。
從庫一般不接受寫操作,可以接受讀操作
複製的功能作用
數據分布
負載均衡 讀操作
數據備份
高可用和故障切換
升級測試
MySQL複製簡述
mysql複製原理大致如下:
1,mysql主資料庫在事物提交時會把數據變更作為事件events記錄在二進位日誌文件bin-log中,mysql主庫上的sync_binlog參數控制bin-log日誌刷新到磁碟
2,主庫推送二進位日誌文件bin-log中的事件到從庫的中繼日誌Relay Log ,之後從庫根據中繼日誌Relay log重寫數據操作將數據寫入從庫,以此達到主庫和從庫的數據一致
mysql複製過程中通過3個線程來完成複製操作:其中binlog dump線程在主庫上,I/O線程和SQL線程在從庫上,當在從庫上啟動複製(START SLAVE)時,首先會I/O線程連接主庫,(連接主庫用戶用主庫創建),主庫隨後創建binlog dump線程讀取資料庫事件(binlog日誌)並發送給I/O線程,I/O獲取到binlog日誌數據後更新到從庫的中繼日誌Relay log中,從庫上的SQL線程讀取中繼日誌Relay log 中數據寫入本地資料庫,最終完成主從複製。
化複製流程
主從複製流程:
主節點: 必須開啟二進位日誌文件
從節點: 啟用中繼日誌
從節點: 啟動I/O線程
主節點: 啟動mysql dump線程推送數據給從節點
從節點: 啟動SQL線程將中繼日誌數據寫入本地
從節點線程:
I/O 線程:從master請求二進位日誌事件,並保存於中繼日誌中
SQL 線程:從中繼日誌讀取日誌事件,在本地完成重放,寫入本地
mysql複製的實現
實驗:主庫:192.168.214.130 : 從庫: 192.168.214.142
由於編譯安裝時間比較長,安裝mariadb使用yum安裝
1. 安裝mariadb
yum install mariadb-server -y
1. 配置主庫
重啟服務並創建 複製用戶賬號
查看主庫二進位日誌狀態
2. 配置從庫
關於從庫是否要開啟二進位日誌:當使用多級複製,從庫同時也是其他庫的主庫時,需要開啟二進位,否則可以不開啟
重啟服務 並查看中繼日誌啟用狀態
systemctl restart mariadb
3. 主庫查看二進位日誌記錄pos值
4. 從庫連接至主庫
5. 啟動從庫複製
查看複製狀態
從庫複製狀態中需要注意觀察的幾個參數
6. 查看主從複製線程
主庫dump線程
主庫連接了幾個從庫,就會有幾個dump線程
從庫I/O線程與SQL線程(SQL線程在工作時才可以看到)
7. 寫入數據測試
主庫:[root@master ~]# mysql
登錄從庫查看數據:
主從讀寫分離
通常主從架構的複製中,從庫是不提供寫操作的,由主庫負責寫操作,從庫負責讀操作,但禁止寫操作,以免數據錯亂,主從讀寫分離一定程度上分擔了主庫的壓力,實現了負載的作用。因此需要設置從庫的只讀操作;
設置從庫為 read only
注意的地方:在my.cnf中配置read only限制對具有supper許可權的用戶無效,如果禁止所有用戶寫操作,則在從庫本地開啟一個會話,執行 flush tables with read lock; 即可禁所有用戶寫操作
加強複製的事務安全
為了更好地保證數據的完整性和安全性,每個SQL語句執行完成時都要寫binlog,為了保證binlog的安全,mysql引入了sync_binlog參數來控制binlog刷新到磁碟的頻率;
在默認情況下,sync_binlog=0,表示mysql不控制binlog的刷新,由文件系統自己控制文件系統緩存刷新。
如果sync_binlog>0,則表示每次sync_binlog事務提交,mysql調用文件系統的刷新操作將binlog刷新到磁碟。
比如:當sync_binlog=1,表示每一次事務提交,mysql都需要把binlog刷新到磁碟,這樣的話,資料庫主機發生故障,系統最多損失最近的一個事務的數據,因為上一次的事務提交時已經把binlog刷新到了磁碟,設置sync_binlog=1,盡最大可能保證數據安全,但是在多個事務並發提交時,同時高頻率的刷新binlog對I/O的影響比較明顯,會影響mysql的性能。
除此外,主庫節點上還可以有選擇地開啟如下參數
如果使用的是innodb,最好開啟
在從節點上可以設置如下:
雙主複製架構
mysql雙主複製架構就是兩台主機互為主從,使用雙主複製會有數據不一致的風險,因此要謹慎使用,另外是需要對自增欄位進行設定,否則會導致數據錯亂。
因此,在上面的主從基礎上,設置雙主複製,需要在原來的主節點開啟中繼日誌,在原來的從節點開啟二進位日誌,並新建複製用戶,此外,雙主各節點還要設置各自自動增長id規則,配置步奏如下:
配置步奏:
1. 各節點使用一個唯一server-id
2. 都啟用binary log和relay log
3,創建擁有複製許可權的用戶賬號(主從)
4,定義自動增長id欄位的數值範圍為奇偶
5, 均把對方指定為主節點,並啟動複製線程
在原來的主庫上
在原來的從庫上
新建複製用戶
my.cnf內容修改如下:
主從庫修改配置後重啟服務
在原來主節點上
添加複製從庫的master信息
啟動主從slave
start slave;
測試數據寫入
在原來的主庫新建db1庫,另一個庫上查看
在原來的主庫新建db2庫,另一個庫上查看
半同步複製
默認情況下,MySQL的複製功能是非同步的,非同步複製可以提供最佳的性能,主
庫把binlog日誌發送給從庫即結束,並不驗證從庫是否接收完畢。這意味著當
主伺服器或從伺服器端發生故障時,有可能從伺服器沒有接收到主伺服器發送
過來的binlog日誌,這就會造成主伺服器和從伺服器的數據不一致,甚至在恢
復時造成數據的丟失
實現半同步複製要在主從節點上安裝相應的插件來實現主節點安裝:semisync_master.so,從節點安裝:semisync_slave.so,
過程如下:
安裝主節點插件:
安裝從節點插件
啟用主節點
啟用從節點
注意: 配置了半同步複製後,要重啟從庫的I/O_THREAD線程
測試寫入數據後查看半同步複製的詳細狀態信息
查看主庫更詳細的信息:
上面的一些信息:
Rpl_semi_sync_master_status :值為ON ,表示半同步複製處於打開狀態
Rpl_semi_sync_master_yes_tx: 值為2, 表示主庫當前有兩個事務通過半同步同步
Rpl_semi_sync_master_no_tx : 值為3,表示主庫當前有3個事務不是通過半同步模式下從庫即使響應的(這個參數比較重要,會經常觀察對比)
半同步複製超時
在主庫上有一個參數,定義半同步複製的超時時間,默認時間是10秒,如果因為從庫網路故障或者宕機,主庫上提交的操作會被阻塞相應的時長,超過時長後主庫會自動關閉半同步模式啟用非同步複製模式。等從庫恢復正常後,主庫會自動切換成半同步模式。
查看同步超時時間
設置半同步超時時間
這裡把超時時間設置成30秒後,然後在從庫上擋住主的ip,禁止通行
從庫上添加防火牆禁止主從通信:
iptables -A INPUT -s 192.168.214.142 -j DROP
主庫再寫入數據觀察:
可以看到第一條數據等待了30秒後在執行完,在等待過程中查看主庫有等待操作的wait線程
此時再看半同步狀態Rpl_semi_sync_master_status 的值已經為 OFF
再次寫入數據時就變成了非同步複製
清除從庫防火牆規則,重啟slave io_thread線程,查看是否自動切換為半同步模式
iptables -F
如果 IO_THREAD不重啟,主動的狀態無法自動切換
重啟io_thread後主庫的Rpl_semi_sync_master_status 狀態會自動變為ON
再次寫入數據:
從庫檢查數據同步正常
複製過濾器
複製過濾就是讓從節點複製主節點上指定的某些庫或者是某張表。有兩種方式可以實現數據複製過濾:
主服務節點僅向二進位日誌中記錄與特定資料庫相關的事件(只記錄指定的庫日誌文件),這種方式存在一個問題:如果主庫出現故障,其他沒有記錄事務的庫數據無法基於時間點還原(謹慎使用)
binlog_do_db= #資料庫白名單列表
binlog_ignore_db= #資料庫黑名單列表
從伺服器sql線程在重現relay log中繼日誌事件時,僅讀取與特定資料庫相關的事件並應用,這種方式會造成網路及磁碟I/O浪費。
replicate_do_db=
replicate_ignore_db=
replicate_do_table=
replicate_ignore_table=
以上設置在命令行設置臨時生效,重啟後失效,通常在配置文件中設置
使用第二種從庫重寫過濾的方式做複製過濾
設置只重寫的庫:
查看過濾的庫
測試複製過濾
在主庫db4中添加數據
在主庫db5中創建一個表寫入數據
從庫查看db4中第55,56條數據
從庫查看db5中的數據
複製的監控
清理日誌
使用purge指令
查看日誌信息:
show binary logs;
purge binary logs to "master-bin.00003"; # 03之前的文件(01,02)被刪除
2 . 複製監控
一些常用查看狀態指令:
3.查看從庫比主庫落後多少時間
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:Linux日記 |