ノードでredisクラスター機能を使用するにはどうすればよいですか?次の記事では、node に基づいた Redis クラスター構成について詳しく説明します。
nodejs
での redis
クラスター関数の使用については、比較的完全な情報が見つかりませんでした。記事を読んで理解できたので、私も開発やデバッグの過程でかなり寄り道をしました。
この記事では、ローカルで Redis クラスターを構築する方法、クライアント上でクラスターを使用する方法、および構築プロセス中に発生する問題とエラーを要約して説明します。次回も利用します 必要に応じて寄り道をさせていただき、開発や作業の効率化を図ります。 クラスターを使用する背景: Redis シングルトン モードでは、ユーザー数と訪問数の増加に伴い、qps 値が急激に上昇し、大量の
io操作により、ある瞬間に一定量の占有が発生する cpu (100%)
がいっぱいになると、いつでもダウンタイムが発生するリスクがあります 同時に、redis などのバッチ処理症状を治療するだけで根本原因は治療しないため、 サーバー パフォーマンスのボトルネックを突破できません。したがって、クラスター ソリューションを使用するか、Redis インスタンスを追加することが不可欠です。
用語の説明 - クラスター
バックアップに使用できるため、いずれかのマシンが壊れた場合でも、システム全体が復旧できます。まだ正常に機能しています。実行します。 (redis3.0 より前は、 Sentinel モードが一般的に使用されていましたが、 Sentinel の構成は若干複雑で、パフォーマンスと高可用性は平均的です ) redis クラスターの要件
投票フォールト トレランス メカニズムでは、ノードの半分以上がノードがダウンしていると認識する必要があるため、ノードはダウンしているため、2 つのノードでクラスターを形成することはできません。 Redis クラスターには少なくとも 3 つのノードが必要です。 クラスターの高可用性を確保するには、各ノードにスレーブ ノード (つまり、バックアップ ノード) が必要であるため、Redis
クラスターには少なくとも 6 台のサーバーが必要です。 (3 つのマスターと 3 つのスレーブ、3 つのデポジットと 3 つの取得、高可用性、バックアップ) もちろん、ローカルでデバッグするときにこれほど多くのサーバーを使用することは不可能です。ローカルでの実行をシミュレートする 6 redis
実際、運用環境での Redis クラスターのセットアップは基本的にここと同じです。 Mac 環境でローカル Redis クラスターを構築する
#安装 brew install redis #启动 redis-server #进入redis客户端 redis-cli
2. redis を使用してクラスター環境を構成する
brew list redis
cd /opt/homebrew/Cellar/redis/6.2.4
open . Use
Xcode.app を開きます。つまり、次のように
redis.conf がある場所を見つけることができます。
##6 つのサービス構成ファイルを作成します
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
ディレクトリ上に作成した redis/cluster/7000 にコピーして変更するだけです。手順は次のとおりです。
最初に構成ファイルをコピーして変更します
cd /opt/homebrew/etc/ # 进入配置文件目录 cp redis.conf redis/cluster/7000/7000.conf code redis/cluster/7000/7000.conf # 用编辑器打开或者用vim打开配置文件来进行修改
7000.conf#を入力します##その後、次のプロパティを変更します# 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
7001.conf-7005.conf
ポートおよびクラスタ構成ファイルの属性各構成ファイルの#構成ファイルのディレクトリは、
コマンド ## で見つけることができます。 #3. クラスターサービスの起動と停止
##6 つのサービスを設定しているため、1 つずつ起動または停止することはできません。シェルを使用する必要があります。これを実現するためのスクリプト 进入 执行 执行 注意: 第一次执行./start.sh需要通过 Redis.Cluster提供了在多个Redis节点上自动分片的功能,使用前面搭建好的六个redis服务器,然后在本地启动 使用 替代集群的方案:在不需要数据同步和数据迁移的情况下,可以在客户端使用多个 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语句失败? 执行语句: 提示错误: 原因:执行创建语句时,没有清空数据和重置集群 处理:清空数据和重置集群, 清除rdb和aof文件 参考清除redis数据 https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working redis集群在客户端的使用是非常简单的,相比之下服务端的配置会比较繁琐。 客户端的具体使用只做了一下简单的说明,使用过程中要注意redis数据的同步和迁移等问题。 使用集群虽然能提升服务能力、支持主从复制、哨兵模式、读写分离、平分服务器的压力等特点。但不具备自动容错和恢复功能,如果出现宕机会使部分读写请求失败,降低了系统的可用性。在使用时根据业务情况分析、选择不同的方案。 本文转载自:https://juejin.cn/post/7079928963107127327 作者:tager 更多node相关知识,请访问:nodejs 教程! 以上がノードでのRedisクラスター機能の使い方を詳しく見る【詳細設定】の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。/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服务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 框架接入集群
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
集群时存在问题: 每次有数据push
到redis
队列时对应的回调函数可能会触发多次,目前无法确定是使用的问题还是框架本身的问题(如果有了解的欢迎大家留言告知)。redis
实例,结合Math.random()
使数据平分到其中的一个redis
,从而解决了单个实例硬件(cpu
等)瓶颈的问题。问题处理
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
# 以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
结语