分布式数据库会面临着一个独特的挑战,就是数据必须要严格的按照读,写顺序执行。如创建用户,转账,两个潜在的写操作竞态条件必须要确保一个写操作必须在另外一个之前发生。在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. Codeforces 258D Little Elephant and Broken Sorting (看题解) 概率dp

    Little Elephant and Broken Sorting 怎么感觉这个状态好难想到啊.. dp[ i ][ j ]表示第 i 个数字比第 j 个数字大的概率.转移好像比较显然. #incl ...

  2. 【转】window.onerror跨域问题

    What the heck is "Script error"? Ben Vinegar/ May 17, 2016 If you’ve done any work with th ...

  3. 基本排序算法(Java)

    基本排序算法 (Java) 经过几次笔试,发现自己的Java基础有些薄弱,基本的排序算法掌握的还不够熟练,需要多加学习总结. 1. 选择排序 思想: 给定一个整数数组,例 int[] a ={38,6 ...

  4. 1.初识Node.js

    Node.js基础知识大汇总 1.下载并安装npm,检测安装是否成功(在命令行输入node -v,看是否会输出对应版本号) 2.写一个hello world 程序. (1).打开notepad,新建一 ...

  5. Logstash 6.4.3 导入 csv 数据到 ElasticSearch 6.4.3

    本文实践最新版的Logstash从csv文件导入数据到ElasticSearch. 本文目录: 1.初始化ES.Kibana.Logstash 2.安装logstash文件导入.过滤器等插件 3.配置 ...

  6. sqlzoo:using group by and having

    For each continent show the number of countries: SELECT continent, COUNT(name) FROM world GROUP BY c ...

  7. PHP使用CURL抓取网页

    CURL是一个非常强大的开源库,支持很多协议,包括HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS ...

  8. golang 内存模型

    1,是什么 是一套规范.内存操作指导 解决多线程编程的 程序的 原子性,有序性,可见性(主要)的问题. 多核操作系统,会存在缓存不一致的情况,说到底是一个同步的问题. 2, 内容 内存模型,除了定义了 ...

  9. vue基于webpack说明

    1.文件build里的check-versions.js:检查node和npm版本, 此文件里的 (1)require('chalk')引入一个模块,定义输入终端样式 (2) require('sem ...

  10. SElinux安全子系统---学习

    SElinux是一个强制访问控制的安全子系统,是为了让各个服务进程都受到约束,只能获取到属于自己的资源 SElinux有三种配置模式: 1:enforcing--强制启动安全配置策略,拦截不合法的请求 ...