5. Cassandra API
5.2. Cassandra CLI
Cassandra 0.7 giới thiệu một phiên bản ổn định của giao diện dòng lệnh là Cassandra-cli, nó có thể được sử dụng để dịnh nghĩa dữ liệu (DDL – Data Definition Language), thao tác dữ liệu (DML – Data Manipulation Language) và khai thác dữ liệu. Mặc dù không dành cho phát triển ứng dụng, nhưng đây là một cách tốt để bước đầu làm quen với Cassandra và xác định mô hình dữ liệu sẽ phát triển.
Tiện ích Cassandra CLI có thể được dung để định nghĩa dữ liệu và thao tác dữ liệu với một Cassandra cluser. Tiện ích này được lưu trong [Đường dẫn thư mục cài Cassandra]/bin/Cassandra-cli
Trước khi sử dụng Cassandra-cli bạn phải chắc chắn rằng đã khởi động dịch vụ Cassandra server. Chuyển con trỏ dòng lệnh tới thư mục cài đặt Cassandra, gõ lệnh:
bin\cassandra-cli –host [tên host/IP] –port [cổng kết nối]
Ví dụ:
cassandra-cli -host localhost -port 9160 cassandra-cli -host 110.123.4.5 -port 9160
Nếu các bạn thấy dòng “Connected to [tên host/IP]/[cổng]” là bạn đã kết nối thành công.
Mặc định Cassandra-cli sẽ kết nối tới một Cluster đã được thiết lập sẵn trong Cassandra.yaml (được gọi là “Test Cluster”)
Chú ý là cuối mỗi lệnh phải có dấu Chấm phẩy “;” để kết thúc lệnh (trừ lệnh “?” để trợ giúp là không cần dấu “;”), nếu không thấy dấu “;” Cassandra-cli hiểu khi bạn gõ Enter là xuống dòng và hiện “…” chờ gõ tiếp lệnh sau dấu, chỉ khi thấy “;”Cassandra-cli mới thực hiện lệnh.
Tạo một khoá Keyspace
CREATE KEYSPACE [tên keyspace]. Ví dụ, tạo một keyspace có tên demo
[default@unknown] CREATE KEYSPACE demo
Tạo một Column Family
Đầu tiên bạn phải chuyển tới keyspace muốn tạo Column Family với câu lệnh USE
[default@unknown] USE demo;
Trong ví dụ này, chúng ta tạo một Column Family lấy tên là users trong Keyspace demo. Trong Column Family chúng ta định nghĩa những cột sau: full_name, email,
state, gender, birth_year. Đây được xem như là một Column Family tĩnh,
chúng ta đang xác định tên các cột trước vì hầu hết các hàng được dự đoán sẽ có bằng hoặc ít hơn các cột trên (điều này không có nghĩa là chúng ta không thêm được các cột sau khi sử dụng, Column Family tĩnh chỉ là cách gọi tương đối)
Các thiết lập comparator, key_validation_class và validation_class
là kiểu mặc định cho tên cột, các giá trị của hàng và các giá trị của cột.
[default@unknown] USE demo;
[default@demo] CREATE COLUMN FAMILY users WITH comparator = UTF8Type
AND key_validation_class=UTF8Type AND column_metadata = [
{column_name: full_name, validation_class: UTF8Type} {column_name: email, validation_class: UTF8Type} {column_name: state, validation_class: UTF8Type} {column_name: gender, validation_class: UTF8Type} {column_name: birth_year, validation_class: LongType}
];
Tiếp theo chúng ta tạo một Column Family động tên là blog_entry. Chú ý là không có một Column nào được định nghĩa trước, các cột cần dùng sẽ được ứng dụng định nghĩa sau.
[default@demo] CREATE COLUMN FAMILY blog_entry WITH comparator = TimeUUIDType
AND key_validation_class=UTF8Type
AND default_validation_class = UTF8Type;
Tạo một Counter Column Family
Một Counter Column Family bao gồm nhiều Counter Column. Một Counter Column là loại cột đặc biệt mà giá trị là một số nguyên có dấu 64 bit (tăng hoặc giảm) được xác định bởi ứng dụng. Counter Column tìm kiếm giá trị mới nhất từ tất cả mọi cập nhật. Một Counter Column không thể lẫn lộn với cột thường trong 1 Column Family mà phải được tạo riêng để chuyên trách việc đếm.
Tạo 1 Column Family gồm các Counter Column, đặt giá trị
default_validation_class của Column family là CounterColumnType. VD:
[default@demo] CREATE COLUMN FAMILY page_view_counts WITH default_validation_class=CounterColumnType
AND key_validation_class=UTF8Type AND comparator=UTF8Type;
Chèn 1 hàng và Counter Column vào 1 Column Family (với giá trị đếm ban đầu đặt là 0):
[default@demo] INCR page_view_counts['www.datastax.com'] [home] BY 0;
Tăng số đếm:
[default@demo] INCR page_view_counts['www.datastax.com'] [home] BY 1;
Chèn dòng và cột
Ví dụ tiếp theo minh hoạ việc sử dụng lệnh SET để chèn cột cho 1 xâu kí tự vào Column Family Users. Trong ví dụ này, xâu kí tự là “bobbyjo” và chúng ta chèn vào các cột cho người dùng này. Lưu ý rằng với lệnh SET thì mỗi lần chỉ có thể chèn được 1 cột
[default@demo] SET users['bobbyjo']['full_name']='Robert Jones';
[default@demo] SET users['bobbyjo']
['email']='bobjones@gmail.com';
[default@demo] SET users['bobbyjo']['state']='TX'; [default@demo] SET users['bobbyjo']['gender']='M';
[default@demo] SET users['bobbyjo']['birth_year']='1975';
VD tiếp theo, chuỗi kí tự là “yomama” và chúng ta chỉ đặt ở một vài cột.
[default@demo] SET users['yomama']['full_name']='Cathy Smith';
[default@demo] SET users['yomama']['state']='CA'; [default@demo] SET users['yomama']['gender']='F';
[default@demo] SET users['yomama']['birth_year']='1969';
VD tiếp, chúng ta tạo mục nhập trong Column family blog_entry cho xâu kí tự “yomama”:
[default@demo] SET blog_entry['yomama'][timeuuid()] = 'I love my new shoes!';
Chú ý:
Giao diện dòng lệnh Cassandra sử dụng mức nhất quán mặc định là ONE cho tất cả thao tác đọc/ghi. Cassandra không hỗ trợ các mức nhất quán cụ thể ở giao diện dòng lệnh.
Đọc dòng và cột
Dùng lệnh GET để truy hồi một dòng cụ thể trong 1 Column family. Dùng lệnh LIST để trả lại 1 nhóm dòng và các cột kiên kết của chúng (Mặc định số cột trả lại tối đa là 100). VD, để trả lại 100 cột đầu (cùng các cột liên kết) từ Column family users:
[default@demo] LIST users;
Cassandra lưu giữ mặc định tất cả dữ liệu theo chuỗi 6 byte. Nếu không mặc định cụ thể một cấp xâu kí tự hợp lệ, giao diện dòng lệnh Cassandra sẽ đòi hỏi dữ liệu nhập cho xâu kí tự, tên cột, giá trị các cột đều ở dạng 6 byte (và dữ liệu phản hồi cũng sẽ là dạng 6 byte).
Để chuyển tiếp và phản hồi dữ liệu dưới dạng con người có thể đọc được, cần phải chuyển tiếp 1 giá trị thông qua một bảng mã. Các bộ mã máy tính hiện có là:
ascii bytes
integer (a generic variable-length integer type) lexicalUUID
long utf8
VD muốn 1 xâu kí tự và cột được phản hồi bằng bộ mã UTF8:
[default@demo] GET users[utf8('bobby')][utf8('full_name')];
Cũng có thể dùng lệnh ASSUME để chỉ rõ ở phiên người dùng, dữ liệu cẩn được phản hồi theo bộ mã nào. VD, để phản hồi xâu kí tự, tên và giá trị cột bằng bộ mã ASCII:
[default@demo] ASSUME users KEYS AS ascii;
[default@demo] ASSUME users COMPARATOR AS ascii; [default@demo] ASSUME users VALIDATOR AS ascii;
Đặt thời hạn cho cột
Khi đặt một cột trong Cassandra, bạn có thể tuỳ chọn đặt thời hạn TTL (time-to-live) cho cột.
Giả sử chúng ta lập 1 mã phiếu giảm giá (coupon codes) cho khách hàng có giá trị trong vòng 10 ngày. Chúng ta có thể định nghĩa 1 cột coupon_code và đặt thời hạn ở cột đó. VD:
[default@demo] SET users['bobbyjo']
[utf8('coupon_code')] = utf8('SAVE20') WITH ttl=864000;
Sau 10 ngày hoặc 864,000 giây kể từ sau khi lập cột, giá trị của nó sẽ bị xoá và không thể đọc được nữa. Tuy nhiên cần chú ý rằng, giá trị đó không thực sự bị xoá khỏi đĩa cho đến khi quá trình nén của Cassandra hoàn tất.
Giao diện lệnh có thể được sử dụng để tạo chỉ số thứ cấp (chỉ số trong giá trị cột). Chỉ số thứ cấp có thể được thêm vào khi tạo Column family hoặc thêm vào sau đó bằng lệnh UPDATE COLUMN FAMILY.
VD, để thêm chỉ số thứ cấp vào cột birth_year trong Column family users:
[default@demo] UPDATE COLUMN FAMILY users WITH comparator = UTF8Type
AND column_metadata = [{column_name: birth_year, validation_class: LongType, index_type: KEYS}];
Do chỉ số thứ cấp được tạo cho cột birth_year nên có thể truy vấn trực tiếp giá trị của cột bằng 1 năm nào đó như sau:
[default@demo] GET users WHERE birth_date = 1969;
Xoá dòng và cột
Giao diện lệnh Cassandra cung cấp lệnh DEL để xoá đi 1 hàng hay 1 cột.
VD, để xoá cột coupon_code cho xâu kí tự “yomama” trong Column family users:
[default@demo] DEL users ['yomama']['coupon_code']; [default@demo] GET users ['yomama'];
Hoặc xoá cả dòng:
[default@demo] DEL users ['yomama'];
Loại bỏ các Column Family và Keyspace
Có thể sử dụng các lệnh trong giao diện lệnh Cassandra để loại bỏ các column family và keyspace giống như loại bỏ bảng ở các CSDL quan hệ. VD sau đây minh hoạ lệnh loại bỏ Column family users và sau đó loại bỏ Keyspace demo:
[default@demo] DROP COLUMN FAMILY users; [default@demo] DROP KEYSPACE demo;