redis之codis和redis cluster对比

news2025/4/21 0:55:56

写在前面

codis和Redis cluster 都是Redis的集群方案,本文就一起来看下。

1:codis的组件和架构

codis的组件有4个,如下:

codis server:基于redis进行了二次开发的组件,负责数据的读写
codis proxy:面向客户端,代理客户端访问codis server
zookeeper 集群:保存元数据,如数据路由表信息,codis proxy信息
codis dashboard,codis fe:codis dashboard提供维护codis server,codis proxy等功能,codis fe提供web界面,方便管理人员使用。

架构图如下:

在这里插入图片描述

2:codis工作原理

2.1:客户端如何获取codis proxy信息

客户端通过zookeeper集群获取codis proxy信息,如当前有3个codis proxy实例,则在客户端就可以随机选择一个codis proxy来访问,达到负载均衡的效果如下图:

在这里插入图片描述

如图中红框部分就是客户端获取codis proxy列表,当codis proxy有增减时客户端都能动态的通过zookeeper感知。

2.2:数据是如何分布的

我们在redis之分片集群 一文中分析了redis cluster的数据分布是通过16384个槽(slot)分配到各个redis实例节点完成的,codis的数据分布方案与之类似,不同之处在于槽slot的个数是1024,编号0~1023,分配的方式有手动分配和基于codis dashboard自动分配两种方式,分配完成后没有差异,都是一个codis server负责一批slot数据的读写,其中映射到codis server的过程是crc32(key)/1023,获取的结果就是槽号,而槽对应codis server,这样就能找到目标codis server了,这个寻找的过程可能如下图:

在这里插入图片描述

slot和codis server分配后的对应关系我们叫做路由表,路由表维护在zookeeper集群中,并且在codis proxy本地也会缓存一份,提高路由的性能,分配过程如下图:

在这里插入图片描述

2.3:codis proxy压力过大怎么办

因为客户端直连codis proxy,当客户端请求压力比较大时,可能处理不过来,此时需要增加codis proxy节点,然后在codis dashboard中配置即可,配置后信息会同步到zookeeper集群中,然后客户端就可以从zookeeper集群中获取最新的codis proxy列表了,这个过程如下图:

在这里插入图片描述

2.4:codis server压力过大怎么办

codis server实际就是redis实例,用来实际处理数据的读写请求,当其压力过大时,需要增加codis server节点,当增加节点后,信息会同步写到zookeeper中,然后codis proxy就可以获取最新的codis server列表信息,并缓存到本地了。但是,增加codis server的最大问题是数据迁移,数据迁移具体做法是:

1:随机选择一批slot分配给新codis server
2:针对每个slot循环执行如下操作
    1:选择slot中的一个key同步到新codis server,收到ACK后将该key从源codis server删除
    2:继续同步其他key,直到全部同步完成

以上同步一个slot的过程可能如下图:

在这里插入图片描述

当数据量较大,或存在一些bigkey时,数据迁移时间可能较长,当使用同步迁移时源codis server将无法处理数据的读写请求,降低codis的性能,为了解决这个问题codis提供另外一种数据迁移方式,即异步迁移。另外还有一个问题是对bigkey处理,bigkey因为较大,一次迁移完成可能会占用较多的宽带和CPU等资源,给服务器的稳定性造成隐患,因此对bigkey的迁移方式是通过将其拆分成一个个命令来迁移,即化整为零,如有一万个元素的key,先通过lpop从源codis server获取数据,然后发送命令rpush key value到新codis server,直到全部执行完成,并且这个过程中为了保证迁移的原子性,会给新codis server的key设置一个有效时间,这样如果是迁移过程中出现问题,数据也会自动删除,而迁移完成后只需要删除过期时间 就行了。

2.5:客户端需要重新开发吗?

