NDB Cluster 磁碟資料儲存是使用下列物件實作的
表空間:作為其他磁碟資料物件的容器。一個表空間包含一個或多個資料檔案和一個或多個復原日誌檔群組。
資料檔案:儲存欄位資料。資料檔案直接指派給表空間。
復原日誌檔:包含復原交易所需的復原資訊。指派給復原日誌檔群組。
日誌檔群組:包含一個或多個復原日誌檔。指派給表空間。
復原日誌檔和資料檔案是每個資料節點檔案系統中的實際檔案;依預設,它們會放置在 NDB Cluster config.ini 檔案中指定的 DataDir 中的 ndb_ 中,其中 node_id_fsnode_id 是資料節點的節點 ID。您可以透過在建立復原日誌或資料檔案時指定絕對或相對路徑作為檔案名稱的一部分,將它們放置在其他位置。本節稍後會顯示建立這些檔案的陳述式。
復原日誌檔僅由磁碟資料表使用,記憶體中僅儲存的 NDB 表格不需要或不使用。
NDB Cluster 表空間和日誌檔群組不是以檔案形式實作的。
雖然並非所有磁碟資料物件都以檔案形式實作,但它們都共用相同的命名空間。這表示每個磁碟資料物件都必須有唯一的名稱 (而不只是每個給定類型的磁碟資料物件)。例如,您不能有表空間和名為 dd1 的日誌檔群組。
假設您已設定包含所有節點 (包括管理和 SQL 節點) 的 NDB Cluster,在磁碟上建立 NDB Cluster 表的基本步驟如下
建立日誌檔群組,並將一個或多個復原日誌檔指派給它 (復原日誌檔有時也稱為 復原檔案)。
建立表空間;將日誌檔群組和一個或多個資料檔案指派給表空間。
建立使用此表空間進行資料儲存的磁碟資料表。
可以使用 mysql 用戶端或其他 MySQL 用戶端應用程式中的 SQL 陳述式來完成這些任務中的每一個,如下列範例所示。
我們使用
CREATE LOGFILE GROUP建立名為lg_1的日誌檔群組。此日誌檔群組將由兩個復原日誌檔組成,我們將其命名為undo_1.log和undo_2.log,其初始大小分別為 16 MB 和 12 MB。(復原日誌檔的預設初始大小為 128 MB。) (選用) 您也可以指定日誌檔群組的復原緩衝區大小,或允許它採用 8 MB 的預設值。在此範例中,我們將復原緩衝區的大小設定為 2 MB。必須使用復原日誌檔建立日誌檔群組;因此我們在此CREATE LOGFILE GROUP陳述式中將undo_1.log新增至lg_1CREATE LOGFILE GROUP lg_1 ADD UNDOFILE 'undo_1.log' INITIAL_SIZE 16M UNDO_BUFFER_SIZE 2M ENGINE NDBCLUSTER;若要將
undo_2.log新增至日誌檔群組,請使用下列ALTER LOGFILE GROUP陳述式ALTER LOGFILE GROUP lg_1 ADD UNDOFILE 'undo_2.log' INITIAL_SIZE 12M ENGINE NDBCLUSTER;一些需要注意的事項
此處使用的
.log檔案副檔名並非必要。我們使用它只是為了使日誌檔案容易辨識。每個
CREATE LOGFILE GROUP和ALTER LOGFILE GROUP陳述式都必須包含ENGINE選項。此選項唯一允許的值是NDBCLUSTER和NDB。重要在任何給定時間,同一個 NDB Cluster 中最多只能有一個日誌檔群組。
當您使用
ADD UNDOFILE '將復原日誌檔新增至日誌檔群組時,會在叢集中每個資料節點的filename'DataDir內的ndb_目錄中建立名稱為node_id_fsfilename的檔案,其中node_id是資料節點的節點 ID。每個復原日誌檔的大小都與 SQL 陳述式中指定的大小相同。例如,如果 NDB Cluster 有 4 個資料節點,則剛才顯示的ALTER LOGFILE GROUP陳述式會建立 4 個復原日誌檔,每個資料節點的資料目錄中各 1 個;這些檔案的名稱都為undo_2.log,並且每個檔案的大小為 12 MB。UNDO_BUFFER_SIZE受限於可用的系統記憶體量。請參閱 第 15.1.16 節,「CREATE LOGFILE GROUP 陳述式」,以及 第 15.1.6 節,「ALTER LOGFILE GROUP 陳述式」,以取得關於這些陳述式的詳細資訊。
現在我們可以建立一個表空間,它是磁碟資料表用來儲存資料的檔案的抽象容器。表空間與特定的日誌檔群組相關聯;建立新的表空間時,您必須指定它用於復原日誌記錄的日誌檔群組。您也必須指定至少一個資料檔案;您可以在建立表空間後將更多資料檔案新增至表空間。也可以從表空間中捨棄資料檔案 (請參閱本節稍後的範例)。
假設我們希望建立一個名為
ts_1的表空間,它使用lg_1作為其日誌檔群組。我們希望表空間包含兩個資料檔案,名為data_1.dat和data_2.dat,其初始大小分別為 32 MB 和 48 MB。(INITIAL_SIZE的預設值為 128 MB。) 我們可以使用兩個 SQL 陳述式來完成此操作,如下所示CREATE TABLESPACE ts_1 ADD DATAFILE 'data_1.dat' USE LOGFILE GROUP lg_1 INITIAL_SIZE 32M ENGINE NDBCLUSTER; ALTER TABLESPACE ts_1 ADD DATAFILE 'data_2.dat' INITIAL_SIZE 48M;CREATE TABLESPACE陳述式會使用資料檔案data_1.dat建立表空間ts_1,並將ts_1與日誌檔群組lg_1建立關聯。ALTER TABLESPACE會新增第二個資料檔案 (data_2.dat)。一些需要注意的事項
與本範例中用於復原日誌檔的
.log檔案副檔名一樣,.dat檔案副檔名沒有特殊意義;它僅用於方便辨識。當您使用
ADD DATAFILE '將資料檔案新增至表空間時,會在叢集中每個資料節點的filename'DataDir內的ndb_目錄中建立名稱為node_id_fsfilename的檔案,其中node_id是資料節點的節點 ID。每個資料檔案的大小都與 SQL 陳述式中指定的大小相同。例如,如果 NDB Cluster 有 4 個資料節點,則剛才顯示的ALTER TABLESPACE陳述式會建立 4 個資料檔案,每個資料節點的資料目錄中各 1 個;這些檔案的名稱都為data_2.dat,並且每個檔案的大小為 48 MB。NDB會保留每個表空間的 4% 用於資料節點重新啟動期間使用。此空間無法用於儲存資料。CREATE TABLESPACE陳述式必須包含ENGINE子句;只有使用與表空間相同儲存引擎的表格,才能在表空間中建立。對於NDB表空間,ALTER TABLESPACE僅接受ALTER TABLESPACE ... ADD DATAFILE的ENGINE子句;對於任何其他ALTER TABLESPACE陳述式,都會拒絕ENGINE。NDB表空間的ENGINE選項唯一允許的值是NDBCLUSTER和NDB。區塊的配置會在給定表空間使用的所有資料檔案之間以循環方式執行。
如需關於
CREATE TABLESPACE和ALTER TABLESPACE陳述式的詳細資訊,請參閱 第 15.1.21 節,「CREATE TABLESPACE 陳述式」,以及 第 15.1.10 節,「ALTER TABLESPACE 陳述式」。
現在可以建立一個表格,其未建立索引的欄位會使用表空間
ts_1中的檔案儲存在磁碟上CREATE TABLE dt_1 ( member_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, last_name VARCHAR(50) NOT NULL, first_name VARCHAR(50) NOT NULL, dob DATE NOT NULL, joined DATE NOT NULL, INDEX(last_name, first_name) ) TABLESPACE ts_1 STORAGE DISK ENGINE NDBCLUSTER;TABLESPACE ts_1 STORAGE DISK指示NDB儲存引擎使用表空間ts_1來儲存磁碟上的資料。一旦如範例所示建立了表
ts_1,您就可以對其執行INSERT、SELECT、UPDATE和DELETE陳述式,就像對待其他任何 MySQL 表一樣。也可以在
CREATE TABLE或ALTER TABLE陳述式中,使用STORAGE子句來指定個別欄位是否儲存在磁碟或記憶體中。STORAGE DISK會使欄位儲存在磁碟上,而STORAGE MEMORY會使使用記憶體儲存。請參閱 第 15.1.20 節,〈CREATE TABLE 陳述式〉,以取得更多資訊。
您可以透過查詢 INFORMATION_SCHEMA 資料庫中的 FILES 表,取得剛剛建立的 NDB 磁碟資料檔案和復原日誌檔案的相關資訊,如下所示
mysql> SELECT
FILE_NAME AS File, FILE_TYPE AS Type,
TABLESPACE_NAME AS Tablespace, TABLE_NAME AS Name,
LOGFILE_GROUP_NAME AS 'File group',
FREE_EXTENTS AS Free, TOTAL_EXTENTS AS Total
FROM INFORMATION_SCHEMA.FILES
WHERE ENGINE='ndbcluster';
+--------------+----------+------------+------+------------+------+---------+
| File | Type | Tablespace | Name | File group | Free | Total |
+--------------+----------+------------+------+------------+------+---------+
| ./undo_1.log | UNDO LOG | lg_1 | NULL | lg_1 | 0 | 4194304 |
| ./undo_2.log | UNDO LOG | lg_1 | NULL | lg_1 | 0 | 3145728 |
| ./data_1.dat | DATAFILE | ts_1 | NULL | lg_1 | 32 | 32 |
| ./data_2.dat | DATAFILE | ts_1 | NULL | lg_1 | 48 | 48 |
+--------------+----------+------------+------+------------+------+---------+
4 rows in set (0.00 sec)有關更多資訊和範例,請參閱 第 28.3.15 節,〈INFORMATION_SCHEMA FILES 表〉。
隱式儲存在磁碟上的欄位索引。 在剛才顯示的範例中定義的表 dt_1 中,只有 dob 和 joined 欄位儲存在磁碟上。這是因為 id、last_name 和 first_name 欄位上有索引,因此這些欄位的資料會儲存在 RAM 中。只有未建立索引的欄位才能保存在磁碟上;索引和已建立索引的欄位資料會繼續儲存在記憶體中。在設計磁碟資料表時,您必須牢記使用索引和節省 RAM 之間的權衡。
您無法在已明確宣告為 STORAGE DISK 的欄位上新增索引,而必須先將其儲存類型變更為 MEMORY;任何嘗試這樣做的操作都會失敗並產生錯誤。可以為 隱式 使用磁碟儲存的欄位建立索引;執行此操作時,欄位的儲存類型會自動變更為 MEMORY。所謂的「隱式」,我們指的是儲存類型未宣告,而是從父表繼承的欄位。在以下 CREATE TABLE 陳述式中(使用先前定義的表空間 ts_1),欄位 c2 和 c3 隱式使用磁碟儲存。
mysql> CREATE TABLE ti (
-> c1 INT PRIMARY KEY,
-> c2 INT,
-> c3 INT,
-> c4 INT
-> )
-> STORAGE DISK
-> TABLESPACE ts_1
-> ENGINE NDBCLUSTER;
Query OK, 0 rows affected (1.31 sec)由於 c2、c3 和 c4 本身未宣告為 STORAGE DISK,因此可以為它們建立索引。在此,我們分別使用 CREATE INDEX 和 ALTER TABLE 為 c2 和 c3 新增索引
mysql> CREATE INDEX i1 ON ti(c2);
Query OK, 0 rows affected (2.72 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE ti ADD INDEX i2(c3);
Query OK, 0 rows affected (0.92 sec)
Records: 0 Duplicates: 0 Warnings: 0
SHOW CREATE TABLE 確認索引已新增。
mysql> SHOW CREATE TABLE ti\G
*************************** 1. row ***************************
Table: ti
Create Table: CREATE TABLE `ti` (
`c1` int(11) NOT NULL,
`c2` int(11) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
`c4` int(11) DEFAULT NULL,
PRIMARY KEY (`c1`),
KEY `i1` (`c2`),
KEY `i2` (`c3`)
) /*!50100 TABLESPACE `ts_1` STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)您可以使用 ndb_desc 看到,已建立索引的欄位(強調文字)現在使用記憶體內儲存,而非磁碟儲存
$> ./ndb_desc -d test t1
-- t1 --
Version: 33554433
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 4
Number of primary keys: 1
Length of frm data: 317
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 4
FragmentCount: 4
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options:
HashMap: DEFAULT-HASHMAP-3840-4
-- Attributes --
c1 Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c2 Int NULL AT=FIXED ST=MEMORY
c3 Int NULL AT=FIXED ST=MEMORY
c4 Int NULL AT=FIXED ST=DISK
-- Indexes --
PRIMARY KEY(c1) - UniqueHashIndex
i2(c3) - OrderedIndex
PRIMARY(c1) - OrderedIndex
i1(c2) - OrderedIndex效能注意事項。如果磁碟資料檔案與資料節點檔案系統位於不同的實體磁碟上,則使用磁碟資料儲存的叢集效能會大幅提升。必須對叢集中的每個資料節點執行此操作,才能獲得任何明顯的好處。
您可以使用絕對和相對檔案系統路徑搭配 ADD UNDOFILE 和 ADD DATAFILE;相對路徑是根據資料節點的資料目錄計算的。
日誌檔案群組、表空間以及使用這些項目的任何磁碟資料表都必須按照特定順序建立。刪除這些物件也是如此,但須遵守以下限制
只要有任何表空間使用日誌檔案群組,就無法刪除該日誌檔案群組。
只要表空間包含任何資料檔案,就無法刪除該表空間。
只要還有任何表正在使用表空間,您就無法從該表空間中刪除任何資料檔案。
無法刪除與不同表空間關聯建立的檔案,只能刪除建立檔案時所關聯的表空間檔案。
例如,若要刪除本節到目前為止建立的所有物件,您可以使用以下陳述式
mysql> DROP TABLE dt_1;
mysql> ALTER TABLESPACE ts_1
-> DROP DATAFILE 'data_2.dat';
mysql> ALTER TABLESPACE ts_1
-> DROP DATAFILE 'data_1.dat';
mysql> DROP TABLESPACE ts_1;
mysql> DROP LOGFILE GROUP lg_1;這些陳述式必須按照所示順序執行,但兩個 ALTER TABLESPACE ... DROP DATAFILE 陳述式可以按任何順序執行。