4.1 คำอธิบาย
Apache Cassandraเป็นระบบจัดการฐานข้อมูลแบบกระจายที่อยู่ในคลาสของระบบ NoSQL และได้รับการออกแบบมาเพื่อสร้างที่จัดเก็บข้อมูลอาร์เรย์ข้อมูลขนาดใหญ่ที่ปรับขนาดได้สูงและเชื่อถือได้ซึ่งนำเสนอในรูปแบบของแฮช
![](https://cdn.codegym.cc/images/article/3f1932c4-0cbf-42a9-a763-73770a3ad298/256.jpeg)
ในขั้นต้นโครงการได้รับการพัฒนาในส่วนลึกของ 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 เท่า เป็นต้น)
![](https://cdn.codegym.cc/images/article/fa60ab89-22de-439d-a6bf-931a891933c6/1024.jpeg)
4.2 แบบจำลองข้อมูล
ในศัพท์เฉพาะของคาสแซนดรา แอปพลิเคชันทำงานร่วมกับคีย์สเปซ ซึ่งสอดคล้องกับแนวคิดของสคีมาฐานข้อมูลในแบบจำลองเชิงสัมพันธ์ คีย์สเปซนี้สามารถมีตระกูลคอลัมน์ได้หลายตระกูล ซึ่งสอดคล้องกับแนวคิดของตารางเชิงสัมพันธ์
ในทางกลับกัน ตระกูลคอลัมน์จะมีคอลัมน์ (คอลัมน์) ซึ่งรวมกันโดยใช้คีย์ (คีย์แถว) ในเรกคอร์ด (แถว) คอลัมน์ประกอบด้วยสามส่วน: name (ชื่อคอลัมน์), timestamp (การประทับเวลา) และ value (ค่า) คอลัมน์ภายในเรกคอร์ดจะถูกจัดลำดับ ซึ่งแตกต่างจากฐานข้อมูลเชิงสัมพันธ์ ไม่มีข้อจำกัดว่าเรกคอร์ด (และในแง่ของฐานข้อมูลคือแถว) มีคอลัมน์ที่มีชื่อเดียวกับในเรกคอร์ดอื่นหรือไม่
ครอบครัวคอลัมน์สามารถมีได้หลายประเภท แต่ในบทความนี้เราจะละเว้นรายละเอียดนี้ นอกจากนี้ในเวอร์ชันล่าสุดของ Cassandra ยังสามารถดำเนินการค้นหาเพื่อกำหนดและเปลี่ยนแปลงข้อมูล (DDL, DML) โดยใช้ภาษา CQL เช่นเดียวกับการสร้างดัชนีรอง
![](https://cdn.codegym.cc/images/article/7ed11962-e3ce-4669-bdc0-fa7e3936d1a3/1024.jpeg)
ค่าเฉพาะที่จัดเก็บไว้ใน 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 พันล้าน นี่เป็นการพูดนอกเรื่องสั้น ๆ และสามารถดูรายละเอียดเพิ่มเติมได้ในบทความเกี่ยวกับเทคนิคการออกแบบและการเพิ่มประสิทธิภาพ และตอนนี้เรามาเจาะลึกขั้นตอนการบันทึกข้อมูลในคาสซานดราและอ่านมัน
GO TO FULL VERSION