ホームページ  >  記事  >  ウェブフロントエンド  >  ノードでのRedisクラスター機能の使い方を詳しく見る【詳細設定】

ノードでのRedisクラスター機能の使い方を詳しく見る【詳細設定】

青灯夜游
青灯夜游転載
2022-03-30 20:23:433736ブラウズ

ノードでredisクラスター機能を使用するにはどうすればよいですか?次の記事では、node に基づいた Redis クラスター構成について詳しく説明します。

ノードでのRedisクラスター機能の使い方を詳しく見る【詳細設定】

nodejs での redis クラスター関数の使用については、比較的完全な情報が見つかりませんでした。記事を読んで理解できたので、私も開発やデバッグの過程でかなり寄り道をしました。

この記事では、ローカルで Redis クラスターを構築する方法、クライアント上でクラスターを使用する方法、および構築プロセス中に発生する問題とエラーを要約して説明します。次回も利用します 必要に応じて寄り道をさせていただき、開発や作業の効率化を図ります。 クラスターを使用する背景: Redis シングルトン モードでは、ユーザー数と訪問数の増加に伴い、qps 値が急激に上昇し、大量の

io

操作により、ある瞬間に一定量の占有が発生する cpu (100%) がいっぱいになると、いつでもダウンタイムが発生するリスクがあります 同時に、redis などのバッチ処理症状を治療するだけで根本原因は治療しないため、 サーバー パフォーマンスのボトルネックを突破できません。したがって、クラスター ソリューションを使用するか、Redis インスタンスを追加することが不可欠です。 用語の説明 - クラスター

クラスターとは一般にサーバークラスターを指しますが、分散システムとは異なり、同じサービスを一緒に実行する多数のサーバーの集合です。一見すると、サーバーが 1 つしかないように見えます。クラスターは、

並列コンピューティング

に複数のコンピューターを使用して、非常に高い計算速度を実現できます。また、複数のコンピューターを

バックアップに使用できるため、いずれかのマシンが壊れた場合でも、システム全体が復旧できます。まだ正常に機能しています。実行します。 (redis3.0 より前は、 Sentinel モードが一般的に使用されていましたが、 Sentinel の構成は若干複雑で、パフォーマンスと高可用性は平均的です ) redis クラスターの要件

投票フォールト トレランス メカニズムでは、ノードの半分以上がノードがダウンしていると認識する必要があるため、ノードはダウンしているため、2 つのノードでクラスターを形成することはできません。 Redis クラスターには少なくとも 3 つのノードが必要です。

クラスターの高可用性を確保するには、各ノードにスレーブ ノード (つまり、バックアップ ノード) が必要であるため、

Redis

クラスターには少なくとも 6 台のサーバーが必要です。

(3 つのマスターと 3 つのスレーブ、3 つのデポジットと 3 つの取得、高可用性、バックアップ) もちろん、ローカルでデバッグするときにこれほど多くのサーバーを使用することは不可能です。ローカルでの実行をシミュレートする 6 redis

インスタンス、

実際、運用環境での Redis クラスターのセットアップは基本的にここと同じです。 Mac 環境でローカル Redis クラスターを構築する

1. redis をダウンロードしてインストールします

公式サイトにインストールすることを選択できます。 Web サイト、または名前付き行を使用できます。 Installation
#安装
brew install redis
#启动
redis-server
#进入redis客户端
redis-cli

2. redis を使用してクラスター環境を構成する

まず、redis 構成ファイルの場所を見つけます。

brew list redis
    # redis のインストール場所を確認します
  • cd /opt/homebrew/Cellar/redis/6.2.4
  • # 場所に基づいてバージョン番号が存在するフォルダーを入力します
  • open .
  • # フォルダーを開きます
  • Use Xcode.app
  • homebrew.mxcl.redis.plist を開きます。つまり、次のように redis.conf がある場所を見つけることができます。

##6 つのサービス構成ファイルを作成しますノードでのRedisクラスター機能の使い方を詳しく見る【詳細設定】

ノードでの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

設定パス下のファイルを変更する必要はありません。

ディレクトリ上に作成した 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
  • # #7000.conf を各 Redis サービスのディレクトリにコピーします
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ポートおよびクラスタ構成ファイルの属性各構成ファイルの
  • 注:
  • 各構成ファイルは、
ポートおよびcluster-config-file
    の値を異なるように構成する必要があります(そうしないと、クラスターは有効になります)、上記はポートによって区別されます。
  • #構成ファイルのディレクトリは、
  • find /opt/homebrew -name nodes-7000.conf

コマンド ## で見つけることができます。 #3. クラスターサービスの起動と停止

##6 つのサービスを設定しているため、1 つずつ起動または停止することはできません。シェルを使用する必要があります。これを実現するためのスクリプト

进入/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

结语

redis集群在客户端的使用是非常简单的,相比之下服务端的配置会比较繁琐。

客户端的具体使用只做了一下简单的说明,使用过程中要注意redis数据的同步和迁移等问题。

使用集群虽然能提升服务能力、支持主从复制、哨兵模式、读写分离、平分服务器的压力等特点。但不具备自动容错和恢复功能,如果出现宕机会使部分读写请求失败,降低了系统的可用性。在使用时根据业务情况分析、选择不同的方案。

本文转载自:https://juejin.cn/post/7079928963107127327

作者:tager

更多node相关知识,请访问:nodejs 教程

以上がノードでのRedisクラスター機能の使い方を詳しく見る【詳細設定】の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。