
วิธีเริ่มต้นใช้งาน VUE3.0 อย่างรวดเร็ว: มาเรียนรู้
เกี่ยวกับการใช้ฟังก์ชัน redis Cluster ใน nodejs กันดีกว่า ฉันไม่พบบทความที่ค่อนข้างสมบูรณ์และเข้าใจง่าย ดังนั้นฉันจึงใช้ทางอ้อมมากมายในระหว่างการพัฒนาและการแก้ไขจุดบกพร่อง กระบวนการ.
บทความนี้จะแนะนำรายละเอียด วิธีสร้างคลัสเตอร์ Redis ภายในเครื่อง วิธีใช้คลัสเตอร์บนไคลเอนต์ และสรุปและอธิบายปัญหาและข้อผิดพลาดที่พบในระหว่างกระบวนการก่อสร้าง เพื่อหลีกเลี่ยงการเลี่ยงในครั้งถัดไป และปรับปรุงการพัฒนาและประสิทธิภาพการทำงาน
พื้นหลังของการใช้คลัสเตอร์คือ: ในโหมดซิงเกิล Redis เมื่อจำนวนผู้ใช้และการเข้าชมเพิ่มขึ้น ค่า qps จะเพิ่มขึ้นอย่างรวดเร็ว การดำเนินการ io จำนวนมากทำให้ cpu(100%) ที่ ในช่วงเวลาหนึ่งและอาจเกิดการหยุดทำงานเมื่อใดก็ได้ ซึ่งถือเป็นอันตราย ขณะเดียวกัน Redis การประมวลผลแบบแบตช์และวิธีการอื่น ๆ จะรักษาเฉพาะอาการเท่านั้น แต่ไม่ใช่สาเหตุที่แท้จริง และ ไม่สามารถทำลายปัญหาคอขวดของประสิทธิภาพของเซิร์ฟเวอร์ได้ ดังนั้นจึงจำเป็นต้องใช้โซลูชันคลัสเตอร์หรือเพิ่มอินสแตนซ์ Redis
โดยทั่วไปหมายถึงคลัสเตอร์เซิร์ฟเวอร์ ซึ่งแตกต่างจากระบบแบบกระจาย โดยรวบรวมเซิร์ฟเวอร์จำนวนมากไว้ด้วยกันเพื่อให้บริการเดียวกัน จากมุมมองของไคลเอ็นต์ ดูเหมือนว่ามีเพียงเซิร์ฟเวอร์เดียว คลัสเตอร์สามารถใช้คอมพิวเตอร์หลายเครื่องสำหรับการประมวลผลแบบขนานเพื่อให้ได้ความเร็วการประมวลผลสูง นอกจากนี้ยังสามารถใช้คอมพิวเตอร์หลายเครื่องในการสำรองข้อมูล ดังนั้นหากเครื่องใดเครื่องหนึ่งเสียหาย ระบบทั้งหมดยังคงสามารถทำงานได้ตามปกติ ( ก่อน Redis3.0 โดยทั่วไปจะใช้โหมด Sentinel แต่ การกำหนดค่าของ Sentinel นั้นซับซ้อนเล็กน้อย และประสิทธิภาพและความพร้อมใช้งานสูงนั้นอยู่ในระดับปานกลาง )
ให้มากกว่าครึ่งหนึ่งของ โหนดเชื่อว่าโหนดบางโหนดล้มเหลว โหนดไม่ทำงาน ดังนั้น 2 โหนดจึงไม่สามารถสร้างคลัสเตอร์ได้ ดังนั้นคลัสเตอร์ Redis จึงต้องการอย่างน้อย 3 โหนด
เพื่อให้มั่นใจว่าคลัสเตอร์มีความพร้อมใช้งานสูง แต่ละโหนดจำเป็นต้องมีโหนดทาส (นั่นคือ โหนดสำรอง) ดังนั้นคลัสเตอร์ Redis จึงจำเป็นต้องมีเซิร์ฟเวอร์อย่างน้อย 6 เครื่อง (ต้นแบบ 3 ตัวและตัวรอง 3 ตัว การฝาก 3 ตัวและการดึงข้อมูล 3 ครั้ง ความพร้อมใช้งานสูง และการสำรองข้อมูล)
แน่นอนว่าเป็นไปไม่ได้ที่เราจะต้องใช้เซิร์ฟเวอร์จำนวนมากเมื่อทำการดีบักในเครื่อง ดังนั้นเราจึงสามารถจำลองการทำงาน 6 อินสแตนซ์ redis ในเครื่อง ได้ คลัสเตอร์ Redis ในสภาพแวดล้อมการผลิต โดยพื้นฐานแล้วบิลด์จะเหมือนกับที่นี่
คุณสามารถเลือกที่จะติดตั้งบนเว็บไซต์อย่างเป็นทางการ หรือคุณสามารถติดตั้งโดยใช้บรรทัดชื่อ
#install brew install redis #เริ่มเซิร์ฟเวอร์ Redis #ป้อนไคลเอ็นต์ Redis redis-cli
คุณต้องค้นหาตำแหน่งของไฟล์การกำหนดค่า Redis
brew list redis ก่อน # ตรวจสอบตำแหน่งของcd /opt/homebrew/Cellar/redis/6.2.4 # ป้อนเวอร์ชันตามตำแหน่ง โฟลเดอร์ที่มีหมายเลขนั้นopen . # เปิดโฟลเดอร์Xcode.app เพื่อเปิด homebrew.mxcl.redis.plist เพื่อค้นหาตำแหน่งของ redis.conf ดังที่แสดง ด้านล่าง:

