前言
當網站面對大流量時,單一數據庫可能無法滿足需求,特別是突發流量會做成數據庫的壓力過大,進而導致網站無法正常運作。
又或者是數據庫的內容需要被分析,對數據流作出監控,生成報表等,進行各種分析都會對數據庫造成壓力,這時候就需要將數據庫進行分流,讓主數據庫專注於寫入,而從數據庫專注於讀取。防止對使用者造成影響。
Master Slave Replication 會將數據庫區分成 Master 和 Slave 兩個角色,Master 負責寫入,Slave 負責讀取,這樣可以有效降低主數據庫的讀取壓力,提升用戶體驗。
由於 Slave 只負責讀取,所以可以設置多個 Slave,進一步提高數據庫的可用性和性能。而且 Slave 的資料始㚵和 Master 保持同步,當 Master 數據庫發生故障時,可以快速切換到 Slave,保證數據庫的可用性,也算是獲得了一份備份。
原理
- 在 Master 上啟用二進制日誌,所有的寫入操作都會被記錄到二進制日誌中。
- Slave 連接到 Master,並從 Master 上的二進制日誌中讀取數據,然後在自己的數據庫中執行這些操作。
- Slave 會記錄自己讀取到的二進制日誌的位置,下次讀取時會從這個位置開始讀取。
所有同步都是由 Master 發起的,Slave 只是被動的接收數據,所以 Slave 不能對數據庫進行寫入操作。
設定方法
最簡單的設定方法是使用 phpMyAdmin 來設定,登入 Master 的 phpMyAdmin,然後在 Replication
頁面上設定 Master
的資訊。
設定 Master
修改 Master 上的my.cnf
組態檔案,啟用二進制日誌。
修改檔案 /etc/mysql/mariadb.conf.d/50-server.cnf
|
|
在[mariadb]
下面輸入以下組態,組態設定可以在 phpMyAdmin
的 Replication
頁面上找到。
|
|
儲存檔案後重啟 MySQL 服務
|
|
設定 Slave
登入 Slave 的 phpMyAdmin,然後在 Replication
頁面上設定 Slave
的資訊。
輸入登入 Master
的資訊,然後點擊 Go
開始同步。
留意 Slave 的 server-id
要和 Master 不同,可以在 phpMyAdmin
的 Replication
頁面上找到。
|
|
設定 Slave 的 server-id
,這個 ID 要和 Master 不同。
如果 Slave 是只讀的,可以設定 read_only = 1
,這樣 Slave 就不能對數據庫進行寫入操作。
|
|
然後重啟 MySQL 服務。
|
|
設定完成後,Slave 會開始從 Master 上讀取數據,並在自己的數據庫中執行這些操作。
可以在 phpMyAdmin 的 Replication
頁面上查看同步的狀態。
常見問題
要留意在設定 Master 和 Slave 的時候,要確保 Master 和 Slave 的數據庫是一樣的,否則會出現同步錯誤。最好是在一開始就將 Master 的數據庫複製到 Slave 上,然後再開始同步,又或者在空數據庫上開始同步。
重設 Master
如果需要重新開始同步,可以在 Slave 上執行以下命令,這樣 Slave 會重新從 Master 上讀取數據。
在 Slave 上執行以下命令:
|
|
在 Master 上執行以下命令:
|
|
留意 RESET MASTER
會刪除索引檔案中列出的所有二進制日誌檔案,將二進制日誌索引檔案重設為空,並創建一個新的二進制日誌檔案。此語句僅用於主機第一次啟動時使用。
重要提示:RESET MASTER
的效果與 PURGE BINARY LOGS
有兩個關鍵區別:
RESET MASTER
刪除索引檔案中列出的所有二進制日誌檔案,僅留下一個帶有數字後綴 .000001 的空二進制日誌檔案,而 PURGE BINARY LOGS
不會重設編號。
RESET MASTER
不應在任何 Slave 運行時使用。當在 Slave 運行時使用 RESET MASTER
的行為是未定義的(因此不受支援),而 PURGE BINARY LOGS
可以在複製從站運行時安全使用。