ลองเล่น Apache Cassandra

What is Apache Cassandra?
Apache Cassandra is an open source NoSQL distributed database trusted by thousands of companies for scalability and high availability without compromising performance. Linear scalability and proven fault-tolerance on commodity hardware or cloud infrastructure make it the perfect platform for mission-critical data

Wide-column Stores

มันเป็นโลกอีกแบบที่เก็บข้อมูลต่างไปเดิม ที่เคยเก็บเป็น row มาเก็บแบบ column (ซึ่งผมเองก็ยังไม่เข้าใจเหมือนกันว่า ได้คำว่าเก็บเป็น column มันต่างจาก row ยังไงนะ) โดยข้อดีของมันคือ ทำงานเร็วมาก เนื่องจากมันบังคับว่า table ที่สร้างต้องมี PRIMARY KEY ซึ่งในภาพประกอบด้านล่างก็จะแสดงให้เห็นว่า ตัว PRIMARY KEY นั้นสามารถกำหนดได้หลายตัว (แบบเดียวกับ MySQL แหละ) โดยจะแบ่งเป็น parttition key และ clusstering key โดย partition key จะถูกใช้ประโยชน์ตอนทีมีการสร้าง node ขึ้นมาเก็บแยกกัน สิ่งนี้ทำให้มันเป็น distributed นั่นเอง

source: https://www.instaclustr.com/cassandra-data-partitioning/

ซึ่งส่วนใหญ่แล้ว Cassandra จะถูกนำไปใช้กับการเก็บ transaction, พวก iOT, history, health tracker data พวกอุณหภูมิ สภาพอากาศ เป็นต้น เนื่องจากมัน insert ได้เก่งมาก ๆ และ select ก็เร็วด้วย เนื่องจากมันไม่มีการ JOIN Table แบบ Relation Database

แต่สิ่งที่ต้องคำนึงถึงนั้นคือ NoSQL ไม่ได้มาแทนที่ Relation DB แต่มันมาช่วยทำบางอย่างที่ RDB ทำไม่ได้ หรือไม่ตอบโจทย์ หรือไม่เร็วพอที่จะทำได้ โดยการออกแบบ ตารางใน Cassandra นี้ จะสร้างไว้เพื่อเก็บไว้ก่อนไม่ได้ ต้องมีแผนการ หรือ มีข้อมูลอยู่แล้ว ที่พร้อมนำไปใช้ เพื่อตอบโจทย์อะไรบ้างอย่าง เช่น มีข้อมูลอุณหภูมิจาก ioT หลายๆตัว จึงอยากรู้ว่าค่าเฉลี่ยของแต่ละตัวเป็นเท่าไร เราก็จะสร้าง table ที่มี iot_id, temp และเอา temp มาหา avg เป็นต้น

Installation from Debian packages

ผมลองใช้งานบน Ubuntu 20.04 ที่ได้จากการอบรมมาทดสอบ ซึ่งตัว VM ติดตั้ง java runtime environment ไว้แล้ว

คู่มือติดตั้งฉบับเต็ม :
https://cassandra.apache.org/doc/latest/getting_started/installing.html#installing-the-debian-packages

เตรียม package

สำหรับการติดตั้ง package ก็ไม่ยากรันคำสั่งทีละบรรทัดได้เลย

echo "deb http://www.apache.org/dist/cassandra/debian 311x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
curl https://downloads.apache.org/cassandra/KEYS | sudo apt-key add -
sudo apt update
sudo apt install cassandra

Service control

ตรวจสอบ service ว่าติดตั้งสำเร็จแล้ว Active หรือไม่ พร้อมกับสั่งให้ทำงานเมื่อ startup

systemctl status cassandra
sudo systemctl enable cassandra

Cassandra tools

เราใช้ command ที่ชื่อว่า cqlsh โดยรูปแบบการทำงานจะคล้าย mysql มากๆ หลังจากติดตั้งครั้งแรกแล้วลองทดสอบพิมพ์ cqlsh มันก็จะเข้าใช้งานได้ทันที เนื่องจาก ไม่ได้ตั้งเรื่อง security เอาไว้

