本文介绍了在AUTO模式数据库中使用Locality关键字指定数据库对象的存储位置的方法。本语法仅适用于AUTO模式数据库。
PolarDB-X支持在AUTO模式数据库中,通过Locality关键字来指定数据库、表或分区的存储位置,以实现数据隔离或数据的均匀分布。
当前Locality关键字实现的能力如下:
- 允许定义数据库、表、分区级别的Locality属性,其他操作(缩容除外)均会在保证Locality约束的前提下改变数据分布。
- 允许变更表组、分区组级别的Locality属性,修改后将自动触发相应的异步数据迁移任务。
前提条件
- 实例内核版本需为5.4.14及以上。
- 逻辑库的分区类型需为AUTO模式。
如何查看实例版本,请参见查看和升级实例版本。
注意事项
- 节点缩容后,包含被缩容节点的Locality定义将会自动失效。
- 当前Locality属性通过DN节点的ID定义,备份恢复后原有Locality属性将会自动失效。
查看存储节点信息
假设已有一个PolarDB-X实例,您可以通过如下命令查看实例中的存储节点信息:
SHOW STORAGE;返回结果如下:
+--------------------+----------------------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| STORAGE_INST_ID | LEADER_NODE | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT | STATUS | DELETABLE | DELAY | ACTIVE |
+--------------------+----------------------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| polardbx-ng28-dn-0 | polardbx-ng28-dn-0-cands-0:14289 | true | MASTER | 1 | 2 | 0 | false | null | null |
| polardbx-ng28-dn-1 | polardbx-ng28-dn-1-cands-0:14176 | true | MASTER | 1 | 1 | 0 | true | null | null |
| polardbx-ng28-dn-2 | polardbx-ng28-dn-2-cands-0:14568 | true | MASTER | 1 | 1 | 0 | true | null | null |
| polardbx-ng28-dn-3 | polardbx-ng28-dn-3-cands-0:16796 | true | MASTER | 1 | 1 | 0 | true | null | null |
| polardbx-ng28-gms | polardbx-ng28-dn-0-cands-0:14289 | true | META_DB | 2 | 2 | 0 | false | null | null |
+--------------------+----------------------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+说明
STORAGE_INST_ID列为存储节点名,即当前在Locality中使用的名字。INST_KIND列为存储节点类型,值为META_DB的节点为元数据节点,不能用于存储用户数据。STATUS列为存储节点状态,值为0的节点为可用节点。DELTETABLE列表明该节点是否可被缩容,值为false的节点不可被缩容,其中包含元数据节点和一个指定存储节点(下面简称为0号存储节点)。
创建数据库时指定存储位置
在创建数据库时指定存储位置以实现数据隔离。
- 在实例中创建一个AUTO模式数据库,并通过如下命令指定其存储位置,详细语法请参见CREATE DATABASE。
CREATE DATABASE db1 LOCALITY='dn=polardbx-ng28-dn-0,polardbx-ng28-dn-1,polardbx-ng28-dn-2' MODE = 'auto'; - 创建成功后,您可以通过如下语句查看数据库的存储位置信息。
SHOW CREATE DATABASE `db1`;返回结果如下:
+----------+--------------------------------------------------------------------------------------------------------------------+ | DATABASE | CREATE DATABASE | +----------+--------------------------------------------------------------------------------------------------------------------+ | db1 | CREATE DATABASE `db1` /* MODE = 'auto' LOCALITY = "dn=polardbx-ng28-dn-0,polardbx-ng28-dn-1,polardbx-ng28-dn-2" */ | +----------+--------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.04 sec) - 您还可以通过如下命令查看创建在该数据库下的逻辑分库和物理分库信息。
SHOW DS;返回结果如下:
+----+--------------------+--------------------+---------------------------------+----------------------+---------+ | ID | STORAGE_INST_ID | DB | GROUP | PHY_DB | MOVABLE | +----+--------------------+--------------------+---------------------------------+----------------------+---------+ | 0 | polardbx-ng28-dn-0 | db1 | DB1_P00000_GROUP | db1_p00000 | 1 | | 1 | polardbx-ng28-dn-1 | db1 | DB1_P00001_GROUP | db1_p00001 | 1 | | 2 | polardbx-ng28-dn-2 | db1 | DB1_P00002_GROUP | db1_p00002 | 1 | | 3 | polardbx-ng28-gms | information_schema | INFORMATION_SCHEMA_SINGLE_GROUP | polardbx_info_schema | 0 | +----+--------------------+--------------------+---------------------------------+----------------------+---------+ 4 rows in set (0.04 sec)说明
数据库的存储位置必须包含0号节点,表和分区的存储位置不受此限制。
创建逻辑表时指定存储位置
在创建逻辑表时指定存储位置以实现数据隔离,目前支持在单表和Range、Hash、List三种分区方式的分区表中使用Locality关键字。
- 在实例中创建一个逻辑表,并指定其存储位置。详细语法参见CREATE TABLE(AUTO模式)。
CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT BY GROUP, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 locality = 'dn=polardbx-ng28-dn-1,polardbx-ng28-dn-2'; - 执行以下语句,查看表的定义。
SHOW CREATE TABLE `t_order`;返回信息如下:
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | TABLE | CREATE TABLE | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t_order | CREATE TABLE `t_order` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, `order_detail` longtext, PRIMARY KEY (`id`), INDEX `l_i_order` (`order_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8 /* LOCALITY='dn=polardbx-ng28-dn-1,polardbx-ng28-dn-2' */ | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.05 sec) - 执行以下语句,查看逻辑表的各个分区的数据分布情况。
SHOW TOPOLOGY `t_order`;返回信息如下:
+----+------------------+--------------------+----------------+-------------+--------------------+ | ID | GROUP_NAME | TABLE_NAME | PARTITION_NAME | PHY_DB_NAME | DN_ID | +----+------------------+--------------------+----------------+-------------+--------------------+ | 0 | DB1_P00002_GROUP | t_order_18dV_00001 | p2 | db1_p00002 | polardbx-ng28-dn-2 | | 1 | DB1_P00001_GROUP | t_order_18dV_00000 | p1 | db1_p00001 | polardbx-ng28-dn-1 | | 2 | DB1_P00001_GROUP | t_order_18dV_00002 | p3 | db1_p00001 | polardbx-ng28-dn-1 | +----+------------------+--------------------+----------------+-------------+--------------------+ 3 rows in set (0.15 sec)说明
- 创建表时Locality关键字指定的存储节点集合,必须是数据库对应存储节点集合的子集。
- 如果所创建的表为单表,则只允许Locality关键字声明单个DN节点作为存储节点。
- 当逻辑表与表组匹配时,表与表组、分区和分区组的Locality属性必须完全相同才能匹配成功。
- 逻辑表、逻辑表的表组、逻辑表的GSI、逻辑表GSI的表组默认具备相同的Locality属性。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




