本文源自:http://www.cockroachchina.cn/?p=685

这篇文档介绍和说明了cockroachdb的架构,简单明了。

作为Spanner的开源实现,CockroachDB具有支持标准SQL接口,线性扩展,强一致,高可用等重要特性。总体架构如下图所示:

CockroachDB架构图

  总览   

Node代表一个CockroachDB进程实例,一般情况下一台物理机部署一个CockroachDB实例,一个CockroachDB实例可以配置多个Store, 单个Store与RocksDB实例一一对应,一般情况下一个Store对应一块物理磁盘。
CockroachDB按照范围进行数据切分,最小数据切分单元是Range。Range默认的配置大小是64M, 以3副本的方式分布在各个节点上,副本间通过Raft协议进行数据同步。

元数据管理 

CockroachDB通过两级路由的方式管理元数据,类似普通用户数据的管理方式,元数据也是基于Range进行管理。每条路由元数据约为256B,默认情况下,单个元数据Range可存储256K条路由信息(64MB/256B),那么,CockroachDB集群理论上最大容量为4EB(256K*256K*64MB)。

第一级元数据永远不会发生分裂而且第一级元数据的路由信息会通过Gossip协议同步到各个节点。由于第一级元数据发生变更的几率较小,所以各个节点大部分时间可直接根据本地的元数据信息将请求路由到指定节点处理。

  SQL层   

CockroachDB支持标准SQL, 当CockroachDB集群的某个节点收到SQL请求时,会经过SQL解析、SQL执行计划生成、SQL执行等重要步骤。

1. 协议层 

CockroachDB兼容PostgreSQL协议,对于报文的封装和解析完全按照PostgreSQL的方式进行,所以用户可以直接使用PostgreSQL的客户端访问CockroachDB。

2. SQL解析 

CockroachDB对于用户的SQL语句按照PostgreSQL的语法进行解析,解析完成后生成语法树(AST),调用示例类似 :

func (p *Parser) Parse(sql string)

(stmts StatementList, err error) {

p.scanner.init(sql)

if p.parserImpl.Parse(&p.scanner) != 0 {

return nil, errors.New(p.scanner.lastError)

}

return p.scanner.stmts, nil

}

3. SQL执行计划生成 

CockroachDB 会根据不同的语法树生成对应的执行计划。目前执行计划基本是基于规则的方式来生成的。对于OLAP的SQL Statement, CockroachDB会将逻辑计划转化为物理执行计划,即通过分布式任务的方式进行并行执行。

// makePlan implements the Planner interface.

func (p *planner) makePlan(

ctx context.Context,

stmt parser.Statement) (planNode, error) {

plan, err := p.newPlan(ctx, stmt, nil)

if err != nil {

return nil, err

}

if err :=

p.semaCtx.Placeholders.AssertAllAssigned();

err != nil {

return nil, err

}

needed := allColumns(plan)

plan, err = p.optimizePlan(ctx, plan, needed)

if err != nil {

return nil, err

}

if log.V(3) {

log.Infof(ctx, “statement %s compiled to:\n%s”,

stmt, planToString(ctx, plan))

}

return plan, nil

}

4. SQL执行当执行计划生成完毕后,CockroachDB会按照约定的方式开始执行,此时CockroachDB将调用事务性的KV接口。执行完成后通过协议层将执行结果返回给客户端。

  分布式KV层   

SQL到分布式KV映射 

在CockroachDB中,所有的Table必须包含一个主键(若建表时无显式声明主键,则系统默认创建)。每列数据构成一个Key-Value存储单元。Key就是每个存储单元值的地址,如/<TableID>/<IndexID>/<Primary Key>/<Column>。举个例子,我们创建一张水果价格表:

我们再往表格中插入两条数据:

此时,KV层存储的数据结构是:对于Key-Value存储单元,分布式KV存储层对外提供了操作原语接口,SQL层通过调用KV操作原语接口实现对KV对象的增删改查操作。

分布式事务 

对于CockroachDB集群,接收请求的节点会充当事务协调节点(Coordinator), 不同于传统的2PC,CockroachDB通过事务表来保证事务的原子性。CockroachDB在事务开始时,会在事务表中新增一条事务记录,初始状态为Pending,然后协调节点会将请求发送给参与节点进行处理,当所有的参与节点执行完毕后,协调节点会将该事务的状态置为Committed;若事务回滚,则把事务状态标记为Abort。这样做的优点是既消除了两阶段锁,同时大大降低了事务提交和回滚的开销。

多副本强一致 

多副本数据:Range默认3副本存储,副本数可设置成2N+1;若少于一半的副本丢失,CockroachDB集群会自动在其他可用节点上补齐丢失的副本数据。
故障容灾:根据不同的容灾等级,Range数据多副本可配置为跨机器、跨数据中心、跨地域存储。Range数据分布越分散,相应的读写延时也会越大,集群整体性能会有所下降。

