文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

小编给大家分享一下node中如何使用redis集群功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

名词解释--集群

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

redis集群要求

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

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

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

mac 环境下搭建本地redis集群

1. 下载安装redis

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

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

2. 通过redis配置集群环境

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

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

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

创建六个服务配置文件

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

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

修改配置文件

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

cd /opt/homebrew/etc/ # 进入配置文件目录
cp redis.conf redis/cluster/7000/7000.conf
code redis/cluster/7000/7000.conf # 用编辑器打开或者用vim打开配置文件来进行修改
# Redis端口号(7000-7005每个配置文件都要修改)
port 7000  

# 开启集群模式运行
cluster-enabled yes   

# 集群内部配置文件配置文件路径,默认nodes-6379.conf(7000-7005每个配置文件都要修改)
cluster-config-file nodes-7000.conf 

# 节点间通信的超时时间
cluster-node-timeout 5000  

# 数据持久化
appendonly yes
cd /opt/homebrew/etc/redis/cluster # 进入配置文件目录

cp 7000/7000.conf 7001/7001.conf
cp 7000/7000.conf 7002/7002.conf
cp 7000/7000.conf 7003/7003.conf
cp 7000/7000.conf 7004/7004.conf
cp 7000/7000.conf 7005/7005.conf

注意:每个配置文件必需配置不一样的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/sh
redis-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/sh
redis-cli -p 7000 shutdown &
redis-cli -p 7001 shutdown &
redis-cli -p 7002 shutdown &
redis-cli -p 7003 shutdown &
redis-cli -p 7004 shutdown &
redis-cli -p 7005 shutdown &

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

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

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

4. 相关命令

redis-cli -p 7000 # 单个客户端启动
redis-server 7000/7000.conf  # 启动单个服务端
redis-cli -p 7000 shutdown # 关闭服务端
sudo chmod +x start.sh # 开启脚本执行权限

# 设置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

cluster nodes #查看集群节点情况(进入某个客户端执行)
cluster info #查看集群信息(进入某个客户端执行)

查看所有key值:keys *

删除指定索引的值:del key

清空整个 Redis 服务器的数据:flushall 

清空当前库中的所有 key:flushdb

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

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

// redis.js
const Redis = require("ioredis");

const cluster = new Redis.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 队列)

import Queue from 'bull'
// 创建redis队列实例
const instance = new Queue('custom', {
  prefix : '{myprefix}',
  createClient(type) {
    // cluster 集群实例同上
    return cluster
  }
})

// 添加数据到redis队列(生产者)
instance.add(
  'request', 
  { 
    ...params
  },
  {
    removeOnComplete: false
  }
).catch(e => {
  console.error(e)
})

// 消费者回调
instance.process('request', 5, async (job, done) => {
  console.log('获取当前消费的数据:', job.data)
  // 执行异步操作
  await new Promise((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 -p 7000
127.0.0.1:7000> flushall
127.0.0.1:7000> cluster reset
127.0.0.1:7000> exit

# 使用find找到rdb和aof文件(也在rdb目录下)
find /opt/homebrew -name dump.rdb

# 重新执行创建语句成功
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

以上是“node中如何使用redis集群功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