分布式数据一致性解决方案推理过程

news/2024/5/20 14:16:24/文章来源:https://blog.csdn.net/qq_16485855/article/details/130233985
  •  redis是一个极轻量级的进程,单机单线程单进程。

使用redis很容易实现分布式锁:setnx,同一个key,谁设置成功了,谁就抢到了锁,所以就产生了多锁问题。

假设客户端1抢到了锁,redis挂了,redis重启了之后,客户端2又抢到了锁。

redis持久化能否解决多锁问题?

持久化有RDB和AOF。

RDB是窗口机制的,会丢失将近一个窗口的数据,比如丢失半小时的数据。

AOF有三个缓存级别:每操作成功就记日志、一秒记一次、内核的缓冲区满了才记。

redis要开启AOF最高的缓存级别来保证锁的一致性。

用户发了一个setnx请求,立刻持久化到AOF里面,这样才能保证重启之后,锁被带到内存,另外一个客户端抢不到该锁,因为它没有被释放。

当开启redis持久化方案的时候,性能会下降,redis本来就是基于内存的,它的特征就是快,开启AOF必然降低性能。

如果不想开启AOF,开启哨兵模式:主从复制,加一个哨兵,把锁同步到另外一个节点。

一个redis挂了之后,由哨兵快速的把另外一个redis切换成主。

redis数据同步

一个a程序、一个b程序、一个客户端,

客户端将a=3写入a程序,为了保证a和b 2个redis数据的一致性,会有2种同步方式:

第一种:

客户端将a=3写入a程序,写成功了,但不返回成功,还在这里阻塞着,a同步给b,把a=3写给b, b返回成功之后,a再给客户端返回成功。

如果a挂了,还可以从b取到a=3,这是强一致性的。

有了redis a,为什么还要有redis b?

为了解决可用性问题,本来不加b,a可以一直存活,加了b,b挂了,a没挂,给a写,还必须要同步给b,b还不在,只能阻塞等b恢复,即强一致性行为间接会破坏可用性。如果再有一个redis c,则出现问题的几率更高。

redis主从复制的确可以设置为强一致性,可以配置主收到几个从节点返回的ok,才允许客户端返回。

还有另外一种一致性行为,非同步阻塞,

只要给a写入成功,就可以给客户端返回成功,

这时候a需要把数据发给b或发给c,但是a不等b或c返回ok,

若a刚给客户端返回ok,a挂了,但b和c还没有处理,此时随便选择一个当主,客户端就获取不到a=3了,这叫弱一致性,弱一致性不能保证数据的一致性。

a挂掉了,把a=3带走了,a把a=3给b和c的时候,这是一个不可靠的给法,因为它不知道对方有没有收到a=3或a=3有没有处理成功等一些列的未知情况。

假设在a和b、c中间加一个可靠的技术d,d和a、b、c之间不会出现网络断开的情况。

a把a=3给到了d,a挂了,d还没有给到b和c,d中有a=3,未来只需要b能够连接到d这个区域,把a=3取回来,最终b和c可以还原到a挂机的状态。

数据同步可能会有延迟,但可以达到最终一致性。

d区域一般不是一台服务器,推荐3、5、7..台。

客户端把a=3写入中间集群中的每一个节点,如果3个都返回ok,才返回给客户端,这是强一致性,但又破坏了可用性。

有一部分返回ok就可以的话就规避了挂机的风险。

那一部分是多少个呢?

如果把a=3请求其中一台,再请求另外两台的时候,就请求不到a=3了或者另外一个客户端从别的节点上取不到a=3。

如果1个节点的话,那更多的节点是取回数据不一致性的情况,但只要有一个节点活着,就可以对外提供服务。

如果是2个节点返回ok呢?

a给这个集群写a=3,返回2个ok。

同时不要只关注a,还要关注中间的这个集群,集群里面必须要两两通信。

只要两个节点能够互相通信,势力范围才能满足2,只要有一个节点不能和别人通信了,势力范围就是1了,不能满足2,这台就会shutdown自己,不会对外提供读写服务。

