雷兽的数据库CAP乱谈之(一)阐述

雷兽的数据库CAP乱谈之(一)阐述

今天有人问我cap,找了https://my.oschina.net/lilw/blog/169776这片文字,

下面是cap那篇文字的解释:

所谓CAP理论,即:

Cosistency       数据的一致性

Availability      高可用性

Tolerance to newowrk Partitions    分区容忍性

 

一个数据存储系统不可能同时满足上述三个特性,只能同时满足其两个特性,也就是: CA,CP,AP。可以这么说,当前所有的数据存储解决方案,都可以归类的上述三种类型。

CA  满足数据的一致性和高可用性,但没有可扩展性,如传统的关系型数据,基本上满足是这个解决方案,如ORACLE , MYSQL 的单节点,满足数据的一致性和高可用性。

CP  满足数据的一致性和分区性,如Oracle RAC ,Sybase 集群。虽然Oracle RAC具备一点的扩展性,但当节点达到一定数目时,性能(也即可用性)就会下降很快,并且节点之间的网络开销很在在,需要实时同步各节点之间的数据。

AP 在性能和可扩展性方面表现不错,但在数据一致性方面会用牺牲,各节点的之间数据同步没有哪么快,但能保存数据的最终一致性。当前热炒的NOSQL大多类是典型的AP类型数据库。

以上是原文内容;

我却觉这解释有点不完全敢苟同,按照这篇文字第一条ca组合下的描述,这个高可用性我认为应该是鲁棒性,

我跟这个所谓数据库的鲁棒性,就是比如在同一个实例同一个库的数据库,不管你是单表还是多表join,想怎么读怎么写都不是问题,我认为说这是可用性,很是牵强,因为

 cap百度百科的解释如下:

分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:
● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
● 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
● 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
在那篇文字里提到ca只有单节点如何,很明显单节点根本不可能保证故障后还可读写,所以可用性是分布式的可用性,不是各种都支持的可用性,也就是我说的鲁棒性;很多人不知道在数据分片以后哪些能做哪些不能做,这就是分布式下相对于单实例数据库有诸多鲁棒性的限制;
下面阐述我个人理解的正文:
cap  是数据分散存储 不在同一个实例里的时候的 产生的问题
我这里说的cap既可能是sql下所谓的 可以叫 伪分布式集群的cap,当然还包括nosql集群的cap,
让后其实还讲到了在大的分布式意义下 某个小规模下的非分布式  也就是分片节点本身  数据100%冗余 全库冗余的情况下  也就是只有一个分片;

首先 在上面说的这种整个集群单一分片的情况下  分多种情况  比如包括  主从 主备  多主
主从就是线上备份   从默认不能写  但是主挂了不自动切换  原始的各种数据库同步技术就是这种了  你是否利用从库来做读的加速 是你自己处理
主备 是主从加上了自动切换  
多主 差不多相当于是把主备的方式反过来  同时也让备同步到主 双向考虑
这里还有个问题就是 同步复制还是异步复制

异步复制以及同步复制发送延迟过大造成了本质上的异步的瞬间问题点的时候
简单的可以认为是分布式数据存储时候的最简单最基本的静态状态下,这是我自己的话,也就是指整个数据库集群 就只有一个分片  每个节点100%数据冗余的情况,暂且把这种情况叫做静态的分布式数据库集群模式

在这种静态中的cap (以下字母我就不分了 反正 内容就是那三个:数据一致性,高可用,分区容忍性)

数据一致性 应该是同内容的镜像分片之间的数据一致与否的问题 就是异步复制 和 同步复制延时过大   这个问题在很多事务级同步的sql方案里不存在了  但是并非100%不会出现

高可用  这个分布式里的数据还是容器都一样  跟上面那个一样同一份数据或者同一个功能节点是否有冗余 是否高可用自动切换  这里为了鲁棒性  其实应该默认和数据一致性同在  只有主备节点数据实时同步  并不会有数据一致性问题   才真正有高可用的意义,其实目前很多高可用方案 其实并非如此  具体技术  就要自己去了解
分区容忍性 这个在静态角度看好像并不存在
鲁棒性  在这种静态情况下  能够做到最接近单一节点的鲁棒性

然后动态来看  就是数据不在一个物理分片上了  就是认为  基本做不了高性能的join的这种情况 或者说 模式

数据一致性  因为不光是全数据镜像   还有同一个事务上下文在不同实例时候 因为普通事务无法维系   而产生的问题通常 这个分布式数据系统都做不到 或者不能良好做到 比如mysql的 xa协议分布式事务  sqlserver的 基于dtc 分布式事务  这些性能 有限 随扩展后 性能下降更加明显  而在nosql里 基本就压根不支持跨节点事务  因为支持了这个   节点扩展 问题就非常严重了  也就是数据一致性降低了可分片的空间和意义
高可用 某个节点的可用性  还是要在一致性  也就是同步复制还是异步复制中寻找平衡   可以想象 你怎么在保证redis每秒20w tps (redis单线程set 有set就当是tps吧)   然后再保证有一个从节点能100%的同步复制   不掉数据?理论上可行  但是很多现实情况下  做不到

分区容忍性  其实是分布式的基础吧  这里我要说的是 oltp olap 问题   分区容忍性其实几乎100%的跟olap不合  至少挺难的  oltp简单一些 归结一点就是  单数据实例上各种操作的鲁棒性 在分区情况下 接近完全丧失
鲁棒性 在这种模式的情况下 鲁棒性就大大降低了  不能跨节点join  甚至做个排序分页 都未必能简单高效的完成  但是可以应对设计良好的大吞吐 oltp 基本最高性能的只有单表查询 或者按key查询
所以  cap 还有鲁棒性r(Robust,注意这里的鲁棒性已经不是Robust的原意,而是方便无脑不会出问题的意思)的认识,加上对一种集群技术、方式方案组合都必须考虑清楚。
posted on 2016-11-19 23:37 雷兽 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/sfissw/p/6081867.html

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

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

