分布式数据库会面临着一个独特的挑战,就是数据必须要严格的按照读,写顺序执行。如创建用户,转账,两个潜在的写操作竞态条件必须要确保一个写操作必须在另外一个之前发生。在Cassandra中,使用Paxos协议来实现轻量级的事务来处理并发操作。

Paxos协议是用来实现线性一致性,这是实时约束的顺序一致性。线性一致性保证事务的隔离性类似于RDBMS提供的串行level的隔离性。这种类型的事务就是众所周知的compare and set(CAS);副本数据被拿来进行比较,发现有任何数据过期了,就设置为最新的数据。在Cassandra中,这个过程融合了Paxos协议和正常的读写操作来实现compare and set操作。

Paxos 协议实现包含一系列阶段

  1. 准备/承诺阶段
  2. 读取/结果阶段
  3. 提议/接受阶段
  4. 提交/应答阶段

这些阶段的动作发生在一个提议者和多个接收者。任何节点都可以成为一个提议者,在同一时间内,多个提议者可以同时发生。为了简单起见,下面的描述只使用一个提议者。Proposer准备阶段,发送一个包含proposal序号的信息给quorum个接受者。每个接受者承诺接受proposal,如果proposal序号是它们接收到最大的那个。一旦proposer接收到了quorum个acceptors的承诺。从每个acceptor中读取到的值会返回给proposer。proposer会计算出值,然后将值和proposal序号一起发送给quorum个acceptors。每个acceptor接受到了一个特定序号的proposal,就会承诺不再接受小数值的proposal。如果所有的条件都满足了,这个值会被提交和作为cassandra写操作的应答。

这四个阶段需要在提议轻量级事务的节点和涉及到事务的如何集群事务节点之间经过4轮请求应答。性能会受到影响,因此,为并发场景保留轻量级事务需要仔细考虑。

轻量级事务会阻塞其他轻量级事务的发生,但是不同阻止正常的读写操作发生。轻量级事务使用时间戳机制与正常的操作进行区分,将轻量级事务与正常的操作混合在一起,可能会产生错误。如果轻量级事务被用来写入分区内的某行,只能用于读和写。对于所有的操作都必须要小心,不过是单个或者是批量。例如,下面这样的操作场景就会失败:

DELETE ...
INSERT .... IF NOT EXISTS
SELECT ....

下面的一系列操作会工作

DELETE ... IF EXISTS
INSERT .... IF NOT EXISTS
SELECT .....

注:

Cassandra实现轻量级事务就是通过IF关键词

线性一致性读

线性一致性允许读取(可能没有commited)当前状态的数据,而不用propose一个新的条件或者更新,如果线性度发现一个未commit的事务,Cassandra会执行read repair作为commit的一部分。

Cassandra如何利用线性一致性来实现轻量级的事务的更多相关文章

  1. 线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12

    上一篇聊了聊构建分布式系统所面临的困难,这篇将着重讨论构建容错分布式系统的算法与协议.构建容错系统的最佳方法是使用通用抽象,允许应用程序忽略分布式系统中的一些问题.本篇我们先聊一聊线性一致性,以及与线 ...

  2. 6. SOFAJRaft源码分析— 透过RheaKV看线性一致性读

    开篇 其实这篇文章我本来想在讲完选举的时候就开始讲线性一致性读的,但是感觉直接讲没头没尾的看起来比比较困难,所以就有了RheaKV的系列,这是RheaKV,终于可以讲一下SOFAJRaft的线性一致性 ...

  3. etcd学习(7)-etcd中的线性一致性实现

    线性一致性 CAP 什么是CAP CAP的权衡 AP wihtout C CA without P CP without A 线性一致性 etcd中如何实现线性一致性 线性一致性写 线性一致性读 1. ...

  4. 【转载】利用jetty+Eclipse实现超轻量级web开发

    之前一直使用maven的jetty插件.今天换种方式. 使用下面介绍的方式你只有一个java project就行. 开发环境更简单,debug也更方便,不需要remote debug的方式,jetty ...

  5. 利用泛型抽取Dao层,加事务注解问题(java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType)

    想利用泛型抽取BaseDao层,简化操作时出现故障: @Transactional这个注解是能够继承的.于是就想写在抽取的BaseDao层上,让实现的类能够不用写@Transactional,就可开启 ...

  6. C#轻量级企业事务 - TransactionScope

    using System; using System.Data.SqlClient; using System.Transactions; namespace SomeDBTransaction { ...

  7. 最终一致性2PC复杂场景,事务报数据库操作超时。

    稀里糊涂的,忘了开启SqlServer的is read committed snapshot on

  8. 利用flashback transaction query新特性进行事务撤销

    具备了flashback version query查询的基础,我们就可以进行基于flashback version query的恢复.这就是flashback transaction query.f ...

  9. Cassandra 简介

    Cassandra是云原生和微服务化场景中最好的NoSQL数据库.我信了~ 1. Cassandra是什么 高可用性和可扩展的分布式数据库 Apache Cassandra™是一个开源分布式数据,可提 ...

随机推荐

  1. supermap中预览osgb格式的倾斜摄影文件

    参考: https://zhidao.baidu.com/question/136723493545478005.html 使用的是SuperMap IDesktop 9D,操作方法如下: 打开超图, ...

  2. ES6---箭头函数()=>{} 与function的区别(转载)

    1.箭头函数与function定义函数的写法: //function function fn(a, b){ return a + b; } //arrow function var foo = (a, ...

  3. python函数默认参数陷阱

    对于学习python的人都有这样的困惑 def foo(a=[]): a.append(5) return a Python新手希望这个函数总是返回一个只包含一个元素的列表:[5].结果却非常不同,而 ...

  4. 判断 Python 版本

    if sys.version_info.major == 2: try: message = unicode(message, "utf-8") except UnicodeDec ...

  5. 微信小程序1

    本次项目主要了解及使用微信小程序,以及更好的理解微信动画,wxss,JavaScript,ajax,xml等技术: 借助的平台是java后端设计语言以及微信小程序界面,设计 该系统分为1,个人用户端: ...

  6. js基础知识易错点(一)

    最近替另一个项目招人,要求基础知识好,随便问了一些基础题,发现了一些易错的点,总结一下. 1.判断一个空数组 var arr = []; 1)JSON.stringify(arr) == " ...

  7. 执行JS

    JS执行切换frame框架后点击 Window.frame['frame路径'].frame['下级frame路径'].document.getElementById("id"). ...

  8. PBRT笔记(11)——光源

    自发光灯光 至今为止,人们发明了很多光源,现在被广泛使用的有: 白炽灯的钨丝很小.电流通过灯丝时,使得灯丝升温,从而使灯丝发出电磁波,其波长的分布取决于灯丝的温度.但大部分能量都被转化为热能而不是光能 ...

  9. Vue(二十八)el-cascader 动态加载 - 省市区组件

    1.后台接口为点击加载下一级 ,传省市区id <template> <el-cascader v-model="selectedOptions" placehol ...

  10. python d:\test.py File "<stdin>", line 1 python d:\test.py ^ SyntaxError: invalid syntax

    pyhton出错: python d:\test.py File "<stdin>", line 1 python d:\test.py ^SyntaxError: i ...