NewSQL如何解决高可用、分片?

news2024/9/24 11:30:54

1 什么是New SQL?

无论你其他方面做的比Old SQL好再多,SQL和ACID是刚需,这个命你革不掉的。你不支持SQL,就不会有多少人用。所以近几年很多之前不支持SQL的数据库,都开始支持SQL了,甚至于像Spark、Flink这样的流计算平台,也都开始支持SQL。当然,虽然说支持SQL,但这里面各个产品的支持程度是参差不齐的,多多少少都有一些缩水。对于ACID的支持,基本上等同于就没有。

New SQL它来了!简单地说,New SQL兼顾Old SQL和No SQL优点:

  • 完整地支持SQL和ACID,提供和Old SQL隔离级别相当的事务能力;
  • 高性能、高可靠、高可用,支持水平扩容。

像Google的Cloud Spanner、国产的OceanBase以及开源的CockroachDB都属于New SQL数据库。

这些New SQL凭什么就能做到Old SQL和No SQL做不到的这些特性呢?

CockroachDB数据分片和弹性扩容

架构图(图片来自于官方文档):

img

最上层是SQL层,SQL层支持和关系型数据库类似的逻辑数据结构,如库、表、行和列这些逻辑概念。

SQL层向下调用的是一个抽象的接口层Structured Data API,实际实现这个API的是下面一层:Distributed, Monolithic KV Store,这就是一个分布式KV存储系统。

大部分数据库都采用的二层架构:执行器和存储引擎。它的SQL层就是执行器,下面的分布式KV存储集群就是它的存储引擎。

MySQL存储引擎InnoDB是基于文件系统的B+树,像Hive和HBase存储引擎都是基于HDFS构建。那CockroachDB这种,使用分布式KV存储来作为存储引擎的设计,理论上也是可行。

CockroachDB在实现它的存储引擎这一层,就是大量地借鉴,甚至是直接使用了已有的一些成熟技术。

分片算法采用的是范围分片,范围分片对查询最友好,可很好支持范围扫描,有利支撑上层SQL查询。

采用Raft一致性协议来实现每个分片的高可靠、高可用和强一致。这个Raft协议,它的一个理论基础,就是我们之前讲的复制状态机,并且在复制状态机的基础上,Raft实现了集群自我监控和自我选举来解决高可用的问题。

CockroachDB的元数据直接分布在所有的存储节点上,依靠流言协议传播,Redis Cluster也是用流言协议来传播元数据变化。

CockroachDB用上面这些成熟的技术解决了集群问题,在单机的存储引擎上,更是直接使用了RocksDB作为KV存储引擎。

你可以看到,CockroachDB的存储引擎,也就是它的分布式KV存储集群,基本上没有什么大的创新,就是重用了已有的一些成熟的技术,这些技术在我们之前讲过的其他存储系统中,全部都见到过。我讲这些并没有贬低CockroachDB的意思,相反,站在巨人的肩膀上,才能看得更远,飞得更高,这是一种非常务实的做法。

CockroachDB能提供金融级事务隔离性?

CockroachDB怎么解析和执行SQL。CockroachDB执行流程差不多。先解析SQL生成语法树,转换成逻辑执行计划,再转换为物理执行计划,优化后,执行物理执行计划返回查询结果。

只是CockroachDB中,物理执行计划更复杂,因为物理执行计划面对的是分布式KV存储系统,在涉及查找、聚合这类操作,可能涉及多个分片(Range)。类似Map-Reduce的逻辑,先查找元数据确定可能涉及到的分片,然后把物理执行计划转换成每个分片上的物理执行计划,在每个分片上去并行执行,最后,再对这些执行结果做汇总。

CockroachDB的ACID。RU、RC、RR和SERIALIZABLE,那CockroachDB能提供哪种隔离级别呢?四种都不是。

CockroachDB提供了另外两种隔离级别,分别是:Snapshot Isolation (SI)Serializable Snapshot Isolatin (SSI),其中SSI是CockroachDB默认的隔离级别。

这两种隔离级别和之前提到的四种隔离级别的关系:

img

SI这行。RR解决脏读和不可重复读,虽然可能幻读,但实际上对绝大多数事务影响不大。SI不会脏读、不可重复读,也不会发生幻读,似乎比RR好。

但这表格多列:写倾斜。RR不会写倾斜,但SI有写倾斜问题。

写倾斜

