使用Redis分布式锁实现主备
使用Redis分布式锁实现集群的主备
最近工作中遇到一个问题,我们会调用业务部门提供的HTTP接口获取所有的音视频任务信息,这些任务会被分发到各个机器节点进行处理。有两个方案:
方案一
为每台机器编号,比如有5台机器,编号为0,1,2,3,4,然后每台机器读取全量任务信息,将每个任务ID用机器总数量取余,然后和机器编号比较,相等的表示这个任务在此机器上执行。
- 优点 可以达到任务分开处理的目的
- 缺点 任务分配不均/一台机器死掉,分给这台机器的任务将永远不会被执行到/每台机器都需要读取HTTP信息,浪费资源。
方案二
我们使用其中一台机器将任务投递到Kafka中,然后所有机器消费这些任务。
但是需要做到以下2点:
- 需要解决投递机器单点故障的问题,最好能达到一主多备。
- 任务分配要均匀。
第一个问题是本文的重点,我们采用了Redis的分布式锁,下面要详细介绍。关于Kafka任务均匀投递的问题,需要自己实现调度模块,根据机器性能来投递到不同机器消费的partition中。
方案二解决了方案一的所有缺点,下面详细说一下分布式锁,做一个记录。
关于主备
主备是高可用集群中绕不开的问题,服务端一般使用nginx反向代理做一次负载均衡,但是如果nginx挂了呢,这就需要做主备(或者主主也可以),网上这个帖子很详细Nginx负载均衡高可用(keepalived+nginx实现主备)。但是我们遇到的问题优点特殊,我们做的是客户端的负载均衡,每次主动调用任务接口获取任务数据来进行处理。并且只能做主备,不能主主,不然会造成任务的重复投递。
Redis 分布式锁实现主备
第一次在工作中接触到redis,发现redis真是个好东西。分布式锁原理
我们的主备方案中,使用分布式锁来实现一个类似单例模式的逻辑。
- 使用一个键值_master_IP来存储主机IP,并且设置过期时间(类似单例模式类里面的数据成员)。
- 定义一个分布式锁,只有在键值_master_IP的值为空的时候,才会获取锁,设置键_deliver_task_IP的值(类似单例模式中的第一次构造函数调用)。
下面是流程图:
- 主备系统启动的时候Redis中没有键值_master_IP,所有机器会抢占Redis分布式锁_master_lock。
- 抢锁成功的机器会变为主机,启动投递任务。并将_master_IP 值Set成自己的IP,并设置键值过期时间,这些操作完成后释放分布式锁。
- 主机释放锁后,其他备机有可能抢占到锁,为了防止备机启动投递任务和写_master_IP,获取锁之后会再次判断_master_IP是否有值,如果有值说明主机已经起来了,直接返回即可。(有点类似于单例模式的双重锁)
- 主机任务起来之后,各个机器每隔固定时间会去检测键值_master_IP,主机每次读取键值_master_IP后会自动Extend这个键值的Expire Time。备机发现键值有值并且不是自己就返回了。
- 主机死掉之后,过了键值_master_IP的Expire Time, 键值会被删除。其他备机器会像整个系统启动的时候一样开始抢占锁并启动新的主机。
注意:一个Redis集群(只有一个Master)有可能出现一个锁被不同服务获取的情况(Master宕机,锁状态还没有来得及同步到Slave就会出现),这样会在不同的机器上启动投递任务,上面的流程中在下一个5秒后会判断,投递任务IP是否为本机IP,只保留本机的服务,其他服务全部停止。
使用Redis分布式锁实现主备的更多相关文章
- 《Redis 分布式锁》
一:什么是分布式锁. - 通俗来说的话,就是在分布式架构的redis中,使用锁. 二:分布式锁的使用选择. - 当 Redis 的使用场景不多,而且也只是单个在用的时候,可以构建自己使用的 锁. - ...
- spring-boot 中实现标准 redis 分布式锁
一,前言 redis 现在已经成为系统缓存的必备组件,针对缓存读取更新操作,通常我们希望当缓存过期之后能够只有一个请求去更新缓存,其它请求依然使用旧的数据.这就需要用到锁,因为应用服务多数以集群方式部 ...
- Redisson实现Redis分布式锁的底层原理
一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起,一路聊到分布式事务.分布式锁.ZooKeeper等知识.所以咱们这篇文章 ...
- redis 分布式锁的 5个坑,真是又大又深
引言 最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催的紧,工期就在眼前只能硬着头皮上了.脑子浑浑噩噩的时候,写的就不能叫代码,可以直接叫做Bug.我就熬夜写了一个 ...
- redis 分布式锁的简单使用
RedisLock--让 Redis 分布式锁变得简单 目录 1. 项目介绍 2. 快速使用 2.1 引入 maven 坐标 2.2 注册 RedisLock 2.3 使用 3. 参与贡献 4. 联系 ...
- 手撕redis分布式锁,隔壁张小帅都看懂了!
前言 上一篇老猫和小伙伴们分享了为什么要使用分布式锁以及分布式锁的实现思路原理,目前我们主要采用第三方的组件作为分布式锁的工具.上一篇运用了Mysql中的select ...for update实现了 ...
- 面试必问:如何实现Redis分布式锁
摘要:今天我们来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubb ...
- redis分布式锁的这些坑,我怀疑你是假的开发
摘要:用锁遇到过哪些问题? 一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面:就比如: 本来一个程序员可以完成一个项目:需求->设计-&g ...
- Redis分布式锁 (图解-秒懂-史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
随机推荐
- Fiddler手机端抓包环境设置与过滤(一)
一.PC端Fiddler设置 1.安装https 证书 打开Fiddler->Tool->Fiddler Options->HTTPS tab,勾选上并Capture HTTPS C ...
- Spring IOC的核心机制:实例化与注入
上文我们介绍了IOC和DI,IOC是一种设计模式,DI是它的具体实现,有很多的框架都有这样的实现,本文主要以spring框架的实现,来看具体的注入实现逻辑. spring是如何将对象加入容器的 spr ...
- Gitlab常规操作
一.Git和SVN的区别 和SVN类似,Git是一个版本控制系统(Version Control System,VCS),不同的是SVN为集中式版本控制系统,为单一的集中管理的服务器,保存所有文件的修 ...
- 环境篇:Atlas2.0.0兼容CDH6.2.0部署
环境篇:Atlas2.0.0兼容CDH6.2.0部署 Atlas 是什么? Atlas是一组可扩展和可扩展的核心基础治理服务,使企业能够有效地满足Hadoop中的合规性要求,并允许与整个企业数据生态系 ...
- Json格式数据的解析
JSON是一种轻量级的数据交换格式,我们在编程中遇到的JSON数据通常就是一串字符串,只不过按照特定的格式去书写,这样当你把JSON数据传输给别人的时候对方只要使用这种特定的规则去阅读解析你的数据即可 ...
- GIT代码版本管理
一.实验目的 1.了解分布式版本控制系统的核心机理: 2.熟练掌握git的基本指令和分支管理指令: 二.实验内容 1.安装git: 2.初始配置git,git init git status指令: 3 ...
- 在没有RedirectAttributes的环境中如何在重定向环境中报错错误提示信息供页面使用
Spring在无RedirectAttributes的情况下(如Interceptor.filter中)使用Flash scope 今天遇到一个应用场景: 在需要在自定义的Interceptor中判断 ...
- Mysql 常用函数(7)- length 函数
Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html length 的作用 返回字符串的字节长度 注意: ...
- Flash 被禁止运行的方法
下面以谷歌浏览器 和 火狐浏览器 来说明. █ 自2020 年以来, 谷歌浏览器(Chome)已全面禁止Flash的运行,我们可以通过如下方法开启: █ 火狐(FireFox) 也禁止,但需要点“运行 ...
- Java多线程带返回值的Callable接口
Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...