redis3.x cluster设计

2024-08-23 19:18
文章标签 设计 cluster redis3

本文主要是介绍redis3.x cluster设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

redis3.x cluster》

前言

redis集群后,我们就需要一种数据路由算法将不同key分散存储到不同的redis节点内,通常的做法是获取某个key的hashcode,然后mod,不过这种做法无法很好的支持动态伸缩性需求,一旦节点的增或者删操作,都会导致key无法在redis中命中,所以在redis3.x之前,基本上都是采用编写一致性hash算法实现redis的集群,但是redis3.x正式支持cluster后,却采用的是hash slot(hash槽)。

redis集群中一共内置了16384个哈希槽,当set操作时,redis先对key使用crc16验证出一个结果,然后把结果对mod 16384,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。这样做的好处很明显,当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。

目录

一、redis的下载与编译;

二、集群安装所需外围插件;

三、redis集群部署;

四、验证redis集群以及HA;

五、 重新指定redis集群的分片规则 ;

六、集群节点的伸缩调整;

七、jediscluster API的使用;

八、注意项;

九、推荐阅读;

一、redis的下载与编译

redis的官网下载地址 http://redis.io/ ,笔者本章博文所使用的版本为redis3.0.7正式版,为了避免出现一些无法预估的错误或不一致的情况出现,建议大家使用和笔者一样的版本。或者直接使用下述命令执行redis的下载和编译,如下所示:

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
$ tar -zvxf redis-3.0.7.tar.gz
$ cd redis-3.0.7
$ make

当成功执行编译命令后,redis的二进制代码包含在/src目录下。

二、集群安装所需外围环境

redis集群需要ruby的一系列环境支持,因此我们需要安装一些ruby环境,如下所示 :

$ yum install ruby
$ yum install rubygems
$ gem install redis

首先下载并安装ruby环境,然后是rubygems组件,最后是redis接口。在此大家需要注意,如果如法下载安装redis.gem,则可能gem服务器无法连接,手动下载安装即可,推荐地址 http://download.csdn.net/download/menggucaoyuan/8487967 。

手动安装,如下所示:

gem install -l ./redis-3.0.0.gem

三、redis集群部署

笔者的redis在安装地址在/usr/local/redis/redis-3.0.7,那么在/usr/local/redis/目录下,笔者新建了如下9个目录,如下所示:

$ mkdir redis7000 redis7001 redis7002 redis7003 redis7004 redis7005 redis7006 redis7007 redis7008

然后将/usr/local/redis/redis-3.0.7/redis.conf拷贝至上述9个新建目录中,并逐个修改每一个redis节点的redis配置项,如下所示:

port 每一个redis实例端口
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

上述文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

在此大家需要注意,要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。笔者本章博文所使用的是9个节点,其中3个主节点,每一个主节点有2个从节点。

当配置完成后,使用如下命令启动每一个redis节点,如下所示:

redis-server redis.conf

当每一个节点都成功启动之后,最后再使用命令创建redis集群,如下所示:

./redis-trib.rb  create --replicas 2 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008

上述命令用于创建一个新的集群, 选项–replicas 2 表示我们希望为集群中的每个主节点创建2个从节点。之后跟着的其他参数则是这个集群实例的地址列表,3个master,6个slave。 redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:

[OK] All 16384 slots covered

这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。

四、验证redis集群以及HA

当成功启动redis集群后,我们可以尝试使用如下命令登录redis客户端验证redis集群,如下所示:

$ ./redis-cli -c -p 7000
$ cluster nodes

当成功执行上述命令后,将会输出:

上述集群信息显示为3个master,6个slave,采用1主2从,一共9个节点。在此大家需要注意,redis集群中如果超过半数以上的master节点不可用,意味着整个集群节点不可用。

假设我们在某一个master上set一个数据,然后kill掉这个进程,它的slave节点会接管并成为新的master,当集群中挂了3个节点后,redis会将集群进行调整,变化为1主1从,还是3个master节点,并由新的master接替之前down机的数据,这样做的好处是可以避免重新分配hash slot,如下所示:

五、重新指定redis集群的分片规则

重新分片操作基本上就是将某些节点上的哈希槽移动到另外一些节点上面, 和创建集群一样, 重新分片也可以使用 redis-trib 程序来执行一次重新分片操作。在此大家需要注意,重新分片并不会对正在运行的集群程序产生任何影响。执行分片命令,如下所示:

./redis-trib.rb reshard 127.0.0.1:7000

我们只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。当执行重新分片命令后,会提示究竟移动多少个hash槽,这里假设我们需要移动1000个hash槽,就输入1000。接下来就要输入希望将这些hash槽移动到哪一个master的id上,最后需要指定将哪些节点上的hash槽移动到之前指定的目标master上,如果输入all就会从其他所有的master上取一些哈希槽移动到目标master上。

最后确认后你将会看到每个redis-trib移动的槽的信息,每个key的移动的信息也会打印出来。在重新分片的过程中,你得例子程序是不会受到影响的,你可以停止或者重新启动多次。在重新分片结束后你可以通过如下命令检查集群状态,如下所示:

./redis-trib.rb check 127.0.0.1:7000 

六、集群节点的伸缩调整

redis集群节点的伸缩性调整主要指的是动态向集群中添加master或者slave节点,或者移除master或者slave节点。假设在现有的集群节点中新增加一个master节点,使用如下命令:

./redis-trib.rb add-node 127.0.0.1:7009 127.0.0.1:7000

由于新加的master节点还没有分配任何的hash槽,因此还需要对这个master分配hash槽操作。当然出了添加master节点万,我们还可以向集群环境中添加slave节点,使用下述命令往集群节点中新增一个slave节点,如下所示:

./redis-trib.rb add-node --slave 127.0.0.1:7010 127.0.0.1:7000

此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。当然我们可以通过下面的命令指定主节点:

./redis-trib.rb add-node --slave --master-id be50d14dca84586054196c867f52bc05a5261561 127.0.0.1:7010 127.0.0.1:7000

对于移除集群环境中的master或者slave节点,可以使用下述命令:

./redis-trib.rb del-node 127.0.0.1:7000 `<node-id>`

第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上。


这篇关于redis3.x cluster设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100262

相关文章

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

开题报告中的研究方法设计:AI能帮你做什么?

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 大家都准备开题报告了吗?研究方法部分是不是已经让你头疼到抓狂? 别急,这可是大多数人都会遇到的难题!尤其是研究方法设计这一块,选定性还是定量,怎么搞才能符合老师的要求? 每次到这儿,头脑一片空白。 好消息是,现在AI工具火得一塌糊涂,比如ChatGPT,居然能帮你在研究方法这块儿上出点主意。是不

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激

分布式文件系统设计

分布式文件系统是分布式领域的一个基础应用,其中最著名的毫无疑问是 HDFS/GFS。如今该领域已经趋向于成熟,但了解它的设计要点和思想,对我们将来面临类似场景 / 问题时,具有借鉴意义。并且,分布式文件系统并非只有 HDFS/GFS 这一种形态,在它之外,还有其他形态各异、各有千秋的产品形态,对它们的了解,也对扩展我们的视野有所俾益。本文试图分析和思考,在分布式文件系统领域,我们要解决哪些问题、有