拿账户余额的例子来说明。比如说,我们的账户需要支持主副卡,主卡和副卡都分别有自己的余额,并且这个余额是可以透支的,只要满足主副卡的余额之和大于0就行了。如果我们需要给主卡支出100元:

update account
-- 在主卡中扣100
set balance = balance - 100 
where id = ? and
  (select balance from account where id = ?) -- 主卡余额
  +
  (select balance from account where id = ?) -- 附卡余额
  >= 100; -- 主副卡余额和须大于100

RR由于更新数据时会对记录加锁,即使更新主副卡的两个SQL分别在两个事务并发执行,也不会出现把主副卡的余额之和扣减成负数。

但SI没有加锁,而是采用快照实现事务隔离,若并发更新主副卡余额,可能把主副卡余额之和扣减为负,即写倾斜。实际表达的,就是因为没有检测读写冲突,也没有加锁,导致数据写错。

SSI在SI的基础,加入冲突检测,通过检测读写冲突,然后回滚事务解决写倾斜,代价降低性能,且冲突严重时,会频繁出现事务回滚。

理论上,CockroachDB支持的SI和SSI这两种事务隔离级别能提供的事务隔离性与传统RC和RR不相上下,可满足大多数在线交易类系统对ACID要求。

总结

CockroachDB是开源的New SQL数据库。它的存储引擎是一个分布式KV存储集群,执行器则大量借鉴了PostgreSQL的一些设计和实现,是一个集很多现有数据库和分布式存储系统技术于一身,这样的一个数据库产品。

从设计上来看,CockroachDB这类New SQL数据库,有非常大的潜质可以真正地取代MySQL这类传统的关系型数据库。但是我们也应该看到,目前这些New SQL数据库都还处于高速发展阶段,并没有被大规模地应用到生产系统中去。我也不建议你做小白鼠,在重要的系统上去使用它。

做一个日志系统,收集全公司所有系统的全量程序日志,给开发和运维人员提供日志的查询和分析服务,你会选择用什么存储系统来存储这些日志?原因是什么?

要根据业务对数据的查询方式,反推数据应该使用什么存储系统。对于日志的查询,最常用的二种方式就是按照关键字去查询或者指定一个时间和IP去浏览。

若日志量级不超过TB级,直接放到ES最省事,对于二种查询方式都可以获得还不错的查询性能。规模太大,ES也扛不住,可考虑把日志放到HDFS,对于浏览的查询需求,直接定位的具体的日志文件返回是比较快的。对于关键字查询的需求,也可以通过实现Map-Reduce任务,并行查询然后聚合的方式来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自然语言处理 第十章 信息抽取 复习

信息抽取信息抽取复习重点:信息抽取概述从任务内容分为:从处理文档类型分为:从发展时间和处理文档分为:实体识别与抽取限定域命名实体识别基于规则或字典的方法 :规则模版(字典)匹配统计学习方法…

23.1、Java中的类加载器反射模块化

1.类加载器 1.1类加载 类加载的描述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤&#…

spring boot 七:SpringBoot自定义配置Jackson的ObjectMapper

spring boot 七:SpringBoot2.5.4自定义配置Jackson的ObjectMapper 1 前言 SpringBoot底层默认使用的自动依赖注入,即spring-boot-autoconfigure包的META-INF下,存在spring.factories文件,里面有自动注入的jackson自动配置类。在…

[数据结构基础]栈和队列的结构及接口函数

一. 栈 1.1 栈的概念及结构 栈是一种特殊的线性表,其只允许在固定的一段进行插入和删除元素的操作。进行数据插入和删除的一端成为栈顶,另一端称为栈底。栈结构中的数据遵循先进后出原则(LIFO:Last in First Out)&am…

03 Hive概述

Hive概述1、什么是Hive2、Hive优缺点3、Hive架构原理4、Hive 和 数据库比较5、Hive计算引擎1、什么是Hive 由Facebook开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供 类SQ…

如何在外籍人员子女学校和同事有效工作

香港 (Xinwengao.com) — PD Academia 的 Henry Wong 在新加坡出生长大,在美国接受高等教育,现在在美国半退休。他在中国生活了16年。他与许多西方人和中国人一起工作。他始终将自己视为东方与西方的交汇点,是学术界与行政部门之间的桥梁。他…

刷油漆【中等】

