1. Trang chủ >
  2. Kỹ thuật >
  3. Điện - Điện tử - Viễn thông >

1 So sánh mô hình dữ liệu Cassandra với cơ sở dữ liệu quan hệ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.52 MB, 50 trang )


Trong Cassandra, keyspace là nơi chứa tất cả dữ liệu ứng dụng, tương tự với một

cơ sở dữ liệu hay lược đồ trong một cơ sở dữ liệu quan hệ. Bên trong keyspace là một

hoặc nhiều đối tượng column family tương tự như các bảng. Các column family chứa các

cột và một tập các cột được xác định bởi một row key do ứng dụng cung cấp. Mỗi dòng là

trong một column family không nhất thiết phải có cùng các cột.

Cassandra không áp đặt quan hệ giữa các column family như cách mà cơ sở dữ liệu

quan hệ thực hiện với các bảng: không có khóa ngoại trong Cassandra, và việc join các

column family khi truy vấn không được hỗ trợ. Mỗi column family có một tập các cột tự

chứa được dự định để được truy nhập cùng nhau để thỏa mãn các truy vấn nào đó từ ứng

dụng.

Ví dụ, sử dụng vó dụ ứng dụng blog ở trên, bạn có thể có một column family cho

user và blog entry như trong mô hình quan hệ. Sau đó, các column family khác có thể

được thêm vào để hỗ trợ truy vấn mà ứng dụng cần thực hiện. Ví dụ, để trả lời truy vấn

“những người dùng nào đăng kí xem blog của tôi” ”, hay “cho tôi xem tất cả các blog viết

về thời trang” hay “cho tôi xem các bài viết mới nhất của các blog mà tôi đăng kí”, bạn có

thể cần thiết kế các column family bổ sung để hỗ trợ những truy vấn này. Chú ý rằng cần

thực hiện một số phi chuẩn hóa đối với dữ liệu.



36



3.2 Keyspaces

Trong Cassandra, keyspace là nơi chưa dữ liệu cho ứng dụng của bạn, giống như

lược đồ trong một cơ sở dữ liệu quan hệ. keyspace được dùng để nhóm các column family

lại với nhau. Thường thì một cluster có một column family cho một ứng dụng. Việc nhân

bản được điều khiển trên cơ sở keyspace, vì dữ liệu có những yêu cầu nhân bản khác nhau

nên đặt ở những keyspace khác nhau. Keyspace không được thiết kế để sử dụng như một

lớp bản đồ quan trọng trong mô hình dữ liệu, mà nó chỉ như một cách để điều khiển việc

nhân bản dữ liệu cho một tập các column family.

Các lệnh của ngôn ngữ định nghĩa dữ liệu (DDL) cho việc định nghĩa và thay đổi

keyspace được cung cấp trong rất nhiều giao diện khách hàng khác nhau như Cassandra

CLI và CQL. Ví dụ, để định nghĩa có một keyspace trong CQL:

CREATE KEYSPACE keyspace_name WITH

strategy_class = 'SimpleStrategy'

AND strategy_options:replication_factor=2;

Hoặc trong Cassandra CLI:

CREATE KEYSPACE keyspace_name WITH

placement_strategy = 'SimpleStrategy'

AND strategy_options = [{replication_factor:2}];



3.3 Column Families

Khi so sánh Cassandra với cơ sở dữ liệu quan hệ, column family giống như bảng

trong đó nó chứa các cột và dòng. Tuy nhiên, một column family cần thay đổi lớn trong

suy nghĩ của những người quen thuộc với thế giới quan hệ.

Trong cơ sở dữ liệu quan hệ, bạn định nghĩa ra các bảng có các cột cố định. Bảng

xác định tên cột, và kiểu dữ liệu của nó, và sau đó ứng dụng cung cấp các dòng để hoàn

thiện schema đó: mỗi dòng chứa cùng một số cột cố định như nhau.

Trong Cassandra, bạn định nghĩa các column family. Các column family có thể

(và nên) định nghĩa metadata về các cột, nhưng các cột thực sự tạp thành một dòng được

xác định bởi ứng dụng. Mỗi dòng có thể có số lượng cột khác nhau.

Mặc dù các column family rất linh hoạt, nhưng trong thực thế mỗi column family

không hoàn toàn không có lược đồ. Mỗi column family nên được thiết kế để chứa một

37



