Redis高可用之3种集群方案对比
Redis集群方案使用建议:
- Redis cluster:除非是1000个节点以上的超大规模集群,优先考虑使用Redis cluster
- codis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis cluster
- twemproxy:不建议使用,与codis同为proxy方案,但不如codis(twemproxy不能平滑地扩容)
- 客户端分片:应当禁止使用,因为扩容复杂,如果2个服务同时读写,其中一个修改了路由,另一个不修改会有问题
其中客户端分片、Redis Cluster属于无中心化的集群方案,Codis属于中心化的集群方案。
是否中心化是指客户端访问多个Redis节点时:是直接访问还是通过一个中间层Proxy来进行操作,直接访问的就属于无中心化的方案,通过中间层Proxy访问的就属于中心化的方案,它们有各自的优劣。
一、客户端分片
我们只需要部署多个Redis节点,具体如何使用这些节点,主要工作在客户端。
客户端通过固定的Hash算法,针对不同的key计算对应的Hash值,然后对不同的Redis节点进行读写。
客户端分片需要业务开发人员事先评估业务的请求量和数据量,然后让DBA部署足够的节点交给开发人员使用即可。
1、优点
部署非常方便,业务需要多少个节点DBA直接部署交付即可,剩下的事情就需要业务开发人员根据节点数量来编写key的请求路由逻辑,制定一个规则,一般采用固定的Hash算法,把不同的key写入到不同的节点上,然后再根据这个规则进行数据读取。
2、缺点
是业务开发人员使用Redis的成本较高,需要编写路由规则的代码来使用多个节点,
如果事先对业务的数据量评估不准确,后期的扩容和迁移成本非常高,因为节点数量发生变更后,Hash算法对应的节点也就不再是之前的节点了。
3、一致性哈希
所以后来又衍生出了一致性哈希算法,就是为了解决当节点数量变更时,尽量减少数据的迁移和性能问题。
这种客户端分片的方案一般用于业务数据量比较稳定,后期不会有大幅度增长的业务场景下使用,只需要前期评估好业务数据量即可。
二、Redis Cluster方式
Redis cluster是官方支持的Redis集群方案:
- 去中心化架构,不依赖外部存储,每个节点都有槽位信息、以及一部分数据,各节点之间使用gossip协议交互信息
- 划分为16384个slot槽位,每个key按照分片规则,对key做crc16 % 16384得到slot id
- 每个Redis节点存储了一部分槽位数据,各个Redis节点共同分担16384个slot槽位
- 客户端需遵守Redis cluster规范读写数据,客户端连接集群时,会得到一份集群的槽位配置信息,客户端本地缓存了slot到node的映射关系,以便直接定位到对应的Redis节点
1、用key计算出slot
- 通过本地缓存的slot到node映射关系(某个slot范围映射到某个node),用slot得出node
- 请求对应的node节点,如果key对应的槽位在Redis节点存储的各槽位中,则查询结果
- 如果key对应的槽位不在Redis节点存储的各槽位中(即key所在的槽位不归该节点管理),则返回moved <节点> 提示客户端再次请求指定的节点,并更新本地映射关系
- 如果请求的key对应槽位正在迁移,则返回ask <节点> 提示客户端再次请求指定的节点
- 主库读写,从库用于高可用备份、一般不用来承担读请求:主从同步通过指令流、环形数组来做增量同步,通过RDB来做全量同步
2、优缺点
优点:
- 官方支持的集群方案,能使用最新feature
- 性能好,无多余网络开销
- 无一致性问题,读写请求都走主节点
- 槽位更精细,16384(2^14)相比于codis的1024
缺点:
- 如果是从旧版不支持集群的Redis升级而来,需做较大改造,把传统的Jedis client需替换成智能客户端来维护key到slot的映射关系,如lettuce
- 官方是最小使用原则,没有易用的扩容、迁移工具,需要寻找社区提供的易用界面,或自行研发
- 迁移过程中性能可能受影响,有3次请求:首次get得到ask返回、再次asking确认指定节点是否有槽位、最后get
3、请求转发
Redis Cluster没有采用中心化模式的Proxy方案,而是把请求转发逻辑一部分放在客户端,一部分放在了服务端,它们之间互相配合完成请求的处理。
Redis Cluster没有了中间的Proxy代理层,那么是如何进行请求的转发呢?
Redis把请求转发的逻辑放在了Smart Client中,要想使用Redis Cluster,必须升级Client SDK,这个SDK中内置了请求转发的逻辑,所以业务开发人员同样不需要自己编写转发规则,Redis Cluster采用16384个槽位进行路由规则的转发。
没有了Proxy层进行转发,客户端可以直接操作对应的Redis节点,这样就少了Proxy层转发的性能损耗。
Redis Cluster也提供了在线数据迁移、节点扩容缩容等功能,内部还内置了哨兵完成故障自动恢复功能,可见它是一个集成所有功能于一体的Cluster。因此它在部署时非常简单,不需要部署过多的组件,对于运维极其友好。
Redis Cluster在节点数据迁移、扩容缩容时,对于客户端的请求处理也做了相应的处理。当客户端访问的数据正好在迁移过程中时,服务端与客户端制定了一些协议,来告知客户端去正确的节点上访问,帮助客户端订正自己的路由规则。
三、Codis方案
codis是Go语言编写的Redis proxy集群方案:
codis-proxy作为上层proxy,负责路由请求至底层的Redis分片。client与proxy交互,可以把proxy当作普通的Redis实例一样,因为codis-proxy实现了Redis协议,API保持一致。
Redis分片是一个codis-group,包括了多个codis-server,其中有1个主节点、n个从节点,用来作读写分离,主节点承担写请求,从节点分摊读请求。各个分片的Redis实例是独立的,互不感知。codis-server与普通Redis实例的区别是,在Redis的基础上扩展实现了slot槽的功能,用于扩容、数据迁移。
- 分片规则:对key做crc32 % 1024
- 强依赖zookeeper,来存储节点槽位信息。
- codis-dashboard、codis-fe是集群运维工具。
1、优点
- 客户端无需感知背后细节,跟Redis单实例无明显区别(除部分命令不支持)
- 平滑扩容,运维操作简单,有易于使用的web界面
2、缺点
- 是在Redis官方未支持集群方案之前的可选方案,目前已停止更新
- proxy会带来额外的网络开销,请求链路多了一层
- 读写分离可能出现不一致的问题,也需要评估请求读写比
- 需要额外维护zookeeper
相关文章:

Redis高可用之3种集群方案对比
Redis集群方案使用建议: Redis cluster:除非是1000个节点以上的超大规模集群,优先考虑使用Redis clustercodis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis clustertwemproxy:不建…...

java 线程唤醒于阻塞的常用方法
1.分类描述 1.sleep() 休眠2.suspend() 暂停和 resume() 继续3.yield() 让步 就是我放弃本次执行,但继续排队,下一次有机会在执行。 4.wait() 和 notify() notifyAll() 注:这两个方法,属于Object类,而不属于Thread…...

面包多面包多面包多面包多面包多面包多
1.背景 1.摘要 本文是针对智慧政务中的文本数据挖掘应用的研究。通过建立基于三层网络结构的fastText文本分类模型,聚类量化模型,熵权评估模型解决了群众留言分类,热点问题挖掘,答复意见评价等问题。 针对群众留言分类问题&#…...

windows下Tomcat安装
目录 1.安装java环境 2.配置Tomcat环境变量 3.安装服务 4.启动前修改配置文件 (1)设置tomcat端口 (2)设置临时日志等文件夹的位置 5.放入应用 6.启动Tomcat服务 1.安装java环境 安装tomcat版本对应的JDK 比如:…...

4月17号软件资讯更新合集.....
CrateDB 5.3.0 发布,分布式 SQL 数据库 CrateDB 是一个分布式的 SQL 数据库,使得实时存储和分析大量的机器数据变得简单。CrateDB 提供了通常与 NoSQL 数据库相关的可扩展性和灵活性,最小的 CrateDB 集群可以轻松地每秒摄取数万条记录。这些…...

[java基础]面向对象(五)
访问控制修饰符:--------------保护数据的安全(隐藏数据、暴露行为),实现封装 public:公开的,任何类 private:私有的,本类 protected:受保护的,本类、派生类、同包类 默认的&…...

React应用(基于React脚手架)
目录 前言:一、使用create-react-app创建react应用1、什么是 react 脚手架?2. 创建 cli 脚手架方式13. 创建 cli 脚手架方式24. npx:5. react脚手架项目结构6. 功能界面的组件化编码流程(通用)7. 如何更改脚手架版本 二、React 组…...

Redis(03)List--附有示例
文章目录 reids-listBLMOVEBLMPOPBLPOPBRPOPBRPOPLPUSHLINDEXLINSERTLLENLMOVELMPOPLPOPLPOSLPUSHLPUSHXLRANGELREMLSETLTRIMRPOPRPOPLPUSHRPUSHRPUSHX reids-list 本文介绍了Redis中的表命令。LSET用于设置列表中指定索引位置的元素的值;LTRIM用于按照索引范围修剪…...

openEuler-linux下部署zabbix-超级详细
一、准备工作 下载:zabbix包 地址:下载Zabbix 准备2台openEuler-linux虚拟机: linux-1:当服务器端 IP地址:192.168.100.100 修改hosts文件 [rootzbx ~]# vim /etc/hosts 192.168.100.100 zbx.xx.cn linux-2&…...

nginx 简介 第四章
一、Nginx简介 1、Nginx简介 Nginx(特点:占用内存少,并发能力强) Nginx是一个高性能的 HTTP 和反向代理服务器。 Nginx是一款轻量级的 Web 服务器/反向代理服务器及电子邮件 单台物理服务器可支持30 000~50 000个并发…...

c++ float32 与 float16 互转
背景: 最近用到一块推理加速卡时,推理输入的数据是 float16 类型,而我们平常用到的数据是 float 类型,也就是 float32类型,这需要输入数据时float32 转 float16,解析输出数据时 float16 转 float。 参考&…...