在一个8 \times 8 的网格中,一些水平的行被涂成红色,一些垂直的列被涂成蓝色,条纹是按顺序画的,一个接着一个。绘制条纹时它会重新绘制它所经过的所有单元格。(原理跟刷油漆一样)现在你需要确定最后一个上色的是什么颜色红色条纹是…

静态路由配置

获取未知网段的路由信息: 静态路由:由网络管理员手工配置的路由条目 动态路由:所有路由器上开启同一种路由协议,之后,通过路由器之间沟通,协商,最终计算生成路由条目。 静态路由的优点&#xf…

MySQL2-初识MySQL

目录 1.数据库 1.1.什么是数据库? 1.2.为什么要用数据库? 1.2.1.数据存储的发展史 1.2.2.文件存储的缺点 1.3.数据库分类 1.3.1.关系型数据库(RDBMS) 1.3.2.非关系型数据库(了解) 1.3.3.关系型数据库和非关系…

STM32——TIM简介与TIM中断

文章目录一、TIM简介二、定时器类型基本定时器通用定时器高级定时器三、定时中断基本结构四、时序图预分频器时序计数器时序计数器无预装时序计数器有预装时序RCC时钟树五、定时器定时中断六、定时器外部时钟七、定时器库函数(tim.h)一、TIM简介 TIM&am…

【设计模式篇】设计模式3类23种

创建型模式 创建型模式提供了创建对象的机制, 能够提升已有代码的灵活性和可复用性。 这里面比较重要和经常用到时单例模式、工厂模式和原型模式。 单例模式 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问…

antd 动态增减表单项的使用

需求 首先这是基于antd的Form组件&#xff0c;需求1&#xff1a; 单选按钮组 选择设置时间 展示时间选择器需求2&#xff1a; 动态添加时间选择器(最多添加10个、时间为空校验、时间段重叠校验)需求3&#xff1a; 开关需求4&#xff1a;编辑时赋值 1. 单选钮组 <Radio.Gro…

4.6.1、路由选择协议概述

1、静态/动态路由 2、主要特点 因特网所采用的路由选择协议的主要特点 例如&#xff1a;一个较大的因特网提供商就可划分为一个自治系统 在自治系统内部和外部采用不同类别的路由选择协议&#xff0c;分别进行路由选择 3、分层次的路由选择协议 如下所示&#xff0c;将网络…

ArcGIS基础实验操作100例--实验44融合细碎多边形

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验44 融合细碎多边形 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

k8s基础

一、基本介绍 Kubernetes&#xff0c;简称K8s&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效(powerful) , Kubernetes提供了应用部署…

Linux 下 python3.9.8的安装

1. 准备安装环境 yum install gcc zlib* openssl* -y 2. linux 下 python 安装包的获取 官网下载地址: https://www.python.org/downloads/ 找到 自己想要的版本。 方式一&#xff1a;直接点击该链接下载&#xff0c;然后将安装包通过xftp 传送到远程服务器 的 /opt 路…

k8s之搭建单机集群

写在前面 本文一起看下如何在单机环境下搭建k8s集群。 基础环境准备参考这篇文章 。 1&#xff1a;k8s的前世今生 现在当我们提到容器技术时&#xff0c;首先想到的肯定是docker&#xff0c;但其实在docker之前&#xff0c;谷歌公司就已经有了类似的技术&#xff0c;我们知道…

借助免费AI艺术平台生成头像

随着 AI 的兴起&#xff0c;看到越来越多的实例通过 OpenAI 的举措变得轻松&#xff0c;使得 AI 艺术在今天早已不是什么新鲜事物&#xff0c;而且在游戏领域也开始有所应用。人工智能&#xff08;AI&#xff0c;artificial intelligence&#xff09;艺术&#xff0c;更准确地说…

数据挖掘与机器学习作业_09 贝叶斯

贝叶斯 贝叶斯公式 后验概率 先验概率 * 似然估计 from sklearn.model_selection import GridSearchCV from sklearn.naive_bayes import BernoulliNB from sklearn.naive_bayes import GaussianNB from sklearn.naive_bayes import MultinomialNB from sklearn.naive_bayes…

关于进程间的通信方式的总结

一、背景 在人类思想史上,马克思第一次对人的本质作出科学界定:人的本质是一切社会关系的总和。时间万物都存在或多或少的关系。那么人除了天生父子这样的家族关系&#xff0c;还有后天 通过 语言 &#xff0c;这样区别于其他动物的方式来进行和其他人的交流产生关系。 在计算…