Storacle - lưu trữ tập tin phi tập trung

Storacle - lưu trữ tập tin phi tập trung

Trước khi bắt đầu, tôi phải rời đi liên kết đến bài viết trướcđể có thể hiểu rõ chính xác chúng ta đang nói về điều gì.

Trong bài viết này, tôi muốn xem xét lớp chịu trách nhiệm lưu trữ tệp và cách mọi người có thể sử dụng nó. Storacle là một thư viện độc lập, không có kết nối trực tiếp với âm nhạc. Bạn có thể sắp xếp việc lưu trữ bất kỳ tập tin nào.

Ở bài viết trước tôi đã “lăn thùng” một chút ipfs, nhưng điều này xảy ra chính xác trong bối cảnh của vấn đề tôi đang giải quyết. Nhìn chung, tôi nghĩ dự án này rất tuyệt. Tôi chỉ thích khả năng tạo các mạng khác nhau cho các nhiệm vụ khác nhau. Điều này cho phép bạn tổ chức cấu trúc tốt hơn và giảm tải cho từng nút riêng lẻ và toàn bộ mạng. Ngay cả trong khuôn khổ một dự án, nếu cần, bạn có thể chia mạng thành nhiều phần theo một số tiêu chí, giảm tải tổng thể.

Vì vậy, kho lưu trữ sử dụng cơ chế có thể lây lan để tổ chức một mạng lưới. Các tính năng chính:

  • Các tập tin có thể được thêm vào kho lưu trữ thông qua bất kỳ nút nào.
  • Các tập tin được lưu hoàn toàn, không phải theo khối.
  • Mỗi tệp có hàm băm nội dung duy nhất của riêng nó để tiếp tục làm việc với nó.
  • Các tập tin có thể được sao chép để có độ tin cậy cao hơn
  • Số lượng tệp trên một nút chỉ bị giới hạn bởi hệ thống tệp (có một ngoại lệ, chi tiết hơn ở bên dưới)
  • Số lượng tệp trong mạng bị giới hạn bởi khả năng có thể lan truyền tùy theo số lượng nút hợp lệ trong mạng, trong phiên bản thứ hai sẽ có thể hoạt động với số lượng nút vô hạn (xem thêm về điều này trong một bài viết khác)

Một ví dụ đơn giản về cách thức hoạt động của chương trình này:

Máy chủ:

const  Node = require('storacle').Node;