客户端从集群中节点3取数据的时候,因为它已经shutdown了(此时进程还活着,只是跟别的节点连不上 ,必须要找到另外一个小伙伴,2个节点的时候,才能对外提供服务), b和c只能从另外两台(节点1、2)取,这两台曾经又登记过a=3,所以对方一定能够取到正确的数据,这样就可以保证数据最终一致性了。

节点3也会从另外2个节点同步数据,最终整个集群也是数据一致的。

如果集群中有5个节点,

1,2组成一个小集群A,4,5组成一个小集群B,3谁也不理谁,2个小集群A,B都可以对外提供服务,这样出现了脑裂情况。

所以如果5个节点,3个组成一个小集群才能对外提供服务的话,上面的2个小集群均不能对外提供服务,即redis b和c从小集群A和B上是获取不到a=3的,因为不满足3个节点,不能对外提供服务,

集群中,5个节点,同时给这3(节点1-2-3)个写入成功,这3个组成的小集群才能对外提供服务。

如果不过半,就通过,那么就会产生脑裂问题。

可不可以偶数个节点?

3台过半是2台,允许一台挂机,集群还能继续运行。

四台过半数是3,承担风险还是1个。

奇数3和偶数4承担的风险是一样的,4台还更容易挂一台,所以偶数台没有必要,风险反而更大,所以从成本和风险考虑,选择奇数台。

中间这个集群是什么?

zk是分布式协调服务,自带高可靠光环。

redis组建一个主从复制分布式集群,需要解决分布式数据同步或选主等分布式行为。

zk给别人提供服务的时候,如果它自己都不可靠的话,那别人更不可靠。

zk必须是集群多机的,所以自带了高可靠的光环,挂了一台无所谓,依然对外提供服务。

zk对外提供服务的时候,还需要考虑成本,

a和集群中的5个节点都建立连接,然后过半的节点都给它返回ok,这样增加了客户端连接和通信的成本。

将中间区域做一个整体对外提供服务

a向这个中间件发送数据,中间件返回给a有没有写入成功即可。

redis集群部署的时候,一般是主从集群,在三个里面,选出一个leader,这个leader负责增删改查和向其他从节点同步数据,只要leader活着,其他从节点有一个活着,在满足势力范围是2的条件下,就可以组成一个小集群对外提供服务。

a只要发给中间件集群中的leader节点就可以了。

zk为了完成分布式协调做了一些事情,redis却没有做这些事情。

zk在leader节点活着的时候叫主从集群,和主节点通信就可以了,主在同步给从节点,主一旦挂掉了,就会进入无主集群,只有主才能对外提供服务,此时就会立刻选主,从剩下2台中选择一个主,只要选主够快,对外影响就不大。

选的要够快,而且能够选出来,官方在集群压测的情况下,恢复leader时间是200ms,

里面也有observer观察者,即便zk集群很大,最终选主投票的节点可以限定的很少,所以恢复leader的时间是很快的,

这么快是怎么实现的?

比如班级100个人中,投票选举谁最帅,每个人都发自己最帅,这样会陷入恶性循环,第一轮投票失效,可能会投出30秒或30个小时。加一个条件,谁可以说话,谁就最帅,这样只能选择老师,只有老师才可以说话。

zk哨兵模式就是这样做的,zk配置文件中有一个myid,server.1 server.2 ... 会给每一个zk server一个数值,而且全局唯一不能重复。

主从集群有一个好处 ,主是单点的,一台很容易实现串行化。

还有一个事务id,客户端给主发了一个操作,给一个事务id加1,第二个操作再增加1,这就是zxid。

当有一个节点挂了之后,剩余存活的节点要亮出自己的2个id,优先判断谁的事务id最大,因为事务id最大代表数据最全,所以谁的事务id最大,谁立刻就是leader了。

如果两个人的事务id都一样,就亮出自己的全局唯一的id,谁最大,谁就是leader,所以选举的过程,根本不需要消耗太多的时间,这是谦让机制。

从无主投票到过半机制,其实是符合paxos协议的,zk单独实现了paxos协议,叫zab协议。

