使用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分布式锁实现主备的更多相关文章

  1. 《Redis 分布式锁》

    一:什么是分布式锁. -  通俗来说的话,就是在分布式架构的redis中,使用锁. 二:分布式锁的使用选择. - 当 Redis 的使用场景不多,而且也只是单个在用的时候,可以构建自己使用的 锁. - ...

  2. spring-boot 中实现标准 redis 分布式锁

    一,前言 redis 现在已经成为系统缓存的必备组件,针对缓存读取更新操作,通常我们希望当缓存过期之后能够只有一个请求去更新缓存,其它请求依然使用旧的数据.这就需要用到锁,因为应用服务多数以集群方式部 ...

  3. Redisson实现Redis分布式锁的底层原理

    一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起,一路聊到分布式事务.分布式锁.ZooKeeper等知识.所以咱们这篇文章 ...

  4. redis 分布式锁的 5个坑,真是又大又深

    引言 最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催的紧,工期就在眼前只能硬着头皮上了.脑子浑浑噩噩的时候,写的就不能叫代码,可以直接叫做Bug.我就熬夜写了一个 ...

  5. redis 分布式锁的简单使用

    RedisLock--让 Redis 分布式锁变得简单 目录 1. 项目介绍 2. 快速使用 2.1 引入 maven 坐标 2.2 注册 RedisLock 2.3 使用 3. 参与贡献 4. 联系 ...

  6. 手撕redis分布式锁,隔壁张小帅都看懂了!

    前言 上一篇老猫和小伙伴们分享了为什么要使用分布式锁以及分布式锁的实现思路原理,目前我们主要采用第三方的组件作为分布式锁的工具.上一篇运用了Mysql中的select ...for update实现了 ...

  7. 面试必问:如何实现Redis分布式锁

    摘要:今天我们来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubb ...

  8. redis分布式锁的这些坑,我怀疑你是假的开发

    摘要:用锁遇到过哪些问题? 一.白话分布式 什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面:就比如: 本来一个程序员可以完成一个项目:需求->设计-&g ...

  9. Redis分布式锁 (图解-秒懂-史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

随机推荐

  1. python进程/线程/协程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  2. 细说 PEP 468: Preserving Keyword Argument Order

    细说 PEP 468: Preserving Keyword Argument Order Python 3.6.0 版本对字典做了优化,新的字典速度更快,占用内存更少,非常神奇.从网上找了资料来看, ...

  3. Vuel路由跳转动画

    1.App.vue中添加 <transition :name="animate"> <router-view/> </transition> e ...

  4. maven基本配置

    1.maven 是一个项目构建工具,如果在公司做大的项目 ,需要把项目拆分成很多子项目,为了方便各子项目之间协同开发和调试,一般都会使用maven.使用maven和以前web项目最大的不同是jar包的 ...

  5. C#学习笔记——数据类型

    数据类型 sbyte x; //8bit,有符号,表示-128~127 bite x; //8bit,无符号,表示0~255 short x; //16bit,有符号整型 ushort x; //16 ...

  6. OpenWrt R2020.3.19 反追踪 抗污染 加速 PSW 无缝集成 UnPnP NAS

    固件说明 基于Lede OpenWrt R2020.3.19版本Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及软件进行测试,通过后发布 设计目 ...

  7. 设计模式之GOF23备忘录模式

    备忘录模式Memento 场景: -Word文档编辑时,电脑死机或者断电,再次打开时,word提醒恢复之前的文档 -文件的撤回 核心: -就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原 ...

  8. 嫌弃Apriori算法太慢?使用FP-growth算法让你的数据挖掘快到飞起

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第20篇文章,我们来看看FP-growth算法. 这个算法挺冷门的,至少比Apriori算法冷门.很多数据挖掘的教材还会 ...

  9. Windows 10 IoT Core用PWM控制器控制树莓派LED灯亮度

    我接到一个需求,需要调节LED灯的亮度,且是从上位机进行控制,我了解到树莓派也有PWM,就准备通过PWM来控制灯的亮度. PWM又叫脉宽调制,是用微处理器的数字输出来对模拟电路进行控制,对模拟信号电平 ...

  10. VMware Tanzu已融合云原生与K8s 市场前景尚不确定

    Tanzu是什么? Tanzu 结合了Wavefront IT监控的项目和产品,VMware于2017年5月收购了该软件,并加入了Cloud Foundry PaaS实用工具.VMware在2019年 ...