Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群

作者丨轩辕之风O

来源丨编程技术宇宙(ID:xuanyuancoding)

Redis的新烦恼

你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。

自从上次被拉入群聊之后,我就从一个人单打独斗变成了团队合作,在小伙伴们的共同努力下,不仅有主从复制可以数据备份,还有哨兵节点负责监控管理,我现在也可以拍拍胸脯说我们是高可用服务了!

但是,幸福的日子没过太久,我们就笑不起来了。

不知道是我们的工作太出色,还是业务发展太快,程序员们对我们养成了依赖,什么都往我们这里写,数据量越来越大,我们承受了这个年纪不该有的压力~

虽然有主从复制+哨兵,但只能解决高可用的问题,解决不了数据量大的问题!

因为咱们看起来人手多,但都是存储的全量数据,所以对于数据容量提升并没有什么帮助。

集群时代

这一天,我找到了大白和小黑,咱们仨合计了一下,一个节点的力量不足,但众人划桨可以开大船啊,我们决定把三个人的内存空间“”起来,每个人负责一部分数据,合体进化成一个大的缓存服务器,进入集群Cluster时代!

集群,集群,首要问题当然是团队建设啦!我们得想一套办法来组建团队,还要考虑到以后可能会扩容,会有新的伙伴加入我们,我们仨憋了半天,抄袭人家TCP的三次握手,也搞了一个握手协议出来。

想要加入集群,得有一个介绍人才行。通过团队里的任何一个成员都行,就比如说我吧,只要告诉我IP和端口,我就给他发送一个MEET信息,发起握手,对方得回我一个PONG信息同意入伙,最后我再回他一个PING信息,三次握手就完成了!

然后,我再把这件事告诉团队中其他成员,新的伙伴就算正式成为我们的一份子了。

第二件很重要的事情就是要解决数据存储的公平问题,不能旱的旱死,涝的涝死,我们争论了很久,最后决定学习人家哈希表的方法。

我们总共划分了16384个哈希桶,我们把它叫做槽位Slot,程序员可以按照我们能力大小给我们各自分配一部分槽位,比如我们团队:

我:0-4000

大白:4001-9000

小黑:9001-16383

我比较菜,只分到了4000个,小黑老哥最辛苦,要负责7000+个槽位,正所谓能力越大,责任越大,谁叫他内存空间最大呢。

数据读写的时候,对键值做一下哈希计算,映射到哪个槽,就由谁负责。

为了让大家的信息达成一致,启动的时候,每个人都得把自己负责的槽位信息告诉其他伙伴。

一共有一万多个槽,要通知其他小伙伴,需要传输的数据量还挺大的,后来我们仨又商量了一下,为了压缩数据空间,每个槽位干脆就用一个bit来表示,自己负责这一位就是1,否则就是0,总共也才16384个bit,也就是2048个字节,传输起来轻便快捷,一口气就发送过去了。

struct clusterNode {// ...unsigned char *slots[16384/8];// ...
};

这样传输的数据是轻量了,但真正工作的时候还是不方便,遇到读写数据的时候,总不能挨个去看谁的那一位是1吧。

干脆一步到位,用空间换时间,我们又准备了一个超大的数组来存储每个槽由哪个节点来负责,通过上面的方式拿到信息后,就更新到这里来:

struct clusterNode *slots[16384];

这样一来,遇到数据访问的时候,我们就能快速知道这个数据是由谁来负责了。

对了,这16384个槽位必须都得有人来负责,我们整个集群才算是正常工作,处于上线状态,否则就是下线状态。

你想啊,万一哪个键值哈希映射后的槽位没人负责,那该从哪里读,又该写到哪里去呢?所以我们要工作,一个槽都不能少!

集群数据的访问

数据分派的问题解决了,我们团队总算可以正式上线工作了!

和原来不同的是,数据读写的时候多了一个步骤:得先检查数据是不是由自己负责。

如果是自己负责,那就进行处理,不然的话,就要返回一个MOVED错误给请求端,同时把槽号、IP和端口告诉他,让他知道该去找谁处理。嘿嘿,这个MOVED我们也是抄袭的HTTP中的302跳转~

不过程序员们是感知不到的,他们都是用封装好的库来操作,才不会亲自写代码来跟我通信呢~

一开始的工作很顺利,但没过多久就出事儿了!

随后我们开始了数据迁移,还把这一套流程标准化了,留着为以后新入伙的朋友分配数据。

经过一段时间的磨合,我们集群小分队配合的越来越默契。

不过光靠咱们仨还是不行,万一哪天有人挂了,整个集群就得下线了!咱们三个每人至少得有一个backup才行!

于是我找到了原来的一帮小弟,让他们也加入我们,继续给我们当起了从节点,平时当我们的backup,从我们这里复制数据,一旦我们遇到故障,他们就能快速顶上。

有了集群工作+主从复制,我们现在不仅高可用,数据容量也大大提升了,就算以后不够用了也有办法扩容,我们又过上了舒服的日子~

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

近期精彩内容推荐:  

 几句话,离职了

 中国男性的私密数据大赏,女生勿入!

 为什么很多人用“ji32k7au4a83”作密码?

 一个月薪 12000 的北京程序员的真实生活 !