相关文章

python kivy ios_Kivy跨平台技术开发iOS

#kivyKivy是一套专门用于跨平台快速应用开发的开源框架,使用Python和Cython编写,对于多点触控有着非常良好的支持,是一套专门用于跨平台快速应用开发的开源框架,使用Python和Cython编写,基于OpenGL ES 2只需一套代码&a…

让我们的标签语义化成为一种习惯好处多多

使用标签语义化的理由可以有无数条: 去掉样式或者样式丢失时页面结构依然清晰分明移动设备能够更加完美的展示你的网页(移动设备对css的支持较弱)阅读器会根据标签的语义自动解析,呈现更容易阅读的内容形式(无障碍阅读…

ABP vNext微服务架构详细教程——简介

简介该系列文章主要展示ABP vNext框架在微服务架构下的用法,提供一套可落地的技术实现思路,并演示各服务在Kubernetes下的部署方案。基础概念ABP vNext基于ASP.NET Core的应用框架,是.Net主流应用开发框架之一。提供基于模块化的灵活项目模板…

linux c之用fopen、fputs、fgets、 fseek来对文件进行写、替换、读

1、函数说明 1、fgets #includechar *fgets(char *s, int size, FILE *stream); 功能:从文件流读取一行,送到缓冲区,使用时注意以下几点: 返回值:成功时s指向哪返回的指针就指向哪,出错或者读到文件末尾时返回NULL 2、fputs #includeint fputs(const char *s, F…

Scala:First Steps in Scala

var and val 简单来说,val声明的变量可以重新修改其引用,val则不行,见下面的例子: 1 def max(x: Int, y: Int): Int {2 if(x > y) x else y 3 }4 5 def max(x: Int, y: Int): Int if(x > y) x else y 6 7 var list Ar…

CIDR

CIDR(无类别域间路由,Classless Inter-Domain Routing)是一个在Internet上创建附加地址的方法,这些地址提供给服务提供商(ISP),再由ISP分配给客户。CIDR将路由集中起来,使一个IP地址…

电脑怎么测试硬盘的读写速度_两块硬盘合二为一,电脑读写翻倍?这样的“好事”你必须得了解...

近日,技嘉在旗下顶级的B550 AORUS MASTER主板上做了一次PCIe4.0固态阵列测试,由于该款主板支持3个PCIe4.0的M.2固态硬盘,所以这次的测试为3块PCIe4.0固态组建RAID0,来进行读写测试。常见的PCIe3.0x4的固态硬盘的读写速度一般在250…

C# 动态创建控件时注册Name属性

动态创建控件1. 容器控件 .RegisterName("Name",要注册的控件) //注册控件2. 容器控件 .FindName("Name") as 控件类型 //找到控件并转换成相应类型注意仅通过控件.Name来设置是不能通过FindName来找到控件的,必须注册动态删除控件1. 容器控件…

3-07. 求前缀表达式的值(25) (ZJU_PAT数学)

题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,比如23*(7-4)8/4的前缀表达式是: 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果…

linux之文件类型

1 、纯文本文件 这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容为我们可以直接读到的数据,例如数字、字母等等。设 置文件几乎都属于这种文件类型。举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容 2、二进制文件 我们在GNU发展史中提过,…

java配置运行环境和配置

2019独角兽企业重金招聘Python工程师标准>>> 1:准备好下载的java。开始安装 2:第一次蹦出安装路径设置为(D:\java\jdk)。不要设置下图样式设置路径! 3:jdk安装完成后会再弹出如下窗口,让你选择独立的jre的安…

SQL Server 的锁定和阻塞

本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量。 所谓的「阻塞」,是指当一个数据库会话中的事务,正在锁定其他会话…

结构体数组排列_学习RTOS(3)数据结构

在 FreeRTOS 中存在着大量的基础数据结构列表和列表项的操作,列表和列表项是直接从 FreeRTOS 源码注释中的 list 和 list item 翻译过来的,其实就是对应我们 C 语言当中的链表和节点,在后续的讲解,我们说的链表就是列表&#xff0…

python实现元旦多种炫酷高级倒计时_附源码【第20篇—python过元旦】

文章目录 🌍python实现元旦倒计时 — 初级(控制台)⛅实现效果🌋实现源码🌜源码讲解 🌍python实现元旦倒计时 — 中级(精美动态图)⛅实现效果🌋实现源码🌜源码讲解 🌍python实现元旦倒计时 — 高…

.NET6之MiniAPI(十一):本地化

.net开发体系里,大部分本地化的实现都是用资源文件实现(.resx),asp.net core中的多语Culture是指区域性的对象,而UICulture 该对象表示资源管理器在运行时查找区域性特定资源时所用的当前用户接口区域性。asp.net core实现也是通过添注入本地…

C#基础整理

元旦整理书架发现一本小册子——《C#精髓》中国出版社2001年出版的,粗略翻了下关于C#的知识点挺全的虽然内容谈得很浅也有很多过时的内容(话说这本书是我在旧书店花5块钱淘的)我保留原有章节并删减部分过时和不重要内容添加一些自己觉得重要的…

linux c之fdopen(int fd, const char *type)使用总结

1、fdopen(int fd, const char *type)的介绍 比如一写特殊文件不能用io打开,我们先要用open函数得到文件描述符,也就是这个fdopen函数的第一个参数,第二个参数是常量,不同类型不同意义,如下图 2、代码演示 #include<stdio.h> #include<fcntl.h>int main…