关于TiDB中指定Region的疑问

看文档里面有说在TiDB中可以为表指定Region,想知道如果在单纯使用TiKV的场景里面,能否也拥有这样的功能,或者没有的话,TiKV是否对这部分有对外暴露的接口,有的话想知道对应的源码位置,在TiKV Client层面能否扩展出这样的功能,TiKV层面就不是以表的维度指定,而是基于业务场景,对场景中的一类数据指定Region

源码我没看 ,支持是肯定的 现在tikv支持指定region

Region 一般是以 keyStart 和 keyEnd 作为上下限的,这个和 tidb 里面的基础知识一样
参考 纯 tikv的架构图

除了没tidb,也是有 PD的,但是调度支持的比较少
仅支持:

  • Add a new replica
  • Remove a replica
  • Transfer a Region leader between replicas in a Raft group

They are implemented by the Raft commands AddReplica , RemoveReplica , and TransferLeader .

参考文档:


另外 不论是 RawAPI 还是 TxnAPI,对delete key 之后,需要做相应的处理(参考 LSMTree 特性),实际的数据没回收的话(参考 RocksDB compaction),这些key 还是可以访问的

看了文档和tikv配置参数里面没找到对应的说明,大佬对此有了解么:joy:

关于key的范围我想确定下,我看源码里面对key的存储是用Vec来存的,但是具体指定范围那没细看,猜测是按照key的字节长度来作为region范围的边界的是吗

范围你可以自己订,可以参考 tidb 中 key 的定义方式,也是实现的 左闭右开的原则

参考如下:

  • Hash:按照 Key 做 Hash,根据 Hash 值选择对应的存储节点。
  • Range:按照 Key 分 Range,某一段连续的 Key 都保存在一个存储节点上。

TiKV 选择了第二种方式,将整个 Key-Value 空间分成很多段,每一段是一系列连续的 Key,将每一段叫做一个 Region,并且会尽量保持每个 Region 中保存的数据不超过一定的大小,目前在 TiKV 中默认是 96MB。每一个 Region 都可以用 [StartKey,EndKey) 这样一个左闭右开区间来描述。

Region in TiDB
https://docs.pingcap.com/zh/tidb/stable/tidb-storage#region

然后通过 数据的 Scan,你可以找到一些答案:

试了api,默认应该是按照key的字节长度来做range的边界,但是你说的范围可以自己定,这是在client层面可以操作的么,client的api没看到可以指定region范围的地方,只有region大小是可配置的

调整边界模式的话,就需要深度定制,就只能自己改了(我理解业务层面,只需要考虑副本数量和写入数据的所在的位置即可,甚至都不用关心数据在哪个 Region,实际上从 PD 中是可以读到的)

边界模型是TIKV 和 PD共同处理的协作方案,为了满足调度能力

大概了解了,不过我的核心问题是TiKV里面为数据指定region,这有点偏,哈哈哈,也算涨见识,大佬在指定Region方面有了解么

| ex_order_total | CREATE TABLE ex_order_total (
id bigint(20) NOT NULL COMMENT ‘ID’,
order_id bigint(20) NOT NULL COMMENT ‘子订单委托单ID’,
symbol varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ‘’ COMMENT ‘币对’,
base varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ‘’ COMMENT ‘基准货币,symbol的前半段’,
quote varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ‘’ COMMENT ‘计价货币,symbol的后半段’,
user_id int(11) unsigned NOT NULL COMMENT ‘用户id’,

status tinyint(3) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘订单状态:0 init,1 new,2 filled,3 part_filled,4 canceled,5 pending_cancel,6 expired’,
type tinyint(3) unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘委托类型:1 limit,2 market,3 stop’,
ctime timestamp NOT NULL COMMENT ‘子订单创建时间’,
mtime timestamp NOT NULL COMMENT ‘子订单更新时间’,
source tinyint(3) unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘订单来源:1web,2app,3api’,
order_type tinyint(3) NOT NULL DEFAULT ‘1’ COMMENT ‘订单类型1:常规订单,2 杠杆订单’,
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
updated_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
finger_print varchar(32) DEFAULT ‘’ COMMENT ‘防篡改指纹’,
month_code int(11) unsigned NOT NULL COMMENT ‘所处月份,用户分区’,
PRIMARY KEY (id,month_code) /*T![clustered_index] NONCLUSTERED */,
UNIQUE KEY uniq_orderid_symbol (order_id,symbol,month_code),
KEY idx_ctime (ctime),
KEY idx_status (status),
KEY idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘委托订单汇总表’
PARTITION BY RANGE (month_code)
(PARTITION p1 VALUES LESS THAN (2),
PARTITION p2 VALUES LESS THAN (3),
PARTITION p3 VALUES LESS THAN (4),
PARTITION p4 VALUES LESS THAN (5),
PARTITION p5 VALUES LESS THAN (6),
PARTITION p6 VALUES LESS THAN (7),
PARTITION p7 VALUES LESS THAN (8),
PARTITION p8 VALUES LESS THAN (9),
PARTITION p9 VALUES LESS THAN (10),
PARTITION p10 VALUES LESS THAN (11),
PARTITION p11 VALUES LESS THAN (12),
PARTITION p12 VALUES LESS THAN (MAXVALUE)) |

比如这个按月分区表
要求最近2个月的数据放在热存储中。你就可以把 PARTITION p7 放在ssd分区上。做冷热分离 把 PARTITION p6 放回hhd上

Region 的划分 还和 raft 有关系,参考下图:

如果对核心的特性有更多的兴趣,可以自行翻阅资料和代码

该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。