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 )
3.6.1 Validators
Với tất cả các column family, cách thực hành tốt nhất là định nghĩa một kiểu dữ
liệu cho khóa dòng sử dụng thuộc tính key_validation_class.
Với các column family tĩnh, bạn nên định nghĩa một cột và kiểu dữ liệu tương ứng
khi bạn định nghĩa column family sử dụng thuộc tính column_metadata.
Với các column family động (các tên cột không được biết trước), bạn nên chỉ ra
một default_validation_class thay vì định nghĩa kiểu dữ liệu cho từng cột.
Các validator cho khóa và cột có thể được thêm vào hoặc thay đổi trong định nghĩa
column family bất cứ khi nào. Nếu bạn chỉ định một validator không hợp lệ trên column
family, yêu cầu tới dữ liệu đó có thể bị nhầm lẫn, và việc thêm hay cập nhật dữ liệu khong
tuân theo validator đã chỉ định sẽ bị từ chối.
3.6.2 Comparators
Trong một dòng, các cột luôn được lưu trữ theo thứ tự sắp xếp theo tên cột.
Comparator chỉ ra kiểu dữ liệu cho tên cột, cũng như thứ tự sắp xếp mà các cột được lưu
trong một dòng. Không giống validator, comparator có thể không được thay đổi sau khi
column family được định nghĩa, nên đây là một xem xét quan trọng khi định nghĩa một
column family trong Cassandra.
Thường thì tên của column family tĩnh thường là kiểu chuỗi, và thứ tự sắp xếp của
cột không quan trọng. Với các column family động, thứ tự sắp xếp lại quan trọng. Ví dụ,
trong một column family lưu trữ dữ liệu chuỗi thời gian (tên cột và nhãn thời gian), có dữ
liệu theo thứ tự sắp xếp được cần đến để trích ra tập kết quả từ một dòng các cột.
3.7 Nén column family
Việc nén dữ liệu có thể được cấu hình trên mỗi column family. Việc nén này sẽ tối
đa hóa dung lượng lưu trữ của các node Cassandra bằng cách giảm dung lượng dữ liệu
trên đĩa. Hơn nữa ngoài tiết kiệm không gian lưu trữ, việc nén cũng giảm vào ra đĩa, đặc
biệt là cho các công việc chỉ đọc.
Bên cạnh việc giảm kích thước dữ liệu, việc nén thường cải thiện cả hiệu năng đọc
và ghi. Cassandra có thể nhanh chóng tìm ra vị trí của các dòng trong chỉ mục SSTable,
và chỉ giải nén nhóm dữ liệu có liên quan. Điều này có nghĩa việc nén cải thiện hiệu năng
đọc không chỉ bằng cách cho phép lưu trữ được nhiều dữ liệu hơn trên bộ nhớ mà còn có
lợi với các công việc có tập dữ liệu không đặt vừa vào bộ nhớ.
43
Không giống như cơ sở dữ liệu truyền thống, hiệu năng ghi bị ảnh hưởng tiêu cục
bởi việc nén trong Cassandra. Ghi dữ liệu trên các bảng đã nén trong thực tế đã cho thấy
cải thiện được 10% hiệu năng. Trong cơ sở dữ liệu quan hệ truyền thống, việc ghi đòi hỏi
ghe đè lên các file dữ liệu đang tồn tại trên đĩa. Điều này nghĩa là các cơ sở dữ liệu phải
định vị các trang liên quan trên đĩa, giải nén chúng, ghi đè dữ liệu liên quan lên, và sau đó
lại nén lại (một thao tác đắt đỏ về cả sử dụng CPU và vào ra đĩa).
Vì các file dữ liệu Cassandra SSTable là bất biến (chúng không dược viết lại sau
khi đã được ghi vào đĩa), khong cần phải giản nén để xử lý thao tác ghi. SSTable chỉ được
nén một lần, khi chúng được ghi vào đĩa.
Việc nén có thể đưa lại các lợi ích sau, phụ thuộc vào đặc trưng dữ liệu của column
family:
• Giảm 2x-4xtrong kích thước dữ liệu
• Cải thiện 25-35% hiệu năng đọc
• Cải thiện 5-10% hiệu năng của thao tác ghi.
3.7.1 Khi nào sử dụng nén
Nén phù hợp nhất cho các column family có nhiều dòng, mỗi dòng có cùng số cột,
hoặc ít nhất có nhiều cột chung. Ví dụ, một column family chứa dữ liệu người dùng như
tên, email… có thể là ứng cử viên tốt cho việc nén. Càng có nhiều dữ liệu tương đồng trên
các dòng tỉ lệ nén càng lớn, và đạt được hiệu năng đọc tốt hơn.
Nén khong tốt đối với các column family mà mỗi dòng có tập các cột khác nhau, hoặc có
rất ít dòng rộng. Column family động như vậy sẽ không tốt trong tỉ lệ nén.
3.7.2 Cấu hình nén cho một Column Family
Khi bạn tạo hay cập nhật một column family, bạn có thể chọn làm nó thành một
column family nén bằng cách thiết lập thuộc tính compression_options. Bạn có thể cho
phép nén khi bạn tạo một column family mới, hoặc cập nhật một column family đã có để
thêm việc nén vào sau. Khi bạn thêm thao tác nén vào một column family mới, SSTable
dã có trên đĩa khong được nén ngay lập tức. Bất cứ SSTable mới nào được tạo ra cũng sẽ
được nén, và các SSTable đã có sẽ được nén trong quá trình nén Cassandra thông thường.
Nếu cần, bạn có thể ép buộc các bảng SSTable đã có được ghi lại và nén bằng cách sử
dụng một số nodetool.
Ví dụ, để tạo ra một column family mới có thực hiện nén bằng Cassandra CLI, bạn
làm như sau:
44
[default@demo]
CREATE
COLUMN
FAMILY
key_validation_class=UTF8Type AND column_metadata = [
{column_name: name, validation_class:
validation_class: UTF8Type} {column_name:
state, validation_class: UTF8Type}
UTF8Type} {column_name: birth_year,
UTF8Type}
{column_name:
users
{column_name:
gender,
validation_class:
LongType}
]
compression_options={sstable_compression:SnappyCompressor,
WITH
email,
validation_class:
AND
chunk_length_kb:64};
3.8 Chỉ mục trong Cassandra
Một chỉ mục là một cấu trúc dữ liệu cho phép tìm kiếm dữ liệu nhanh, hiệu quả
phù hợp với một điều kiện đã cho.
3.8.1 Chỉ mục chính
Trong thiết kế cơ sở dữ liệu quan hệ, một khóa chính là khóa duy nhất được dùng
để xác định mỗi dòng trong bảng. Một chỉ mục khóa chính, giống như chỉ mục, tăng tốc
độ truy nhập ngẫu nhiên tới dữ liệu trong bảng. Khóa chính cũng đảm bảo tính duy nhất
của bản ghi, và có thể điều khiển thứ tự trong đó các bản ghi được phân cụm một cách vật
lý, hoặc được lưu trữ trong cơ sở dữ liệu.
Trong Cassandra, chỉ mục chính cho một column family là chỉ mục của các khóa
dòng. Mỗi node giữ chỉ mục này cho dữ liệu nó quản lý.
Các dòng được gán cho các node bởi phân vùng cluster được cấu hình, và chiến
lược đặt bản sao keyspace đã cấu hình. Chỉ mục chính trong Cassandra cho phép tìm kiếm
các dòng theo khóa dòng. Vì mỗi node biết khoảng các khóa mà nó quản lý, các dòng
được yêu cầu có thể được định vị một cách hiệu quả bằng việc quét các chỉ mục dòng chỉ
trên các bản sao liên quan.
Với các khóa dòng được phân vùng ngẫu nhiên (mặc định trong Cassandra), các
khóa dòng được phân vùng bởi mã băm MD5 và không được quét theo thứ tự như trong
các chỉ mục cây nhị phân truyền thống. Sử dụng các phân vùng có thứ tự cho phép giới
hạn các truy vấn tới các dòng, nhưng không được khuyến khích vì độ phức tạp trong việc
duy trì việc phân tán dữ liệu trên các node.
45
3.8.2 Chỉ mục thứ cấp
Các chỉ mục thứ cấp trong Cassandra chỉ các chỉ mục trên giá trị cột (để phân biệt
với chỉ mục khóa dòng chính cho một column family). Cassandra hỗ trợ các chỉ mục thứ
cấp của kiểu KEYS (tương tự như chỉ mục băm).
Các chỉ mục thứ cấp cho phép truy vấn hiệu quả bởi việc chỉ ra các giá trị bằng
phép bằng (where column x = value y). Và, các truy vấn trên các giá trị đã được đánh chỉ
mục có thể áp dụng các bộ lọc bổ sung vào tập kết quả cho các giá trị ở cột khác.
Chỉ mục thứ cấp của Cassandra tốt nhất cho các trường hợp nhiều dòng chứa giá trị
được đánh chỉ mục.
Ví dụ, giả sử bạn có mọt bảng user với hàng tỉ người dùng, và muốn tìm kiếm
người dùng theo bang mà họ sống. Rất nhiều người dùng sẽ có cùng giá trị cột cho bang
(như CA, NY, TX…). Đây là ứng cử viên tốt nhất cho chỉ mục thứ cấp. Mặc khác, nếu
bạn muốn tìm kiếm người dùng theo địa chỉ email của họ (một giá trị thường là duy nhất
cho mỗi người), thì có thể hiệu quả hơn khi duy trì một cách thủ công column family
động dưới dạng một “chỉ mục”.
Thậm chí với các cột chứa dữ liệu độc nhất, sử dụng các chỉ mục thứ cấp cũng là
một điều khôn ngoan, chừng nào khối lượng truy vấn tới các column family được đánh
chỉ mục là vừa phải và không dưới một tải liên tục.
Một ưu điểm khác của các chỉ mục thứ cấp là sự dễ dàng về mặt thao tác duy trì
chỉ mục. Khi bạn tạo một chỉ mục thứ cấp cho một cột, nó đánh chỉ mục dữ liệu ngầm bên
dưới.
Các column family được client duy trì như những chỉ mục phải được tạo một cách
thủ công; ví dụ, nếu cột bang được đánh chỉ mục bằng cách tạp ra một column family như
users_by_state , ứng dụng client phải xây dựng column family với dữ liệu từ column
family users.
3.8.3 Tạo và sử dụng chỉ mục thứ cấp
Bạn có thể chỉ ra kiểu KEYS khi tạo ra định nghĩa cột, hoặc bạn có thể thêm vào
sau để đánh chỉ mục một cột có sẵn. Các chỉ mục thứ cấp được tạo một cách tự động bởi
tiến trình nền mà không cần phải khóa các thao tác đọc, ghi.
Ví dụ, trong Cassandra CLI, bạn có thể tạo ra một chỉ mục thứ cấp trên một côt khi
định nghĩa column family (chú ý index_type: đặc tả KEYS cho các cột state và
birth_year):
46