Storacle - พื้นที่จัดเก็บไฟล์แบบกระจายอำนาจ

Storacle - พื้นที่จัดเก็บไฟล์แบบกระจายอำนาจ

ก่อนที่ฉันจะเริ่มฉันต้องจากไป เชื่อมโยงไปยังบทความก่อนหน้าเพื่อให้ชัดเจนว่าเรากำลังพูดถึงอะไรกันแน่

ในบทความนี้ ฉันอยากจะดูเลเยอร์ที่รับผิดชอบในการจัดเก็บไฟล์ และวิธีที่ใครๆ ก็สามารถนำไปใช้ได้ Storacle เป็นห้องสมุดแบบสแตนด์อโลนไม่มีการเชื่อมต่อโดยตรงกับดนตรี คุณสามารถจัดระเบียบการจัดเก็บไฟล์ต่างๆ ได้

ในบทความที่แล้ว ฉัน "รีดถัง" เล็กน้อย ไอพีเอสแต่สิ่งนี้เกิดขึ้นอย่างแน่นอนในบริบทของปัญหาที่ฉันกำลังแก้ไข โดยรวมแล้วผมคิดว่าโปรเจ็กต์นี้เจ๋งนะ ฉันแค่ชอบความสามารถในการสร้างเครือข่ายที่แตกต่างกันสำหรับงานที่แตกต่างกัน สิ่งนี้ช่วยให้คุณจัดระเบียบโครงสร้างได้ดีขึ้นและลดภาระในแต่ละโหนดและเครือข่ายโดยรวม แม้จะอยู่ในกรอบของโครงการเดียว หากจำเป็น คุณสามารถแบ่งเครือข่ายออกเป็นชิ้นๆ ตามเกณฑ์บางประการ ซึ่งจะช่วยลดภาระโดยรวม

สตอราเคิลจึงใช้กลไกนี้ แพร่กระจายได้ สำหรับการจัดเครือข่าย คุณสมบัติที่สำคัญ:

  • สามารถเพิ่มไฟล์ลงในที่เก็บผ่านโหนดใดก็ได้
  • ไฟล์จะถูกบันทึกทั้งหมด ไม่ใช่เป็นบล็อก
  • แต่ละไฟล์มีแฮชเนื้อหาเฉพาะของตัวเองเพื่อการทำงานต่อไป
  • ไฟล์สามารถทำซ้ำได้เพื่อความน่าเชื่อถือที่มากขึ้น
  • จำนวนไฟล์ในหนึ่งโหนดถูกจำกัดโดยระบบไฟล์เท่านั้น (มีข้อยกเว้น โปรดดูข้อมูลเพิ่มเติมด้านล่าง)
  • จำนวนไฟล์ในเครือข่ายถูกจำกัดด้วยความสามารถในการแพร่กระจายตามจำนวนโหนดที่ถูกต้องในเครือข่าย ซึ่งในเวอร์ชันที่สองจะอนุญาตให้ทำงานกับโหนดจำนวนไม่สิ้นสุด (เพิ่มเติมเกี่ยวกับเรื่องนี้ในบทความอื่น)

ตัวอย่างง่ายๆ ของวิธีการทำงานโดยทั่วไปจากโปรแกรม:

เซิร์ฟเวอร์:

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);
  }
})();

ลูกค้า:

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);
  }
})();

มองเข้าไปข้างใน

ไม่มีอะไรแฟนซีภายใต้ประทุน ข้อมูลเกี่ยวกับจำนวนไฟล์ ขนาดรวม และจุดอื่นๆ จะถูกจัดเก็บไว้ในฐานข้อมูลในหน่วยความจำ และได้รับการอัปเดตเมื่อมีการลบและเพิ่มไฟล์ ดังนั้นจึงไม่จำเป็นต้องเข้าถึงระบบไฟล์บ่อยครั้ง ข้อยกเว้นคือการเปิดใช้งานตัวรวบรวมขยะเมื่อคุณต้องการหมุนเวียนไฟล์เมื่อถึงขนาดพื้นที่จัดเก็บที่กำหนด และไม่ได้ห้ามไม่ให้เพิ่มไฟล์ใหม่ ในกรณีนี้ คุณต้องข้ามพื้นที่เก็บข้อมูล และการทำงานกับไฟล์จำนวนมาก (> เช่นล้าน) อาจทำให้เกิดการโหลดจำนวนมากได้ และเป็นการดีกว่าถ้าเก็บไฟล์น้อยลงและรันโหนดมากขึ้น หากปิดใช้งาน "ตัวทำความสะอาด" แสดงว่าไม่มีปัญหาดังกล่าว