如果想使用redis做分布式锁怎么做

redis开启磁盘持久化后性能会下降,开启主从复制,强一致性数据同步容易破坏可用性,redis中间还没有加数据缓冲的过程即上面所说的中间件区域,redis本身没有实现,但zk实现了。

redis自己同步数据的时候只能实现弱一致性,可能会出现数据不一致,就会造成双锁的现象。

c1从redis A获取到了分布式锁,redisA还没有来得及同步给redisB,redisA就挂了。

哨兵把redisB设置成主,c2从新主抢到了锁,结果2个客户端都拿到一把锁。

使用redis做分布式锁一直就存在争议。

替代性redis分布式锁的是zk,zk做分布式协调,本身就是主从的。

redis 胖客户端

应用程序中引入redis jar包,客户端自己每次要写三个,

这是一个间接的伪cp,客户端尽量向所有redis去写数据,

客户端1和客户端2都去抢锁,如何确定锁的唯一性?

不是redis自身实现的(类似于zk实现的),而是由客户端来代替了leader角色。

俩客户端去抢锁,要是zk的话 ,客户端给zk的leader就可以了,zk自己去同步。

redis胖客户端写数据给redis集群中的每个节点,写之后,另外一个客户端如果想判断有没有这把锁,有的话,就说明被其他客户端是使用了,尽量查询每个节点数据,客户端再判断到底有没有这把锁。

这种方式也可以承担一部分挂掉的风险,3个redis节点允许挂掉一个。

解决分布式数据一致性的话,要么是基于paxos协议,由中间件自己去设计实现,要么就是由客户端自己完成对过半机制的判定。

不推荐redis实现分布式锁,zk肯定要优于redis,还有另外一种k8s etcd速度高于zk,实现较复杂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_290367.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不懂就问,Milvus 新上线的资源组功能到底怎么样?

在近期更新的 Milvus 2.x 版本中,我们上线了在社区中呼声一直很高的【资源组功能】。有了这个功能,用户再也不需要“为每个 collection 部署一套 Milvus 服务”的方案,轻松实现对 Query Node 资源进行分组管理,达到物理资源隔离的…

运行时内存数据区之执行引擎(一)

执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软…

「计算机控制系统」6. 直接设计法

特殊类型系统的最小拍无差设计 一般系统的最小拍无差设计 最小拍控制器的工程化改进 Dahlin算法 文章目录 特殊类型系统的最小拍无差设计理论分析典型输入函数的最小拍无差系统 一般系统的最小拍无差设计有波纹最小拍无差设计无波纹最小拍无差设计 最小拍控制器的工程化改进针对…

浅析商场智能导购系统功能与实施效益

商场智能导购系统是一种基于物联网技术和人工智能算法的解决方案,旨在提供商场内部的智能导购服务,为消费者提供个性化的购物导引和推荐,提升用户购物体验,增加商场的客流量和销售额。 商场智能导购系统的方案一般包括以下主要功能…

LeetCode 27.移除元素

文章目录 💡题目分析💡解题思路🚩思路1:暴力求解 --- 遍历🔔接口源码:🚩思路2:空间换时间🔔接口源码:🚩思路3:双指针(快慢指针)🔔接口…

tftp+Filezilla文件双向传输(1)-centos(VMware)-win10(host)

目录 1.下载安装vsftpdtftptftp-server 2.配置服务 2.1 配置服务 修改文件 /etc/vsftpd.conf 2.2 配置服务 守护进程 /etc/xinetd.d/tftp 2.3 配置服务 tftp服务器 2.4 配置登录用户 2.4.1 修改selinux 2.4.2 匿名用户登录 2.4.3 新建账户,不能登陆系…

Linux时间服务器(ntp)

1.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆,能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

Liunx下进程间通信

文章目录 前言1.进程间通信相关介绍2.管道1.匿名管道2.管道的原理3.通过代码来演示匿名管道4.命名管道5.命名管道的原理6.命名管道代码演示 3.System V共享内存1.共享内存原理2.相关系统接口的介绍与共享内存的代码演示3.共享内存的一些特性 4.system V消息队列与system V信号量…

