Hầu hết dữ liệu được lưu trữ ở định dạng tệp dễ đọc để dễ dàng tương tác với ứng dụng. Mặc dù có các định dạng được sử dụng rộng rãi để nén hình ảnh, video và âm thanh, hầu hết các dữ liệu khác đều được lưu trữ dưới dạng văn bản, dưới dạng JSON, CSV hoặc các định dạng dựa trên văn bản tương tự khác.
Các định dạng như Parquet, Avro và ORC có tính năng nén tùy chọn, do đó, thông thường, các định dạng này đã được nén sẵn khi được lưu trữ. Video và hình ảnh cũng thường được nén bằng các thuật toán dành riêng cho từng miền mang lại khả năng nén tốt hơn các định dạng chung.
Tuy nhiên, đối với dữ liệu tùy chỉnh, tốt nhất nên giữ dữ liệu ở định dạng không phức tạp, không bao gồm bước giải nén để truy cập. Chúng tôi muốn cung cấp tùy chọn nén dữ liệu này trước khi nó được lưu trữ trên đĩa.
Tính năng nén cho MinIO đã được phát triển để cho phép nén trong suốt mà không ảnh hưởng đến hiệu suất chung của hệ thống.
MinIO sử dụng phương pháp nén dựa trên Snappy có tên S2. Nó tương thích với nội dung Snappy nhưng có hai phần mở rộng định dạng . Trước hết, nó cho phép các khối lớn hơn các khối 64KB được phép cho luồng Snappy. Điều này cải thiện đáng kể khả năng nén. Thứ hai, nó bổ sung thêm “độ lệch lặp lại”, cung cấp các cải tiến nén chủ yếu cho dữ liệu do máy tạo, như tệp nhật ký, JSON và CSV. Nó cũng cho phép mã hóa hiệu quả các kết quả khớp dài hơn 64 byte, đây là một điểm khó khăn đối với Snappy.
S2 cũng cho phép nén đồng thời nhiều khối khi đầu vào nhanh hơn mức mà một lõi đơn có thể hấp thụ. Điều này rất quan trọng để duy trì khả năng đáp ứng các yêu cầu cá nhân. Thực tế, hạn chế với hơn 16 lõi sẽ là tốc độ bộ nhớ.
Một số nhà cung cấp thiết bị sẽ hứa hẹn hoặc thậm chí giả định một tỷ lệ nén nhất định khi tính chi phí cho mỗi TB. Với tính năng nén, không có tỷ lệ đảm bảo nào trên 1:1. Các loại dữ liệu khác nhau mang lại tỷ lệ nén khác nhau và theo ý kiến của chúng tôi, không có cách nào có ý nghĩa để cung cấp bất kỳ tỷ lệ nén trung bình nào. Tỷ lệ nén không bao giờ được đánh giá trong chân không - chúng phải luôn được kết hợp với tốc độ nén, vì độ nén thực tế là sự cân bằng giữa hai yếu tố này.
Hãy so sánh một loại dữ liệu để quan sát sự khác biệt. Chúng tôi so sánh việc triển khai Go của các thuật toán này trên nền tảng AMD64, sử dụng tối đa 16 lõi.
Trước hết, trục ngang là tỷ lệ nén bị cắt ngắn, mức giảm đạt được từ kích thước không nén. Đúng là tốt hơn. Để cung cấp một tài liệu tham khảo, gzip cấp 5 đơn luồng đã được đưa vào.
Máy nén | Tốc độ MB/s | Kích cỡ | Sự giảm bớt | Tháng 12 MB/s |
---|---|---|---|---|
S2 mặc định | 15148 | 1043196283 | 83,37% | 2378 |
S2 tốt hơn | 11551 | 954430842 | 84,79% | 2300 |
S2 tốt nhất | 680 | 832855431 | 86,73% | 2572 |
LZ4 nhanh nhất | 5645 | 1280414160 | 79,59% | 2680 |
LZ4 Tốt nhất | 1552 | 1091826460 | 82,60% | 2694 |
nhanh nhẹn | 946 | 1525176492 | 75,69% | 1828 |
Gzip L5 | 206 | 942726276 | 84,97% | 557 |
Tốc độ giải nén đang sử dụng lõi đơn, mặc dù S2 cung cấp khả năng giải nén đồng thời.
Đối với dữ liệu này, Snappy thiếu khoảng 10% so với tham chiếu Gzip. Vì chúng ta đang xử lý phần trăm giảm bớt, điều này cũng có nghĩa là Snappy chiếm khoảng 1,6 lần dung lượng của dữ liệu nén Gzip. Điều này bỏ qua thực tế là Snappy giải nén nhanh hơn khoảng 4 lần so với Gzip.
LZ4 thường được coi là vượt trội hơn Snappy. Việc triển khai LZ4 cho phép nén trên nhiều lõi cũng làm rõ quan điểm này. Nhưng nén cơ sở thì tốt hơn. LZ4 Best, đôi khi còn được gọi là LZ4-HC, cung cấp khả năng nén gần bằng gzip, nhưng mặc dù tốc độ giải nén nhanh nhưng quá trình nén không ở tốc độ tương tác.
S2 cung cấp ba mức nén; S2 Default là tốc độ nhanh nhất có thể và có thể được coi là đối thủ cạnh tranh trực tiếp với Snappy về việc sử dụng lõi đơn. Với loại dữ liệu này, nó hoạt động tốt hơn bất kỳ cấp độ LZ4 nào với thông lượng cao hơn đáng kể. Chế độ này được MinIO sử dụng cho các nền tảng không có triển khai lắp ráp.
S2 Better cho phép giao dịch một chút CPU để có độ nén cao hơn. Ở đây khả năng nén cạnh tranh với Gzip, nhưng tốc độ giải nén tốt hơn rất nhiều. Chế độ này được MinIO sử dụng trên các nền tảng có sẵn lắp ráp - hiện tại là AMD64.
S2 Best là khả năng nén tốt nhất mà S2 có thể thực hiện với định dạng hiện tại. Điều này có thể được sử dụng trong các tình huống mà tốc độ/tài nguyên nén không phải là quan trọng nhất, nhưng vẫn cần giải nén nhanh. Hiện tại MinIO không sử dụng chế độ này nhưng có thể triển khai nó như một tùy chọn vòng đời cho các đối tượng không thay đổi trong một thời gian.
Để so sánh, đây là một vài so sánh của các loại dữ liệu khác:
Một tính năng quan trọng của nén hiện đại là nó hoạt động tốt với dữ liệu được nén trước. Theo truyền thống, dữ liệu được nén trước là một vấn đề đối với các thuật toán nén. Thông thường máy nén sẽ chạy chậm lại một cách vô lý khi gặp phải dữ liệu không thể nén được.
Do đó, theo bản năng, nhiều người biết rằng việc nén lại dữ liệu đã nén là không tốt. Tuy nhiên, nhiều triển khai hiện đại hiện nay ở mức độ hợp lý có thể bỏ qua các phần không thể nén được một cách nhanh chóng.
Đối với các máy nén ở trên, đây là tốc độ trên dữ liệu không thể nén 2GiB (2.147.483.647 byte):
Máy nén | Tốc độ MB/s | Kích cỡ | Sự giảm bớt |
---|---|---|---|
S2 mặc định | 13045 | 2147487753 | 0,00% |
S2 tốt hơn | 9894 | 2147487753 | 0,00% |
S2 tốt nhất | 3938 | 2147487753 | 0,00% |
LZ4 nhanh | 6400 | 2147485710 | 0,00% |
LZ4 Tốt nhất | 12488 | 2147745841 | -0,01% |
nhanh nhẹn | 6564 | 2147745801 | -0,01% |
Gzip (Đi) L5 | 63 | 2148139030 | -0,03% |
Gzip (alt) L5 | 5535 | 2147647512 | -0,01% |
Ở đây, chúng tôi cũng đưa gzip từ thư viện chuẩn Go làm đại diện cho hành vi “xấu” này. Việc triển khai gzip thay thế không hiển thị vấn đề này. Trong tất cả các trường hợp khác, nội dung được xử lý khá nhanh và họ đã vượt qua.
Điều này có nghĩa là MinIO có thể xử lý tốt dữ liệu được nén trước.
Nhược điểm điển hình của việc nén là khả năng bỏ qua trong một tệp bị mất. Giải pháp cho vấn đề này là nén các khối một cách độc lập và giữ một chỉ mục ánh xạ một số độ lệch không nén sang độ lệch đã nén nơi quá trình giải nén có thể bắt đầu.
Việc nén các khối độc lập sẽ giảm độ nén một chút, nhưng ít hơn với các khối lớn hơn. Snappy/S2nén các luồng dưới dạng các khối độc lập theo thiết kế.
Đối với MinIO, điều này có liên quan vì các yêu cầu GetObject của S3 có thể bao gồm các phạm vi tùy chọn để truy xuất. Điều này cho phép truy xuất các phần của đối tượng và chúng tôi muốn điều đó hiệu quả nhất có thể.
Bắt đầu từ RELEASE.2022-07-13T23-29-44Z , giờ đây chúng tôi tạo chỉ mục cho mọi phần tệp được tải lên lớn hơn 8MB. Chỉ mục sau đó được gắn nội bộ vào siêu dữ liệu. Điều này cho phép chúng tôi bỏ qua phần tiếp theo một cách hiệu quả và chỉ giải mã phần đối tượng cần thiết để trả về dữ liệu được yêu cầu.
Chỉ mục thường là 16 byte + khoảng 3 byte cho mỗi MB dữ liệu. Điều này cho phép MinIO phân phát bất kỳ byte nào từ bên trong tệp nén với tốc độ tương đương với việc truy xuất byte đầu tiên.
Theo mặc định, cần có một tham số bổ sung để MinIO nén dữ liệu cần mã hóa trên đĩa. Điều này là để đảm bảo rằng bạn nhận thức được ý nghĩa của việc này.
Khi nén dữ liệu bạn nhận được hai số; kích thước không nén và kích thước nén. Nếu không nén, bất kỳ ai lấy dữ liệu của bạn chỉ có thể thấy một trong những dữ liệu này - kích thước không nén.
Mặc dù điều này vẫn không cung cấp cho bạn quyền truy cập vào bất kỳ dữ liệu nào trong tệp nén nhưng nó cung cấp một số gợi ý về dữ liệu. Nó có thể cho bạn biết một số loại dữ liệu mà nó không thể có được. Nếu bạn thấy một tệp được nén 50% thì rất khó có khả năng tệp đó sẽ chứa video nén MP4.
Tương tự, một tệp được nén chỉ còn vài byte có thể sẽ chứa một chuỗi lặp lại rất đơn giản. Không thể biết trình tự là gì, nhưng nó làm giảm khả năng xảy ra. MinIO từ RELEASE.2022-07-13T23-29-44Z sẽ đệm đầu ra được nén thành bội số của 256 byte. Phần đệm này không được ghi lại ở bất cứ đâu. Chúng tôi không coi đây là cách khắc phục hoàn toàn sự cố nhưng nó làm giảm đáng kể tính hữu ích của thông tin kích thước bị rò rỉ đối với đối thủ.
Đây là lý do chính khiến MinIO không trả lại bất kỳ thông tin nào về kích thước nén cho khách hàng. Do đó, bất kỳ thông tin nào về điều này sẽ yêu cầu quyền truy cập vào bộ lưu trữ phụ trợ hoặc giao tiếp mạng phụ trợ.
Với thông tin này, bạn hiện đã được trang bị đủ kiến thức để xác định xem liệu bạn có cho rằng việc bật nén và mã hóa có an toàn hay không.
Các cuộc tấn công kiểu CRIME không thể thực hiện được trên MinIO vì chúng tôi không cho phép sửa đổi hoặc thêm vào bất kỳ luồng nén nào. Chúng tôi cũng không loại bỏ trùng lặp/nén trên các phiên bản đối tượng vì điều này sẽ làm rò rỉ quá nhiều thông tin về tệp.
Theo mặc định, tính năng nén trên đĩa bị tắt trong MinIO. Tính năng nén trên đĩa có thể được bật hoặc tắt bất kỳ lúc nào. Để bật tính năng nén trên đĩa, hãy sử dụng mc admin config set myminio compression enable=on
.
Điều này sẽ cho phép nén một số phần mở rộng và loại MIME đặt trước. Theo mặc định, chúng sẽ bao gồm:
Tiện ích mở rộng | Các loại kịch câm |
---|---|
.txt.log.csv.json.tar.xml.bin | văn bản/*ứng dụng/jsonapplication/xmlbinary/octet-stream |
Bạn có thể kiểm tra cài đặt hiện tại bằng mc admin config get myminio compression
.
Bạn có thể sửa đổi danh sách này bất kỳ lúc nào bằng cách sửa đổi:
mc admin config set myminio compression \ extensions=.txt,.log,.csv,.json,.tar,.xml,.bin \ mime_types=text/*,application/json,application/xml,binary/octet-stream
Theo mặc định, MinIO loại trừ mạnh mẽ các phần mở rộng của dữ liệu thường không thể nén được, chẳng hạn như tệp gzip, âm thanh, video, hình ảnh.
Có thể kích hoạt tính năng nén cho tất cả các đối tượng, ngoại trừ những đối tượng bị loại trừ bằng cách đặt danh sách tiện ích mở rộng và loại mime thành trống:
mc admin config set myminio compression enable=on extensions= mime_types=
Cài đặt cuối cùng là allow_encryption=on
, cho phép nén ngay cả đối với các đối tượng sẽ được mã hóa. Chỉ đặt điều này khi bạn đã đọc phần trên và hiểu được hàm ý.
MinIO cung cấp sơ đồ nén tốt nhất cho phép nén dữ liệu trên đĩa hoàn toàn trong suốt. Trong nhiều trường hợp, điều này có thể dẫn đến giảm chi phí lưu trữ, chỉ bằng cách cho phép nén.
Hiệu suất GET và PUT trong mọi trường hợp sẽ gần như nhau khi bật tính năng nén. Trên thực tế, trong các tình huống mà hiệu suất bị giới hạn bởi tốc độ đọc đĩa, việc nén có thể mang lại hiệu suất bổ sung do phải đọc ít dữ liệu hơn.
Chúng tôi sẽ tiếp tục bổ sung thêm các tính năng mới. Chúng tôi hiện đang đánh giá các tùy chọn cấu hình cấp độ nhóm/tiền tố cũng như nén theo vòng đời sẽ nén các tệp khi chúng đạt đến một độ tuổi nhất định.
Nếu bạn quan tâm đến những tính năng này, hãy tải xuống MinIO và tự mình dùng thử. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn cho chúng tôi biết về những ứng dụng tuyệt vời mà bạn đang xây dựng bằng MinIO, hãy liên hệ với chúng tôi theo địa chỉ [email protected] , tham gia cộng đồng Slack , theo dõi blog của chúng tôi hoặc đăng ký nhận bản tin của chúng tôi.
Cũng được xuất bản ở đây .