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