node​中如何使用redis集群功能(node,redis,web开发)

时间:2024-05-09 16:22:08 作者 : 石家庄SEO 分类 : web开发
  • TAG :

名词解释--集群

集群一般是指服务器集群,区别于分布式系统,是将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。(在redis3.0之前一般使用的都是 哨兵模式,但 哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般)

redis集群要求

由于投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群,因此Redis集群至少需要3个节点。

要保证集群的高可用、需要每个节点都有从节点(也就是备份节点),所以Redis集群至少需要6台服务器。 (三主三从、三存三取、高可用、可备份)

当然,我们在本地调试时不可能用这么多服务器,因此我们可以在本地模拟运行6个redis实例,事实上生产环境的Redis集群搭建和这里基本上一样。

mac 环境下搭建本地redis集群

1. 下载安装redis

可以在官网选择安装,也可以用命名行安装

#安装brewinstallredis#启动redis-server#进入redis客户端redis-cli

2. 通过redis配置集群环境

首先要找到redis配置文件的位置

  • brew list redis # 查看redis安装的位置

  • cd /opt/homebrew/Cellar/redis/6.2.4 # 根据位置进入版本号所在的文件夹

  • open . # 打开文件夹

  • Xcode.app打开homebrew.mxcl.redis.plist, 即可找到redis.conf所在的位置,如下所示:

node​中如何使用redis集群功能

node​中如何使用redis集群功能

创建六个服务配置文件

cd /opt/homebrew/etc/(上一步找到的配置文件目录)

#需要在/opt/homebrew/etc/路径下mkdir-predis/cluster/7000mkdir-predis/cluster/7001mkdir-predis/cluster/7002mkdir-predis/cluster/7003mkdir-predis/cluster/7004mkdir-predis/cluster/7005

修改配置文件

/opt/homebrew/etc/redis.conf路径下的配置文件不用去修改, 只要将其copy到上面创建的 redis/cluster/7000目录下,然后再修改,步骤如下

  • 先复制一份配置文件修改

cd/opt/homebrew/etc/#进入配置文件目录cpredis.confredis/cluster/7000/7000.confcoderedis/cluster/7000/7000.conf#用编辑器打开或者用vim打开配置文件来进行修改
  • 进入到7000.conf后,修改以下属性

#Redis端口号(7000-7005每个配置文件都要修改)port7000#开启集群模式运行cluster-enabledyes#集群内部配置文件配置文件路径,默认nodes-6379.conf(7000-7005每个配置文件都要修改)cluster-config-filenodes-7000.conf#节点间通信的超时时间cluster-node-timeout5000#数据持久化appendonlyyes
  • 将7000.conf复制到每个redis服务的目录下

cd/opt/homebrew/etc/redis/cluster#进入配置文件目录cp7000/7000.conf7001/7001.confcp7000/7000.conf7002/7002.confcp7000/7000.conf7003/7003.confcp7000/7000.conf7004/7004.confcp7000/7000.conf7005/7005.conf
  • 再修改7001.conf-7005.conf每个配置文件的port和cluster-config-file属性

注意:每个配置文件必需配置不一样的port和cluster-config-file值(否则集群不会生效),上面是以端口区分。

通过find /opt/homebrew -name nodes-7000.conf命令可查找到该配置文件的目录


3. 启动和停止集群服务

由于我们配置了6个服务,因此不可能一个一个的启动或停止,需要借助shell脚本来实现

进入/opt/homebrew/etc/redis/cluster目录,创建start.sh和stop.sh文件

#start.sh文件#!/bin/shredis-server/opt/homebrew/etc/redis/cluster/7000/7000.conf&redis-server/opt/homebrew/etc/redis/cluster/7001/7001.conf&redis-server/opt/homebrew/etc/redis/cluster/7002/7002.conf&redis-server/opt/homebrew/etc/redis/cluster/7003/7003.conf&redis-server/opt/homebrew/etc/redis/cluster/7004/7004.conf&redis-server/opt/homebrew/etc/redis/cluster/7005/7005.conf&#stop.sh文件#!/bin/shredis-cli-p7000shutdown&redis-cli-p7001shutdown&redis-cli-p7002shutdown&redis-cli-p7003shutdown&redis-cli-p7004shutdown&redis-cli-p7005shutdown&