在看点这里好文分享给更多人↓↓

我拍了拍Redis,被移出了群聊···相关推荐

  1. 我拍了拍 Redis,没想到被移出了群聊......

    作者 | 轩辕之风O 来源 | 编程技术宇宙(ID:xuanyuancoding) Redis的新烦恼 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上. 自从上次被拉入群聊之后( ...

  2. 拍一拍:“你拍一,我拍一”,共创沙雕小气息

    最近,微信群冒出很多"拍了拍"的提示,到底是拍啥呢? 打开一看,哈哈哈哈,多少沙雕事,都在笑谈中. "拍一拍"的沙雕知多少. 一个"拍一拍" ...

  3. pyqt怎么给字体加粗_微信拍一拍可设置后缀?怎么用?还有更多新功能!

    阅读本文前,请您先点击上面的蓝色字体,再点击"关注",这样您就可以继续免费收到文章了.每天都有分享,完全是免费订阅,请放心关注. 注:本文转载自网络,如有侵权,请联系删除谢谢. 微 ...

  4. 阿里 P8 员工招聘私人助理被辞退;微信上线「拍一拍」功能;FreeBSD 11.4 释出 | 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

  5. 微信撤回软件安卓版_微信拍一拍撤回软件下载

    微信拍一拍撤回软件带给大家,微信拍一拍是微信上线的一个通过双击好友头像来拍一拍对方的趣味功能,专注于提高和好友之间的趣味交流. 微信拍一拍怎么撤回 8-12日,应广大用户的要求,微信终于更新了全新版本 ...

  6. android微信如何禁用拍一拍,微信拍一拍怎么关闭? 微信拍一拍的玩法

    微信又偷偷添加了"拍一拍"功能,很多已经将微信更新到最新版本的朋友一定发现了新功能拍一拍,不用每次卑微的问对方"你在吗"那么怎么使用呢?那么不想使用这个新功能的 ...

  7. 微信“拍一拍”功能只为好玩?我却看到微信如芒在背,害怕什么?

    最近微信上线一个新功能"拍一拍",官方并没有对此做出介绍,不过被网友玩得不亦乐乎. 所谓的"拍一拍",就是你在一个聊天窗口(群聊和私聊都可以),双击对方头像就会 ...

  8. 微信新出“拍一拍”功能,快被大家玩坏了,你会吗?

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 今天,腾讯微信发布最新的安卓内测版 7.0.16 更新. 从微信 7.0.15 开始,其暗黑模式可以独立设置了.微信安卓版 7.0.14 ...

  9. 别在微信「拍来拍去」了,这些“隐藏”新功能才真香!

    码个蛋(codeegg) 第 997 次推文 作者丨套路编辑部 来源丨运营研究社(ID: U_quan) iOS 可以修改微信号了!!!(此处需要三个感叹号) 我被姐妹们嘲笑了一百年的微信号,终于可以 ...

  10. antd 动态添加表单_ZooTeam 拍了拍你,来看看如何设计动态化表单

    ? 这是第 58篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队关注我们吧- 本文首发于政采云前端团队博客:ZooTeam 拍了拍你,来看看如何设计动态化表单 https://www.z ...

最新文章

  1. Windows 7 操作系统核心文件
  2. mysql查询哪天,Mysql日期查询的详细介绍
  3. 比特币多重签名机制使用篇
  4. cloudera manager 及CDH卸载
  5. C语言 sizeof 和 strlen 函数区别 - C语言零基础入门教程
  6. 头脑风暴算法代码_混乱的头脑导致混乱的代码
  7. 全国计算机考试一级在线模拟,2017全国计算机一级考试模拟
  8. XMLHttpRequest.overrideMimeType()
  9. 给你出道题---最佳组合问题
  10. 在linux中docker安装mysql_Linux系统:用docker安装mysql。
  11. iOS原生APP和H5交互-delegate和第三方
  12. paip.提升用户体验----表格显示及控件布局错乱的问题
  13. 数学分析 函数的连续性(第4章)
  14. 越狱开发笔记(三)——非越狱App砸壳
  15. 获取当前时间戳的方法
  16. 中文计算机期刊影响因子排名,最新计算机类中文核心期刊影响因子排名
  17. 充电器类型检测实现代码分析
  18. VC,Http库(get,post,upload(File))
  19. 解决Error: ENOENT: no such file or directory, scandir
  20. 基于Java+MySQL 实现(Web)日程管理系统【100010222】

热门文章

  1. 在ArcCatalog中通过图标来认识ArcGIS中的数据
  2. 【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现
  3. 马尔可夫链 以及 隐马尔可夫模型(HMM)
  4. 利用Matlab求解Stewart并联机构位置正解,方法为牛顿迭代法
  5. 超好用的数学公式识别软件mathpix!
  6. 【图像分割】最大类间方差法(otsu)图像分割
  7. 图像处理算法:最大类间方差法
  8. 计算机本地组策略编辑器在哪里,win7系统本地组策略编辑器在哪的操作方法
  9. java输出 JButton,Java JButton用法
  10. 机器人——人类工作和生活的助手(科普)