kiểu dữ liệu. Có 2 kiểu mẫu thiết kế column family phổ biến trong Cassandra: các column

family động và tĩnh.

Một column family tĩnh sử dụng một tập tương đối cố định các tên cột cột và giống

với cơ sở dữ liệu quan hệ hơn. Ví dụ, một column family lưu trữ dữ liệu người dùng có

thể có các cột tên người dùng, địa chỉ, email, số điện thoại… Mặc dù các dòng sẽ có cùng

một tập cột, chúng không bắt buộc phải có giá trị xác định cho tất cả các cột. Column

family tĩnh thường có metadata được đĩnh nghĩa trước cho mỗi cột.



Một column family động tận dụng được ưu điểm trong khả năng của Cassandra để

dùng các tên cột bất kỳ mà ứng dụng cung cấp để lưu trữ dữ liệu. Một column family

động cho phép bạn tính toán trước các tập kết quả và lưu chúng trong một dòng đơn để

truy vấn dữ liệu hiệu quả. Mỗi dòng là một snapshot của dữ liệu thỏa mãn một truy vấn cụ

thể.

Ví dụ, một column family theo dõi người sử dụng đăng kí xem một blog của người

dùng nào đó.



38



Thay vì định nghĩa metadata cho các cột riêng lẻ, một column family động định

nghĩa kiểu thông tin cho các tên giá giá trị của cột, nhưng tên và giá trị thực sự của cột

được đặt ởi ứng dụng khi một cột được thêm vào.

Với tất cả các column family, mỗi dòng là duy nhất và được xác định bằng khóa

của dòng đó, giống như khóa chính trong bảng quan hệ. Một column family luôn được

phân chia theo khóa dòng của nó, và khóa dòng luôn luôn được đánh chỉ mục ẩn. Khóa

dòng không được phép để trống.



3.4 Columns

Cột là đơn vị dữ liệu nhỏ nhất trong Cassandra. Nó là một bộ gồm có tên, giá trị,

và một nhãn thời gian.



Một cột phải có ten, và tên có thể là một nhãn tĩnh (như “tên”, hay “email”) hoặc

nó có thể được đặt tự động khi cột được tạo ra bởi ứng dụng.

Cột có thể được đánh chỉ mục theo tên của nó. Tuy nhiên, mọt hạn chế của các chỉ

mục cột là chúng không hỗ trợ các truy vấn yêu cầu truy nhập đến dữ liệu có thứ tự, như

các dữ liệu chuỗi thời gian. Trong trường hợp này, chỉ mục thứ cấp trên một cột nhãn thời

gian là không đủ vì bạn khong thể diều khiển thứ tự sắp xếp của cột với một chỉ mục thứ

cấp. Với những trường hợp thứ tự sắp xếp là quan trọng, việc duy trì thủ công một

column family như một chỉ mục là một cách khác để tra cứu cột dữ liệu được sắp xếp theo

thứ tự.

Một cột không nhất thiết phải có một giá trị. Đôi khi tất cả thông tin ứng dụng cần

để thỏa mãn một truy vấn nào đó có thể được lưu trữ ngay ở tên của cột. Ví dụ, nếu bạn

đang sử dụng một column family như một cái nhìn cụ thể hóa dể truy vấn các dòng từ các

column family khác, tất cả những gì bạn cần là lưu trữ khóa dòng mà bạn đang tìm kiếm,

giá trị có thể trống.

Cassandra sử dụng cột nhãn thời gian để xác định cập nhật gần nhất của một cột.

Nhãn thời gian được cung cấp bởi ứng dụng. Nhãn thời gian gần nhất luôn đạt dược khi

yêu cầu dữ liệu, nếu nhiều phiên cùng cập nhật một cột trong một dòng cùng một lúc thì

cập nhập mới nhất là cập nhật sẽ được tồn tại.



39



3.5 Các column đặc biệt (Counter, Expiring, Super)

3.5.1 Expiring Columns

Một cột có thể có một ngày hết hạn tùy chọn gọi là TTL (time to live). Mỗi khi

một cột được thêm vào, ứng dụng yêu cầu có thể chỉ ra một giá trị TTL tùy chọn, được

định nghĩa bằng giây, cho cột đó. Các cột TTL được đánh dấu xóa sau khi thời gian yêu

cầu hết hạn. Một khi chúng được đánh dấu xóa, chúng sẽ tự động bị loại bỏ khỏi các quá

