วิธีเริ่มต้นใช้งาน 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
ผู้เขียน : เทเกอร์