Tìm hiểu về các quyết định thiết kế đằng sau hỗ trợ mới của HBase dành cho MOB.
Apache HBase là một cơ sở dữ liệu giá trị khóa phân tán, có thể mở rộng, hiệu suất, nhất quán và có thể lưu trữ nhiều kiểu dữ liệu nhị phân khác nhau. Nó vượt trội trong việc lưu trữ nhiều giá trị tương đối nhỏ (<10K) và cung cấp khả năng đọc và ghi với độ trễ thấp.
Tuy nhiên, ngày càng có nhiều nhu cầu về việc lưu trữ tài liệu, hình ảnh và các đối tượng vừa phải khác (MOB) trong HBase trong khi vẫn duy trì độ trễ thấp khi đọc và ghi. Một trong những trường hợp sử dụng như vậy là một ngân hàng lưu trữ các tài liệu khách hàng đã ký và quét. Một ví dụ khác, các cơ quan vận tải có thể muốn lưu trữ ảnh chụp nhanh về giao thông và xe ô tô đang di chuyển. Các MOB này thường được viết một lần.
Thật không may, hiệu suất có thể suy giảm trong các tình huống lưu trữ nhiều giá trị có kích thước vừa phải (100K đến 10MB) do áp lực I / O ngày càng tăng do các giao dịch tạo ra. Hãy xem xét trường hợp 1TB ảnh từ camera giao thông, mỗi ảnh có kích thước 1MB, được lưu trữ vào HBase hàng ngày. Các phần của tệp được lưu trữ được nén nhiều lần thông qua các giao dịch nhỏ và cuối cùng, dữ liệu được viết lại bởi các giao dịch chính. Cùng với việc tích lũy các MOB này, I / O được tạo bởi các giao dịch sẽ làm chậm các giao dịch, tiếp tục chặn quá trình xả vào kho lưu trữ và cuối cùng là chặn các cập nhật. Một cửa hàng MOB lớn sẽ kích hoạt việc phân chia khu vực thường xuyên, làm giảm tính khả dụng của các khu vực bị ảnh hưởng.
Để giải quyết những nhược điểm này, các kỹ sư của Cloudera và Intel đã triển khai hỗ trợ MOB trong một nhánh HBase (hbase-11339:HBase MOB). Nhánh này sẽ được hợp nhất với cái chính trong HBase 1.1 hoặc 1.2 và cũng đã có mặt và được hỗ trợ trong CDH 5.4.x.
Các thao tác trên MOB thường tốn nhiều công sức ghi, hiếm khi cập nhật hoặc xóa và đọc tương đối không thường xuyên. MOB thường được lưu trữ cùng với siêu dữ liệu của chúng. Siêu dữ liệu liên quan đến MOB có thể bao gồm, ví dụ:số xe, tốc độ và màu sắc. Siêu dữ liệu rất nhỏ so với MOB. Siêu dữ liệu thường được truy cập để phân tích, trong khi MOB thường chỉ được truy cập ngẫu nhiên khi chúng được yêu cầu rõ ràng bằng các khóa hàng.
Người dùng muốn đọc và ghi các MOB trong HBase với độ trễ thấp trong cùng các API và muốn tính nhất quán, bảo mật, ảnh chụp nhanh và sao chép HBase giữa các cụm, v.v. Để đáp ứng các mục tiêu này, MOB đã được chuyển ra khỏi đường dẫn I / O chính của HBase và sang đường dẫn I / O mới.
Trong bài đăng này, bạn sẽ tìm hiểu về cách tiếp cận thiết kế này và lý do tại sao nó được chọn.
Các phương pháp tiếp cận có thể xảy ra
Có một số cách tiếp cận khả thi cho vấn đề này. Cách tiếp cận đầu tiên mà chúng tôi xem xét là lưu trữ các MOB trong HBase với các chính sách phân tách và nén được điều chỉnh —MaxFileSize mong muốn lớn hơn sẽ giảm tần suất phân chia vùng và ít hơn hoặc không có giao dịch nào có thể tránh được hình phạt khuếch đại ghi. Cách tiếp cận đó sẽ cải thiện đáng kể độ trễ và thông lượng ghi. Tuy nhiên, cùng với số lượng tệp được lưu trữ ngày càng tăng, sẽ có quá nhiều trình đọc được mở trong một cửa hàng duy nhất, thậm chí nhiều hơn số lượng mà hệ điều hành cho phép. Kết quả là, rất nhiều bộ nhớ sẽ bị tiêu tốn và hiệu suất đọc sẽ giảm sút.
Một cách tiếp cận khác là sử dụng mô hình HBase + HDFS để lưu trữ riêng biệt siêu dữ liệu và MOB. Trong mô hình này, một tệp duy nhất được liên kết bởi một mục trong HBase. Đây là một giải pháp dành cho khách hàng và giao dịch được kiểm soát bởi khách hàng — không có bộ nhớ phía HBase nào được sử dụng bởi các MOB. Cách tiếp cận này sẽ hoạt động với các đối tượng lớn hơn 50MB, nhưng đối với MOB, nhiều tệp nhỏ dẫn đến việc sử dụng HDFS không hiệu quả vì kích thước khối mặc định trong HDFS là 128MB.
Ví dụ:giả sử NameNode có 48GB bộ nhớ và mỗi tệp là 100KB với ba bản sao. Mỗi tệp chiếm hơn 300 byte trong bộ nhớ, vì vậy NameNode với bộ nhớ 48 GB có thể chứa khoảng 160 triệu tệp, điều này sẽ giới hạn chúng tôi chỉ lưu trữ tổng cộng các tệp MOB 16TB.
Để cải tiến, chúng tôi có thể tập hợp các tệp MOB nhỏ thành tệp lớn hơn — nghĩa là, một tệp có thể có nhiều mục MOB – và lưu trữ độ lệch và độ dài trong bảng HBase để đọc nhanh. Tuy nhiên, việc duy trì tính nhất quán của dữ liệu và quản lý các MOB đã xóa và các tệp MOB nhỏ trong các giao dịch là rất khó.
Hơn nữa, nếu chúng tôi sử dụng phương pháp này, chúng tôi sẽ phải xem xét các chính sách bảo mật mới, làm mất đặc tính nguyên tử của các lần ghi và có khả năng mất bản sao lưu và khôi phục thảm họa được cung cấp bởi sao chép và ảnh chụp nhanh.
Thiết kế HBase MOB
Cuối cùng, vì hầu hết các mối quan tâm xung quanh việc lưu trữ MOB trong HBase liên quan đến I / O được tạo bởi các giao dịch, chìa khóa là chuyển MOB ra khỏi phạm vi quản lý của các khu vực thông thường để tránh phân chia khu vực và giao dịch ở đó.
Thiết kế HBase MOB tương tự như cách tiếp cận HBase + HDFS vì chúng tôi lưu trữ siêu dữ liệu và MOB riêng biệt. Tuy nhiên, sự khác biệt nằm ở thiết kế phía máy chủ:memstore lưu trữ các MOB trước khi chúng được chuyển vào đĩa, các MOB được ghi vào một HFile gọi là “tệp MOB” trong mỗi lần tuôn ra và mỗi tệp MOB có nhiều mục nhập thay vì một tệp duy nhất. trong HDFS cho mỗi MOB. Tệp MOB này được lưu trữ trong một khu vực đặc biệt. Tất cả việc đọc và ghi đều có thể được sử dụng bởi các API HBase hiện tại.
Viết và Đọc
Mỗi MOB có một ngưỡng:nếu độ dài giá trị của ô lớn hơn ngưỡng này, ô này được coi là ô MOB.
Khi các ô MOB được cập nhật trong các vùng, chúng được ghi vào WAL và memstore, giống như các ô bình thường. Trong quá trình xả, các MOB được chuyển sang tệp MOB, đồng thời siêu dữ liệu và đường dẫn của tệp MOB được chuyển để lưu trữ tệp. Tính nhất quán của dữ liệu và các tính năng sao chép HBase có nguồn gốc từ thiết kế này.
Các chỉnh sửa MOB lớn hơn bình thường. Trong quá trình đồng bộ hóa, I / O tương ứng cũng lớn hơn, điều này có thể làm chậm hoạt động đồng bộ hóa của WAL. Nếu có các khu vực khác chia sẻ cùng WAL, độ trễ ghi của các khu vực này có thể bị ảnh hưởng. Tuy nhiên, nếu cần tính nhất quán và không biến động của dữ liệu, thì WAL là bắt buộc.
Các ô được phép di chuyển giữa các tệp được lưu trữ và tệp MOB trong các giao dịch bằng cách thay đổi ngưỡng. Ngưỡng mặc định là 100KB.
Như minh họa bên dưới, các ô chứa đường dẫn của tệp MOB được gọi là ô tham chiếu . Các thẻ được giữ lại trong các ô, vì vậy chúng tôi có thể tiếp tục dựa vào cơ chế bảo mật HBase.
Các ô tham chiếu có các thẻ tham chiếu để phân biệt chúng với các ô bình thường. Thẻ tham chiếu ngụ ý một ô MOB trong tệp MOB và do đó cần phân giải thêm khi đọc.
Khi đọc, máy quét cửa hàng sẽ mở máy quét vào kho lưu trữ và lưu trữ tệp. Nếu một ô tham chiếu được đáp ứng, máy quét sẽ đọc đường dẫn tệp từ giá trị ô và tìm kiếm khóa hàng tương tự từ tệp đó. Bộ nhớ đệm khối có thể được bật cho các tệp MOB trong quá trình quét, điều này có thể tăng tốc tìm kiếm.
Không nhất thiết phải mở trình đọc cho tất cả các tệp MOB; chỉ cần một cái khi được yêu cầu. Việc đọc ngẫu nhiên này không bị ảnh hưởng bởi số lượng tệp MOB. Vì vậy, chúng tôi không cần phải nén lại nhiều lần các tệp MOB khi chúng đủ lớn.
Tên tệp MOB có thể đọc được và bao gồm ba phần:MD5 của khóa bắt đầu, ngày mới nhất của các ô trong tệp MOB này và UUID. Phần đầu tiên là khóa bắt đầu của vùng mà từ đó tệp MOB này được xóa. Thông thường, các MOB có TTL do người dùng xác định, vì vậy bạn có thể tìm và xóa các tệp MOB đã hết hạn bằng cách so sánh phần thứ hai với TTL.
Ảnh chụp nhanh
Để thân thiện hơn với ảnh chụp nhanh, các tệp MOB được lưu trữ trong một vùng giả đặc biệt, nhờ đó ảnh chụp nhanh, xuất / sao chép bảng và lưu trữ hoạt động như mong đợi.
Khi lưu trữ ảnh chụp nhanh vào bảng, người ta tạo vùng MOB trong ảnh chụp nhanh và thêm các tệp MOB hiện có vào tệp kê khai. Khi khôi phục ảnh chụp nhanh, hãy tạo liên kết tệp trong vùng MOB.
Sạch sẽ và giao dịch
Có hai tình huống khi tệp MOB nên bị xóa:khi tệp MOB hết hạn và khi tệp MOB quá nhỏ và nên được hợp nhất thành tệp lớn hơn để cải thiện hiệu quả HDFS.
HBase MOB có một công việc tổng thể:nó quét các tệp MOB, tìm những tệp đã hết hạn được xác định theo ngày trong tên tệp và xóa chúng. Do đó, dung lượng ổ đĩa được lấy lại định kỳ bằng cách loại bỏ các tệp MOB đã hết hạn.
Các tệp MOB có thể tương đối nhỏ so với khối HDFS nếu bạn viết các hàng trong đó chỉ một số mục nhập đủ điều kiện là MOB; ngoài ra, có thể có các ô bị xóa. Bạn cần bỏ các ô đã xóa và hợp nhất các tệp nhỏ thành các tệp lớn hơn để cải thiện việc sử dụng HDFS. Các giao dịch MOB chỉ nén các tệp nhỏ và các tệp lớn không được chạm vào, điều này tránh việc nén nhiều lần thành các tệp lớn.
Một số điều khác cần ghi nhớ:
- Biết những ô nào bị xóa. Trong mỗi lần nén chính của HBase, các điểm đánh dấu xóa được ghi vào tệp del trước khi chúng bị xóa.
- Trong bước đầu tiên của các giao dịch MOB, các tệp del này được hợp nhất thành các tệp lớn hơn.
- Tất cả các tệp MOB nhỏ đã được chọn. Nếu số lượng tệp nhỏ bằng với số tệp MOB hiện có, thì quá trình nén này được coi là một tệp chính và được gọi là nén ALL_FILES.
- Các tệp đã chọn này được phân vùng bằng khóa bắt đầu và ngày tháng trong tên tệp. Các tệp nhỏ trong mỗi phân vùng được nén lại bằng các tệp del để các ô đã xóa có thể được loại bỏ; trong khi đó, một HFile mới với các ô tham chiếu mới được tạo, trình nén sẽ gán tệp MOB mới và sau đó nó tải hàng loạt HFile này vào HBase.
- Sau khi hoàn tất các giao dịch trong tất cả các phân vùng, nếu có liên quan đến quá trình nén ALL_FILES, các tệp del sẽ được lưu trữ.
Vòng đời của tệp MOB được minh họa bên dưới. Về cơ bản, chúng được tạo khi memstore bị xóa và bị HFileCleaner xóa khỏi hệ thống tệp khi chúng không được tham chiếu bởi ảnh chụp nhanh hoặc đã hết hạn trong kho lưu trữ.
Kết luận
Tóm lại, thiết kế HBase MOB mới di chuyển các MOB ra khỏi đường dẫn I / O chính của HBase trong khi vẫn giữ lại hầu hết các tính năng bảo mật, nén và chụp nhanh. Nó phục vụ cho các đặc điểm của hoạt động trong MOB, làm cho việc khuếch đại ghi của MOB dễ dự đoán hơn và giữ độ trễ thấp trong cả đọc và ghi.
Jincheng Du là Kỹ sư phần mềm tại Intel và là người đóng góp cho HBase.
Jon Hsieh là Kỹ sư phần mềm tại Cloudera và là thành viên cam kết / PMC của HBase. Anh ấy cũng là người sáng lập Apache Flume và là người cam kết trên Apache Sqoop.