ทำความรู้จัก Apache Cassandra และ Amazon Keyspaces
Tags: aws, awsthai, cassandra, keyspaces
Published: 2021-08-31 08:23:28

## สารบัญ (Table of Contents)
1. [บทนำ](#intro)
2. [Apache Cassandra คืออะไร](#apache-cassandra)
3. [ข้อดีของ Apache Cassandra](#apache-cassandra-benefits)
4. [Amazon Keyspaces (for Apache Cassandra) คืออะไร](#amazon-keyspaces)
5. [ข้อดีของ Amazon Keyspaces (for Apache Cassandra)](#amazon-keyspaces-benefits)
6. [บทสรุป](#summary)
7. [แหล่งอ้างอิง] (#references)

## บทนำ <a name="intro"></a>
สำหรับหลายท่านที่เพิ่งศึกษาการใช้งานระบบฐานข้อมูล (database) มักจะรู้จักระบบฐานข้อมูลแบบตารางเช่น MySQL, PostgreSQL, Oracle, Microsoft SQL Server ซึ่งระบบฐานข้อมูลเหล่านี้ จะถูกจัดอยู่ในหมวดหมู่ Relational Database Management Software (RDBMS) 

แต่ในระยะหลัง ๆ เรื่องการทำงานแบบ Microservices Application ก็มักจะได้ยินระบบฐานข้อมูลประเภท NoSQL (Not-Only-SQL) ซึ่งเป็นระบบฐานข้อมูลที่ช่วยผู้ใช้งานในเรื่องของ ภาษาเข้าถึง (Query Language), การขยาย (Scale), การจัดเก็บ (Storage Engine), และความเร็ว (Performance)

โดยระบบฐานข้อมูลแบบ NoSQL มีหลายยี่ห้อมากมาย ทั้งที่เป็น Commercial บน open-source อย่างเช่น MongoDB, Redis, Elasticsearch หรือจะเป็น open-source หลัก ๆ อย่าง Apache Cassandra, Prometheus โดยแต่ละยี่ห้อก็จะมีความแตกต่างกันทั้งในแง่ของ ภาษาเข้าถึง, รูปแบบการขยาย, ลักษณะข้อมูลที่จัดเก็บ, และความเร็วในการเข้าถึงที่แตกต่างกัน

## Apache Cassandra คืออะไร <a name="apache-cassandra"></a>
![Cassandra Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8nri7rjkusgnvr65ruu.png)
Apache Cassandra คือระบบฐานข้อมูล open-source NoSQL แบบ distributed ที่มีจุดเด่นในเรื่องของการขยาย (scalability) และความพร้อมใช้ (high availability) อีกทั้งยังมีความเร็วสูง (performance) นอกจากนั้นยังรองรับเรื่องการ Linear-scale ที่สามารถใช้ได้กับ commodity hardware เพื่อช่วยกันทำงานให้เกิดประสิทธิภาพดียิ่งขึ้น [1]

การจัดเก็บของ Apache Cassandra จะอยู่ในรูปแบบ Column Family (CF) [2] โดยจะเป็นรูปแบบแถว ที่มี key/value ในแต่ละ column (คล้าย ๆ กับ row ใน table) และมีภาษาเข้าถึงชื่อว่า CQL (Cassandra Query Language) ที่มีการเขียนแบบ SQL-Like

โดยถ้าอ้างอิงจากเว็บไซต์ DB-Engines[3] ตัว Apache Cassandra ถือว่าเป็นระบบฐานข้อมูลที่ได้รับความสนใจ โดยอยู่ในลำดับที่ 11 (เมื่อก่อนเคยอยู่ Top 10 ด้วย) ซึ่งก็ถือว่าเกาะกลุ่มผู้นำ โดยจะช่วยให้ผู้ใช้งาน สามารถหาข้อมูล วิธีการใช้ หรือคำตอบของปัญหาที่เจอแต่ละวันจากเว็บไซต์ต่าง ๆ หรือใน community ได้ง่าย

## ข้อดีของ Apache Cassandra <a name="apache-cassandra-benefits"></a>
* **Masterless Architecture** - Apache Cassandra เป็นระบบฐานข้อมูลที่ทำงานแบบ cluster โดยไม่มี master ซึ่งการสื่อสารกันของข้อมูลภายใน cluster จะทำงานแบบ peer-to-peer โดยใช้ gossip protocol ในการติดต่อกัน
![Cassandra Distributed Architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qo0v6rfo9t3da8n24z27.jpg)
* **Distributed and Linear Scale-out** - Apache Cassandra ทำงานแบบ distributed database ผ่าน shard/token โดยแต่ละ node ใน cluster จะทำงานเฉพาะข้อมูลที่ตัวเองเป็นผู้ถือครองเท่านั้น และหากมีการออกแบบที่ถูกต้อง การเพิ่มจำนวน node ใน cluster จะเป็นการเพิ่มการรองรับโหลดแบบ linear scale ได้อีกด้วย (เช่น 10 nodes รับโหลดได้ 10,000 w/s หากขยายเป็น 20 nodes ก็จะรับโหลดได้ 20,000 w/s เป็นต้น)
![Cassandra Scale](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10nnrb7wzn8eysw699w0.jpg)
* **Active-Active Multiple Clusters** - Apache Cassandra รองรับการทำ architecture แบบหลาย cluster ได้ โดยสามารถเลือกที่จะเขียนข้อมูลที่ cluster ไหนก็ได้ อีกทั้งยังสามารถควบคุม data consistency ระหว่าง cluster ได้อีกด้วย ส่งผลให้เกิดการออกแบบ DC/DR ข้าม region ได้
![Cassandra MutliDC](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0n3mo76sgcp03vjhx4k.jpg)
* **Flexible for Data Consistency or Partition Tolerance** - Apache Cassandra มีการออกแบบให้รองรับเรื่องการทำซ้ำ (replication) ของข้อมูลจากตัวระบบฐานข้อมูลเอง โดยผู้ใช้งานสามารถเลือก 3 copies หรือ N copies (แนะนำเป็นเลขคี่) แล้วแต่ผู้ใช้งานเอง ทำให้แม้ว่าจะเกิด node มีปัญหา ก็ยังสามารถกู้ข้อมูลคืนได้ และผู้ใช้งานยังสามารถกำหนดความถูกต้องของข้อมูลผ่าน Consistency Level ระหว่างอ่าน (read) หรือเขียน (write) ได้ โดยแลกกับความเร็ว (performance)
![Cassandra CAP](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vai15g0g0t2sbcpzgvxx.jpg)

โดย Apache Cassandra มี keywords สำคัญ ๆ ที่ควรจะรู้ดังนี้
* **Node** - เครื่องหรือ process ที่ทำงานระบบฐานข้อมูล โดยจะทำการทั้งการจัดเก็บ การประมวลผล และการพูดคุยเชื่อมต่อกันระหว่าง node ภายใน cluster
* **Cluster** - กลุ่มของ node ที่ช่วยกันทำงานบนระบบฐานข้อมูล โดยการเชื่อมต่อจาก application จะเชื่อมต่อเข้ามาทำงานในระดับ cluster
* **Keyspace** - Logical Isolation ของข้อมูล โดยเป็นส่วนที่สามารถแบ่งแยกกลุ่มของ table (คล้ายกับ database ใน RDBMS)
* **Replication Factor** - ค่าทำซ้ำ (replication) ของข้อมูล โดยสามารถเลือกจำนวน copy ได้ เช่น 3,5,7 เป็นต้น โดยสามารถกำหนดในแต่ละ Keyspace ของแต่ละ "DC" ได้
* **Table** - Schema ที่ใช้ในการจัดเก็บข้อมูล โดยมีการระบุ column name, data type รวมถึง Keys ต่าง ๆ เพื่อใช้ในการเข้าถึงข้อมูล (คล้ายกับ table ใน RDBMS)
* **Partition Key(s)** - Column(s) ที่ระบุให้ทำการ shard ไปในแต่ละ node ของ cluster โดย partition key(s) เป็นสิ่งที่ require ในการทำ equal filtering เวลาเข้าถึงข้อมูล
* **Clustering Key(s)** - Column(s) ที่ระบุให้ทำการเรียง (sort) ของข้อมูล ซึ่งจะสามารถเข้าถึงข้อมูลแบบ range filtering ได้
* **Primary Key** - ส่วนประกอบของ Partition Key(s) กับ Clustering Key(s) ที่แสดงถึงความเป็น Unique ของ record ใด ๆ โดยหากมีการเขียนซ้ำที่ record ที่มี Primary Key เดียวกัน จะเป็นการ Upsert โดยอัตโนมัติ ซึ่งรูปแบบการจัดการ conflict จะเป็นลักษณะ Last-Write-Win
* **Consistency Level** - กำหนดความถูกต้องของข้อมูล โดยสามารถกำหนดแยกกันระหว่างการเขียน (write) กับการอ่าน (read) ได้ โดยจะส่งผลทั้งเรื่องของ performance, availability ด้วย เช่น ONE, QUORUM, ALL, LOCAL_ONE, LOCAL_QUORUM เป็นต้น

ต่อมาเมื่อผู้ใช้งาน Apache Cassandra ใช้งานไปสักระยะนึงแล้ว มีการขยายจำนวน node ใหญ่ประมาณนึง ผู้ใช้งานมักจะพบปัญหาเรื่องการจัดการ การดูแล รวมถึงความรู้ความใจเชิงลึกของตัว software
* การปรับ cassandra.yaml[4] - จำนวนของ configuration ที่สามารถปรับเปลี่ยนได้มีเยอะมาก ๆ และต้องใช้ expert ที่เข้าใจระบบค่อนข้างสูง ซึ่งจะส่งผลทั้งเรื่อง performance และ stability
* การจัดการผ่าน Nodetool - ตัว software ของ Apache Cassandra จะมี tool ที่ใช้ในการจัดการ node ผ่าน Nodetool แต่การทำงานผ่าน Nodetool ส่วนใหญ่จะมีผลกับ node ที่ระบุเท่านั้น โดยหากต้องจัดการระดับ 20-100+ nodes จะต้องเสียเวลาทำ automation เพิ่มเติมด้วย
* การดูแล compaction tasks - compaction เป็นเรื่องสำคัญที่ต้องดูแลเพราะจะส่งผลทั้งในแง่ของ performance และการ stream ของข้อมูลในการเพิ่ม/ลด node
* การ replace dead node - day-to-day maintenance ที่ต้องทำเพื่อการแก้ไข node ที่มีปัญหา และต้องคอยดูแลไม่ให้เกิดการ stream ข้อมูลผิดพลาด
* การ repair inconsistent data - ตัว Apache Cassandra เมื่อมีการทำงานไปสักพักจะเกิด data inconsistent ใน cluster โดยจะมี practice ที่ต้องทำการ full repair data ก่อนเกิด garbage collection ของข้อมูล (default 10 days)
* การ monitor low-level - แม้ว่าส่วนใหญ่ตัว Apache Cassandra จะให้ metrics ผ่าน MBean หรือ Nodetool มา แต่การที่จะดูแลและเข้าใจ ต้องใช้ผู้เชี่ยวชาญที่เข้าใจ architecture และ configuration ค่อนข้างสูง

## Amazon Keyspaces (for Apache Cassandra) คืออะไร <a name="amazon-keyspaces"></a>
![Amazon Keyspaces Logo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rpzv73e1akjzaec9zekv.png)
Amazon Keyspaces คือ Serverless Apache Cassandra–compatible platform ที่ให้ผู้ใช้งานสามารถใช้งาน service ได้ทันที โดยยังคงความสามารถต่าง ๆ ที่ตัว Apache Cassandra ทำได้ ทั้งในเรื่องของ Scalability, High Availability รวมถึงตัว Driver, Code และภาษาเข้าถึงอย่าง CQL

โดยคำว่า Serverless หมายความว่าทางผู้ใช้งานไม่ต้องทำการ provision ไม่ต้อง patch ไม่ต้องดูแล server, ไม่ต้องติดตั้ง (install), ดูแล (maintain), หรือจัดการ (operate) software อีกต่อไป

นอกจากนั้นยังเพิ่มเติมความสามารถอย่าง Data Encryption การทำ Backup และ Point-in-time Recovery[5]

## ข้อดีของ Amazon Keyspaces (for Apache Cassandra) <a name="amazon-keyspaces-benefits"></a>
* **Serverless on Apache Cassandra architecture** - โดยหลัก ๆ แล้วข้อดีเรื่อง architecture ก็จะยังอยู่ครบทั้งเรื่องของ scalability, high availability, partition tolerance และผู้ใช้งานยังสามารถเลือก Consistency Level ได้เหมือนเดิม และมีส่วนเพิ่มเติมคือเรื่องของ Serverless Architecture ที่ช่วยให้ผู้ใช้งานไม่ต้องดูแล server ไม่ต้องติดตั้ง software ไม่ต้องจัดการ software รวมถึงรองรับ Mutliple Availability Zone ที่ช่วยเพิ่ม SLA ของ service ให้กับผู้ใช้งานอีกด้วย
<br />

* **คงความเป็น Apache Cassandra Compatibility** - หากตัว application มีการติดตั้ง driver/client ที่ใช้กับ version 3.11.2 ได้ ก็จะยังสามารถใช้ตัวเดิม เชื่อมต่อ Amazon Keyspaces ได้เลย โดยไม่ต้องมีการติดตั้งใหม่[6] และยังรองรับภาษา CQL ในการอ่านและเขียนข้อมูลได้อีกด้วย ซึ่งหมายถึงผู้ใช้งานสามารถเลือกใช้ Apache Cassandra หรือ Amazon Keyspaces โดยไม่ต้องแก้ไข application เหมาะกับการโยกย้ายไปมาได้สะดวก แต่แน่นอน ว่านี่เป็น compatibility service แนะนำให้อ่านความแตกต่างในรายละเอียดได้บน [Compare Amazon Keyspaces with Cassandra](https://docs.aws.amazon.com/keyspaces/latest/devguide/keyspaces-vs-cassandra.html)
<br />

* **เพิ่มเติมในส่วนของ Security และ Data Protection** - ตัว Amazon Keyspaces มี default เป็น Data Encryption At-Rest และ security มุมอื่น ๆ อีกมากมาย ที่จะช่วยให้ผู้ใช้ตอบโจทย์เรื่อง Security and Compliance รวมถึงการจัดการ Backup/Restore ที่รองรับรูปแบบ Point-in-Time Recovery อีกด้วย
<br />

* **รองรับการใช้งานผ่าน Capacity แบบ Provisioned และ On-demand และการคิดเงินแบบ pay-as-you-go model** - โดย Provisioned จะเป็นรูปแบบกำหนด throughput ที่ผู้ใช้งานจะสามารถ ทั้งในส่วนของการอ่านและเขียน (คล้ายซื้อค่า internet) หรือ on-demand ที่ให้ผู้ใช้งาน ใช้เท่าไหร่จ่ายเท่านั้น โดยทั้งสองแบบนั้นยังรองรับการทำ Auto-Scaling เพื่อให้มั่นใจได้ว่า ตัว service สามารถรองรับก็ load ที่เกิดขึ้นได้

## บทสรุป <a name="summary"></a>
**Apache Cassandra** คือระบบฐานข้อมูลแบบ Distributed NoSQL ที่มีจุดเด่นในเรื่องของการทำ Scale-out Architecture, High Availability, และ Performance ที่สูง โดยผู้ใช้งานสามารถเลือกปรับ Data Consistency ให้เหมาะสมกับ Use Case ที่เลือกใช้ได้ และยังรองรับภาษา CQL (SQL-Like) ซึ่งจะช่วยให้ผู้ใช้งานไม่ต้องปรับตัวมากนัก

**Amazon Keyspaces (for Apache Cassandra)** คือ 1 ใน Database Services ที่ทาง AWS ให้บริการในรูปแบบ Serverless Apache Cassandra Compatibility Service ที่ช่วยให้ผู้ใช้งานสามารถใช้ driver/client เดิม รวมถึงภาษา CQL เดิมที่เคยใช้อยู่แล้ว นำมาใช้กับ Amazon Keyspaces ได้ทันที โดยทาง AWS ช่วยเรื่องของการจัดการ infrastructure, software, scaling ต่าง ๆ ให้ รวมถึงมีการเพิ่ม features บางส่วนเช่น security backup/restore และให้บริการในรูปแบบ pay-as-you-go model

![CastleArm](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdhrwaj8zolrm46mhs3k.jpg)

### แหล่งอ้างอิง <a name="references"></a>
[1] https://cassandra.apache.org/
[2] https://en.wikipedia.org/wiki/Column_family
[3] https://db-engines.com/en/ranking
[4] https://github.com/apache/cassandra
[5] https://aws.amazon.com/keyspaces/
[6] https://docs.aws.amazon.com/keyspaces/latest/devguide/programmatic.drivers.html

### แหล่งอ้างอิงรูปภาพ
[a] https://cassandra.apache.org/_/cassandra-basics.html