พื้นที่จัดเก็บไฟล์ประกอบด้วย 256 โฟลเดอร์และการซ้อน 2 ระดับ ไฟล์จะถูกจัดเก็บไว้ในโฟลเดอร์ระดับที่สอง คือถ้ามี 1 ล้าน แต่ละโฟลเดอร์จะมีไฟล์ประมาณ 62500 ไฟล์ (1000000 / sqrt(256))

ชื่อโฟลเดอร์ถูกสร้างขึ้นจากแฮชของไฟล์เพื่อให้คุณสามารถเข้าถึงได้อย่างรวดเร็วหากคุณรู้แฮช

โครงสร้างนี้ถูกเลือกตามความต้องการพื้นที่จัดเก็บข้อมูลที่แตกต่างกันจำนวนมาก: การรองรับระบบไฟล์ที่อ่อนแอ โดยที่ไม่ต้องการให้มีหลายไฟล์ในโฟลเดอร์เดียว การข้ามผ่านโฟลเดอร์ทั้งหมดอย่างรวดเร็วหากจำเป็น เป็นต้น ค่าเฉลี่ยสีทองบางชนิด

เก็บเอาไว้

เมื่อเพิ่มไฟล์รวมถึงเมื่อได้รับลิงก์ไปยังไฟล์จะถูกเขียนลงในแคช
ด้วยเหตุนี้ บ่อยครั้งจึงไม่จำเป็นต้องข้ามเครือข่ายทั้งหมดเพื่อค้นหาไฟล์ ซึ่งจะช่วยเพิ่มความเร็วในการรับลิงก์และลดภาระบนเครือข่าย การแคชยังเกิดขึ้นผ่านส่วนหัว http

ไอโซมอร์ฟีย์

ไคลเอนต์เขียนด้วยจาวาสคริปต์และเป็น isomorphic ซึ่งสามารถใช้งานได้โดยตรงจากเบราว์เซอร์ 
คุณสามารถอัพโหลดไฟล์ https://github.com/ortexx/storacle/blob/master/dist/storacle.client.js เป็นสคริปต์และการเข้าถึง หน้าต่าง ClientStoracle หรือนำเข้าผ่านระบบบิลด์ เป็นต้น

ลิงค์ที่เลื่อนออกไป

คุณลักษณะที่น่าสนใจก็คือ "การอ้างอิงที่รอการตัดบัญชี" นี่คือลิงก์ไปยังไฟล์ที่สามารถรับพร้อมกันได้ที่นี่และเดี๋ยวนี้ และไฟล์จะถูกดึงขึ้นมาเมื่อพบแล้วในที่เก็บข้อมูล วิธีนี้จะสะดวกมากเมื่อคุณต้องการแสดงรูปภาพบางส่วนบนเว็บไซต์ เราเพิ่งใส่ลิงค์ที่เลื่อนออกไปใน src เท่านี้ก็เรียบร้อย คุณสามารถเกิดขึ้นได้หลายกรณี

API ของไคลเอ็นต์

  • async Client.prototype.storeFile() - บันทึกไฟล์
  • async Client.prototype.getFileLink() — รับลิงก์โดยตรงไปยังไฟล์
  • async Client.prototype.getFileLinks() — รับรายการลิงก์โดยตรงไปยังไฟล์จากโหนดทั้งหมดที่มีอยู่
  • async Client.prototype.getFileToBuffer() - นำไฟล์ไปไว้ในบัฟเฟอร์
  • async Client.prototype.getFileToPath() - รับไฟล์เข้าสู่ระบบไฟล์
  • async Client.prototype.getFileToBlob() — รับไฟล์ในรูปแบบหยด (สำหรับเวอร์ชันเบราว์เซอร์)
  • async Client.prototype.removeFile() - ลบไฟล์
  • Client.prototype.createRequestedFileLink() — สร้างลิงค์เลื่อน

ส่งออกไฟล์ไปยังเซิร์ฟเวอร์อื่น