codis proxy支持RESP协议,可以像访问一个普通的redis实例一样访问,所以不需要修改客户端代码,但是因为codis proxy是集群的,所以客户端需要有简单的负载均衡逻辑,即选择一个codix proxy来访问,当然,这个改动其实是不大的,因为只要动态的修改redis的数据源地址就可以了,业务代码丝毫不会受到影响。

2.6:集群的可靠性保证

2.6.1:codis proxy

是多实例的,且信息动态维护在zookeeper集群中,所以codis proxy组件是可靠的。

2.6.2:zookeeper

集群部署,只要有超过一半的节点正常,就可以正常提供服务,所以zookeeper组件是可靠的。

2.6.3:codis server

codis server本质上就是一个redis实例,将其配置主从的集群,然后通过哨兵 实现主节点故障时的主从切换,此时codis server组件也是可靠的。

3:codis VS redis cluster

codis大概是在2014年左右就发布的版本,提供了基于redis的集群功能,截止到写这篇文章,已经走了8年多将近九年的时间,而redis cluster是在redis3.0版本,大概是在2017年发布的,这部分我们就来对比下二者的优势和劣势,以及在实际应用中应该如何选择。

对比项codisredis cluster
可靠性可靠可靠
扩容支持支持
数据迁移同步迁移,异步迁移同步迁移
客户端兼容性兼容不兼容,需要支持cluster的客户端
组件数量不需要额外组件,只需要redis实例
成本组件多,成本高不需要额外组件,成本低
成熟度低于codis

写在后面

参考文章列表:

吃透Redis系列(九):Redis代理twemproxy和predixy详细介绍 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon图像拼接

图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 如按下图是将两张楼房图片拼接成一个图像。…

QT 学习笔记(九)

文章目录一、事件的接收和忽略1. 准备工作2. 接收和忽略二、event() 函数1. 简介2. 实例演示3. 总结三、事件过滤器四、总结(细看)1. 知识点汇总2. QT 的事件处理五、事件、事件的接收和忽略、event() 函数和事件过滤器代码1. 主窗口头文件 mywidget.h2.…

英语文本转语音软件哪个好?分享三个新手也能学会的工具

大家平时都是怎么学习英语的呢?课上老师让我们熟悉单词意思、巩固语法、多练阅读理解;其实通过练习听力来加强语感也很重要。很多小伙伴的阅读理解很好,但是听力却跟不上。这里教大家一个小技巧,就是在做阅读理解的时候&#xff0…

第十章TomCat详解

文章目录Tomcat的部署和启动Tomcat扮演的角色①对外:Web服务器②对内:Servlet容器深入理解为什么需要TomCat从目的开始出发遇到的问题总过程部署前提解压TomCat的目录文件启动Tomcat并访问首页如何部署一个项目访问对应的web资源专业版IDEA创建一个JavaW…

力扣(718.1143)补9.12