Raft协议:对于CockroachDB而言,单个Range的多个副本通过Raft协议进行数据同步。Raft协议将所有的请求以Raft Log的形式串行化并由Leader同步给Follower,当绝大多数副本写Raft Log成功后,该Raft Log会标记为Committed状态,并Apply到状态机(即写RocksDB)。对于读请求,由于直接使用Raft协议开销比较大,为此CockroachDB引入了Leaseholder的概念。Leaseholder在有效期内可以保证该Range的Raft Group的Leader不会发生切换,从而保证从Leaseholder上即可读到最新的数据,一般情况下Leaseholder也同样是Raft Leader。

CockroachDB架构浅析相关推荐

  1. 百度交易中台之账房系统架构浅析

    导读:百度交易中台作为集团移动生态战略的基础设施,面向收银交易与清分结算场景,为赋能业务提供高效交易生态搭建.目前支持百度体系内多个产品线,主要包含:小程序,地图打车,百家号,招财猫,好看视频等.本文 ...

  2. Spark in action on Kubernetes - Playground搭建与架构浅析

    前言 Spark是非常流行的大数据处理引擎,数据科学家们使用Spark以及相关生态的大数据套件完成了大量又丰富场景的数据分析与挖掘.Spark目前已经逐渐成为了业界在数据处理领域的行业标准.但是Spa ...

  3. 云计算学习笔记005---Hadoop HDFS和MapReduce 架构浅析

    Java技术qq交流群:JavaDream:251572072 Hadoop HDFS和MapReduce 架构浅析 前言 Hadoop是一个基于Java的分布式密集数据处理和数据分析的软件框架.Ha ...

  4. Android应用内社区SDK技术架构浅析

    Android应用内社区SDK技术架构浅析 图1为雪球财经自选界面,图2是雪球财经App内的社区,也就是动态页面. 一.以友盟微社区为例 简单来说,友盟的微社区就是一款帮助开发者在应用中快速搭建一个社 ...

  5. 车载USB DVR(行车记录仪)的源码架构浅析(基于AndroiidM)

    基于AndroiidM的USB DVR的源码架构浅析,主要讲述大概流程,以便于分析问题. APP层 源码路径: AndroidM/vendor/mediatek/proprietary/package ...

  6. Android Clean 架构浅析

    该原创文章首发于微信公众号"字节流动" Android 常用的架构主要有 MVC,MVP,MVVM 以及 Clean .以上架构设计模式没有绝对的优劣之分,关键要看具体的应用场景. ...

  7. RISC-V生态架构浅析(认识RISC-V)

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 RISC-V 生态架构浅析 前言 RISC-V最近越来越多的出现在科技新闻中,大量的公司加入到RISC-V研究和生产中.在越来越多的 ...

  8. CockroachDB架构——CockroachDB中的读和写

    本文解释CockroachDB复制和分布特性如何影响读和写. 本文以总结某些重要的CockroachDB架构概念开始,接着,介绍几个简单的读写场景. --注意: 1)一个查询通过CockroachDB ...

  9. USB 驱动架构浅析

    USB 驱动架构浅析 之前一直概念模糊,最近简单总结了一下 1.USB简介 USB,即Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和 ...

最新文章

  1. 罗永浩“咬定”微信不放松
  2. 中科院微生物所郭惠珊团队创建抗土传真菌黄萎病的陆地棉种质
  3. Python教程:内置函数filter()和匿名函数lambda解析
  4. R语言与概率统计(四) 判别分析(分类)
  5. Java:处理 Exception 的几种实践,很优雅,值得推荐!
  6. 如何在Windows中快速轻松地将文件发送到SkyDrive
  7. 致家长:疫情期间教育好自己的孩子,就是你最重要的事业!
  8. php new static,PHP 的 new static 和 new self
  9. 联通3G用户破千万 建成全球规模最大WCDMA网络
  10. PTA C语言程序设计 单项链表
  11. TVM代码库结构概述
  12. 苹果商城怎么调成中文_海豚加速器拳头账号中文注册下载-海豚加速器拳头账号注册下载 v2020...
  13. bugly android sdk,Bugly SDK 集成使用
  14. 谁说bug解决不了?试试这个使用日志法
  15. 赛效:如何在线更改图片格式 图片格式在线转换方法介绍
  16. 大数据量(例如几十万或者几百万的量)怎么导入到excel中
  17. 4763: 雪辉[点分治+可持久化分块]
  18. MES系统对企业而言是必须的吗?
  19. js中两个等号“==“与三个等号“===“有何不同
  20. 集成支付宝支付出现{resultStatus=4000, result=, memo=系统繁忙,请稍后再试}

热门文章

  1. -已解决-word粘贴时快捷键实现只保留文本
  2. 单臂路由 + 网管交换机 详细设置
  3. 管理经济学之颗粒归仓(四)
  4. 全面解析Linux下的su指令
  5. java输出和opensl,OpenSL的使用
  6. 看雪论坛chrome浏览器无法登录
  7. java 获取当前时间的毫秒值
  8. C语言switch选择结构
  9. RedHat Linux 8中 Apache服务
  10. 如果论文写的不好,学校会因此不让毕业吗?