4.1 คำอธิบาย

Apache Cassandraเป็นระบบจัดการฐานข้อมูลแบบกระจายที่อยู่ในคลาสของระบบ NoSQL และได้รับการออกแบบมาเพื่อสร้างที่จัดเก็บข้อมูลอาร์เรย์ข้อมูลขนาดใหญ่ที่ปรับขนาดได้สูงและเชื่อถือได้ซึ่งนำเสนอในรูปแบบของแฮช

ในขั้นต้นโครงการได้รับการพัฒนาในส่วนลึกของ Facebook และในปี 2009 ย้ายไปอยู่ภายใต้ปีกของ Apache Software Foundation องค์กรนี้ยังคงพัฒนาโครงการต่อไป โซลูชันอุตสาหกรรมที่ใช้ Cassandra ถูกนำไปใช้เพื่อให้บริการแก่บริษัทต่างๆ เช่น Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter และ Spotify ภายในปี 2554 คลัสเตอร์เซิร์ฟเวอร์ที่ใหญ่ที่สุดที่ให้บริการฐานข้อมูลเดียวภายใต้ Cassandra มีมากกว่า 400 เครื่องและมีข้อมูลมากกว่า 300 TB

เขียนด้วยภาษา Javaใช้ระบบแฮชแบบกระจายที่คล้ายกับ DynamoDB ซึ่งให้ความสามารถในการปรับขนาดได้เกือบเป็นเส้นตรงพร้อมปริมาณข้อมูลที่เพิ่มขึ้น มันใช้รูปแบบการจัดเก็บข้อมูลตามตระกูลของคอลัมน์ ซึ่งแตกต่างจากระบบเช่น MemcacheDB ซึ่งเก็บข้อมูลในคู่คีย์-ค่าเท่านั้น โดยความสามารถในการจัดเก็บแฮชที่มีการซ้อนกันหลายระดับ

อยู่ในหมวดหมู่ของ DBMS ที่ทนทานต่อความผิดพลาด: ข้อมูลที่อยู่ในฐานข้อมูลจะถูกจำลองโดยอัตโนมัติไปยังโหนดต่างๆ ของเครือข่ายแบบกระจาย หรือแม้แต่กระจายอย่างสม่ำเสมอในศูนย์ข้อมูลหลายแห่ง เมื่อโหนดล้มเหลว โหนดอื่นจะดึงฟังก์ชันของโหนดนั้นไปใช้ทันที การเพิ่มโหนดใหม่ไปยังคลัสเตอร์และการอัปเดตเวอร์ชัน Cassandra จะทำได้ทันที โดยไม่ต้องมีการแทรกแซงเพิ่มเติมด้วยตนเองและกำหนดค่าโหนดอื่นใหม่

อย่างไรก็ตาม ขอแนะนำอย่างยิ่งให้สร้างคีย์ (ป้ายกำกับ) ใหม่สำหรับแต่ละโหนด รวมถึงโหนดที่มีอยู่ เพื่อรักษาคุณภาพของการจัดสรรภาระงาน การสร้างคีย์สำหรับโหนดที่มีอยู่สามารถหลีกเลี่ยงได้ในกรณีที่จำนวนโหนดเพิ่มขึ้นหลายเท่า (2 เท่า 3 เท่า เป็นต้น)

4.2 แบบจำลองข้อมูล

ในศัพท์เฉพาะของคาสแซนดรา แอปพลิเคชันทำงานร่วมกับคีย์สเปซ ซึ่งสอดคล้องกับแนวคิดของสคีมาฐานข้อมูลในแบบจำลองเชิงสัมพันธ์ คีย์สเปซนี้สามารถมีตระกูลคอลัมน์ได้หลายตระกูล ซึ่งสอดคล้องกับแนวคิดของตารางเชิงสัมพันธ์

ในทางกลับกัน ตระกูลคอลัมน์จะมีคอลัมน์ (คอลัมน์) ซึ่งรวมกันโดยใช้คีย์ (คีย์แถว) ในเรกคอร์ด (แถว) คอลัมน์ประกอบด้วยสามส่วน: name (ชื่อคอลัมน์), timestamp (การประทับเวลา) และ value (ค่า) คอลัมน์ภายในเรกคอร์ดจะถูกจัดลำดับ ซึ่งแตกต่างจากฐานข้อมูลเชิงสัมพันธ์ ไม่มีข้อจำกัดว่าเรกคอร์ด (และในแง่ของฐานข้อมูลคือแถว) มีคอลัมน์ที่มีชื่อเดียวกับในเรกคอร์ดอื่นหรือไม่

ครอบครัวคอลัมน์สามารถมีได้หลายประเภท แต่ในบทความนี้เราจะละเว้นรายละเอียดนี้ นอกจากนี้ในเวอร์ชันล่าสุดของ Cassandra ยังสามารถดำเนินการค้นหาเพื่อกำหนดและเปลี่ยนแปลงข้อมูล (DDL, DML) โดยใช้ภาษา CQL เช่นเดียวกับการสร้างดัชนีรอง

ค่าเฉพาะที่จัดเก็บไว้ใน Cassandra ระบุโดย:

  • คีย์สเปซเป็นการเชื่อมโยงกับแอปพลิเคชัน (โดเมน) อนุญาตให้คุณโฮสต์ข้อมูลจากแอปพลิเคชันต่างๆ ในคลัสเตอร์เดียวกัน
  • ครอบครัวคอลัมน์มีผลผูกพันกับแบบสอบถาม
  • คีย์คือการเชื่อมโยงกับโหนดคลัสเตอร์ คีย์กำหนดว่าโหนดใดที่คอลัมน์ที่บันทึกไว้จะไปสิ้นสุดที่โหนดนั้น
  • ชื่อคอลัมน์มีผลผูกพันกับแอตทริบิวต์ในบันทึก ให้คุณจัดเก็บหลายค่าในรายการเดียว

