mysql讀寫分離的最佳實踐

Arno_z發表於2024-10-07

一. 傳統的讀寫分離方式

在 MySQL 中實現讀寫分離可以透過以下幾種方式來達到目的:

1. 主從複製

使用主從複製(Master-Slave Replication)是實現讀寫分離的常見方式。

  • 主庫:處理所有的寫入操作(INSERT、UPDATE、DELETE)。
  • 從庫:負責處理讀操作(SELECT)。

步驟

  1. 設定主從複製
    • 在主庫上配置 binlog,並建立複製使用者。
    • 在從庫上配置 server-id,並指向主庫的 binlog。
  2. 應用程式配置
    • 將寫操作指向主庫。
    • 將讀操作指向從庫。可以在應用層實現邏輯來決定查詢使用哪個庫。

2. 連線池配置

在應用程式中,使用連線池(如 HikariCP、C3P0)來管理資料庫連線。

  • 讀寫分離:配置連線池分別用於寫(主庫)和讀(從庫)。

示例

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://主庫地址");
config.setUsername("使用者名稱");
config.setPassword("密碼");
HikariDataSource dataSource = new HikariDataSource(config);

// 讀操作
HikariConfig readConfig = new HikariConfig();
readConfig.setJdbcUrl("jdbc:mysql://從庫地址");
HikariDataSource readDataSource = new HikariDataSource(readConfig);

3. 使用中介軟體

使用中介軟體(如 Mycat、Atlas)可以簡化讀寫分離的實現。

  • 中介軟體負責路由請求,將寫操作轉發到主庫,將讀操作轉發到從庫。
  • 配置和管理更加靈活。

4. 應用程式邏輯

在應用程式中根據業務需求手動控制讀寫操作。例如:

  • 所有的寫操作都透過一個 DAO(資料訪問物件)傳送到主庫。
  • 所有的讀操作則透過另一個 DAO 傳送到從庫。

注意事項

  • 延遲問題:從庫的資料可能會有延遲,因此在進行讀操作時要注意資料一致性。
  • 負載均衡:可以配置多個從庫進行負載均衡。
  • 故障轉移:確保主庫或從庫發生故障時能夠快速切換。

實現讀寫分離可以顯著提升資料庫的效能,尤其是在讀操作較多的場景中。


二.基於MySQL 8.2的 InnoDB ReplicaSet元件實現讀寫分離

我們一直在等待它!現在它已經可用!MySQL 中的讀/寫拆分!!

在規模上,我們在副本之間分配讀取,但這必須在應用程式中以某種方式進行管理:將寫入指向某處,將讀取指向其他地方。

使用 MySQL 8.2,MySQL Router 現在能夠識別讀取和寫入,並將它們路由到 InnoDB 叢集中的主例項,或者路由到非同步複製源進行寫入,路由到輔助例項或副本進行讀取。

為了說明這一點,我部署了最簡單的架構:MySQL InnoDB ReplicaSet。

MySQL InnoDB ReplicaSet

這是 MySQL Shell 中 ReplicaSet 物件的狀態:

Bootstrap MySQL Router 8.2
配置 (bootstrap) MySQL Router:

the router in the MySQL Shell ReplicaSet object:

使用讀寫埠連線(6450):

我們可以看到,預設情況下,如果我們執行讀取,我們將到達副本(輔助),但是如果我們啟動事務,我們將到達複製源(主),而無需更改埠並使用相同的連線。

我們還可以看到使用只讀事務時的區別:

我們可以在 MySQL Router 的配置檔案中看到生成的 R/W 分割設定:

[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://myreplica/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto

您還可以使用命令 ROUTER SET access_mode=: 在會話中定義要訪問的例項型別:

結論

總之,MySQL Router 8.2 支援讀寫拆分。這是一項有價值的功能,可用於最佳化資料庫效能和可擴充套件性,而無需對應用程式進行任何更改。

此配置使您能夠將所有讀取流量引導至只讀例項,並將所有寫入流量引導至讀寫例項。

此功能不僅增強了整體使用者體驗,還簡化了資料庫管理和部署。

讀寫例項是主例項或源。只讀例項是副本(InnoDB 群集輔助例項、ReplicaSet 輔助例項或副本群集中的輔助例項)。

享受 MySQL,再也沒有藉口不將工作負載分散到副本!


參考連結:

MySQL 8.2 – transparent read/write splitting

相關文章