Rumah >hujung hadapan web >tutorial js >Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]

Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]

青灯夜游
青灯夜游ke hadapan
2022-03-30 20:23:433774semak imbas

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!

Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]

Berkenaan penggunaan fungsi kelompok dalam nodejsredis, 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.

Penjelasan istilah - kluster

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)

Keperluan kluster Redis

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.

Bina gugusan redis tempatan dalam persekitaran mac

1 Muat turun dan pasang redis

Anda boleh memilih untuk memasangnya pada rasmi. laman web, atau anda boleh menggunakan baris bernama Pasang

#安装
brew install redis
#启动
redis-server
#进入redis客户端
redis-cli

2 Konfigurasikan persekitaran kluster melalui redis

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
  • dengan Xcode.appBuka homebrew.mxcl.redis.plist untuk mencari lokasi redis.conf, seperti ditunjukkan di bawah:

Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]

Ketahui lebih lanjut tentang cara menggunakan fungsi kelompok redis dalam nod [konfigurasi terperinci]

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:

  • Salin fail konfigurasi dahulu Ubah suai
cd /opt/homebrew/etc/ # 进入配置文件目录
cp redis.conf redis/cluster/7000/7000.conf
code redis/cluster/7000/7000.conf # 用编辑器打开或者用vim打开配置文件来进行修改
  • Selepas memasukkan 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
  • Salin 7000.conf ke setiap redis Di bawah direktori perkhidmatan
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
  • dan kemudian ubah suai 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


3. Mula dan berhenti perkhidmatan kluster

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授权执行权限

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 教程

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam