NDBCLUSTER
(也稱為 NDB
) 是一個提供高可用性和資料持久性的記憶體內儲存引擎。
NDBCLUSTER
儲存引擎可以配置一系列容錯移轉和負載平衡選項,但最容易的做法是從叢集層級開始使用儲存引擎。NDB Cluster 的 NDB
儲存引擎包含一整套資料,僅依賴叢集本身內的其他資料。
NDB Cluster 的 「叢集」 部分是獨立於 MySQL 伺服器配置的。在 NDB Cluster 中,叢集的每個部分都被視為一個 節點。
在許多情況下,術語 「節點」 用於表示電腦,但在討論 NDB Cluster 時,它表示一個 處理程序。可以在一台電腦上執行多個節點;對於正在執行一個或多個叢集節點的電腦,我們使用術語 叢集主機。
叢集節點有三種型別,在最精簡的 NDB Cluster 配置中,至少有三個節點,每個型別各一個
管理節點:此型別節點的作用是管理 NDB Cluster 內的其他節點,執行諸如提供配置資料、啟動和停止節點以及執行備份等功能。由於此節點型別管理其他節點的配置,因此應先啟動此型別的節點,然後再啟動任何其他節點。管理節點使用 ndb_mgmd 命令啟動。
資料節點:此型別的節點儲存叢集資料。資料節點的數量等於片段複本的數量乘以片段的數量(請參閱第 25.2.2 節「NDB Cluster 節點、節點群組、片段複本和分割區」)。例如,如果有兩個片段複本,每個複本有兩個片段,則需要四個資料節點。一個片段複本足以用於資料儲存,但不提供冗餘;因此,建議使用兩個(或更多)片段複本來提供冗餘,從而實現高可用性。資料節點使用 ndbd 命令啟動(請參閱 第 25.5.1 節「ndbd — NDB Cluster 資料節點精靈」)或 ndbmtd 命令啟動(請參閱 第 25.5.3 節「ndbmtd — NDB Cluster 資料節點精靈(多執行緒)」)。
NDB Cluster 表格通常完全儲存在記憶體中,而不是在磁碟上(這就是我們將 NDB Cluster 稱為記憶體內資料庫的原因)。但是,一些 NDB Cluster 資料可以儲存在磁碟上;如需詳細資訊,請參閱第 25.6.11 節「NDB Cluster 磁碟資料表」。
SQL 節點:這是一個存取叢集資料的節點。在 NDB Cluster 的情況下,SQL 節點是使用
NDBCLUSTER
儲存引擎的傳統 MySQL 伺服器。SQL 節點是使用--ndbcluster
和--ndb-connectstring
選項啟動的 mysqld 處理程序,這些選項在本章的其他地方進行了說明,也可能帶有其他 MySQL 伺服器選項。SQL 節點實際上只是一種特殊型別的 API 節點,它指定任何存取 NDB Cluster 資料的應用程式。API 節點的另一個範例是 ndb_restore 公用程式,用於還原叢集備份。可以使用 NDB API 撰寫此類應用程式。如需有關 NDB API 的基本資訊,請參閱NDB API 入門。
在生產環境中採用三節點設定是不切實際的。此類配置不提供冗餘;若要從 NDB Cluster 的高可用性功能中獲益,必須使用多個資料和 SQL 節點。也強烈建議使用多個管理節點。
如需簡要介紹 NDB Cluster 中節點、節點群組、片段複本和分割區之間的關係,請參閱第 25.2.2 節「NDB Cluster 節點、節點群組、片段複本和分割區」。
叢集的配置涉及配置叢集中的每個單獨節點,以及設定節點之間的單獨通訊連結。NDB Cluster 目前的設計意圖是,資料節點在處理器能力、記憶體空間和頻寬方面是同質的。此外,為了提供單一的配置點,整個叢集的所有配置資料都位於一個組態檔中。
管理伺服器管理叢集組態檔和叢集日誌。叢集中的每個節點都會從管理伺服器擷取配置資料,因此需要一種方法來判斷管理伺服器所在的位置。當資料節點中發生有趣的事件時,節點會將有關這些事件的資訊傳輸到管理伺服器,然後管理伺服器會將資訊寫入叢集日誌。
此外,可以有任意數量的叢集用戶端處理程序或應用程式。這些包括標準 MySQL 用戶端、NDB
特定 API 程式和管理用戶端。以下段落將介紹這些內容。
標準 MySQL 用戶端。 NDB Cluster 可以與以 PHP、Perl、C、C++、Java、Python 等編寫的現有 MySQL 應用程式一起使用。此類用戶端應用程式會將 SQL 陳述式傳送到充當 NDB Cluster SQL 節點的 MySQL 伺服器並從中接收回應,其方式與它們與獨立 MySQL 伺服器互動的方式大致相同。
可以使用 NDB Cluster 作為資料來源的 MySQL 用戶端可以進行修改,以利用與多個 MySQL 伺服器連線來實現負載平衡和容錯移轉的能力。例如,使用 Connector/J 5.0.6 及更高版本的 Java 用戶端可以使用 jdbc:mysql:loadbalance://
URL (在 Connector/J 5.1.7 中進行了改進) 以透明方式實現負載平衡;如需有關將 Connector/J 與 NDB Cluster 結合使用的更多資訊,請參閱將 Connector/J 與 NDB Cluster 結合使用。
NDB 用戶端程式。 可以撰寫用戶端程式,使用高階 C++ API NDB API,直接從 NDBCLUSTER
儲存引擎存取 NDB Cluster 資料,從而繞過可能連線到叢集的任何 MySQL 伺服器。此類應用程式對於不需要 SQL 資料介面的特殊用途可能很有用。如需更多資訊,請參閱NDB API。
也可以使用適用於 Java 的 NDB Cluster 連接器針對 NDB Cluster 撰寫NDB
特定 Java 應用程式。此 NDB Cluster 連接器包括ClusterJ,這是一個類似於物件關聯對應持久性架構 (例如,直接連線至 NDBCLUSTER
的 Hibernate 和 JPA) 的高階資料庫 API,因此不需要存取 MySQL 伺服器。如需更多資訊,請參閱Java 和 NDB Cluster,以及ClusterJ API 和資料物件模型。
對使用 Node.js 以 JavaScript 撰寫的應用程式的 NDB Cluster 支援已棄用,但在 NDB 9.0 中仍受支援。如需更多資訊,請參閱適用於 JavaScript 的 MySQL NoSQL 連接器。
管理用戶端。 這些用戶端連線到管理伺服器,並提供用於正常啟動和停止節點、啟動和停止訊息追蹤 (僅限偵錯版本)、顯示節點版本和狀態、啟動和停止備份等的命令。此類程式的範例是 NDB Cluster 隨附的 ndb_mgm 管理用戶端(請參閱第 25.5.5 節「ndb_mgm — NDB Cluster 管理用戶端」)。可以使用 MGM API(一種直接與一個或多個 NDB Cluster 管理伺服器通訊的 C 語言 API)撰寫此類應用程式。如需更多資訊,請參閱MGM API。
Oracle 還提供 MySQL Cluster Manager,它提供了一個進階命令列介面,簡化了許多複雜的 NDB Cluster 管理任務,例如重新啟動具有大量節點的 NDB Cluster。MySQL Cluster Manager 用戶端還支援用於取得和設定大多數節點配置參數的值以及與 NDB Cluster 相關的 mysqld 伺服器選項和變數的命令。如需更多資訊,請參閱MySQL Cluster Manager 9.0.0 使用者手冊。
事件日誌。 NDB叢集會依據類別(啟動、關閉、錯誤、檢查點等等)、優先順序和嚴重性來記錄事件。所有可報告事件的完整列表可以在第25.6.3節「NDB叢集中產生的事件報告」中找到。事件日誌分為以下兩種:
叢集日誌:記錄整個叢集所有想要報告的事件。
節點日誌:為每個單獨的節點維護的獨立日誌。
在正常情況下,只需保留並檢查叢集日誌即可。節點日誌僅用於應用程式開發和除錯目的。
檢查點。 一般來說,當資料儲存到磁碟時,就表示已達到一個檢查點。更具體地說,在NDB叢集中,檢查點是指所有已提交的交易都儲存到磁碟的時間點。關於NDB
儲存引擎,有兩種檢查點類型協同工作,以確保維護叢集資料的一致性視圖。這些類型如下列所示:
本機檢查點 (LCP):這是特定於單一節點的檢查點;但是,LCP會在叢集中的所有節點上或多或少同時發生。LCP通常每隔幾分鐘發生一次;確切的間隔時間會有所不同,並取決於節點儲存的資料量、叢集活動的程度和其他因素。
NDB 9.0 支援部分LCP,在某些情況下可以顯著提高效能。請參閱啟用部分LCP並控制其使用儲存量的
EnablePartialLcp
和RecoveryWork
組態參數的描述。全域檢查點 (GCP):GCP每隔幾秒鐘發生一次,當所有節點的交易同步並且重做日誌刷新到磁碟時發生。
有關本機檢查點和全域檢查點建立的檔案和目錄的更多資訊,請參閱NDB叢集資料節點檔案系統目錄。
傳輸器。 我們使用傳輸器一詞來表示資料節點之間使用的資料傳輸機制。MySQL NDB 叢集 9.0 支援以下三種傳輸器:
透過乙太網路的TCP/IP。 請參閱第 25.4.3.10 節「NDB 叢集 TCP/IP 連線」。
直接 TCP/IP。 使用機器對機器的連線。 請參閱第 25.4.3.11 節「使用直接連線的 NDB 叢集 TCP/IP 連線」。
儘管此傳輸器使用與前一個項目中提到的相同的 TCP/IP 協定,但它需要以不同的方式設定硬體,並且配置方式也不同。因此,它被視為 NDB 叢集的一個獨立傳輸機制。
共享記憶體 (SHM)。 請參閱第 25.4.3.12 節「NDB 叢集共享記憶體連線」。
由於 TCP/IP over Ethernet 無所不在,因此大多數使用者都使用它來進行 NDB 叢集。
無論使用哪種傳輸器,NDB
都會盡力確保資料節點程序之間的通訊使用盡可能大的區塊來執行,因為這有助於所有類型的資料傳輸。