TryHackMe-Services(Windows域渗透)

Services 认识团队! 今天thm新出的房间,尝尝鲜 端口扫描 循例nmap 把services.local加入hosts Web枚举 发现员工邮箱以及一些员工姓名 从下边的邮箱中,大致可以猜测其他员工账户名跟这个一致的格式 将其保存起来 立足 - AS-REP Roasting…

Linux基础—日志分析

Linux基础—日志分析 一、日志的功能1.日志消息的级别2.设备字段说明 二、日志文件的分类1.内核及系统日志2.用户日志3.程序日志 三、日志文件1.日志文件查看2.主要日志文件介绍3.日志管理策略 一、日志的功能 用于记录系统、程序运行中发生的各种事件 通过阅读日志&#xff0c…

2023第十四届蓝桥杯 C/C++大学生A组省赛 满分题解

写在前面 以下代码,目前均可通过民间OJ数据(dotcpp & New Online Judge), 两个OJ题目互补,能构成全集,可以到对应链接下搜题提交(感谢OJ对题目的支持) 如果发现任何问题&…

论文各子结构的实现

本文将简明介绍人工智能论文各子结构的实现方法,重点指出了各部分实现时的要点,帮助读者高效地完成论文的写作。 1. 标题 论文标题的确定必须遵循明确而有吸引力的原则。论文的题目需要准确反映自己论文的研究内容和创新点,同时还必须具有吸…

【LeetCode: 1027. 最长等差数列 | 暴力递归=>记忆化搜索=>动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

(算法基础)完全背包问题

完全背包问题 完全背包问题就是在背包问题大逻辑前提之下,给定的n个物品没有个数的限制。对于完全背包问题的状态表示与01背包问题是一样的,f(i, j),这个二维的集合表示:在前i个物品当中去选择,并且总体积小于等于j&a…

android 布局优化

1.绘制和布局加载原理 本文仅供个人学习记录,详细介绍可查看下面链接 Android布局优化,多套方案全面解析 布局优化的原因:布局嵌套过深,或者其他原因导致布局渲染性能不佳,可能会导致应用卡顿。 android绘制原理&am…

taobao.item.carturl.get( 加购URL获取 )

¥开放平台免费API可选用户授权 获取加购URL,支持添加商品到购物车 公共参数 请求地址: 公共请求参数: 公共响应参数: 点击获取key和secret 请求参数 请求示例 响应示例 异常示例

java版UWB人员定位系统源码,提供位置实时显示、历史轨迹回放、电子围栏、行为分析、智能巡检等功能

运用UWB定位技术开发的人员定位系统源码 文末获取联系! 本套系统运用UWB定位技术,开发的高精度人员定位系统,通过独特的射频处理,配合先进的位置算法,可以有效计算复杂环境下的人员与物品的活动信息。 提供位置实时显…

10分钟了解人工智能(最通俗的语言)

最通俗的语言:15分钟了解人工智能;唯一优点,受众完全听懂 无人驾驶、智能家居、远程医疗……如今,人工智能(AI)技术已被广泛应用于金融、交通、医疗、安防、教育等领域,成为经济增长新动能 一 什么是人工智能 人工智能…

css预处理器:less

1.css常见单位 绝对单位 只需要掌握px,国外in用得更多 相对单位 em em相对于自身的font-size,如果自身未定义,则相对于继承的父元素font-size rem rem可以做移动端的适配,依然很重要,如淘宝m站在使用;但是趋势是rem转vw rem是相对于html的font-size,html默认字体大小为1…

Linux系统之部署Samba服务

Linux系统之部署Samba服务 一、Samba服务介绍1.Samba服务简介2.NFS和CIFS简介3.Smaba服务相关包4.samba监听端口4.samba相关工具及命令 二、环境规划介绍1.环境规划2.本次实践介绍 三、Samba服务端配置1.检查yum仓库2.安装smaba相关软件包3.创建共享目录4.设置共享目录权限5.新…