• 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/

  • 相关阅读:
    PAT Basic 1001
    PAT基础6-11
    PAT基础6-12
    PAT基础6-10
    修改正在进行遍历的列表
    使用管道和cronolog切割日志
    python logging模块
    python实现广度优先搜索和深度优先搜索
    多继承下的super()指向的不一定是直接父类
    python3 pandas DataFrame常见用法
  • 原文地址:https://www.cnblogs.com/stoneFang/p/6715271.html
Copyright © 2020-2023  润新知