看文档里面有说在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配置参数里面没找到对应的说明,大佬对此有了解么
关于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) 这样一个左闭右开区间来描述。
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上
该主题在最后一个回复创建后60天后自动关闭。不再允许新的回复。