zoukankan      html  css  js  c++  java
  • Cassandra与Mongo的事务实现之分布式协议

    摘要

    NoSql不同于关系型数据库,是分布式存储,因此想要实现关系型数据库中的事务就不是那么简单了。本文结合Cassandra中的paxos和Mongo的two phase commit来谈谈Nosql如何利用分布式协议来实现事务的。

    Cassandra

    Cassandra的paxos机制在这篇译文中已有详细解释了。
    下面时序图方便理解。
    注意acceptor节点数量由replicate factor数量决定,quorum个返回就是超过一半的replicate factor。
    这里写图片描述

    Cassandra只能通过轻量级事务来实现行层面的原子性和隔离性。因此没有关系型数据库那么丰富的事务操作,如开启事务,提交事务,和回滚

    eg.给mike的账户加一块钱,IF就是Cassandra中的关键字,实现事务的。这样可以确保在事务中正确更改miki的账户。但是如果涉及到转账,两行记录,是实现不了的原子性操作的,因为没有回滚机制的。

    UPDATE test.bank SET amount = 2
    WHERE name = 'mike' 
    AND id = 123 
    IF amount = 1

    mongo

    mongo 的原子性是基于document级别,而document又是可以嵌套的,所以基本可以满足大部分情况的原子性要求。但是如果需要实现多个document的的事务。则需要两阶段协议

    2pc(2 phase commit) 两阶段即请求阶段,以及提交阶段。
    相比较paxos的Proposer和Acceptor。两阶段协议也包含两种角色,一个是coordinator(协调者),集群中一般只有1个,另外一种角色是workers(参与者)

    1. 请求阶段
      coordinator通知workers准备提交或者取消事务。workers返回应答信号,当所有的workers都返回应答信号了,再进行下一阶段。
    2. 提交阶段
      coordinator根据请求阶段收集到的所有结果,当所有的结果都为提交的时候,就通知所有的workers提交事务,否则取消。

    参考

    https://docs.mongodb.com/manual/core/write-operations-atomicity/

  • 相关阅读:
    为上次写的框架加了一个辅助功能
    复制文件夹下所有文件
    进制之间的相互转换
    c# 修改appConfig文件节点
    GUID
    太悲哀了
    poj2411 Mondriaan's Dream
    poj3311 Hie with the Pie
    HDU3001 Travelling
    luogu p2622关灯问题II
  • 原文地址:https://www.cnblogs.com/stoneFang/p/6715271.html
Copyright © 2011-2022 走看看