Microsoft ได้โอเพ่นซอร์สระบบ NoSQL Garnet ซึ่งออกแบบมาเพื่อสร้างร้านค้าแคชและเข้ากันได้กับไลบรารีไคลเอนต์ที่มีอยู่สำหรับพื้นที่เก็บข้อมูล Redis Garnet รองรับการสร้างคลัสเตอร์แคชข้อมูลที่ปรับขนาดได้ ซึ่งสามารถใช้การจำลองแบบ การย้ายคีย์ และการแบ่งส่วนข้อมูลข้ามโหนดคลัสเตอร์ โปรเจ็กต์นี้เขียนด้วยภาษา C# โดยมีแกนหน่วยเก็บข้อมูลเป็นภาษา C++ เปิดภายใต้ใบอนุญาต MIT และสามารถทำงานได้บนทุกแพลตฟอร์มที่รองรับ .NET (แพลตฟอร์มหลักคือ Linux และ Windows)
ในการจัดเก็บข้อมูล มีการใช้กลไก Tsavorite (ทางแยกของที่เก็บข้อมูล Microsoft FASTER) ซึ่งรองรับการประมวลผลแบบสอบถามแบบมัลติเธรด ธุรกรรม การแก้ไขการเปลี่ยนแปลงในโหมดที่ไม่บล็อก (จุดตรวจสอบ) การกู้คืนจากความล้มเหลว บันทึกสำเนาที่ซ้ำซ้อนและการบำรุงรักษา บันทึกการดำเนินงาน กลไกเครือข่ายใน Garnet สร้างขึ้นโดยใช้สถาปัตยกรรมหน่วยความจำที่ใช้ร่วมกันที่เสนอโดยโครงการวิจัย ShadowFax การประมวลผล TLS และการโต้ตอบกับที่เก็บข้อมูลจะดำเนินการในเธรดเดียว ซึ่งทำให้สามารถหลีกเลี่ยงค่าใช้จ่ายในการสลับเธรด และใช้แคช CPU ได้อย่างมีประสิทธิภาพมากขึ้นเมื่อถ่ายโอนข้อมูลผ่านเครือข่าย
สถาปัตยกรรม Garnet แยกตรรกะสำหรับการแยกวิเคราะห์และประมวลผลคำขอจากการดำเนินการจัดเก็บข้อมูล ข้อมูลถูกจัดเก็บโดยใช้ที่เก็บคีย์-ค่าสองแห่งโดยอิงตามไลบรารี Tsavorite พื้นที่จัดเก็บ "หลัก" แห่งแรกได้รับการปรับให้เหมาะสมสำหรับการดำเนินการสตริงที่รวดเร็ว และที่จัดเก็บ "อ็อบเจ็กต์" แห่งที่สองได้รับการปรับให้เหมาะสมเพื่อรองรับอ็อบเจ็กต์ที่ซับซ้อนและประเภทข้อมูลขั้นสูง เช่น แฮชและรายการ ชนิดข้อมูลในที่จัดเก็บข้อมูลที่สองถูกนำมาใช้โดยใช้ไลบรารี .NET ข้อมูลถูกจัดเก็บไว้ในฮีป (ฮีป C#) ซึ่งช่วยให้อัปเดตได้อย่างมีประสิทธิภาพและอยู่ในรูปแบบซีเรียลไลซ์บนดิสก์
คุณสมบัติของโกเมน:
- มีความเป็นไปได้ที่จะปรับใช้พื้นที่จัดเก็บข้อมูลแบบหลายชั้น ซึ่งครอบคลุม RAM, ไดรฟ์ SSD และพื้นที่จัดเก็บข้อมูลบนคลาวด์ ซึ่งข้อมูลที่มีความต้องการน้อยกว่าจะถูกผลักไปยังพื้นที่จัดเก็บข้อมูลที่ช้าเพื่อสร้างแคชที่มีขนาดใหญ่กว่า RAM
- รองรับอุปกรณ์ที่ขยายได้ ช่วยให้สามารถสร้างเลเยอร์ที่ปรับให้เหมาะกับการทำงานกับอุปกรณ์ต่างๆ ได้ เช่น มีเลเยอร์สำหรับ SDD, ฮาร์ดไดรฟ์ และที่เก็บข้อมูลบนคลาวด์ Azure Storage
- กลไกที่มีประสิทธิภาพสำหรับการนำพื้นที่ว่างใน RAM กลับมาใช้ใหม่ ป้องกันการแตกแฟรกเมนต์
- ขีดจำกัดที่กำหนดได้เกี่ยวกับขนาดของหน่วยความจำที่ใช้สำหรับดัชนี บันทึก และการจัดเก็บอ็อบเจ็กต์
- โปรโตคอล RESP ใช้เพื่อเข้าถึงที่เก็บข้อมูล ซึ่งอนุญาตให้ Garnet สามารถใช้กับไคลเอนต์ Redis ที่ยังไม่ได้แก้ไข
- รองรับการจัดเก็บทั้งค่าสตริงและโครงสร้างข้อมูลที่ซับซ้อน เช่น รายการ แฮช ชุด รายการเรียงลำดับ และข้อมูลตำแหน่งทางภูมิศาสตร์ ความสามารถในการกำหนดอายุการใช้งานของคีย์
- ความพร้อมใช้งานของ API สำหรับดำเนินการสืบค้นเชิงวิเคราะห์ (HLL/Hyperloglog, Bitmap), ธุรกรรม (MULTI/EXEC) และการใช้กระบวนทัศน์เผยแพร่/สมัครสมาชิก
- ความพร้อมใช้งานของวิธีการสำหรับการควบคุมการเข้าถึงที่ยืดหยุ่นผ่าน ACL
- ความสามารถในการกำหนดการกำหนดค่าในรูปแบบ JSON หรือ redis.conf
- รองรับการเชื่อมต่อตัวจัดการเครือข่ายเพิ่มเติม ความสามารถในการเข้ารหัสการรับส่งข้อมูลโดยใช้ TLS (ขึ้นอยู่กับ SslStream)
- ความสามารถในการสร้างส่วนขยายใน C# ที่ใช้การดำเนินการเพิ่มเติมกับสตริงและอ็อบเจ็กต์
- รองรับขั้นตอนการจัดเก็บธุรกรรมที่ครอบคลุมหลายคีย์
- ความสามารถในการเรียกคืนสถานะจากตำแหน่งที่บันทึกไว้ก่อนหน้านี้ (การกู้คืนจุดตรวจ) การมีอยู่ของโหมดไฟล์ต่อท้ายเท่านั้น (AOF, ไฟล์ต่อท้ายเท่านั้น) ซึ่งข้อมูลเก่าทั้งหมดยังคงอยู่และไม่ได้ถูกแทนที่
- รองรับการสร้างคลัสเตอร์พื้นที่จัดเก็บข้อมูลด้วยการจำลองแบบ การแบ่งส่วน การย้ายคีย์แบบไดนามิกระหว่างโหนด และการกู้คืนโหนดที่ล้มเหลว
- ประสิทธิภาพสูงและเวลาแฝงต่ำเมื่อดำเนินการค้นหา ประมวลผลคำขอกลุ่มเล็กๆ ได้อย่างมีประสิทธิภาพบนเซสชันไคลเอ็นต์จำนวนมาก ช่วยให้คุณบรรลุปริมาณงาน (จำนวนคำขอที่ประมวลผลต่อวินาที) ลำดับความสำคัญที่สูงกว่าโซลูชันของคู่แข่ง เมื่อทำงานในเครื่องเสมือนในระบบคลาวด์ Azure ในกรณีส่วนใหญ่ เวลาแฝงของไคลเอ็นต์จะไม่เกิน 300 ไมโครวินาที ในการทดสอบของเรา Garnet เหนือกว่า Redis, Dragonfly และ KeyDB อย่างมากในแง่ของประสิทธิภาพและการตอบสนอง ในการทดสอบบางอย่าง Garnet มีประสิทธิภาพเหนือกว่าระบบคู่แข่งถึงสิบเท่า
ที่มา: opennet.ru