91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-03-31 09:37:26 來源:億速云 閱讀:361 作者:小新 欄目:web開發

小編給大家分享一下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配置文件的位置

  • 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 -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打開配置文件來進行修改
  • 進入到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每個配置文件的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/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集群功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤庆县| 灵川县| 南岸区| 沐川县| 木里| 寿阳县| 肇东市| 义马市| 梁平县| 岑巩县| 石屏县| 苍山县| 江华| 天气| 信宜市| 沧州市| 桦川县| 太保市| 三明市| 马龙县| 昌平区| 中山市| 梁河县| 文安县| 翁牛特旗| 武冈市| 昭觉县| 海兴县| 法库县| 襄樊市| 湖北省| 宜都市| 公安县| 孙吴县| 周宁县| 福建省| 湘乡市| 丹东市| 区。| 锦屏县| 顺昌县|