Mysql

如何更新和管理數百萬個數據庫

  • August 9, 2022

我們正在尋求對我們的應用程序進行分片,以便每個客戶都有自己的數據庫。所有數據庫的數據內容不同,但結構對所有客戶都是一樣的。

想像一下有 200 萬客戶。我們如何將 200 萬個數據庫更新為:

  1. 創建、修改或刪除列。
  2. 創建、修改或刪除表。

我們如何在數十個實例的數百萬個數據庫中做到這一點?我們知道如何手動完成,但是如何使這個過程自動化呢?所以我們只修改一個實例,然後傳播給所有客戶。請記住,每個客戶在每個數據庫中都有完全不同的數據。

謝謝!

在過去的工作中,我管理了一個為每個客戶提供一個模式的網站。有 8 個 MySQL 實例,每個實例大約有 1,500 個模式。每個客戶的模式都有一組相同的表,因此當需要 ALTER TABLE 時,我們必須執行它大約 12,000 次。

還有一個特殊的模式,其中包含有關客戶模式、他們所在的伺服器等的元數據。

我們使用了一個用 PHP 實現的定制開發腳本(儘管任何語言都可以),它查詢客戶目錄,遍歷該目錄中命名的所有客戶模式,並針對錶中的表呼叫所需的 ALTER TABLE各自的架構。

我可以根據需要在多個視窗中安全地同時執行腳本。當腳本啟動每個變更時,它首先會更新相應模式schema_version表中的記錄。如果該更新已經發生,那麼腳本會斷定腳本的另一個實例已經在另一個會話中執行更改,因此它會跳過該客戶並繼續嘗試循環中的下一個。

在某些情況下,我有 60 多個並發視窗執行腳本,以便盡快通過它們。

嘗試使用更大的並行性的一個風險是,如果更改涉及大表的表副本,則並發更改可能會使伺服器耗盡磁碟空間。所以增加視窗的數量並不是一個好主意。

我不知道有任何現成的工具可以做到這一點。我們的產品是內部開發的。無論如何,您的站點很可能有自己的專有方式來列舉客戶數據庫。

如果每台伺服器的客戶數量比我多一個數量級,則應確保使用的是 MySQL 8.0。在我的例子中,我們遇到了每台伺服器有這麼多表的困難,因為 InnoDB 中打開文件的數量是一個瓶頸。他們在 MySQL 8.0 中重新實現了 InnoDB 數據字典,在我向他們提供有關我的案例的回饋後,他們專門測試了數據字典的可擴展性,每台伺服器最多 100 萬個表(它可能可以處理更多,但這就是他們測試的程度)。

我不知道 MariaDB 是否可以處理相同規模的數據字典。我不使用 MariaDB,你不應該假設它與 MySQL 兼容。

MariaDB(和 MySQL)將數據庫實現為目錄。在該目錄中,每個表至少有一個文件。

您的設計要求作業系統處理數千萬個文件。可能做不到!即使可以,也可能很慢。

至於為每個使用者添加一列;讓我們來看看…

  • 200 萬個連接(如果在單獨的虛擬機中)
  • 200 萬個 ALTER
  • 即使在 SSD 驅動器上,每次更改可能需要 20 毫秒(包括模式更新等)。

那是幾個小時。

怎麼做?你可以寫一個SELECT反對information_schema.tables來建構所有的ALTER語句。然後您可以使用儲存過程來執行它們,或者您可以使用雪鏟將 200 萬對 USE + ALTER 交給命令行“mysql”工具。

SELECT本身可能需要幾分鐘才能執行。

並行執行?它可能會有所幫助;也許可以縮短到 3 小時。如何?程式碼更加複雜。

會不會是客戶使用的SELECT * FROM ...*猜猜當現在又代表一列時,他們的程序會發生什麼?向 200 萬客戶解釋這一點!您的客戶支持人員有多大?

CREATE/ DROPtable - 可能更慢。

這些客戶將擁有什麼樣的數據?我們可以討論設計模式的“更好”方法。

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