[Etcd]分布式系统中如何使用乐观锁保证Mysql和Etcd数据最终一致性

这篇具有很好参考价值的文章主要介绍了[Etcd]分布式系统中如何使用乐观锁保证Mysql和Etcd数据最终一致性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

在写业务代码时,很多时候需要保证数据存储在不同中间件中的一致性。以笔者为例,就遇到了需要将mysql中已存储的数据转存到etcd中,同时还要考虑到并发场景下如何保证数据最终一致性的问题。

问题分析

该问题形象地表示的话,可以将时间线展开如下

  1. 服务A1更新db数据为{"key1":"valA", "key2":"val_old"}
  2. 服务A2读取db数据为{"key1":"valA", "key2":"val_old"},并存入内存
  3. 服务B1更新db数据为{"key1":"valA", "key2":"valB"}
  4. 服务B2读取db数据为{"key1":"valA", "key2":"valB"},并存入内存
  5. 服务B2将其内存数据发送到etcd,etcd中的数据为{"key1":"valA", "key2":"valB"}
  6. 服务A2将其内存数据发送到etcd,etcd中的数据为{"key1":"valA", "key2":"val_old"}

最终db中的数据为{"key1":"valA", "key2":"valB"},而etcd中的数据为{"key1":"valA", "key2":"val_old"}。从中我们可以分析出,产生这个问题的本质原因是因为服务A1、A2、B1和B2没有共用一块物理内存,这也是微服务拆分的必然结果。

解决思路

要想解决本问题,可以考虑几种方案:

  • 方案1:db添加读写锁,将1、2、6和3、4、5分别串行执行,缺点是db开销变大、并发性能下降
  • 方案2:使用db事务,将写etcd的操作保护起来,缺点是这种方法很不规范,不应在db的事务中添加外部调用,可能带来严重的故障
  • 方案3:基于etcd的revision和事务机制设计乐观锁,首先获取etcd中key的revision,从而在服务2查询db时保证etcd中的key没有被其他服务修改,确保最终一致性,缺点是在高并发修改的情况下可能需要多次重试。

方案3详解

不了解etcd中的各种version可以看Etcd 中 Revision, CreateRevision, ModRevision, Version 的含义。

方案3伪代码如下:

1  get revision of key from etcd
2  if revision is null:
3    create key1
4    goto line 1
5  get val from db
6  start etcd transaction
7  if mod_revision of key equal revision:
8    put val
9  else:
10   goto line 1
11 commit etcd transaction
	

至于具体的实现方式,可以参考etcd-cli的mutex实现,这篇分布式锁之 etcd(分布式锁原理、etcd特点、分布式锁实现方案)也有较为详细的介绍。文章来源地址https://www.toymoban.com/news/detail-781805.html

到了这里,关于[Etcd]分布式系统中如何使用乐观锁保证Mysql和Etcd数据最终一致性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kafka 分布式的情况下,如何保证消息的顺序消费?

    目录 一、什么是分布式 二、kafka介绍 三、消息的顺序消费 四、如何保证消息的顺序消费   分布式是指将计算任务分散到多个计算节点上进行并行处理的一种计算模型。在分布式系统中,多台计算机通过网络互联,共同协作完成任务。每个计算节点都可以独立运行,并且可以

    2024年02月10日
    浏览(56)
  • 集群高并发环境下如何保证分布式唯一全局ID生成?

    在集群高并发环境下保证分布式唯一全局ID生成是一个具有挑战性的问题。下面笔者将为大家提供几种常见的解决方案: UUID是一个128位的全局唯一标识符,它可以在不同的计算机和时间上生成。UUID的生成是基于MAC地址、时间戳等信息,因此可以保证在分布式环境下的唯一性

    2024年02月13日
    浏览(47)
  • 分布式websocket即时通信(IM)系统保证消息可靠性【第八期】

    b站上面本期视频版本,观看视频食用更佳!点击即可跳转,找不到视频可以直接搜索我 目前叫 呆呆呆呆梦 目前已经写的文章有。并且有对应视频版本。 git项目地址 【IM即时通信系统(企聊聊)】点击可跳转 sprinboot单体项目升级成springcloud项目 【第一期】 前端项目技术选型

    2024年01月22日
    浏览(63)
  • 【103期】RabbitMQ 实现多系统间的分布式事务,保证数据一致性

    org.springframework.boot spring-boot-starter-amqp mysql mysql-connector-java runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-jdbc com.alibaba fastjson 1.2.17 3.2.1.2配置文件内容: server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=tru

    2024年04月14日
    浏览(65)
  • etcd分布式存储

    etcd分布式存储 etcd简介 etcd下载安装 etcd常用命令 etcd配置参数 etcd集群 golang操作etcd

    2024年02月09日
    浏览(47)
  • ETCD中的分布式设计思想和WAL

    etcd中的分布式设计思想主要包括以下几个方面: 一致性:etcd使用Raft一致性算法来确保分布式系统中的数据一致性。Raft算法通过选举一个领导者节点来协调各个节点之间的操作,保证数据的一致性和可靠性。 可用性:etcd设计为高可用的分布式系统,通过使用多个节点来提供

    2024年02月16日
    浏览(37)
  • Spring Cloud实战 |分布式系统的流量控制、熔断降级组件Sentinel如何使用

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月04日
    浏览(75)
  • 什么是分布式系统,如何学习分布式系统

    正文 虽然本人在前面也写过好几篇分布式系统相关的文章,主要包CAP理论,分布式储存与分布式事务,但对于分布式系统,并没有一个跟清晰的概念。分布式系统涉及到很多的技术、理论与协议,很多人也说,分布式系统是“入门容易,深入难”,我之前的学习也只算是管中

    2024年02月13日
    浏览(44)
  • k8s mysql集群 & 分布式锁 & apiserver & etcd 的关系

    在 Kubernetes (k8s) 中,MySQL 集群可以使用分布式锁来确保在多个实例之间对共享资源的互斥访问。这是通过结合 Kubernetes API Server 和 etcd 来实现的。 Kubernetes API Server 是 k8s 集群中的核心组件之一,它充当了集群的控制平面,提供了对集群资源的管理和操作接口。API Server 是一个

    2024年02月07日
    浏览(52)
  • (快手一面)分布式系统是什么?为什么要分布式系统?分布式环境下会有哪些问题?分布式系统是如何实现事务的?

    《分布式系统原理与泛型》中这么定义分布式系统: “ 分布式系统是若干独立计算机的集合, 这些计算机对于用户来说就像单个相关系统 ”, 分布式系统(distributed system)是建立在网络之上的软件系统。 就比如:用户在使用京东这个分布式系统的时候,会感觉是在使用一

    2024年02月08日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包