备胎是怎么上位的-redis高可用浅析

前言

最近在看redis,有一些心得,为了不忘,现在记录下来。

我尝试从问题出发,步步递进,给大家较好的阅读体验,具体如下

  1. 什么是缓存,为啥要有它
  2. 缓存的实现方式-进程内的缓存
  3. 缓存的实现方式-进程级别的缓存
  4. redis作为一个进程级别的数据库,优点
  5. redis的高可用实现

什么是缓存,为啥要有它

一般我们将数据存储在数据库中,对于一些经常查询的业务,比如用户访问某一资源,通常我们会通过查询数据库查看用户是否有这个访问权限,这样业务的特点是查询频率高,查询数据库是比较重的操作,主要的耗时有数据库本身的查询耗时和网络耗时。如果将一些常使用的数据放在程序运行时内存里,随着程序的启动,加载数据库中信息到内存中,这样就减少了网络交互和数据库本身的查询耗时。

缓存的实现方式-进程内的缓存

这种就是在写程序时开辟一块内存,专门当做缓存供程序使用

优点

  1. 不需要网络传输。
  2. 不需要线程间切换。
  3. 缓存更新方便。因为是程序内的内存区域,我需要更新哪个区域,我可以直接定位到内存位置,并更新它。

缺点

  1. 拓展性差。还是一个商城的例子,用户想看自己的购物车,假设我们使用token进行状态保持,我解析token,抽取用户id,查看是否具有这个业务操作的权限。如果部署的程序只有一个,完全没问题。但是为了满足未来用户量高速增长,通过nginx横向拓展程序就可以有问题。假如我们平行的部署两个程序,用户来登录,程序a处理了这个请求,并将该用户的权限信息,token存在自己的内存区域,当该用户发起另外一个业务请求时,程序b接受这个请求,程序b拿到用户的token,抽取用户信息,查询自己的内存区域,发现没有这个用户信息,就判断这个用户没有访问权限。
  2. 如果是横向拓展的话,很有可能浪费内存。多个程序都有自己的内存区域,但是内存区域存的东西也是基本一样的。

缓存的实现方式-进程级别的缓存

优点

  1. 节约内存资源。
  2. 职责分离更明确

缺点

  1. 增加网络传输
  2. 增加线程间切换
  3. 单点,有风险

redis作为一个进程级别的数据库,优点

  1. 支持高可用部署
  2. 为了降低总体网络传输的延迟,提出了一个新思想:

假设我是新街口东方饺子王老板,提供送餐服务,我有2个快递员,假设我的饭是提前做好的

  • 12:00,京师科技大厦小强定了一份饺子,快递员1去送餐,十分钟可以送到,再有十分钟回到饭店
  • 12:02,京师科技大厦小红定了一份饺子,快递员2去送餐,十分钟可以送到,再有十分钟回到饭店
  • 12:03,京师科技大厦小花定了一份饺子,没有快递员送餐:快递员1要到12:20才能回来,快递员2要到12:22才能回来。等待
  • 12:04,京师科技大厦特朗普定了5份饺子,没有快递员送餐:快递员1要到12:20才能回来,快递员2要到12:22才能回来。等待
  • 12:05,京师科技大厦克林顿定了5份饺子,没有快递员送餐:快递员1要到12:20才能回来,快递员2要到12:22才能回来。等待
  • 12:20,快递员1接到小花订单,去送餐
  • 12:22,快递员2接到特朗普订单,去送餐

假如特朗普和小强小红是一个公司的,特朗普心里就不爽了,都是同一时间定的,为啥他们到了,我的还没到?

那有什么解决方案吗 ?

  1. 减少每趟耗时。比如原来是快递员骑自行车,现在换成摩托车,原来是摩托车,现在换成汽车,原来汽车,现在换成火箭..
  2. 增加快递员的数量。 原来是2个,我就再招十来个 。
  3. 快递员每趟运送的货物争取多一点。比如上述例子,仅仅五分钟内,连续有京师科技大厦5单订单,一共13份饺子,假设一个快递员的后备箱可以装10分饺子,那在12:05的时候,快递员1 运送前四个订单,一共8份,快递员2运送第五个订单,一个5分。这样特朗普就和小强一起吃上饭了。

在计算机中 ,这三种解决方案分别对应的是

  1. 减少每趟耗时。往返时间:从发送方发送数据开始,直到发送方收到接收方回复的确认为止。数据传输的方式简单来说是这样的,先将数据转换为字节流,然后通过一个装置(调制解频器)转换为电磁波 ,通过网线或者无线电波传输,接收方接受到无线电波,将其转换成字节流,然后在转换成具体的可供程序使用的数据。是不是脑袋有点大,这个过程的优化可能不是软件工程师能做的。
  2. 吞吐量:单位时间内通过某个网络的数据量。这个优化可能不是软件工程师能做的。
  3. 对传输的数据进行缓冲,降低总体网络延迟。

