【原创】Redis简介,容灾备份与消息队列设计方案

Redis简介

      Redis是一个高性能的key-value非关系型数据库,并且是开源免费的。Redis数据库有以下特点:

            1、Redis支持数据的持久化;

            2、提供list,set,zset,hash等数据结构的存储;

            3、Redis支持数据的备份,针对redis有优良的容灾方案;

            4、redis是单线程模式,线程安全。

            5,性能极高,读取速度为110000次/s,写速度为81000次/s。

            6,丰富的数据类型(String, List,Hash, Set zSet)。

            7,遵守原子性,事物提交要么都成功,要么都失败。

            8,支持事务,通过MULTI和EXEC指令包裹代码块提交事物。

            9,list的双链表特性方便实现基于内存存储的消息队列。

       高效的性能、丰富的数据类型以及可持久化的特点,目前大多项目都选择使用redis做缓存存储。Redis就像是项目的备忘录,把常用并不容易变更的数据记录下来。在需要用到的时候方便查阅。项目中一般把快码,资源路径,功能编码,角色权限列表等比较固定的信息存储到redis。当遇到需要提高并发量的技术难题时,可以把用户经常加载的请求、耗时的请求缓存在redis里面,可以显著提高应用的并发量。

课题研究

一,redis容灾策略介绍

      目前项目大多采用的是单节点redis服务器部署,当该节点出现宕机时应用就会异常。由于redis能够持久化,所以解决办法通常是重启redis服务器。但是问题来了,如果是生产环境出现该问题,会造成无法弥补的经济损失和名誉损失。所以需要通过容灾手段去避免该情况的出现。

方案一:master---slave 主从服务器集群:

       以一个Master节点为主,多个Slave节点为辅助。Master节点负责写入数据,多个Slave节点从master节点做备份之后对外提供读取权限。这样实现了数据备份,其次读写分离减轻了master的负担。

      但是一旦master出现故障,整个应用可能就面临崩溃。这时我们技术人员就不得不上线排查问题。此时技术人员就迫切想要一个可以实现全自动化无需人工参与的技术方案。

方案二:Redis Sentinel服务器集群:

       Redis Sentinel可以创建一个无需人为干预就可以进行故障转移的Redis环境。Redis Sentinel类似于一组守护进程,时刻监听着redis组的运行情况,当其中一个Sentinel检测到master无法使用时,会将其广播给其他Sentinel,当所有Sentinel都确定master无法再使用时,就会执行故障转移。

Redis Sentinel主要作用有如下功能:

1,监控:Sentinel会不断的检查master和slave是否像预期那样正常运行

2,通知:当出现问题会通过api通知给管理员。

3,自动故障转移:当Sentinel一致确定master异常,Sentinel组中会选举出来一个sentinel作为领导去把其中最稳定的slave提升为master。

4,客户端动态感知master地址:故障转移完成后,客户端连接sentinel会自动切换成新的master的地址。

       Sentinel自己本身也有个选举方式,选举方式为投票。每个确认了master“主观不可用”的sentinel节点,都会向周围广播自己的参选请求。所有Sentinel节点通过广播都确认“主观不可用”即可定义为“客观不可用”。同时每个节点都只会投票给第一个接受到的参选请求。当一个节点超过一半同意则确定为Leader。如果本回合持续了足够长的时间还未选出Leader,则开启下一个回合。所以建议sentinel节点必须是奇数个。

      当选举出一个Sentinel作为领导节点后,Sentinel会去主导Slave节点晋升。步骤如下:

        1,slave优先级设置,保存在redis.conf配置文件。

        2,复制偏移量大小,最接近master的节点作为新的master。

        3,选举具有最小Run ID(运行最久)的Slave作为新的Master。

        4,选举成功后会让原来master降级为slave,并与其他slave节点一起随从新master节点

二,Redis实现消息队列方案

       上文提到过redis支持list数据格式。针对list格式的支持,redis非常友好。Redis允许往数组的左边或者右边放入数据,也可以移除最左或者最右的元素。这样很好满足传统的队列的规则“先进先出,后进先出”。同时redis是单线程的,所以是线程安全的,作为队列不会重复脏读。如图是一个先进先出的指令demo。

       Redis的list支持头尾增加数据可以看出数据结构的原型是双向链表。双向链表对于首尾的增删是非常快的。一个列表的容量可达2的32次方-1个。并且该list结构在双向链表的基础上做了存储优化,美称为quickList。引用专业人士的描述为: “quickList 是 zipList 和 linkedList 的混合体。它将 linkedList 按段切分,每一段使用 zipList 来压缩存储,多个 zipList 之间使用双向指针串接起来。因为链表的附加空间相对太高,prev 和 next 指针就要占去16 个字节 (64bit 系统的指针是 8 个字节),另外每个节点的内存都是单独分配,会加剧内存的碎片化,影响内存管理效率”。

      原理掌握了之后,接下来介绍一下该队列如何在项目上使用。由于公司政策不方便把代码贴上来,只能口述描述一下具体思路:

        1,通过自定义注解去配置队列,实现afterPropertiesSet接口去解析注解去监听匹配的队列。

        2,执行处理队列任务时,需要根据队列的数量自动生成相应数量的监听线程。确保每一个队列都被一个专门的线程监听。

        3,在监听线程内去监听所需要监听的队列。如果该队列有值则进行pop操作,并触发一个处理该值的业务事件。

        4,通过SmartLifecycle去触发以上动作,这样就能完成一个基于redis的消息队列了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容