执行./start.sh或者./stop.sh来启停服务

执行ps -ef |grep redis来查看已启动的redis服务

注意: 第一次执行./start.sh需要通过sudo chmod +x start.sh授权执行权限

4. 相关命令

redis-cli-p7000#单个客户端启动redis-server7000/7000.conf#启动单个服务端redis-cli-p7000shutdown#关闭服务端sudochmod+xstart.sh#开启脚本执行权限#设置redis主从关系(三主三从)redis-cli--clustercreate--cluster-replicas1127.0.0.1:7000127.0.0.1:7001127.0.0.1:7002127.0.0.1:7003127.0.0.1:7004127.0.0.1:7005clusternodes#查看集群节点情况(进入某个客户端执行)clusterinfo#查看集群信息(进入某个客户端执行)查看所有key值:keys*删除指定索引的值:delkey清空整个Redis服务器的数据:flushall清空当前库中的所有key:flushdb

客户端使用 ioredis 框架接入集群

Redis.Cluster提供了在多个Redis节点上自动分片的功能,使用前面搭建好的六个redis服务器,然后在本地启动node redis.js,就可以测试集群的效果了。ioredis

//redis.jsconstRedis=require("ioredis");constcluster=newRedis.Cluster([{port:7000,host:"127.0.0.1",},{port:7001,host:"127.0.0.1",},]);cluster.set("foo","bar");cluster.get("foo",(err,res)=>{//res==='bar'});

使用bull框架(redis 队列)

importQueuefrom'bull'//创建redis队列实例constinstance=newQueue('custom',{prefix:'{myprefix}',createClient(type){//cluster集群实例同上returncluster}})//添加数据到redis队列(生产者)instance.add('request',{...params},{removeOnComplete:false}).catch(e=>{console.error(e)})//消费者回调instance.process('request',5,async(job,done)=>{console.log('获取当前消费的数据:',job.data)//执行异步操作awaitnewPromise((resolve)=>resolve())done()})

使用bull框架连接ioredis集群时存在问题: 每次有数据pushredis队列时对应的回调函数可能会触发多次,目前无法确定是使用的问题还是框架本身的问题(如果有了解的欢迎大家留言告知)。

替代集群的方案:在不需要数据同步和数据迁移的情况下,可以在客户端使用多个redis实例,结合Math.random()使数据平分到其中的一个redis,从而解决了单个实例硬件(cpu等)瓶颈的问题。

问题处理

1、Mac系统下连接redis报错?

控制台错误提示:Could not connect to Redis at 127.0.0.1:6379: Connection refused

原因:服务端没有开启或启动失败

解决办法:需要先启动redis服务端redis-server

参考链接

https://blog.csdn.net/qq_23347459/article/details/104257529

2、客户端启动、读写报错?

错误提示:ClusterAllFailedError: Failed to refresh slots cache.

原因:每个服务下的配置文件中的cluster-config-file属性一致。

处理:修改成唯一的属性值

  • 参考链接1

    https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache

  • 参考2

    https://github.com/luin/ioredis/issues/711

3、执行创建主从redis语句失败?

执行语句:redis-cli --cluster create --cluster-replicas 1 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

提示错误:[ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

原因:执行创建语句时,没有清空数据和重置集群

处理:清空数据和重置集群, 清除rdb和aof文件

参考清除redis数据

https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working

#以7000端口的服务为例,7001-7005重复以下操作$redis-cli-p7000127.0.0.1:7000>flushall127.0.0.1:7000>clusterreset127.0.0.1:7000>exit#使用find找到rdb和aof文件(也在rdb目录下)find/opt/homebrew-namedump.rdb#重新执行创建语句成功redis-cli--clustercreate--cluster-replicas1127.0.0.1:7000127.0.0.1:7001127.0.0.1:7002127.0.0.1:7003127.0.0.1:7004127.0.0.1:7005
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:node​中如何使用redis集群功能的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python队列的练习题有哪些下一篇:

18 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18