Rumah >hujung hadapan web >tutorial js >Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]
Bagaimana untuk menggunakan fungsi kluster redis dalam nod? Artikel berikut akan memberi anda penjelasan terperinci tentang konfigurasi kelompok redis berdasarkan nod Saya harap ia akan membantu anda!
Berkenaan penggunaan fungsi kelompok dalam nodejs
redis
, saya tidak menemui artikel yang agak lengkap dan mudah difahami , jadi saya sedang membangunkannya sendiri Terdapat juga banyak lencongan semasa proses penyahpepijatan.
Artikel ini akan memperkenalkan secara terperinci cara membina kluster redis secara tempatan, cara menggunakan kluster pada klien, dan merumuskan serta menerangkan masalah dan ralat yang dihadapi semasa proses pembinaan untuk mengelakkan menggunakannya lain kali Apabila perlu, kami akan mengambil lencongan untuk meningkatkan pembangunan dan kecekapan kerja.
Latar belakang untuk menggunakan kluster ialah: dalam mod tunggal Redis, dengan peningkatan dalam bilangan pengguna dan lawatan, nilai qps meningkat dengan mendadak??, dan sejumlah besar operasi io
menyebabkan cpu(100%)
untuk menjadi penuh pada masa tertentu , terdapat bahaya masa henti pada bila-bila masa, dan pemprosesan kumpulan redis dan kaedah lain hanya merawat gejala tetapi bukan puncanya Adalah mustahil untuk menembusi kesesakan pelayan prestasi. Oleh itu, adalah penting untuk menggunakan penyelesaian kluster atau menambah kejadian redis.
Kluster secara amnya merujuk kepada kluster pelayan, yang berbeza daripada sistem teragih Ia adalah himpunan banyak pelayan yang melakukan perkhidmatan yang sama bersama-sama perspektif pelanggan, ia kelihatan seperti Terdapat hanya satu pelayan. Kelompok ini boleh menggunakan berbilang komputer untuk melakukan pengkomputeran selari untuk mendapatkan kelajuan pengkomputeran yang sangat tinggi Ia juga boleh menggunakan berbilang komputer untuk melakukan sandaran supaya jika mana-mana mesin rosak, keseluruhan sistem. masih boleh berfungsi seperti biasa. (Sebelum redis3.0, mod sentinel biasanya digunakan, tetapi konfigurasi sentinel agak rumit, dan prestasi serta ketersediaan tinggi serta aspek lain adalah sederhana)
Memandangkan mekanisme toleransi kesalahan mengundi memerlukan lebih separuh daripada nod untuk berfikir bahawa nod turun, nod turun, jadi 2 nod tidak boleh membentuk kluster , jadi gugusan Redis memerlukan sekurang-kurangnya 3 nod.
Untuk memastikan ketersediaan kluster yang tinggi, setiap nod perlu mempunyai nod hamba (iaitu, nod sandaran), jadi Redis
kluster memerlukan sekurang-kurangnya 6 pelayan. (Tiga tuan dan tiga hamba, tiga deposit dan tiga perolehan, ketersediaan tinggi, sandaran)
Sudah tentu, adalah mustahil untuk kami menggunakan begitu banyak pelayan semasa menyahpepijat secara tempatan, jadi kami boleh simulasi berjalan secara tempatan 6 redis
kejadian, Malah, persediaan kelompok Redis dalam persekitaran pengeluaran pada asasnya adalah sama seperti di sini.
Anda boleh memilih untuk memasangnya pada rasmi. laman web, atau anda boleh menggunakan baris bernama Pasang
#安装 brew install redis #启动 redis-server #进入redis客户端 redis-cli
Mula-mula cari lokasi konfigurasi redis. fail
brew list redis
# Semak lokasi pemasangan redis cd /opt/homebrew/Cellar/redis/6.2.4
# Masukkan folder di mana nombor versi terletak mengikut lokasi open .
# Buka folder Xcode.app
Buka homebrew.mxcl.redis.plist
untuk mencari lokasi redis.conf
, seperti ditunjukkan di bawah: Buat enam fail konfigurasi perkhidmatan
cd /opt/homebrew/etc/
(direktori fail konfigurasi yang terdapat dalam langkah sebelumnya)
# 需要在 /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
Ubah suai fail konfigurasi
Tidak perlu mengubah suai fail konfigurasi di bawah laluan/opt/homebrew/etc/redis.conf
Hanya salin ke direktori redis/cluster/7000
yang dibuat di atas dan kemudian ubah suainya . Langkah-langkahnya adalah seperti berikut:
cd /opt/homebrew/etc/ # 进入配置文件目录 cp redis.conf redis/cluster/7000/7000.conf code redis/cluster/7000/7000.conf # 用编辑器打开或者用vim打开配置文件来进行修改
7000.conf
, ubah suai sifat berikut # 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
port dan konfigurasi kelompok -atribut fail bagi setiap fail konfigurasi Nota : Setiap fail konfigurasi mesti dikonfigurasikan dengan nilai port和cluster-config-file
yang berbeza (jika tidak, kluster tidak akan berkuat kuasa). dibezakan oleh pelabuhan.
Direktori fail konfigurasi boleh didapati melalui perintah find /opt/homebrew -name nodes-7000.conf
Memandangkan kami telah mengkonfigurasi 6 perkhidmatan, adalah mustahil untuk memulakan atau menghentikannya satu demi satu. Kami perlu menggunakan skrip shell untuk mencapai
ini进入/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
授权执行权限
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
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' });
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 教程!
Atas ialah kandungan terperinci Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!