Replication

如何配置 AWS Aurora 以分離寫入/讀取操作

  • December 11, 2017

我想將我的數據庫實例從 AWS RDS MySQL 遷移到 Aurora,但我對複制以及 Aurora 如何管理寫入/讀取操作有疑問。

我有我的應用程序,我想將寫入操作與讀取分開。我想創建一個僅用於寫入操作的Master實例,而其他實例(Read Replica)僅用於讀取操作。

問題就在這裡,我在 AWS 文件中閱讀到***我需要對我的應用程序進行這種分離,***我認為或者我希望找到一種方法來做到這一點並對我的應用程序透明。我繪製了一個簡單的模式來使用 Aurora(來自 AWS):

AWS 說我必須做什麼:

     -----------------
     |  Application  |
     -----------------
      |             |
      | writes      |reads      
      |             |
------------      ------------------
|  Master  |      |  Read Replica  |
------------      ------------------
      ^            ^
      |replication |
      |____________|

我需要什麼:

我需要 Master 始終保持寫入操作,並將讀取重定向到只讀副本實例。

     -----------------
     |  Application  |
     -----------------
      |
      |write/read
      |           
------------   Reads    ------------------
|  Master  | <------->  |  Read Replica  |
------------            ------------------
      ^                     ^
      |      replication    |
      |_____________________|

複製始終在執行。但我想將寫入和讀取過程分開。所以我的總結:

主實例檢測寫入/讀取操作之間的差異,所有讀取操作將由只讀副本管理。我需要這個解決方案,因為 aurora 提供了一個很好的功能來改進我的 RDS,但唯一的問題是我需要在寫入和讀取操作之間建立平衡:寫入操作在主伺服器中處理,並將讀取操作發送到讀取複製品。我不想像亞馬遜建議的那樣在我的應用程式碼中定義這個過程並在它們之間進行選擇。

AFAIK,你說得對,AWS RDS Aurora(一個 MySQL 5.6 分支)不支持自動或透明的讀/寫拆分: http ://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Aurora.html

為了以對應用程序完全透明的方式執行此操作,您需要一個中間代理。然後,您的應用程序將始終連接到代理,然後代理必須進行數據包檢查以檢查每個傳入查詢以確定它是讀寫的,然後轉發到主伺服器,還是只讀的,然後可以獲取轉發到 N 個副本中的任何一個。

請注意,這有一些值得注意的含義: 1. 這意味著代理需要了解 MySQL 協議 2. 它需要檢查每個數據包(查詢)並確定它是 RW 還是 RO 3. 然後需要將查詢轉發到適當的後端 MySQL 實例 4. 它可能需要跟踪每個連接,維護應用程序和代理之間的前端連接映射,以及到 mysqld 實例的後端連接。前端連接將保持穩定,但後端連接可能會因每個查詢而改變。5. 您可能會因此遇到一些狀態問題。例如,當您啟動顯式事務、創建臨時表或在連接中設置會話變數時……這些可能會在(透明地)切換後端時失去。6.

這是我們希望在 MySQL Router 中擁有的功能(舊 MySQL Proxy 的替代品:http: //mysqlhighavailability.com/mysql-router-on-labs-the-newest-member-of-the-mysql- family/ ),但我們還沒有。正確地做這件事需要花費大量的時間和精力,才能將上述影響降到最低。目前支持的代理之一是 ProxySQL: http: //www.proxysql.com (參見“讀寫拆分”部分)

您可以在此處獲取原始碼並開始使用它:https ://github.com/renecannao/proxysql

祝你好運!

引用自:https://dba.stackexchange.com/questions/116361