第三种思想在很多地方都采用了,比如邮件服务器使用这种思想可以更快的下载新邮件,

redis 也是采用了第三种解决方案

感兴趣的同学可以参考官方文档

https://redis.io/topics/pipelining

redis的高可用实现

高可用的业务需求,当缓存服务因为某些原因不可用时,可以切换到另外一台机器的的缓存服务上。

可能涉及到的难点

  1. 我怎么判断缓存服务不可用
  2. 当不可用的时候,我怎么通知到所有使用缓存服务的客户端,现在你访问的这个有问题,你应该访问另外一个好的
  3. 备份的缓存服务存储的数据怎么和正在使用的缓存服务存储的数据保持一致
  4. 当我down掉的节点可以重新提供使用,怎么能加入到缓存,当做备胎使用

我尝试着对这几个问题提出自己的思考

1 我怎么判断缓存服务不可用

我需要知道每一个客户端使用缓存服务的情况,假如大家都说缓存有问题,那没问题,就换一个好的,如果至少有一半的客户都认为有问题,那这个缓存就有问题。像这样的事情肯定是谁用谁知道。哈哈

2 当缓存不可用的时候,我怎么通知到所有使用缓存服务的客户端,现在你访问的这个有问题,你应该访问另外一个好的

这个就要在程序部署的时候记录一下需要使用缓存服务的client,当要切换缓存时,我就逐一通知client就行

3 备份的缓存服务存储的数据怎么和正在使用的缓存服务存储的数据保持一致

这个其实很简单,把访问缓存的请求copy一份给备份的缓存就行。当然这个操作应该谁来做。如果是我的话,我就在client里来做,我做完一个操作,就把这个操作加到一个缓存队列中,让后台线程处理这个copy操作。

4 当我down掉的节点可以重新提供使用,怎么能加入到缓存,当做备胎使用

这个有两种方式,一种是down掉的缓存直接通知我,我活了,我想当备胎,你看怎么办。一种是 我每隔一段的时间对down掉的节点看一下,如果好了,我就将他允许他当备胎。

现在看看redis怎么做的

它提出了一种类型的人:哨兵,他的的职责如下

  • 监控。他负责检查缓存和备胎的健康情况
  • 通知。他监控出现异常的时候,可以通知管理员,或者其他程序。
  • 自动故障恢复。当缓存不可以时,在备胎请求缓存的时候启动一个故障恢复的进程,当client使用缓存的时候就会被通知,你要换个备胎来用了。
  • 配置提供者。client不能直接的访问缓存,需要先问一下这哥们我应该访问那个缓存。

针对上面的四个问题,看看redis是怎么做的

1 我怎么判断缓存服务不可用

他提出了一个阈值的概念 quorum ,当且仅当这两个条件满足时,才能确定一个缓存不可用

  • 有几个哨兵同意当前缓存不可用
  • 为了找到一个哨兵启动故障恢复的进程,哨兵们需要选举一个领导,由他来执行这个操作。

这个就有点坑爹了,如果是这样部署的缓存服务

  • server001 master soilder01
  • server002 replica1 soilder02

阈值设置的是1 ,当soilder02说 master不能使了,ok满足第一个条件,那第二个条件是找到一个哨兵来启动故障恢复程序,就剩一个soilder,还怎么选举,还需要选举吗

当然这种情况可以认为的避免,比如可以将哨兵也可以安排在client里

  • server001 master soilder01
  • server002 replica1 soilder02
  • server003 client1 soilder03
  • server004 client2 soilder04

我把阈值设置为 1,就可以解决这个问题。

2 当缓存不可用的时候,我怎么通知到所有使用缓存服务的客户端,现在你访问的这个有问题,你应该访问另外一个好的

客户端通过哨兵来间接的访问缓存服务。这样做的弊端就是增加了一层网络消耗。本来我直接访问缓存拿到数据了,现在我需要问一下哨兵,现在的缓存地址是啥,我再根据这个地址访问缓存服务。

3 备份的缓存服务存储的数据怎么和正在使用的缓存服务存储的数据保持一致

当备胎和缓存master连上时,master负责备胎和自己保持一致性。

4 当我down掉的节点可以重新提供使用,怎么能加入到缓存,当做备胎使用

当备胎和缓存master连上时,master负责备胎和自己保持一致性。

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

推荐阅读更多精彩内容