一. 傳統的讀寫分離方式
在 MySQL 中實現讀寫分離可以透過以下幾種方式來達到目的:
1. 主從複製
使用主從複製(Master-Slave Replication)是實現讀寫分離的常見方式。
- 主庫:處理所有的寫入操作(INSERT、UPDATE、DELETE)。
- 從庫:負責處理讀操作(SELECT)。
步驟:
- 設定主從複製:
- 在主庫上配置 binlog,並建立複製使用者。
- 在從庫上配置 server-id,並指向主庫的 binlog。
- 應用程式配置:
- 將寫操作指向主庫。
- 將讀操作指向從庫。可以在應用層實現邏輯來決定查詢使用哪個庫。
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