Featured image of post 透過 MySQL 主從式架構,進行平衡負載,提高數據庫的可用性和性能

透過 MySQL 主從式架構,進行平衡負載,提高數據庫的可用性和性能

Master Slave Replication 是 MySQL 的一種主從式架構,可以有效降低主數據庫的讀取壓力,提升用戶體驗。

最後更新
約 1203 字

前言

當網站面對大流量時,單一數據庫可能無法滿足需求,特別是突發流量會做成數據庫的壓力過大,進而導致網站無法正常運作。

又或者是數據庫的內容需要被分析,對數據流作出監控,生成報表等,進行各種分析都會對數據庫造成壓力,這時候就需要將數據庫進行分流,讓主數據庫專注於寫入,而從數據庫專注於讀取。防止對使用者造成影響。

Master Slave Replication 會將數據庫區分成 Master 和 Slave 兩個角色,Master 負責寫入,Slave 負責讀取,這樣可以有效降低主數據庫的讀取壓力,提升用戶體驗。

由於 Slave 只負責讀取,所以可以設置多個 Slave,進一步提高數據庫的可用性和性能。而且 Slave 的資料始㚵和 Master 保持同步,當 Master 數據庫發生故障時,可以快速切換到 Slave,保證數據庫的可用性,也算是獲得了一份備份。

原理

  1. 在 Master 上啟用二進制日誌,所有的寫入操作都會被記錄到二進制日誌中。
  2. Slave 連接到 Master,並從 Master 上的二進制日誌中讀取數據,然後在自己的數據庫中執行這些操作。
  3. Slave 會記錄自己讀取到的二進制日誌的位置,下次讀取時會從這個位置開始讀取。

所有同步都是由 Master 發起的,Slave 只是被動的接收數據,所以 Slave 不能對數據庫進行寫入操作。

設定方法

最簡單的設定方法是使用 phpMyAdmin 來設定,登入 Master 的 phpMyAdmin,然後在 Replication 頁面上設定 Master 的資訊。

設定 Master

修改 Master 上的my.cnf 組態檔案,啟用二進制日誌。

修改檔案 /etc/mysql/mariadb.conf.d/50-server.cnf

1
vi /etc/mysql/mariadb.conf.d/50-server.cnf

[mariadb]下面輸入以下組態,組態設定可以在 phpMyAdminReplication 頁面上找到。

1
2
3
server-id = 41761
log_bin = mysql-bin
log_error = mysql-bin.err

儲存檔案後重啟 MySQL 服務

1
systemctl restart mysql

設定 Slave

登入 Slave 的 phpMyAdmin,然後在 Replication 頁面上設定 Slave 的資訊。

輸入登入 Master 的資訊,然後點擊 Go 開始同步。

留意 Slave 的 server-id 要和 Master 不同,可以在 phpMyAdminReplication 頁面上找到。

1
vi /etc/mysql/my.cnf

設定 Slave 的 server-id,這個 ID 要和 Master 不同。 如果 Slave 是只讀的,可以設定 read_only = 1,這樣 Slave 就不能對數據庫進行寫入操作。

1
2
server-id = 1720184094
read_only = 1

然後重啟 MySQL 服務。

1
systemctl restart mysql

設定完成後,Slave 會開始從 Master 上讀取數據,並在自己的數據庫中執行這些操作。 可以在 phpMyAdmin 的 Replication 頁面上查看同步的狀態。

phpMyAdmin Replication Status

常見問題

要留意在設定 Master 和 Slave 的時候,要確保 Master 和 Slave 的數據庫是一樣的,否則會出現同步錯誤。最好是在一開始就將 Master 的數據庫複製到 Slave 上,然後再開始同步,又或者在空數據庫上開始同步。

重設 Master

如果需要重新開始同步,可以在 Slave 上執行以下命令,這樣 Slave 會重新從 Master 上讀取數據。

在 Slave 上執行以下命令:

1
2
3
4
STOP SLAVE;
RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE ='mysql-bin.000001', MASTER_LOG_POS =0;
START SLAVE;

在 Master 上執行以下命令:

1
RESET MASTER;

留意 RESET MASTER 會刪除索引檔案中列出的所有二進制日誌檔案,將二進制日誌索引檔案重設為空,並創建一個新的二進制日誌檔案。此語句僅用於主機第一次啟動時使用。

重要提示:RESET MASTER 的效果與 PURGE BINARY LOGS 有兩個關鍵區別:

RESET MASTER 刪除索引檔案中列出的所有二進制日誌檔案,僅留下一個帶有數字後綴 .000001 的空二進制日誌檔案,而 PURGE BINARY LOGS 不會重設編號。

RESET MASTER 不應在任何 Slave 運行時使用。當在 Slave 運行時使用 RESET MASTER 的行為是未定義的(因此不受支援),而 PURGE BINARY LOGS 可以在複製從站運行時安全使用。


使用 Hugo 建立
主題 StackJimmy 設計