MariaDB Xpand的数据分布以及实现数据库保护的原理
随着MariaDB Platform X5的发布,数据库供应商MariaDB公司为客户提供了分布式SQL数据库解决方案,将MariaDB的多功能性提升到另一个层次。在这里我们来谈一下MariaDB Enterprise Service提供的Xpand智能引擎的数据分布以及实现数据库保护的原理,下面将会结合一个例子来进行阐述。
首先我们先创建一张命名为test的表格,并建立两个索引。创建表格和索引的代码如下:
CREATE TABLE test (
id BIGINT PRIMARY KEY,
col1 INT,
col2 INT,
col3 VARCHAR(64),
KEY k1 (col2),
KEY k2 (col3, col1)
);
然后向test插入一些数据,代码如下:
INSERT INTO test
(col1, col2, col3)
VALUES
(16, 36, "JANUARY"),
(17, 35, "FEBRUARY"),
(18, 34, "MARCH"),
(19, 33, "APRIL"),
(20, 32, "MAY");
表格数据和索引如下图所示:
表示:
Xpand 将每个表划分为表中每个索引的表示形式。每个表示具有由与表示相关联的索引定义的不同分布键。主键产生基本表示,其中包含表中的所有列。其他索引产生其他表示,其中包含索引列。每个表示的切片包含不同的行。Xpand 对分布键进行哈希处理,从而确定行属于哪个切片。
test表由一个主键和两个二级索引组成,因此它具有三种表示形式:
- 主键表示使用主键列作为分布键。此表示的切片包含所有表列。
- 该
k1
表示使用col2
列作为分布键。此表示的切片还包含主键列。 - 该
k2
表示使用col3
和col1
列作为分布键。此表示的切片还包含主键列。
切片:
Xpand 将每个表示水平划分为切片:
-
给定行的切片是通过对分布键应用上的一致哈希算法来确定的。
-
每个表示都是独立切片的。
-
同一个表的每个表示可以有不同数量的切片。
-
默认情况下,每个表示从每个节点一个切片开始。但是,可以使用
SLICE
table 选项配置表的初始切片数。 -
如果切片太大,Xpand 会自动将切片分成多个切片。最大切片大小基于
rebalancer_split_threshold_kb
系统变量。默认情况下,最大大小为 8 GB。
我们的test表由三种表示形式组成,每种表示形式可以有不同数量的切片,为了方便阐述,就将三种表示都分为三个切片并且放在三个节点上
假设Node #1(节点1)故障,Xpand是怎么保存Node #1的数据的呢?这就要提到副本了。
副本:
Xpand 将切片作为副本写入磁盘。Xpand 维护每个切片的多个副本。
-
在默认配置中,Xpand自动在磁盘上维护每个片的两个副本。但是,可以使用
REPLICAS
table选项或通过设置MAX_FAILURES将Xpand配置为维护更多副本。 -
给定切片的每个副本都存储在不同的节点上。
-
副本分布在节点之间以实现冗余并平衡读取、写入和磁盘使用。
-
Xpand 可以使新副本联机,而无需暂停或阻止对切片的写入。
在上图中我们可以看到在Node #2存储有Node #1 Slice 1切片的副本,而Node #3存储有Node #2 Slice 2切片的副本,并以此类推。根据上述副本的描述默认情况下,Xpand会自动在磁盘上维护每个片的两个副本。但是我们可以根据实际情况的需要使用REPLICAS table选项或者通过设置MAX_FAILURES将Xpand配置为维护更多副本。这里为了讲解方便就以一个副本为例。这样当Node #1发生故障后,因为在Node #2有Node #1 Slice 1切片的副本,从而保证了Slice 1切片上的数据不会丢失。对于Node #1 上的其他切片也是如此,这里就不再赘述了。
一致哈希算法:
Xpand 使用一致的散列进行数据分发。一致的散列允许 Xpand 动态地重新分配数据,而无需重新散列整个数据集。
Xpand 将每个分发密钥散列为 64 位数字。然后将空间划分为多个范围。每个范围都归一个特定的切片所有。下表说明了一致性哈希如何将特定键分配给特定切片。
片 | 哈希范围 | 关键值 |
---|---|---|
1 | 最小-100 | A,D,G |
2 | 101-200 | B,E |
3 | 201-最大 | C,F,H |
最后:
有关Xpand智能引擎的数据分布以及实现数据库保护的原理的讲述就到这里了,鉴于本人技术有限如若有错,欢迎评论区留言沟通交流~