分布式数据库会面临着一个独特的挑战,就是数据必须要严格的按照读,写顺序执行。如创建用户,转账,两个潜在的写操作竞态条件必须要确保一个写操作必须在另外一个之前发生。在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. Electron 项目在 Mac 下复制和粘贴快捷键失效的解决办法

    公司的一个项目需要开发跨平台,由于整个项目完全由我一个人开发,本人也是初次接触 Electron,开发过程中遇到了不少坑,同样的代码 Windows 下复制和粘贴没有问题,Mac 下复制和粘贴失效,在 ...

  2. 重磅推出:AutoProject Studio 自动化项目生成器

    AutoProject Studio 自动化项目生成器 核心架构图 AutoProject Studio 自动化项目生成器是一款基于C#.Net Framework 4.0为平台自主研发.专为软件设计 ...

  3. 利用Google趋势来预测比特币价格

    预测市场是件极其困难和不可能的事情,特别是预测市场的短期行为.长期预期相对而言简单很多,因为很多事情把时间拉长,都可以预测,比如我预测烧汽油的车最终都会消失,把时间拉长,都是没问题的.但是这种预测没法 ...

  4. python @property的用法及含义全面解析

    在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样. class Rectangle(object): de ...

  5. 2018-2019 20165235 网络对抗 Exp5 MSF基础

    2018-2019 20165235 网络对抗 Exp5 MSF基础 1. 实践内容(3.5分) 1.1一个主动攻击实践 攻击方:kali 192.168.21.130 靶机: win7 192.16 ...

  6. swool配置ssl

    1 yum install  openssl  --enable-openssl -y 2 切换在swoole 安装目录 cd /usr/local/swoole 3 ./configure --en ...

  7. Pytoch机器学习乱玩(一):数学建模作业,体重与心率

    动物心率与体重的模型 动物消耗的能量p主要用于维持体温,而体内热量通过其表面积S散失,记动物体重为w,则\(P \propto S \propto w^{\alpha}\).又\(P\)正比于血流量\ ...

  8. 从Facebook数据泄露事件看大数据时代的个人信息安全问题

    进入21世纪后,互联网开始大规模普及,线上业务和线上服务也开始逐渐走入人们的生活.尤其在智能手机和移动互联网诞生以后,人们对网络的依赖更是与日俱增.然而,伴随而来的则是涉及个人隐私的信息安全问题.个人 ...

  9. Spring IoC的原理为什么是反射而不是new

    因为Spring在加载类的实例时,我们知道其实是用工厂的方式,给出一个个实例,而在工厂里面,用了单例,但是真正实例化,则是反射的newInstance来创建对象,而不是new. 那么,为什么是反射的n ...

  10. Java中 StringTokenizer 的用法

    一.StringTokenizer 1.1 StringTokenizer简介及其构造函数的三种形式: StringTokenizer类是字符串分割解析类型,其属于java.util包,在使用之前需要 ...