當前位置:
首頁 > 最新 > MySQL主從複製模式與複製過濾

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.查看從庫比主庫落後多少時間


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux日記 的精彩文章:

TAG:Linux日記 |