718.最长重复子数组 这题真的想不到。 看图的话会好懂很多。 class Solution { public int findLength(int[] nums1, int[] nums2) { int nnums1.length; int n2nums2.length; int[][] dpnew int[n1][n21]; int result0; for(int…

【区块链-智能合约工程师】第二篇:Solidity入门

文章目录Solidity极简入门HelloWorld数值类型三种函数类型函数输出变量作用域引用类型参考文章:一文速览2022十大智能合约开发工具 资料地址:WTF学院 Solidity极简入门 HelloWorld remix:在线智能合约开发IDE(Integrated Deve…

DBCO-PEG-Aminooxy, Aminooxy-PEG-DBCO,氨甲基聚乙二醇环辛炔

DBCO-PEG-Aminooxy , Aminooxy-PEG-DBCO,二苯并环辛炔-聚乙二醇-氨甲基,氨甲基聚乙二醇环辛炔 Product specifications: 1.CAS No:N/A 2.Molecular weightMV:1000,2000,34000&#x…

小侃设计模式(十八)-发布订阅模式

1.概述 发布订阅模式又叫观察者模式(Observer Pattern),它是指对象之间一对多的依赖关系,每当那个特定对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新,它是行为型模式的一种。观察者模式内部…

被吹爆的JVM笔记,一招教会什么是JVM调优,资深架构师强推!

面试经常被问 JVM 如何调优?这个问题该怎么回答?没有实际调优经验怎么办? 一般面试时问JVM调优,主要是因为,这个技术并不是懂了Java就能自然懂的,需要明白一些底层原理,有一些深度。所以比较适合…

传奇客户端文件介绍注解教程,GM必备知识

传奇客户端文件介绍注解教程,GM必备知识 很多朋友架设微端,或者说修改传奇版本素材方面的内容的时候对于客户端很懵逼! 尤其是新手朋友他并不知道传奇客户端里面哪个文件是对应什么内容的! 今天我们将这些发出来分享给支持奇速的朋…

高压放大器在IDE压电元件及其在仿生翼中的应用

实验名称:IDE压电元件及其在仿生翼中应用研究 研究方向:仿生学 测试目的: 优化IDE压电元件结构和组分出发,目的是为了获得大驱动位移、综合性能良好的IDE驱动件。着重研究IDE压电元件的力学和电学性能、驱动特性和在仿生翼上的集成…

LVGL学习笔记(一)--- 环境搭建

LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,可以高效地进行开发。 一.嵌入式设备的移植 L…

企业请体育冠军明星代言,为何要在年前邀请

行业形势好,要把握住消费升级的机会;行业调整时,要抓住结构性增长的机会。实力背书、冠军代言、让品牌成为品类创新,中小型这几个概念与品牌自身的卖点,每一个放在光中小型企业的品牌上都能独当一面,当一款…

C/C++ 内存分布---变量所在哪个内存区域以及变量所占空间大小是多少?

C/C内存区域划分: 变量所在哪个内存区域以及变量所占空间大小是多少? int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const …

基于JavaFX+Mysql实现(PC)足球联赛评分系统【100010048】

一、引言 1. 编写目的 本文档是概要设计文档的组成部分,编写数据库设计文档的目的是:明确数据库的表名、字段名等数据信息,用来指导后期数据库脚本的开发。本文档的读者对象是需求人员、系统设计人员、开发人员、测试人员。 2. ### 术语表 …

GPT3动口,RT-1动手,智能机器人开卷; 代码开源!

机器学习 (ML) 研究的多个子领域(例如计算机视觉和自然语言处理)的最新重大进展是通过一种共享的通用方法实现的,该方法利用大型、多样化的数据集和能够有效吸收所有数据的表达模型。尽管已经有各种尝试将这种方法应于机器人技术,…

绘制雪夜圣诞树并封装为小程序

绘制雪夜圣诞树并封装为小程序 使用turtle绘制一颗雪夜圣诞树,然后封装成exe小程序送给你的朋友吧! PS:只能在windows运行。 转载注明本文链接和作者 先看效果图: 绘制雪夜圣诞树 由于代码有三百多行,我放在下面的两…

Web前端105天-day45-DOM

DOM01 目录 前言 一、DOM 二、DOM树 三、class 总结 前言 DOM01学习开始 一、DOM DOM: Document Object Model 文档 : HTML代码 -- 超文本标记语言对象 : 网页真正显示的是 HTML 转换出来的 对象类型 -- document模型 : 固定的规则 -- 代表把 HTML代码 转 JS对象网页真…

Jmeter(十七):利用jmeter插件收集性能测试结果汇总报告和聚合报告,利用PerfMon插件收集监控服务器资源指标

利用jmeter插件收集性能测试结果 汇总报告(Summary Report ) 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍: 所有数据写入一个文件:保存测试结果到本地…

全产业链落实循环减碳实践 宝马在华持续推进绿色转型

作为率先推出“循环减碳”理念的汽车企业,宝马集团将循环经济理念贯彻到产品生命周期的各个阶段,并以“再思考、再精减、再利用、再回收”为指导原则,在产业链上下游不断壮大“循环减碳朋友圈”。“可持续发展是宝马集团的战略支点之一”&…