สร้างไฟล์การกำหนดค่าบริการหก
cd /opt/homebrew/etc/ (ไดเร็กทอรีไฟล์การกำหนดค่าที่พบในขั้นตอนก่อนหน้า)
# จำเป็นต้องอยู่ใน /opt/homebrew/etc/ path mkdir -p redis/cluster/7000 mkdir -p redis/คลัสเตอร์/7001 mkdir -p redis/คลัสเตอร์/7002 mkdir -p redis/คลัสเตอร์/7003 mkdir -p redis/คลัสเตอร์/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) พอร์ต 7000 # เปิดใช้งานโหมดคลัสเตอร์และเรียกใช้การเปิดใช้งานคลัสเตอร์ใช่ # เส้นทางไฟล์การกำหนดค่าไฟล์การกำหนดค่าภายในคลัสเตอร์ ค่าเริ่มต้น nodes-6379.conf (ต้องแก้ไขไฟล์การกำหนดค่าแต่ละไฟล์ 7000-7005) คลัสเตอร์-config-ไฟล์ nodes-7000.conf # การหมดเวลาการสื่อสารระหว่างโหนดคลัสเตอร์-โหนด-หมดเวลา 5000 # การคงอยู่ของข้อมูลต่อท้ายเท่านั้น ใช่
cd /opt/homebrew/etc/redis/cluster # ป้อนไดเร็กทอรีไฟล์การกำหนดค่า cp 7000/7000.conf 7001/7001.conf ซีพี 7000/7000.conf 7002/7002.conf ซีพี 7000/7000.conf 7003/7003.conf ซีพี 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
เนื่องจากเราได้กำหนดค่าบริการ 6 รายการแล้ว จึงไม่สามารถเริ่มหรือหยุดบริการทีละรายการได้ คุณต้องใช้เชลล์สคริปต์เพื่อ
เข้าสู่ไดเร็กทอรี /opt/homebrew/etc/redis/cluster และสร้าง start.sh และหยุด ไฟล์ .sh
# start.sh file#!/bin/sh เซิร์ฟเวอร์ redis /opt/homebrew/etc/redis/cluster/7000/7000.conf & เซิร์ฟเวอร์ redis /opt/homebrew/etc/redis/cluster/7001/7001.conf & เซิร์ฟเวอร์ redis /opt/homebrew/etc/redis/cluster/7002/7002.conf & เซิร์ฟเวอร์ redis /opt/homebrew/etc/redis/cluster/7003/7003.conf & เซิร์ฟเวอร์ redis /opt/homebrew/etc/redis/cluster/7004/7004.conf & เซิร์ฟเวอร์ redis /opt/homebrew/etc/redis/cluster/7005/7005.conf & # ไฟล์ stop.sh #!/bin/sh redis-cli -p 7000 ปิดระบบ & redis-cli -p 7001 ปิดระบบ & redis-cli -p 7002 ปิดระบบ & redis-cli -p 7003 ปิดระบบ & redis-cli -p 7004 ปิดระบบ & redis-cli -p 7005 ปิดระบบ &
ดำเนินการ ./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 ปิดเครื่อง # ปิดเซิร์ฟเวอร์ 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 โหนดคลัสเตอร์ #ดูสถานะโหนดคลัสเตอร์ (ป้อนไคลเอ็นต์เพื่อดำเนินการ) ข้อมูลคลัสเตอร์ #ดูข้อมูลคลัสเตอร์ (ป้อนไคลเอ็นต์เพื่อดำเนินการ) ดูค่าคีย์ทั้งหมด: คีย์ * ลบค่าที่ดัชนีที่ระบุ: คีย์ del ล้างข้อมูลของเซิร์ฟเวอร์ Redis ทั้งหมด: flushall ล้างคีย์ทั้งหมดในไลบรารีปัจจุบัน:
Redis.Cluster มีฟังก์ชันการแบ่งส่วนอัตโนมัติบน node redis.js Redis หลายตัว คุณสามารถทดสอบผลกระทบของคลัสเตอร์ได้ ioredis
// redis.js
const Redis = ต้องการ ("ioredis");
constคลัสเตอร์ = Redis.Cluster ใหม่ ([
-
พอร์ต: 7000,
โฮสต์: "127.0.0.1",
-
-
พอร์ต: 7001,
โฮสต์: "127.0.0.1",
-
-
คลัสเตอร์.set("foo", "bar");
คลัสเตอร์.get("foo", (ผิดพลาด, ความละเอียด) => {
// ความละเอียด === 'บาร์'
}); จาก 'กระทิง'
// สร้างอินสแตนซ์คิว Redis const instance = new Queue('custom', {
คำนำหน้า : '{myprefix}',
createClient (ประเภท) {
// คลัสเตอร์ อินสแตนซ์คลัสเตอร์เหมือนกับคลัสเตอร์ส่งคืนด้านบน
-
-
//เพิ่มข้อมูลลงในคิว Redis (ผู้ผลิต)
อินสแตนซ์.เพิ่ม(
'ขอ',
-
...พารามิเตอร์
-
-
RemoveOnComplete: เท็จ
-
).จับ(e => {
console.error(จ)
-
// instance.process โทรกลับผู้บริโภค ('คำขอ', 5, async (งาน, เสร็จแล้ว) => {
console.log('รับข้อมูลที่ใช้ในปัจจุบัน:', job.data)
//ดำเนินการแบบอะซิงโครนัสรอสัญญาใหม่ ((แก้ไข)=>แก้ไข())
เสร็จแล้ว()
}) มีปัญหาเมื่อใช้เฟรมเวิร์ก bull เพื่อเชื่อมต่อกับคลัสเตอร์ ioredis : ทุกครั้ง push ข้อมูลไปยังคิว redis ฟังก์ชันการโทรกลับที่เกี่ยวข้องอาจถูกทริกเกอร์หลายครั้ง ในปัจจุบันยังเป็นไปไม่ได้ที่จะระบุได้ว่าเป็นปัญหาหรือไม่ การใช้งานหรือปัญหากับ framework เอง (หากทราบเพิ่มเติมยินดีต้อนรับทุกท่านฝากข้อความไว้แจ้งให้ทราบครับ)
ทางเลือกอื่นนอกเหนือจากการทำคลัสเตอร์: หากไม่จำเป็นต้องมีการซิงโครไนซ์ข้อมูลและการย้ายข้อมูล สามารถใช้อินสแตนซ์ Redis หลายอิน redis ซ์บนไคลเอนต์ รวมกับ Math.random() เพื่อแบ่งข้อมูลเท่า ๆ กันให้เป็นหนึ่งใน redis ซึ่งจะช่วยแก้ปัญหาฮาร์ดแวร์อินสแตนซ์เดียวได้ ( cpu ฯลฯ) ปัญหาคอขวด
1. เกิดข้อผิดพลาดเมื่อเชื่อมต่อกับ Redis ภายใต้ระบบ Mac?
ข้อความแสดงข้อผิดพลาดของคอนโซล: ไม่สามารถเชื่อมต่อกับ Redis ที่ 127.0.0.1:6379: การเชื่อมต่อถูกปฏิเสธ
เหตุผล: เซิร์ฟเวอร์ไม่เริ่มทำงานหรือล้มเหลวในการเริ่มต้น
วิธีแก้ไข: คุณต้องเริ่มเซิร์ฟเวอร์ Redis ก่อน
ลิงก์อ้างอิง
เซิร์ฟเวอร์ Redis ก่อนhttps://blog csdn. net/qq_23347459/article/details/104257529
2. เมื่อเริ่มต้นไคลเอนต์จะรายงานข้อผิดพลาดเมื่ออ่านหรือเขียนหรือไม่?
ข้อความแสดงข้อผิดพลาด: ClusterAllFailedError: ไม่สามารถรีเฟรชแคชสล็อตได้
เหตุผล: แอตทริบิวต์ของไฟล์การกำหนดค่าคลัสเตอร์ในไฟล์การกำหนดค่าภายใต้แต่ละบริการมีความสอดคล้องกัน
กำลังประมวลผล: แก้ไขเป็นค่าแอตทริบิวต์ที่ไม่ซ้ำกัน
ลิงก์อ้างอิง 1
https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache
ข้อมูลอ้างอิง 2
https://github.com/luin/ioredis/ ปัญหา /711
3. ไม่สามารถรันคำสั่ง create master-slave 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
: เมื่อดำเนินการคำสั่ง create ข้อมูลจะไม่ถูกล้างและคลัสเตอร์จะไม่ถูกรีเซ็ต .
กำลังประมวลผล: การล้างข้อมูล และรีเซ็ตคลัสเตอร์ ล้างไฟล์ 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> ฟลัชทั้งหมด 127.0.0.1:7000> รีเซ็ตคลัสเตอร์ 127.0.0.1:7000>ออก # ใช้ find เพื่อค้นหาไฟล์ rdb และ aof (รวมถึงในไดเร็กทอรี rdb ด้วย) ค้นหา /opt/homebrew -name dump.rdb # ดำเนินการคำสั่ง create อีกครั้งสำเร็จ 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
ผู้เขียน : เทเกอร์