深入了解node中怎麼使用redis集群功能【配置詳解】
node中怎麼使用redis叢集功能?以下這篇文章給大家詳解一下基於node的redis叢集配置,希望對大家有幫助!
關於nodejs
#中使用redis
叢集功能,沒有找到一篇比較完整且簡單懂的文章,因此自己在開發調試的過程中也走了不少彎路。
本文會詳細介紹了在本地如何建立redis叢集、在客戶端如何使用叢集、在建置過程中遇到的問題和錯誤匯總並說明,以避免下次使用的時候再走彎路,提高開發、工作效率。
使用群集的背景是:在Redis單例模式下隨著使用者量、訪問量的提高,qps值急劇上漲??,大量的io
操作導致某一時刻佔滿cpu(100%)
,隨時有宕機的危險,同時透過批次處理redis等方式也是治標不治本,無法突破伺服器效能的瓶頸。因此使用叢集方案或增加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安裝的位置
# 根據位置進入版本號所在的資料夾
open . # 開啟資料夾
用Xcode.app開啟
homebrew.mxcl.redis.plist, 即可找到redis.conf
所在的位置,如下所示:
創建六個服務設定檔
- 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
集群时存在问题: 每次有数据push
到redis
队列时对应的回调函数可能会触发多次,目前无法确定是使用的问题还是框架本身的问题(如果有了解的欢迎大家留言告知)。
替代集群的方案:在不需要数据同步和数据迁移的情况下,可以在客户端使用多个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 教程!
以上是深入了解node中怎麼使用redis集群功能【配置詳解】的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

nvm刪除node的方法:1、下載「nvm-setup.zip」並將其安裝在C碟;2、設定環境變量,並透過「nvm -v」指令查看版本號;3、使用「nvm install」指令安裝node;4、透過「nvm uninstall」指令刪除已安裝的node即可。

怎麼處理文件上傳?以下這篇文章為大家介紹一下node專案中如何使用express來處理文件的上傳,希望對大家有幫助!

這篇文章跟大家分享Node的進程管理工具“pm2”,聊聊為什麼需要pm2、安裝和使用pm2的方法,希望對大家有幫助!

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

如何用pkg打包nodejs可執行檔?以下這篇文章跟大家介紹一下使用pkg將Node專案打包為執行檔的方法,希望對大家有幫助!

npm node gyp失敗是因為“node-gyp.js”跟“Node.js”版本不匹配,其解決辦法:1、透過“npm cache clean -f”清除node快取;2、透過“npm install -g n”安裝n模組;3、透過「n v12.21.0」指令安裝「node v12.21.0」版本即可。

什麼是單一登入系統?用nodejs怎麼實作?以下這篇文章為大家介紹一下使用node實作單一登入系統的方法,希望對大家有幫助!

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受