ในการถ่ายโอนไฟล์ไปยังโหนดอื่น คุณสามารถ:

  • เพียงคัดลอกโฟลเดอร์จัดเก็บข้อมูลทั้งหมดพร้อมกับการตั้งค่า (สิ่งนี้อาจไม่ทำงานในอนาคต)
  • คัดลอกเฉพาะโฟลเดอร์ที่มีไฟล์ แต่ในกรณีนี้ คุณจะต้องเรียกใช้ฟังก์ชันนี้อีกครั้ง โหนด.normalizeFilesInfo()เพื่อคำนวณข้อมูลทั้งหมดใหม่และป้อนลงในฐานข้อมูล
  • ใช้ฟังก์ชั่น โหนดส่งออกไฟล์()ซึ่งจะเริ่มทำการคัดลอกไฟล์

การตั้งค่าโหนดพื้นฐาน
เมื่อเริ่มต้นโหนดจัดเก็บข้อมูล คุณสามารถระบุการตั้งค่าที่จำเป็นทั้งหมดได้
ฉันจะอธิบายสิ่งพื้นฐานที่สุด ส่วนที่เหลือสามารถพบได้บน Github

  • storage.dataSize — ขนาดของโฟลเดอร์พร้อมไฟล์
  • storage.tempSize — ขนาดโฟลเดอร์ชั่วคราว
  • storage.autoCleanSize — ขนาดการจัดเก็บขั้นต่ำที่ต้องเก็บไว้ หากคุณระบุพารามิเตอร์นี้ ทันทีที่พื้นที่เริ่มหมด ไฟล์ที่ใช้น้อยที่สุดจะถูกลบ
  • ไฟล์.maxSize - ขนาดไฟล์สูงสุด
  • ไฟล์.minSize - ขนาดไฟล์ขั้นต่ำ
  • file.preferredDuplicates — จำนวนไฟล์ที่ต้องการซ้ำบนเครือข่าย
  • file.mimeWhitelist - ประเภทไฟล์ที่ถูกต้อง
  • ไฟล์.mimeBlacklist - ประเภทไฟล์ไม่ถูกต้อง
  • file.extWhitelist - นามสกุลไฟล์ที่ถูกต้อง
  • file.extBlacklist - นามสกุลไฟล์ไม่ถูกต้อง
  • ไฟล์.linkCache - การตั้งค่าแคชลิงก์ต่างๆ

พารามิเตอร์เกือบทั้งหมดที่เกี่ยวข้องกับมิติสามารถป้อนได้ทั้งค่าสัมบูรณ์และค่าสัมพัทธ์

ทำงานผ่านบรรทัดคำสั่ง
สามารถใช้ไลบรารีผ่านบรรทัดคำสั่งได้ ในการดำเนินการนี้ คุณจะต้องติดตั้งทั่วโลก: npm ฉัน -g storacle. หลังจากนี้ คุณสามารถเริ่มการดำเนินการที่จำเป็นได้จากไดเร็กทอรีโปรเจ็กต์ที่มีโหนดอยู่ ตัวอย่างเช่น, storacle -a storeFile -f ./file.txt -c ./config.jsเพื่อเพิ่มไฟล์. สามารถดูการดำเนินการทั้งหมดได้ใน https://github.com/ortexx/storacle/blob/master/bin/actions.js

ทำไมคุณถึงต้องการสิ่งนี้?

  • หากคุณต้องการสร้างโปรเจ็กต์แบบกระจายอำนาจที่คุณวางแผนจะจัดเก็บและทำงานกับไฟล์โดยใช้วิธีที่สะดวก ตัวอย่างเช่น โครงการเพลงที่อธิบายไว้ในลิงก์ตอนต้นของบทความใช้ ที่เก็บ.
  • หากคุณทำงานในโครงการอื่นที่คุณต้องการจัดเก็บไฟล์ในลักษณะกระจาย คุณสามารถสร้างเครือข่ายแบบปิด กำหนดค่าโหนดได้อย่างยืดหยุ่น และเพิ่มเครือข่ายใหม่เมื่อจำเป็น
  • หากคุณต้องการจัดเก็บไฟล์เว็บไซต์ของคุณไว้ที่ใดที่หนึ่งและมันมากเกินไปสำหรับคุณที่จะเขียนทุกอย่างด้วยตัวเอง บางทีห้องสมุดนี้อาจเหมาะสมกว่าห้องสมุดอื่นในกรณีของคุณ
  • หากคุณมีโปรเจ็กต์ที่คุณทำงานกับไฟล์ แต่ต้องการดำเนินการจัดการทั้งหมดจากเบราว์เซอร์ คุณสามารถหลีกเลี่ยงการเขียนโค้ดเซิร์ฟเวอร์ได้

ผู้ติดต่อของฉัน:

ที่มา: will.com

เพิ่มความคิดเห็น