hashget عبارة عن deduplicator مجانية قائمة على الأوبرا - وهي أداة شبيهة بأرشيف الملفات ، والتي يمكن أن تقلل إلى حد كبير من حجم النسخ الاحتياطية ، فضلاً عن تنظيم أنظمة النسخ الاحتياطي التزايدي والتفاضلي والمزيد.
هذا مقال مراجعة لوصف الميزات. يوصف استخدام hashget نفسه (بسيط للغاية) في وثائق المشروع README ويكي .
مقارنة
وفقًا لقانون النوع ، سأبدأ على الفور بالفضول - مقارنة النتائج:
خلفية ما يجب أن يكون نسخة احتياطية مثالية وفعالة
في كل مرة أقوم بعمل نسخة احتياطية من جهاز ظاهري تم إنشاؤه حديثًا ، شعرت بالسعادة بسبب الشعور بأنني ارتكبت شيئًا ما خطأ. لماذا أحصل على نسخة احتياطية ثقيلة من نظام يكون فيه إبداعي الذي لا يقدر بثمن هو فهرس أحادي السطر مع النص "Hello world"؟
لماذا يوجد 16 ميغا بايت / usr / sbin / mysqld في النسخة الاحتياطية الخاصة بي؟ هل يشرفني حقاً أن أحفظ هذا الملف المهم في هذا العالم ، وإذا لم أتمكن من القيام بذلك ، فستفقده البشرية؟ على الأرجح لا. يتم تخزينه على خوادم دبيان الموثوقة للغاية (لا يمكن مقارنة موثوقيتها واستمراريتها بما يمكنني توفيره) ، وكذلك في نسخ احتياطية (بملايينها) من مدراء آخرين. هل نحتاج حقًا إلى إنشاء نسخة 1000000 + أول نسخة من هذا الملف المهم لزيادة الموثوقية؟
بشكل عام ، hashget يحل هذه المشكلة. عند التعبئة - يخلق نسخة احتياطية صغيرة جدا. عند التفريغ - نظام مفتوح تمامًا ، يشبه النظام الذي سيكون مع tar -c
/ tar -x
. (وبعبارة أخرى ، هذا هو التعبئة والتغليف ضياع)
كيف يعمل hashget
Hashget لديه مفاهيم Package و HashPackage ، بمساعدتهما يقوم بإلغاء البيانات المكررة.
الحزمة (حزمة). ملف (عادةً أرشيف .deb أو .tar.gz) يمكن تنزيله بشكل موثوق من الشبكة ومنه يمكن الحصول على ملف واحد أو أكثر.
HashPackage هو ملف JSON صغير يمثل الحزمة ، بما في ذلك عنوان URL للحزمة ومجموع التجزئة (sha256) من الملفات منه. على سبيل المثال ، بالنسبة لحزمة mariadb-server-core التي يبلغ حجمها 5 ميجابايت ، فإن حجم hashpackage يبلغ 6 كيلو بايت فقط. حوالي ألف مرة أصغر.
إلغاء البيانات المكررة - إنشاء أرشيف بدون ملفات مكررة (إذا كان deduplicator يعرف أين يمكن تنزيل الحزمة الأصلية ، فإنه يقلل التكرارات من الأرشيف).
غلاف
عند التعبئة ، يتم عرض جميع الملفات من الدليل المحزوم ، ومبالغ التجزئة الخاصة بها ، وإذا تم العثور على المبلغ في أحد HashPackage المعروف ، فسيتم حفظ بيانات تعريف الملف (الاسم ، التجزئة ، الأذونات ، وما إلى ذلك) في ملف خاص .hashget-restore.json ، والذي كما سيتم تضمينها في الأرشيف.
لا تبدو العبوة نفسها في أبسط الحالات أكثر تعقيدًا من القطران:
hashget -zf /tmp/mybackup.tar.gz --pack /path/to/data
تفريغ
يتم التفريغ على مرحلتين. أولاً ، تفريغ القطران المعتاد:
tar -xf mybackup.tar.gz -C /path/to/data
ثم استعادة من الشبكة:
hashget -u /path/to/data
عند الاسترداد ، تقرأ hashget ملف .hashget-restore.json ، وتنزيل الحزم الضرورية ، وتفريغها ، وتستخرج الملفات الضرورية ، وتضعها في المسارات الصحيحة ، مع المالك / المجموعة / الأذونات اللازمة.
أشياء أكثر تعقيدا
ما تم وصفه أعلاه يكفي بالفعل لأولئك الذين "يريدون القطران ، ولكن لتعبئة ديبيان الخاص بي إلى 4 ميغابايت." علاوة على ذلك ، سوف ننظر إلى أشياء أكثر صعوبة.
الفهرسة
إذا لم يكن hashget يحتوي على HashPackage واحد على الإطلاق ، فإنه ببساطة لا يمكن تكرار أي شيء.
يمكنك أيضًا إنشاء HashPackage يدويًا (ببساطة: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my
) ، ولكن هناك طريقة أكثر ملاءمة.
من أجل الحصول على hashpackage التي تحتاجها ، هناك خطوة فهرسة (يتم تنفيذها تلقائيًا عند --pack
الأمر --pack
) والاستدلال . عند الفهرسة ، قم بتقطيع "تغذيات" كل ملف موجود لجميع الاستدلال الموجود الذي يهتم به. يمكن للاستدلال ثم فهرسة أي حزمة لإنشاء HashPackage.
على سبيل المثال ، يحب مجريات الأمور في دبيان الملف / var / lib / dpkg / status ويكتشف حزم دبيان المثبتة ، وإذا لم يتم فهرستها (لم يتم إنشاء HashPackage لهم) ، فقم بتنزيلها وفهرستها. والنتيجة هي تأثير ممتع للغاية - ستعمل hashget دائمًا على إلغاء تنشيط أنظمة تشغيل دبيان بشكل فعال ، حتى إذا كان لديها أحدث الحزم.
تلميح الملفات
إذا كانت شبكتك تستخدم نوعًا من الحزمة الاحتكارية أو الحزمة العامة التي لم يتم تضمينها في استدلالات hashget ، يمكنك إضافة ملف تلميح hashget-hint.json بسيط إليها كما يلي:
{ "project": "wordpress.org", "url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip" }
علاوة على ذلك ، في كل مرة يتم إنشاء الأرشيف ، ستتم فهرسة الحزمة (إن لم يكن سابقًا) ، وسيتم إلغاء نسخ ملفات الحزمة من الأرشيف. ليست هناك حاجة إلى البرمجة ، كل شيء يمكن القيام به من vim وحفظها في كل نسخة احتياطية. لاحظ أنه بفضل النهج من خلال التجزئة ، إذا تم تغيير بعض الملفات من الحزمة محليًا (على سبيل المثال ، تم تغيير ملف التكوين) ، فسيتم حفظ الملفات التي تم تغييرها في الأرشيف "كما هي" ولن يتم تخفيضها.
إذا تم تحديث بعض الحزم الخاصة بك بشكل دوري ، ولكن التغييرات ليست كبيرة جدًا ، يمكنك التلميح فقط للإصدارات الرئيسية. على سبيل المثال ، في الإصدار 1.0 ، قاموا بعمل تلميح يشير إلى mypackage-1.0.tar.gz ، وسيتم إلغاء نسخه بالكامل ، ثم أصدروا الإصدار 1.1 ، وهو مختلف قليلاً ، لكنهم لم يقوموا بتحديث التلميح. لا شيء يدعو للقلق. يتم إلغاء نسخ الملفات التي تطابق (والتي يمكن استعادتها) مع الإصدار 1.0 فقط.
إرشادي أن يعالج ملف تلميح هو مثال جيد لفهم الآلية الداخلية للكشف عن مجريات الأمور. يعمل فقط على معالجة ملفات hashget-hint.json (أو .hashget-hint.json باستخدام نقطة) ويتجاهل أي شخص آخر. باستخدام هذا الملف ، فإنه يحدد عنوان URL للحزمة الذي يجب فهرسته ، ويقوم hashget بفهرسته (إذا لم يكن هذا قد تم من قبل)
HashServer
سيكون من المستنفد للوقت إجراء الفهرسة بالكامل عند إنشاء نسخ احتياطية. للقيام بذلك ، تحتاج إلى تنزيل كل حزمة ، بفك ، فهرس. لذلك يستخدم hashget نظام مع HashServer . إذا تم تثبيت حزمة دبيان ، إذا لم يتم العثور عليها في HashPackage المحلي ، يتم إجراء محاولة أولاً لتنزيل HashPackage من خادم التجزئة. وفقط إذا لم ينجح هذا - فقد قام hashget بتحميل وتنزيل الحزمة (وتحميلها إلى hashserver ، بحيث يوفرها hashserver لاحقًا).
HashServer - عنصر اختياري للمخطط ، وليس حرجًا ، يُستخدم حصريًا لتسريع وتقليل التحميل على المستودعات. يتم قطع الاتصال بسهولة (باستخدام الخيار --hashserver
دون معلمات). بالإضافة إلى ذلك ، يمكنك بسهولة جعل hashserver الخاص بك .
نسخ احتياطي تزايدي وتفاضلي ، تقادم مخطط له
hashget يجعلها بسيطة للغاية لعمل نسخ احتياطي تزايدي وتفاضلي . لماذا لا نقوم بفهرسة النسخة الاحتياطية الخاصة بنا (مع جميع ملفاتنا الفريدة)؟ فريق واحد - --submit
وانت القيام به! لن تتضمن النسخة الاحتياطية التالية التي ستنشئها ملفات من هذا الأرشيف.
لكن هذا ليس طريقة جيدة للغاية ، لأنه قد يتضح أنه خلال فترة الاسترداد ، سيتعين علينا التخلص من جميع النسخ الاحتياطية للتجزئة بأكملها (إذا كان لكل منها ملف فريد واحد على الأقل). هناك آلية للتقادم النسخ الاحتياطي المجدولة لهذا الغرض. عند الفهرسة ، يمكنك تحديد تاريخ انتهاء صلاحية HashPackage - تنتهي --expires 2019-06-01
، وفي هذا التاريخ (من 00:00) ، لن يتم استخدامه. لا يمكن حذف الأرشيف نفسه بعد هذا التاريخ (على الرغم من أن hashget يمكنه بسهولة عرض عناوين URL لجميع النسخ الاحتياطية التي قمنا بتعفنها / تعفنها في الوقت الحالي أو في أي تاريخ).
على سبيل المثال ، إذا قمت بعمل نسخة احتياطية كاملة في اليوم الأول وفهرستها بفترة حياة قبل نهاية الشهر ، فسنحصل على نظام نسخ احتياطي تفاضلي.
إذا قمنا أيضًا بفهرسة نسخ احتياطية جديدة ، فسيكون هناك مخطط للنسخ الاحتياطية الإضافية.
على عكس المخططات التقليدية ، يتيح لك hashget استخدام عدة مصادر أساسية. سيتم تقليل النسخ الاحتياطي بسبب تقليل الملفات من النسخ الاحتياطية السابقة (إن وجدت) وبسبب الملفات العامة (ما يمكن تنزيله).
إذا لم نثق في مصداقية موارد دبيان لسبب ما ( https://snapshot.debian.org/ ) أو استخدم توزيعًا مختلفًا ، فيمكننا عمل نسخة احتياطية كاملة مع جميع الحزم مرة واحدة ، ثم الاعتماد عليها بالفعل ( تعطيل الاستدلال) ). الآن ، إذا تبين أن جميع خوادم توزيعاتنا غير قابلة للوصول إلينا (في الإنترنت التذكاري أو خلال نهاية العالم الزومبي) ، ولكن النسخ الاحتياطية لدينا في حالة جيدة - يمكننا التعافي من أي نسخ احتياطي قصير الفرق يعتمد فقط على النسخ الاحتياطية السابقة لدينا.
تعتمد Hashget فقط على مصادر موثوقة للتعافي وفقًا لتقديرك. التي تعتبرها موثوقة - سيتم استخدامها.
FilePool والأنهار الجليدية
تتيح لك آلية FilePool عدم الوصول باستمرار إلى الخوادم الخارجية لتنزيل الحزم ، ولكن استخدام الحزم من دليل محلي أو خادم شركة ، على سبيل المثال:
$ hashget -u . --pool /tmp/pool
أو
$ hashget -u . --pool http://myhashdb.example.com/
لإنشاء تجمع في دليل محلي - فقط قم بإنشاء دليل وتحميل الملفات إليه ، ستجد hashget نفسها ما يحتاج إليه من خلال التجزئة. لجعل التجمع متاحًا عبر HTTP ، تحتاج إلى إنشاء روابط بطريقة خاصة ، ويتم ذلك بأمر واحد ( hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool
). HTTP FilePool في حد ذاته ملف ثابت ، لذلك يمكن لأي خادم ويب بسيط تقديمه ، يكون الحمل على الخادم صفريًا تقريبًا.
بفضل FilePool ، لا يمكن استخدام موارد http (s) فقط كموارد أساسية ، ولكن أيضًا ، على سبيل المثال ، Amazon Glacier.
بعد تحميل النسخة الاحتياطية إلى الجبل الجليدي ، نحصل على معرف التحميل ونستخدمه كعنوان URL. على سبيل المثال:
hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01
الآن تعتمد النسخ الاحتياطية الجديدة (التفاضلية) على هذه النسخة الاحتياطية وستكون أقصر. بعد tar تفريغ diffback ، يمكننا أن نرى ما هي الموارد التي يعتمد عليها:
hashget --info /tmp/unpacked/ list
وما عليك سوى استخدام البرنامج النصي shell لتنزيل كل هذه الملفات من الأنهار الجليدية إلى المسبح وتشغيل الاسترداد المعتاد: hashget -u / tmp / unpacked --pool / tmp / pool
هي لعبة تستحق كل هذا العناء
في أبسط الحالات ، ستدفع ببساطة أقل مقابل النسخ الاحتياطية (إذا قمت بتخزينها في مكان ما في السحابة مقابل المال). ربما - أقل بكثير.
لكن هذا ليس هو الوحيد. يذهب الكمية إلى الجودة. يمكنك استخدام هذا للحصول على ترقية عالية الجودة لنظام النسخ الاحتياطي. على سبيل المثال ، نظرًا لأن النسخ الاحتياطية الخاصة بنا أصبحت الآن أقصر - لا يمكنك عمل نسخة احتياطية شهرية ، ولكن نسخة احتياطية يومية. احتفظ بها ليس ستة أشهر ، كما كان من قبل ، ولكن 5 سنوات. في السابق ، تم تخزينها في مخزن "بارد" بطيء ولكنه رخيص (Glacier) ، والآن يمكنك تخزينها في مكان ساخن ، حيث يمكنك دائمًا تنزيل نسخة احتياطية بسرعة واستردادها في دقائق ، وليس في يوم واحد.
يمكنك زيادة موثوقية التخزين الاحتياطي. إذا قمنا بتخزينها الآن في متجر واحد ، فعندئذ قمنا بتقليل حجم النسخ الاحتياطية - يمكننا تخزين ما بين 2-3 متاجر وتخفيف الألم في حالة تلف أحدها.
كيف نحاول البدء في استخدام؟
نذهب إلى صفحة gitlab https://gitlab.com/yaroslaff/hashget ، pip3 install hashget[plugins]
بأمر واحد ( pip3 install hashget[plugins]
) وقم فقط بقراءة وتنفيذ البدء السريع. أعتقد أن كل الأشياء البسيطة التي يجب القيام بها - سوف تستغرق من 10 إلى 15 دقيقة. ثم يمكنك محاولة هز الأجهزة الظاهرية الخاصة بك ، وإنشاء ملفات تلميح إذا لزم الأمر ، للضغط بشكل أكبر ، واللعب مع البلياردو ، وقاعدة بيانات التجزئة المحلية ، وخادم التجزئة ، إذا كان ذلك ممتعًا ، وفي اليوم التالي ، سيظهر حجم النسخة الاحتياطية التزايدية بالأمس.
Restic + HashGet
(تمت إضافة هذا الفصل لاحقًا. شكرًا للمعلقين على انتقاداتهم ودوافعهم.)
هناك أداة مريحة جيدة للنسخ الاحتياطي - restic . يمكن أيضًا إجراء إلغاء البيانات المكررة ، ولكن فقط داخل المستودع ، لا يمكن إلغاء البيانات المكررة من الخارج ، والتي تعمل أداة التجزئة بسهولة . ولكن في تركيبة من restic + hashget ، نتمكن من استخدام مزايا كلا النهجين!
إعداد (فك وورد وفهرسة):
# wget -q https://wordpress.org/wordpress-5.2.2.tar.gz # hashget --submit https://wordpress.org/wordpress-5.2.2.tar.gz -p my --file wordpress-5.2.2.tar.gz --hashserver # tar -xf wordpress-5.2.2.tar.gz # du -sh wordpress 46M wordpress
مضيفا لقطة للراحة عبر
# hashget -X exclude-list --prepack wordpress --hashserver Saved: 1468 files, 1 pkgs, size: 40.5M. Download: 10.7M # restic --exclude-file exclude-list backup wordpress password is correct scan [/tmp/wp/wordpress] scanned 193 directories, 367 files in 0:02 [0:04] 100.00% 700.829 KiB / 700.829 KiB 560 / 560 items 0 errors ETA 0:00 duration: 0:04 snapshot 76b54230 saved # du -sh /tmp/restic-repo/ 2,1M /tmp/restic-repo/
في هذه المرحلة ، أضفنا لقطة كتالوج (40+ ميغابايت) ، وزاد حجم المستودع بمقدار 1 ميغابايت فقط.
يتم الاسترداد بواسطة أمرين:
# restic restore 76b54230 -t unpacked password is correct restoring <Snapshot 76b54230 of [/tmp/wp/wordpress] at 2019-06-19 04:30:55.760618336 +0700 +07 by root@braconnier> to unpacked # hashget -u unpacked/wordpress/ --hashserver Recovered 1468/1468 files 40.5M bytes (0 downloaded, 0 from pool, 10.7M cached) in 1.56s