cqlsh

DESCRIPT

เป็นคำสั่งเหมือนกับ SHOW เอาไว้แสดงค่าต่างๆ เช่น keyspace, table โดยเราสามารถดูรายละเอียดทั้งหมดได้โดยพิมพ์

HELP DESCRIBE

ที่ใช้งานหลักๆ สำหรับสำรวจเบื้องต้นก็เช่น

  • DESCRIBE KEYSPACES : Output the names of all keyspaces.
  • DESCRIBE TABLES : Output the names of all tables in the current keyspace, or in all keyspaces if there is no current keyspace.
  • DESCRIBE TABLE <tablename> : Output CQL commands that could be used to recreate the given table. In some cases, as above, there may be table metadata which is not representable and which will not be shown.

Create table

ลักษณะการสร้างตารางก็ไม่ต่างจาก MySQL เพียงแต่เน้นย้ำว่า ตารางต้องมี PRIMARY

DROP KEYSPACE IF EXISTS movielens;
CREATE KEYSPACE movielens
  WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE movielens;

CREATE TABLE ratings_by_mm (
  movie_id INT,
  rating INT,
  PRIMARY KEY (movie_id)
);
COPY ratings_by_mm (movie_id,rating) FROM 'movielens_ratings.csv' WITH DELIMITER=',' AND HEADER=TRUE;

SELECT

การดึงข้อมูลก็เหมือนกับ RDB ทุกอย่าง แต่ขอให้เรา WHERE ด้วยเงื่อนไขที่เป็น column ที่เป็น PRIMARY KEY เนื่องจากมันทำ index ไว้ทั้งหมด นี่เลยทำให้มัน query ข้อมูลค่อนข้างไว

SELECT
  movie_id,
  avg(cast(rating as float)) as average
FROM ratings_by_movie
WHERE movie_id = 200;

ALLOW FILTERING

ทั้งนี้หากเราจะ WHERE นอก PRIMARY มันก็จะมีคำเตือน ประมาณนี้

InvalidRequest: Error from server: code=2200 [Invalid query] message=”Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING”

คือมันเตือนว่า เรากำลัง query นอก index อาจทำให้ประสิทธิภาพไม่ดีเท่าที่ควร แต่ถ้าต้องการใช้ก็ตามใจนะ ใส่ ALLOW FILTERING ต่อท้ายคำสั่งเข้าไป มันก็ทำงานให้แหละ แต่ “เขาไม่นิยมทำกัน”

สรุป

Cassandra น่าใช้งาน แต่ต้องวางแผนดี ๆ ถ้ายังวางแผนไม่ได้ ก็เก็บใน RDB ไปก่อน ไม่ต้องคิดมาก แต่เมื่อมีแผนเมื่อไหร่ มีความชัดเจนเมื่อไหร่ ค่อยขยับข้อมูลมาที่ Cassandra ก็ยังไม่สาย แต่ใช้ไปซักพักแล้วเราพบว่า column หรือ มันยังไม่พอ เราอาจจะใช้วิธี ALTER table ก็ได้ หรือจะ CREATE table ใหม่ก็ได้ จุดสำคัญอยู่ตรงที่ table เดิมที่มีอยู่มันตอบโจทย์หรือป่าว มันยังใช้กับโจทย์อื่นได้อย่างมีประสิทธิภาพหรือป่าว หากใช่ การเพิ่มก็ต้องทำให้ประสิทธิภาพของข้อมูลมันดีขึ้นแน่นอน แต่ถ้าไม่ใช่ มันอาจอยู่นอกแผนการที่ว่างไว้ เราก็ควรสร้างตารางใหม่

วันนี้ได้ลองทดสอบติดตั้ง ใช้งานเบื้องต้นโดย export ข้อมูลจาก MySQL ออกมา เป็น csv และ COPY ไปยัง Cassandra ถือว่าน่าพอใจ ลองหาวิธีการนำข้อมูลมาใส่ด้วย service อื่นๆ ก็มีเยอะพอสมควร