Mysql
如何處理大規模多租戶/多模式環境的連接池
以下是情況的簡要介紹:
- 我們每個客戶有 1 個架構。
- 我們有 2000 多個客戶。
- 我們有 50 多個數據庫伺服器(上述模式在它們之間分佈不均)。
我們正在創建一個真正的無狀態應用程序前端(即改進遺留軟體)。這意味著我們可以有許多(100 多個)應用程序伺服器來處理使用者流量,每個應用程序伺服器可能需要連接到 50 多個伺服器中的任何一個以隨時提取數據。
擁有這麼多應用伺服器的原因是程式碼的計算量非常大。最終我們可能會轉向更少的應用伺服器和更強大的硬體,但我們還沒有完全做到這一點。
我的問題: 如何管理這種環境中的連接池情況?
如果我們想像一個“好的”連接池大約有 64 個連接,那麼讓每個應用伺服器為每個 DB 伺服器生成一個連接池似乎是不可行的。這將導致對每個數據庫伺服器進行 100+x64 = 6400 個持久連接……這太多了嗎?
可以做什麼?是否有某種可以使用的連接池代理軟體?
您有 2000 個架構分佈在 50 台伺服器上……我認為不存在可以處理這種情況的連接池。我相信,您將不得不在應用程式碼中編寫自己的程式碼。
我真的會退後一步,看看你的架構。如果您將客戶數量翻倍,會發生什麼?三倍呢?這種類型的設計似乎嚴重難以管理,並且難以擴展到新的業務水平。
HTH,戴夫·西斯克
我會建議 1 個數據庫,每個租戶都有一個單獨的使用者。使用 MySQL 使用者安全對數據進行分段。
- 為每個租戶創建一個數據庫使用者
- 向每個表添加一個tenant_id 列 (VARCHAR)
- 使用觸發器在 INSERT 上使用目前數據庫使用者填充tenant_id 列
- 為過濾到 id_tenant = current_database_user 的行的每個表創建一個視圖(不要在此視圖中包含 tenant_id 列)
- 限制租戶數據庫使用者只能使用這些視圖
那麼您將只有 1 個數據庫需要維護和擴展。但是,連接池仍然是一個潛在問題,因為後續請求可能使用不同的數據庫使用者。根據池的實現,這可能不是問題。
我在我的部落格中記錄了這種方法:https ://opensource.io/it/mysql-multi-tenant/