CockroachDB开发学习文档03 KV编码

本文详细介绍了CockroachDB(CRDB)不同版本中的键值对存储结构,包括早期简单的键值分离方式到引入列簇后的高效存储方案,以及如何通过主键索引和非主键索引来组织数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在上一篇文档中,export导出有一些问题

为了深入理解KV的存储结构,我们参考文档:

https://github.com/cockroachdb/cockroach/blob/master/docs/tech-notes/encoding.md

CRDB中的数据结构编码方式

像其他的键值数据库数据库一样,CRDB将数据以“键-值对”的这种形式存储,这种存储方式在不断地发展,能够保证向前向后兼容。

CRDB的键值存储有三个版本,

第一个版本在https://www.cockroachlabs.com/blog/sql-in-cockroachdb-mapping-table-data-to-key-value-storage/

第二个版本在https://www.cockroachlabs.com/blog/sql-cockroachdb-column-families/

下面创建一张表,并插入一条数据,简单看看3个版本是如何存储数据的。

CREATE TABLE test (
      key       INT PRIMARY KEY,
      floatVal  FLOAT,
      stringVal STRING
)
INSERT INTO test VALUES (10, 4.5, "hello”)
 
  • 第1个版本的存储格式如下:

    KeyValue
    /test/10/floatVal4.5
    /test/10/stringVal"hello”

    这种方式很简单,key的存储方式为:/表名/主键值/列名,value直接记录这个值。

    事实上,还存在一张元数据的表:

    test Table ID1000
    key Column ID1
    floatVal Column ID2
    stringVal Column ID3

    那么将上面各位置的信息替换成元数据表中的值,键值对的存储形式如下:

    KeyValue
    /1000/10/24.5
    /1000/10/3"hello”

    是不是更简单了。

  • 第2个版本的存储方式如下:
    首先,版本2引入了一个重要的概念,列簇(column family),加入列簇后,KV的插入、更新、删除操作相比于版本1平均快了5倍。
    版本1的编码格式有以下几个问题:
    (1)key的主键前缀重复,如有100个字段,“/表名/主键值/”重复了100次,并且value中前4个字节是循环冗余校验码,当数据量大的时候,非常浪费磁盘空间和网络带宽。

    (2)最严重的问题是在提交事务时,每个key都要以“write intent”的方式与其关联,以便进行后续的解析。

    自然而然,很多的NOSQL数据库设计就会不约而同地提出一种解决方案:列簇(column family),将多个相似字段汇聚成一个值。

    现在的存储格式如下所示:

    KeyValue
    /<tableid>/0/11/0
    <crc>/1/string/"Hal"/1/string/"hal@cockroachlabs.com"
    /<tableid>/0/13/0
    <crc>/1/string/"Orin"/1/string/"orin@cockroachlabs.com"

     

    key:/tableid/index/pk val/cf0/
    value:/crc/col id0/value/.../col idn/value/

     

  • 第3个版本的存储方式如下:

    版本3还是利用了列簇的特性,因此,一行数据的存储会以一个或多个的键值对(KV-pairs)的形式存在,主键值会存放在key中,而数据项会存放在value中。
    这里还分为主键索引(primary indexes)和非主键索引(secondary indexes)。

    主键索引的key格式为:/Table/<id>/<index>/<pk val>/<family>

    主键索引的value格式为:<crc><type>/TUPLE/colIDDiff:colID:type/val/.../colIDDiff:colID:type

    对于这样一张表

    CREATE TABLE test (
    	id INT,
    	name STRING PRIMARY KEY,
    	age INT,
    	school STRING,
    	INDEX idx (age ASC)
    )

     

    idnameageschool
    123lml25scut

    实际存储结构如下

    key: /Table/52/1/"lml"/0  value:/TUPLE/1:1:Int/123/2:3:Int/26/1:4:Bytes/scut

    现在,执行

    ./cockroach debug rocksdb scan --db=cockroach-data --value_hex | grep "lml"

    看看数据

    /Table/52/1/"lml"/0/1531803756.900601973,0 : 0xE5ACBDEE0A13F6012334160473637574
    /Table/52/2/26/"lml"/0/1531803756.900601973,0 : 0xF4D2D1CB03

    有两行数据,这是因为为创建了INDEX idx(age),即非主键索引。
    非主键索引的存储格式:

    非主键索引的key格式为:/Table/<id>/<index>/<Data from where the row intersects the indexed columns>/0

    非主键索引的value格式为:说实话,我也没看懂- -。但绝大多数都是空值。

    温馨提示:

    通过tableDesc.PrimaryIndexSpan()可以过滤出主键索引的Span。

     

     

    从版本3的存储方式来看,上篇文档我们留下的第一个问题:

  • 若设置主键则会导致value值中没有主键字段的数据,并且不能确定字段的顺序
    因为主键索引是在key中的(比如key=/Table/60/1/"tom"/88/0,这里"tom"/88就是双主键)。
    那么为了解决这个问题,我们可以简单地将key中的多主键字段取出来,然后用分隔符‘/’进行切分,得到主键字段数据,然后拼接value的数据。

    但是,这种做法是很蠢的,有没有什么更好的办法?

    可以回过头来看看SELECT * FROM TABLE;的处理逻辑。

CockroachDB (蟑螂数据库)是一个可伸缩的、支持地理位置处理、支持事务处理的数据存储系统,和谷歌的F1系统类似,支持分布式事务等特性。。CockroachDB 提供两种不同的的事务特性,包括快照隔离(snapshot isolation,简称SI)和顺序的快照隔离(SSI)语义,后者是默认的隔离级别。        为了保证在线的百万兆字节流量业务的质量,Google开发了Spanner系统,这是一个可扩展的,稳定的,支持事务的系统。许多参与开发CockroachDB的团队现在都服务于开源社区。就像真正的蟑螂(cockroach)一样,CockroachDB可以在没有数据头、任意节点失效的情况下正常运行。这个开源项目有很多富有经验的贡献者,创始人们通过社交媒体、Github、网络、会议和聚会结识他们并鼓励他们参与其中    蟑螂是一个分布式的K/V数据仓库,支持ACID事务,多版本值存储是其首要特性。主要的设计目标是全球一致性和可靠性,从蟑螂的命名上是就能看出这点。蟑螂数据库能处理磁盘、物理机器、机架甚至数据中心失效情况下最小延迟的服务中断;整个失效过程无需人工干预。蟑螂的节点是均衡的,其设计目标是同质部署(只有一个二进制包)且最小配置。    蟑螂数据库实现了单一的、巨大的有序映射,键和值都是字节串形式(不是unicode),支持线性扩展,理论上支持4EB的逻辑数据)。映射有一个或者多个Range组成,每一个Range对应一个把数据存储在RocksDB(LevelDB的一个变种,Facebook贡献)上的K/V数据库,并且复制到三个或者更多蟑螂服务器上,Range定义为有开始和结束键值的区间。Range可以合并及分裂来维持总大小在一个全局配置的最大最小范围之间。Range的大小默认是64M,目的是便于快速分裂和合并,在一个热点键值区间快速分配负载。Range的复制确定为分离的数据中心来达到可靠性(比如如下分组:{ US-East, US-West, Japan }, { Ireland, US-East, US-West}, { Ireland, US-East, US-West, Japan, Australia })    Range有一种变化,通过分布式一致性算法实例来调节确保一致性,蟑螂所选择使用Raft一致性算法。所有的一致性状态存在于RocksDB中。项目官网地址:http://www.cockroachdb.cn/ 标签:蟑螂数据库  国人开源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值