เพิ่มประสิทธิภาพแคช Redis ในสภาพแวดล้อมขนาดใหญ่
(meetup.toast.com)Redis เป็นฐานข้อมูลแบบอินเมมโมรี (In-Memory) ที่ถูกใช้อย่างแพร่หลายสำหรับการแคชในบริการออนไลน์ แต่หากใช้งานไม่ถูกต้อง ก็อาจเกิดปัญหาที่คาดไม่ถึงหรือแม้กระทั่งทำให้เกิดเหตุขัดข้องครั้งใหญ่ได้เช่นกัน เมื่อไม่นานมานี้ผมไปที่ร้านหนังสือแล้วบังเอิญได้พบกับวิศวกรที่ทำงานอยู่ในทีม SRE ของบริษัทแห่งหนึ่ง ระหว่างสนทนาเขาถึงกับพูดว่า “จริง ๆ แล้ว Redis คือความจำเป็นที่เลี่ยงไม่ได้ และควรใช้งานโดยคิดไว้เสมอว่าสักวันหนึ่งปัญหาที่เกี่ยวข้องจะต้องปะทุขึ้นสักครั้ง” เลยทีเดียว
อ้างอิง - Kakao "ใช้ Redis ผิด ชีวิตพัง":
https://zdnet.co.kr/view/?no=20131119174125
อ้างอิง - สาเหตุของข้อผิดพลาดของ Coupang มาจากโอเพนซอร์ส 'Redis DB':
http://www.digitaltoday.co.kr/news/articleView.html?idxno=212904
ด้วยเหตุนี้ Redis จึงเป็นสิ่งที่ต้องเข้าใจให้ดีและใช้งานอย่างละเอียดรอบคอบเท่านั้น
เกริ่นมายาวแล้ว NHN ได้แนะนำเอกสารที่อ้างอิงจากเนื้อหาการบรรยายใน RedisConf 2020 ซึ่งชี้ให้เห็น 3 จุดที่อาจเกิดปัญหาด้านประสิทธิภาพเมื่อใช้ Redis เป็นแคชในสภาพแวดล้อมที่มีทราฟฟิกขนาดใหญ่ พร้อมอธิบายวิธีแก้ไขไว้ด้วย (ภาษาเกาหลี)
-
Cache Stampede: เนื่องจากพื้นที่แคชมีจำกัด จึงมักกำหนดเวลาหมดอายุ (TTL) ให้กับข้อมูลที่เก็บไว้ แต่เมื่อมีคำขออ่านเข้ามายังข้อมูลนั้นอย่างต่อเนื่อง แล้วถึงเวลาหมดอายุของแคช คำขออ่านเหล่านั้นจะพุ่งไปที่ DB พร้อมกันในชั่วขณะหนึ่ง และจากนั้นก็จะกลายเป็นคำขอเขียนซ้ำ ๆ ที่ถาโถมกลับมาที่ Redis ปรากฏการณ์นี้เรียกว่า Cache Stampede โดยแนวทางแก้ไขคือปรับค่า TTL ล่วงหน้าด้วยอัลกอริทึมที่อิงการแจกแจงความน่าจะเป็น หรือไม่ก็นำแนวคิดของ Debounce (ในหลายเหตุการณ์ที่เกิดซ้ำกัน ให้ทำงานเฉพาะเหตุการณ์สุดท้าย) มาใช้
-
Hot Keys: เมื่อการอ่านกระจุกตัวอยู่ที่คีย์เดียว ประสิทธิภาพก็อาจลดลงได้เช่นกัน บทความดังกล่าวแนะนำวิธีรับมือโดยเติม Prefix หน้าชื่อคีย์เพื่อสร้างสำเนาหลายชุด แล้วกระจายการอ่านแบบสุ่มไปยังสำเนาที่มี Prefix เหล่านั้น
-
Compression: เมื่อเก็บข้อมูลขนาดใหญ่ไว้ใน Redis ก็อาจทำให้ประสิทธิภาพลดลงได้เช่นกัน ในกรณีนี้เพียงแค่ใช้การบีบอัดที่เหมาะสม ก็อาจได้ประโยชน์อย่างมากทั้งในด้านความเร็วและการใช้หน่วยความจำ อย่างไรก็ตาม วิธีการบีบอัดและอัตราส่วนที่เหมาะสมอาจแตกต่างกันไปตามสถานการณ์และสภาพแวดล้อม ดังนั้นหากจะนำไปใช้ จำเป็นต้องมีการทดสอบ benchmark ที่จำลองสภาพแวดล้อมการใช้งานจริง
1 ความคิดเห็น
อ้างอิง - บทความที่มีโค้ดตัวอย่างของอัลกอริทึมแบบอิงการแจกแจงความน่าจะเป็น (Probabilistic Early Recomputation) ที่กล่าวถึงข้างต้น:
https://engineering.linecorp.com/ko/blog/…