แต่ละค่าจะเชื่อมโยงกับการประทับเวลา ซึ่งเป็นตัวเลขที่ผู้ใช้ระบุซึ่งใช้เพื่อแก้ไขข้อขัดแย้งระหว่างการบันทึก ยิ่งตัวเลขมากเท่าใด ก็จะพิจารณาคอลัมน์ใหม่ และเมื่อเปรียบเทียบ จะเขียนทับคอลัมน์เก่า

4.3 ประเภทข้อมูล

ตามประเภทข้อมูล: คีย์สเปซและตระกูลคอลัมน์เป็นสตริง (ชื่อ); การประทับเวลาเป็นตัวเลข 64 บิต และคีย์ ชื่อคอลัมน์ และค่าของคอลัมน์คืออาร์เรย์ของไบต์ คาสซานดรายังมีแนวคิดเกี่ยวกับประเภทข้อมูลอีกด้วย นักพัฒนาสามารถระบุประเภทเหล่านี้ (เป็นทางเลือก) เมื่อสร้างตระกูลคอลัมน์

สำหรับชื่อคอลัมน์นี้เรียกว่าตัวเปรียบเทียบ สำหรับค่าและคีย์จะเรียกว่าตัวตรวจสอบความถูกต้อง ขั้นแรกกำหนดค่าไบต์ที่อนุญาตสำหรับชื่อคอลัมน์และวิธีเรียงลำดับ ประการที่สองคือค่าไบต์ใดที่ถูกต้องสำหรับค่าคอลัมน์และคีย์

หากไม่ได้ตั้งค่าประเภทข้อมูลเหล่านี้ Cassandra จะจัดเก็บค่าและเปรียบเทียบเป็นสตริงไบต์ (BytesType) เนื่องจากอันที่จริงแล้วค่าเหล่านี้จะถูกเก็บไว้ภายใน

ประเภทข้อมูลคือ:

  • BytesType : สตริงไบต์ใด ๆ (ไม่มีการตรวจสอบ)
  • AsciiType : สตริง ASCII
  • UTF8Type : สตริง UTF-8
  • IntegerType : ตัวเลขที่มีขนาดตามอำเภอใจ
  • Int32Type : ตัวเลข 4 ไบต์
  • LongType : ตัวเลข 8 ไบต์
  • UUIDType : UUID ประเภท 1 หรือ 4
  • TimeUUIDType : ประเภท 1 UUID
  • DateType : ค่าประทับเวลา 8 ไบต์
  • BooleanType : สองค่า: จริง = 1 หรือเท็จ = 0
  • FloatType : หมายเลขทศนิยม 4 ไบต์
  • DoubleType : หมายเลขทศนิยม 8 ไบต์
  • DecimalType : ตัวเลขที่มีขนาดตามอำเภอใจและทศนิยม
  • CounterColumnType : ตัวนับ 8 ไบต์

ในคาสแซนดรา การดำเนินการเขียนข้อมูลทั้งหมดเป็นการดำเนินการเขียนใหม่เสมอ นั่นคือ ถ้าคอลัมน์ที่มีคีย์และชื่อเดียวกันซึ่งมีอยู่แล้วมาถึงตระกูลคอลัมน์ และการประทับเวลามากกว่าคอลัมน์ที่บันทึกไว้ ค่านั้นจะถูกเขียนทับ . ค่าที่บันทึกไว้จะไม่เปลี่ยนแปลง มีเพียงคอลัมน์ที่ใหม่กว่าเข้ามาพร้อมค่าใหม่

การเขียนถึงคาสแซนดรานั้นเร็วกว่าการอ่าน สิ่งนี้จะเปลี่ยนแนวทางที่ใช้ในการออกแบบ หากเราพิจารณาคาสซานดราจากมุมมองของการออกแบบโมเดลข้อมูล มันจะง่ายกว่าที่จะจินตนาการว่าตระกูลคอลัมน์ไม่ใช่ตาราง แต่เป็นมุมมองที่เป็นรูปธรรม ซึ่งเป็นโครงสร้างที่แสดงถึงข้อมูลของคิวรีที่ซับซ้อน แต่จัดเก็บไว้ใน ดิสก์.

แทนที่จะพยายามเขียนข้อมูลด้วยวิธีใดวิธีหนึ่งโดยใช้การสืบค้น จะเป็นการดีกว่าหากพยายามจัดเก็บทุกอย่างที่อาจจำเป็นสำหรับการค้นหานี้ในกลุ่มเป้าหมาย นั่นคือ จำเป็นต้องเข้าใกล้ไม่ใช่จากด้านของความสัมพันธ์ระหว่างเอนทิตีหรือความสัมพันธ์ระหว่างอ็อบเจ็กต์ แต่จากด้านของแบบสอบถาม: ต้องเลือกฟิลด์ใด บันทึกควรอยู่ในลำดับใด ควรขอข้อมูลใดที่เกี่ยวข้องกับข้อมูลหลักร่วมกัน - ทั้งหมดนี้ควรจัดเก็บไว้ในตระกูลคอลัมน์แล้ว

จำนวนคอลัมน์ในเรคคอร์ดถูกจำกัดในทางทฤษฎีไว้ที่ 2 พันล้าน นี่เป็นการพูดนอกเรื่องสั้น ๆ และสามารถดูรายละเอียดเพิ่มเติมได้ในบทความเกี่ยวกับเทคนิคการออกแบบและการเพิ่มประสิทธิภาพ และตอนนี้เรามาเจาะลึกขั้นตอนการบันทึกข้อมูลในคาสซานดราและอ่านมัน