Redis问题
一、认识Redis 1. 什么是 Redis? Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景&#…...

[API]ListList方法集合排序Lambda表达式(四)
List接口: 继承自Collection接口,List集合是可重复集合,并且有序,还提供了一套可以通过下标来操作元素的方法 常见的实现类: ArrayList:内部使用数组实现,查询性能更好(直接下标找到物理地址)、…...

【ChatGPT】无需魔法打开即用的 AI 工具集锦
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...

Choco-slover的使用
一. 相关资料 choco-slover github源代码以及工具下载网址:https://github.com/chocoteam/choco-solverchoco-slover 官网文档:https://choco-solver.org/choco-slover安装eclipse视频:https://www.youtube.com/watch?v=qz6ATkEI_F8视频所采用的资源网址:https://drive.go…...

亚马逊、ebay、temu如何提升产品点击率?测评自养号解析
产品点击率对于店铺销售额的影响至关重要,尤其是在竞争越来越激烈的市场环境中,想要有销量和转化,提高产品listing点击率成为了非常关键的一环。 1. 产品主图 顾客浏览产品时,第一眼看到的就是主图,一张优质的主图更容…...

人工智能的前沿信息获取之使用谷歌学术搜索
谷歌学术是谷歌公司开发的一款专门针对学术搜索的在线搜索引擎[4],谷歌学术的网址为https://scholar.google.com,界面如图 6‑1所示。使用谷歌学术搜索可以检索会议或者期刊论文。只需要在检索框中输入关键字,然后点搜索按钮即可,…...

PHP快速入门06-类型转换
文章目录 前言一、关于类型转换1.1 自动类型转换1.2 显式类型转换 二、15个常用类型转化示例2.1 将字符串转换为整型2.2 将整型转换为字符串2.3 将浮点型转换为整型2.4 将整型转换为浮点型2.5 将布尔型转换为整型2.6 将整型转换为布尔型2.7 将字符串转换为浮点型2.8 将浮点型转…...

Motion Planning学习笔记一:配置空间、图、图搜索、图遍历
学习高飞博士的路径规划课程所总结的学习笔记。 目录 1、配置空间(Configuration Space, C-space) 2、图(Graphs) 3、图搜索(Graph Search Basis) 3.1、总体框架 3.2、两种基本的图遍历算法 3.3、启…...

C语言中如何判断大小端字节序?
大小端(Endian)是指多字节整数在内存中存储的方式。在计算机中,一个多字节整数由多个字节组成,而不同的机器和处理器在存储多字节整数时会有两种不同存储方式,分别为大端字节序和小端字节序。 以一个4字节整数0x12345…...

用spring-boot-starter实现事务的统一配置
一、前言 微服务架构下,多个微服务都需要事务操作,如果在每个微服务下都从头配置事务,将非常繁锁。事务配置具有高度的一致性,可以抽取出来,制作starter,在需要配置事务的服务中引入starter依赖即可。 采用…...

C语言中fopen的详细用法
fopen是C语言中用于打开文件的函数,其原型为: FILE *fopen(const char *filename, const char *mode); 其中,filename是要打开的文件名,mode是打开文件的模式。fopen函数返回一个指向FILE类型的指针,该指针指向打开的…...

C语言——学生信息管理系统(数组)
文章目录 一、前言二、目的三、框架1.菜单1.1主菜单1.2子菜单 2.流程图2.1总流程图2.2开始流程图2.3增加学生信息流程图2.4.删除学生信息流程图2.5修改学生信息流程图2.6查询学生信息流程图2.7对学生信息排序流程图 3.思路 四、代码五、演示视频 一、前言 因为最近是在赶进度总…...

【C语言】基础语法1:变量和数据类型
下一篇:运算符和表达式 ❤️🔥前情提要❤️🔥 欢迎来到C语言基本语法教程 在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发…...

linux安装和使用jekins
Jenkins详细安装配置部署--超详细_jenkins安装部署_宝贝富贵猪的博客-CSDN博客 1.安装JDK 2.获取安装包 下载页面:https://jenkins.io/zh/download/ 或者Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 3.安装Jenkins sud…...

驼峰式匹配
问题: 如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。) 给定待查询列表 queries,和模式串 patte…...

第三十七章 立方体贴图总结
立方体贴图:将多个纹理组合起来映射到一张纹理上的一种纹理类型。 一个立方体贴图时包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面,相当于是一个有纹理的立方体。 创建立方体贴图: 首先需要生成一个纹理,将其绑定到纹理目标上,再做其他纹理操作。补充:绑定到…...

哈希(C++)
哈希 unordered系列关联式容器unordered_map介绍 底层结构哈希概念哈希冲突哈希函数哈希冲突解决方式闭散列开散列 模拟实现哈希表的改造 哈希应用位图概念实现 布隆过滤器提出概念 unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器&…...

Spring MVC 的调用(12)
目录 SpringMVC流程 源码分析 第一步:用户发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者…...

死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] args) { System.out.println("sleep .."); try { Thread.sleep(10000000); } catch (InterruptedException e) { e.printStackTrace(); } } } java -…...