trình sửa hay nén thông thường.

Bạn có thể sử dụng CLI hay CQL để thiết lập TTL cho một cột.

Nếu bạn muốn thay đổi TTL của một cột có hạn, bạn phải thêm lại cột đó với giá

trị TTL mới. Trong Cassandra việc thêm một cột thực sự là thao tác thêm hoặc cập nhât,

phụ thuộc vào phiên bản trước của cột đó đã tồn tại hay chưa. Điều này có nghĩa là để cập

nhật TTL cho một cột với một giá trị không xác định, bạn phải đọc cột và sau đó thêm lại

cột đó với một giá trị TTL mới.

Các cột TTL có độ chính xác đến một giây, được tính toán trên server. Do đó, một

giá trị TTL rất nhỏ có lẽ không có mấy ý nghĩa. Hơn nữa, các đồng hồ trên server phải

được đồng bộ hóa; nếu không độ chính xác có thể bị giảm vì thời gian hết hạn được tính

toán trên máy chủ chính nhận thao tác thêm cột đầu tiên, nhưng sau đó lại được đọc ra bởi

các máy khác trên cluster.

Một cột có hạn có thêm 8 byte mào đầu trong bộ nhớ hay ổ đĩa (để ghi TTL và thời

gian hết hạn) so với các cột chuẩn.

3.5.2 Counter Columns

Counter là một kiểu cột đặc biệt được sử dụng để lưu trữ một số có giá trị đếm tự

tăng khi có sự xuất hiện của một sự kiện hoặc tiến trình cụ thể nào đó. Ví dụ, bạn có thể

sử dụng cột counter để đếm số lần một trang được xem.

Các counter column family phải sử dụng CounterColumnType là kiểu dữ liệu cho

cột. Điều này có nghĩa là hiện tại, các cột counter chỉ có thể được lưu trữ trong các

column family chuyên biệt; chúng sẽ được phép trộn với các cột thông thường trong

tương lai.

Cột counter khác với các cột thông thường ở chỗ một khi nó được định nghĩa, ứng

dụng chỉ có thể cập nhật giá trị cột bằng cách tăng hoặc giảm nó. Để cập nhật tới cột

counter, ứng dụng cần truyền tên của cột và giá trị tăng (hoặc giảm); không cần nhãn thời

gian.

40



Về bên trong, cấu trúc của một cột counter có một chút phức tạp hơn. Cassandra

theo dõi trạng thái phân tán của counter cũng như nhãn thời gian mà server sinh ra khi xóa

một cột counter. Vì lý do này, điều quan trọng là tất cả các node trong cluster phải có

đồng hồ được đồng bộ hóa bằng giao thức thời gian mạng (network time protocol NTP).

Một cột counter có thể được đọc hay viết ở bất cứ mức độ nhất quán nào. Tuy

nhiên, điều quan trọng là phải hiêu rằng không giống những cột thông thường, việc ghi

vào cột counter yêu cầu một lần đọc trước để đảm bảo rằng các giá trị counter phân tán

vẫn thống nhất với nhau trên các bản sao. Nếu bạn ghi ở mức độ nhất quán là 1, việc đọc

ẩn sẽ không ảnh hưởng đến độ ghi trễ, nên 1 là mức độ nhất quán phổ biến nhất dùng với

counter.

3.5.3 Super Columns

Một Cassandra column family có thể chứa cả cột thông thường và siêu cột – điều

này làm cho mức độ lồng ghép trong cấu trúc column family thông thường tăng lên. Siêu

cột được tạp thành từ tên (siêu) cột và một bản đồ được sắp xếp của các cột con. Một siêu

cột có thể chỉ ra một kiểu dữ liệu (comparator) cho cả tên siêu cột và tên cột con.



Một siêu cột là một cách nhóm nhiều cột dựa trên một giá trị tìm kiếm chung. Mục

đích sử dụng chính của siêu cột là để phi chuẩn hóa nhiều dòng từ các column family

khác vào trong một dòng, cho phép lấy dữ liệu dưới cái nhìn cụ thể hóa. Ví dụ, giả sử bạn

muốn tạo ra một cái nhìn cụ thể của các blog entry cho những blogger mà một người

dùng đăng kí xem blog của họ.



41



Xem Thêm
Tải bản đầy đủ (.pdf) (50 trang)

×