分布式数据库会面临着一个独特的挑战,就是数据必须要严格的按照读,写顺序执行。如创建用户,转账,两个潜在的写操作竞态条件必须要确保一个写操作必须在另外一个之前发生。在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. mysql 和 sqlserver sql差异比较

    mysql:select * from table_name limit 100,200;--取出从100到200的数据 获取时间:mysql:now() mysql tinyint(0,1) → b ...

  2. Delphi 10.3版本获取windows系统版本和CPU信息

    procedure TForm1.Button1Click(Sender: TObject); var mm:TRegistry; cpu:string; begin mm:=TRegistry.Cr ...

  3. 欧朋Opera 浏览器(打不开百度)提示“您的连接不是私密连接”,解决办法

    它网页报错SSL.提示“您的连接不是私密连接” 打开opera://net-internals/#hsts,操作如下图片,三步以后,ok 如果是其他外国浏览器,用这个办法也有效,可以把前面的 oper ...

  4. jetbrains 系列 webstorm、IntelliJ Idea 免费激活方法免激活码

    方法一: 到网站 http://idea.lanyus.com/ 获取注册码. 方法二:填入下面的license server: http://intellij.mandroid.cn/ http:/ ...

  5. python_str的应用

    name = "fsafalk" #nam是个变量名  fsafalk是变量  也是字符串 name.startswith('fs')#判断是否是fs开头 name.endswit ...

  6. mac中如何卸载pkg包

    ---恢复内容开始--- 参考地址.https://blog.csdn.net/play_fun_tech/article/details/27964861?utm_source=tuicool&am ...

  7. SQL Server Governer 控制资源的使用

    --- Create a resource pool for production processing  --- and set limits.  USE master;  GO  CREATE R ...

  8. ASP.NET Aries 开发框架(已支持.NET Core)

    背景: 当年,在卖弄与开源QBlog时,也曾想过把QBlog的开发理念整理整理,独立一个框架来开源. 不过,人越长大就越憔悴,激情终敌不过疲惫的惰性,最终无痕而终,连3.0的版本也没开源出来. 关于框 ...

  9. OO Unit 1 表达式求导

    OO Unit 1 表达式求导 面向对象学习小结 前言 本博主要内容目录: 基于度量来分析⾃己的程序结构 缺点反思 重构想法 关于BUG 自己程序出现过的BUG 分析⾃己发现别人程序bug所采⽤的策略 ...

  10. 简单的dfs题 --- POJ1321 棋盘问题

    题目链接: http://poj.org/problem?id=1321 题目大意: 你有k个棋子,若干个可以填的位置,要求填下一个棋子后其行和列不能填棋子. 思路: dfs策略 画图理解更好些: 填 ...