(async () => {
  try {
    const node = new Node({
      port: 4000,
      hostname: 'localhost'
    });
    await node.init();
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Khách hàng:

const  Client = require('storacle').Client;

(async () => {
  try {
    const client = new  Client({
      address: 'localhost:4000'
    });
    await client.init();
    const hash = await client.storeFile('./my-file');
    const link = await client.getFileLink(hash); 
    await client.removeFile(hash);
  }
  catch(err) {
    console.error(err.stack);
    process.exit(1);
  }
})();

Quang cảnh bên trong

Không có gì lạ mắt dưới mui xe. Thông tin về số lượng tệp, tổng kích thước của chúng và các điểm khác được lưu trữ trong cơ sở dữ liệu trong bộ nhớ và được cập nhật khi tệp bị xóa và thêm vào, do đó không cần phải truy cập thường xuyên vào hệ thống tệp. Một ngoại lệ là cho phép trình thu gom rác khi bạn cần luân chuyển các tệp khi đạt đến kích thước bộ nhớ nhất định và không cấm thêm tệp mới. Trong trường hợp này, bạn phải bỏ qua bộ nhớ và làm việc với một số lượng lớn tệp (> chẳng hạn một triệu) có thể dẫn đến tải đáng kể. Và tốt hơn hết là lưu trữ ít tệp hơn và chạy nhiều nút hơn. Nếu "trình dọn dẹp" bị tắt thì không có vấn đề gì như vậy.

Bộ lưu trữ tệp bao gồm 256 thư mục và 2 cấp độ lồng nhau. Các tập tin được lưu trữ trong các thư mục cấp hai. Tức là nếu có 1 triệu. Sẽ có khoảng 62500 tệp trong mỗi thư mục như vậy (1000000/sqrt(256)).

Tên thư mục được hình thành từ hàm băm của tệp để bạn có thể truy cập nhanh nếu biết hàm băm.

Cấu trúc này được chọn dựa trên một số lượng lớn các yêu cầu lưu trữ khác nhau: hỗ trợ cho các hệ thống tệp yếu, nơi không mong muốn có nhiều tệp trong một thư mục, duyệt nhanh tất cả các thư mục nếu cần, v.v. Một số loại ý nghĩa vàng.

bộ nhớ đệm

Khi thêm tệp cũng như khi nhận chúng, các liên kết đến tệp sẽ được ghi vào bộ đệm.
Nhờ đó, thường không cần phải duyệt toàn bộ mạng để tìm kiếm tệp. Điều này tăng tốc độ nhận liên kết và giảm tải trên mạng. Bộ nhớ đệm cũng xảy ra thông qua tiêu đề http.

đẳng hình

Ứng dụng khách được viết bằng javascript và đẳng cấu, nó có thể được sử dụng trực tiếp từ trình duyệt. 
Bạn có thể tải tập tin lên https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js như một tập lệnh và quyền truy cập window.ClientStoracle hoặc nhập thông qua hệ thống xây dựng, v.v.

Liên kết bị trì hoãn

Một tính năng thú vị nữa là “tham chiếu hoãn lại”. Đây là liên kết đến một tệp có thể được lấy một cách đồng bộ, tại đây và ngay bây giờ, và tệp sẽ được kéo lên khi nó đã được tìm thấy trong bộ lưu trữ. Điều này rất thuận tiện, chẳng hạn như khi bạn cần hiển thị một số hình ảnh trên trang web. Chúng tôi chỉ cần đặt một liên kết trì hoãn vào src và thế là xong. Bạn có thể đưa ra nhiều trường hợp.

API ứng dụng khách

  • không đồng bộ Client.prototype.storeFile() - lưu tập tin
  • không đồng bộ Client.prototype.getFileLink() - nhận được một liên kết trực tiếp đến tập tin
  • không đồng bộ Client.prototype.getFileLinks() — lấy danh sách các liên kết trực tiếp tới một tập tin từ tất cả các nút nơi nó tồn tại
  • không đồng bộ Client.prototype.getFileToBuffer() - đưa tập tin vào bộ đệm
  • không đồng bộ Client.prototype.getFileToPath() - đưa một tập tin vào hệ thống tập tin
  • không đồng bộ Client.prototype.getFileToBlob() - lấy tệp trong blob (đối với phiên bản trình duyệt)
  • không đồng bộ Client.prototype.removeFile() - xóa một tập tin
  • Client.prototype.createRequestedFileLink() - tạo một liên kết hoãn lại

Xuất tập tin sang máy chủ khác

Để chuyển tập tin sang một nút khác, bạn có thể:

  • Chỉ cần sao chép toàn bộ thư mục lưu trữ cùng với các cài đặt. (điều này có thể không hoạt động trong tương lai)
  • Chỉ sao chép thư mục chứa các tập tin. Tuy nhiên, trong trường hợp này, bạn sẽ cần chạy hàm này một lần nút.n normalizeFilesInfo()để tính toán lại tất cả dữ liệu và nhập vào cơ sở dữ liệu.
  • sử dụng chức năng node.exportFiles()sẽ bắt đầu sao chép tập tin.

Cài đặt nút cơ bản
Khi khởi động nút lưu trữ, bạn có thể chỉ định tất cả các cài đặt cần thiết.
Tôi sẽ mô tả những cái cơ bản nhất, phần còn lại có thể tìm thấy trên Github.

  • storage.dataSize - kích thước của thư mục chứa các tập tin
  • storage.tempSize - kích thước thư mục tạm thời
  • storage.autoCleanSize - kích thước lưu trữ tối thiểu cần được lưu giữ. Nếu bạn chỉ định tham số này, thì ngay khi hết dung lượng, các tệp ít được sử dụng nhất sẽ bị xóa.
  • tập tin.maxSize - Kích thước tệp tối đa
  • tập tin.minSize - kích thước tập tin tối thiểu
  • file.preferredTrùng lặp - số lượng bản sao tệp ưa thích trên mạng
  • file.mimeDanh sách trắng - loại tập tin hợp lệ
  • file.mimeDanh sách đen - loại tập tin không hợp lệ
  • file.extDanh sách trắng - phần mở rộng tập tin hợp lệ
  • file.extDanh sách đen - phần mở rộng tập tin không hợp lệ
  • tập tin.linkCache - cài đặt bộ nhớ đệm liên kết khác nhau

Hầu như tất cả các tham số liên quan đến kích thước có thể được nhập ở cả giá trị tuyệt đối và giá trị tương đối.

Làm việc thông qua dòng lệnh
Thư viện có thể được sử dụng thông qua dòng lệnh. Để làm điều này, bạn cần cài đặt nó trên toàn cầu: npm i -g lưu trữ. Sau đó, bạn có thể khởi chạy các hành động cần thiết từ thư mục dự án chứa nút. Ví dụ, lưu trữ -a storeFile -f ./file.txt -c ./config.jsđể thêm tập tin. Tất cả các hành động có thể được tìm thấy trong https://github.com/ortexx/storacle/blob/master/bin/actions.js

Tại sao bạn có thể cần điều này?

  • Nếu bạn muốn tạo một số loại dự án phi tập trung mà bạn dự định lưu trữ và làm việc với các tệp bằng các phương pháp thuận tiện. Ví dụ: dự án âm nhạc được mô tả trong liên kết ở đầu bài viết sử dụng kho chứa.
  • Nếu bạn làm việc trên bất kỳ dự án nào khác mà bạn cần lưu trữ tệp theo cách phân tán. Bạn có thể dễ dàng xây dựng mạng khép kín của mình, cấu hình linh hoạt các nút và thêm các nút mới khi cần.
  • Nếu bạn chỉ cần lưu trữ các tập tin trang web của mình ở đâu đó và việc tự mình viết mọi thứ là quá nhiều. Có lẽ thư viện này phù hợp hơn những thư viện khác trong trường hợp của bạn.
  • Nếu bạn có một dự án mà bạn làm việc với các tệp nhưng muốn thực hiện tất cả các thao tác từ trình duyệt. Bạn có thể tránh viết mã máy chủ.

Địa chỉ liên lạc của tôi:

Nguồn: www.habr.com

Thêm một lời nhận xét