NDB Cluster 磁碟資料儲存是使用下列物件實作的
表格空間 (Tablespace):作為其他磁碟資料物件的容器。一個表格空間包含一個或多個資料檔案和一個或多個復原記錄檔群組。
資料檔案 (Data file):儲存欄位資料。資料檔案直接指定給表格空間。
復原記錄檔 (Undo log file):包含回滾交易所需的復原資訊。指定給復原記錄檔群組。
記錄檔群組 (Log file group):包含一個或多個復原記錄檔。指定給表格空間。
復原記錄檔和資料檔案是每個資料節點檔案系統中的實際檔案;預設情況下,它們會放置在 NDB Cluster config.ini
檔案中指定的 DataDir
中的 ndb_
中,其中 node_id
_fsnode_id
是資料節點的節點 ID。可以透過在建立復原記錄檔或資料檔案時,將絕對或相對路徑指定為檔案名稱的一部分,將它們放置在其他位置。建立這些檔案的陳述式將在本節稍後顯示。
復原記錄檔僅供磁碟資料表格使用,並非僅在記憶體中儲存的 NDB
表格所需或使用。
NDB Cluster 表格空間和記錄檔群組不會以檔案的形式實作。
雖然並非所有的磁碟資料物件都以檔案的形式實作,但它們都共用相同的命名空間。這表示每個磁碟資料物件都必須是唯一命名的 (而不僅僅是特定類型的每個磁碟資料物件)。例如,您不能讓一個表格空間和一個記錄檔群組都命名為 dd1
。
假設您已設定具有所有節點 (包括管理和 SQL 節點) 的 NDB Cluster,則在磁碟上建立 NDB Cluster 表格的基本步驟如下
建立記錄檔群組,並將一個或多個復原記錄檔指定給它 (復原記錄檔有時也稱為 復原檔案 (undofile))。
建立表格空間;將記錄檔群組以及一個或多個資料檔案指定給表格空間。
建立使用此表格空間進行資料儲存的磁碟資料表格。
可以使用 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_1
CREATE 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
'filename
這個名稱在叢集中每個資料節點的DataDir
中的ndb_
目錄中建立檔案,其中node_id
_fsnode_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
'filename
這個名稱在叢集中每個資料節點的DataDir
中的ndb_
目錄中建立檔案,其中node_id
_fsnode_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
陳述式可以按任一順序執行。
較舊版本的 NDB Cluster 會在 ALTER TABLESPACE ... DROP DATAFILE
和 DROP TABLESPACE
中使用 ENGINE
子句。在 NDB 8.4 及更高版本中,這兩種陳述式都不再支援此子句。