\ مرت 6 أشهر منذ الإصدار الأول من Postgresus. خلال هذا الوقت، تلقى المشروع 247 عملية دمج، وميزات جديدة، بالإضافة إلى ~2.8 ألف نجمة على GitHub و~42 ألف تنزيل من Docker Hub. نمت أيضًا مجتمع المشروع، وهناك الآن 13 مساهمًا و90 شخصًا في مجموعة تيليجرام ID.
في هذه المقالة سأغطي:
\
لمن يسمعون عن المشروع لأول مرة: Postgresus هي أداة مفتوحة المصدر لنسخ PostgreSQL الاحتياطي مع واجهة مستخدم. تقوم بتشغيل النسخ الاحتياطي المجدول لقواعد بيانات متعددة، وتحفظها محليًا أو في وحدات تخزين خارجية، وتخطرك عند اكتمال النسخ الاحتياطي أو فشله.
يتم نشر المشروع بأمر واحد في Docker. يمكن تثبيته عبر نص برمجي للشل، أمر Docker، docker-compose.yml والآن عبر Helm لـ Kubernetes. المزيد حول طرق التثبيت.
بجانب الميزة الرئيسية "إنشاء نسخ احتياطية"، يمكن للمشروع:
الموقع الإلكتروني - https://postgresus.com/
GitHub - https://github.com/RostislavDugin/postgresus (سأكون ممتنًا لنجمة ⭐️)
تبدو واجهة المشروع كما يلي:
فيديو نظرة عامة: https://www.youtube.com/watch?v=1qsAnijJfJE
لأولئك الذين يرغبون في المشاركة في التطوير، هناك صفحة منفصلة في الوثائق. إذا أراد شخص ما مساعدة المشروع ولكنه لا يريد البرمجة - فقط أخبر زملائك وأصدقائك عن المشروع! هذه أيضًا مساعدة كبيرة ومساهمة في المشروع.
أعرف كيفية التطوير، لكن الترويج حتى لمشروع مفتوح المصدر أمر صعب للغاية. يكتسب المشروع الاعتراف بفضل أولئك الذين يقومون بمراجعات فيديو ويتحدثون عن المشروع في وسائل التواصل الاجتماعي. شكرًا لكم!
تغير الكثير خلال هذه الأشهر الستة. تم تحسين المشروع في أربعة اتجاهات:
دعونا نستعرض كل واحدة.
بجانب النسخ الاحتياطي، يراقب Postgresus الآن صحة قاعدة البيانات: يظهر وقت التشغيل وينبهك إذا كانت قاعدة البيانات غير متاحة.
يمكن تعطيل فحص الصحة وتكوينه.
إذا كانت قاعدة البيانات غير متاحة - سيرسل النظام إشعارًا بذلك.
في البداية، كان بإمكان Postgresus تخزين النسخ الاحتياطية محليًا وفي S3 فقط. تمت إضافة Google Drive، CloudFlare R2، Azure Blob Storage و NAS. تشمل الخطط إضافة FTP وربما SFTP و NFS.
بالنسبة للإشعارات، كان لدى المشروع في البداية تيليجرام ID والبريد الإلكتروني (SMTP). الآن يتم دعم Slack و Discord و MS Teams و webhooks أيضًا. علاوة على ذلك، يتم الآن تكوين webhooks بمرونة للاتصال بمنصات مختلفة:
سابقًا، كان النظام يحتوي على مستخدم واحد فقط (المسؤول)، وكانت قواعد البيانات عالمية للنظام بأكمله. الآن يدعم Postgresus إنشاء مساحات عمل لفصل قواعد البيانات وإضافة مستخدمين إلى مساحات العمل. مع فصل الدور:
وبالتالي، يمكنك الآن فصل قواعد البيانات:
بدأت فرق مسؤولي قواعد البيانات وشركات الاستعانة بمصادر خارجية الكبيرة في استخدام Postgresus، لذا أصبحت هذه ميزة مهمة. يجعل المشروع مفيدًا ليس فقط للمطورين الفرديين، أو DevOps أو مسؤولي قواعد البيانات، ولكن للفرق والمؤسسات بأكملها.
ظهرت أيضًا سجلات التدقيق:
إذا قرر شخص ما حذف جميع قواعد البيانات أو لسبب ما قام بتنزيل جميع النسخ الاحتياطية لجميع قواعد البيانات - سيكون هذا مرئيًا 🙃
في الإصدار الأول، بصراحة، لم يكن لدي وقت للأمان. قمت بتخزين جميع ملفات النسخ الاحتياطي محليًا، ولم يكن لدى أحد حق الوصول إليها، ولم تكن مشاريعي سرية للغاية.
ولكن عندما أصبح Postgresus مفتوح المصدر، تعلمت بسرعة أن الفرق غالبًا ما تحفظ النسخ الاحتياطية في حاويات S3 المشتركة ولا تريد أن يقرأها الآخرون. يجب ألا يتم تخزين كلمات مرور قاعدة البيانات في قاعدة بيانات Postgresus الخاصة أيضًا، لأن العديد من الأشخاص لديهم حق الوصول إلى خوادمها. ~~وهناك بعض عدم الثقة ببعضهم البعض.~~ ببساطة عدم كشف الأسرار عبر واجهة برمجة تطبيقات جديدة لم يعد كافيًا.
لذلك، أصبح تشفير وأمان المشروع بأكمله الأولوية الرئيسية لـ Postgresus. تعمل الحماية الآن على ثلاثة مستويات، وهناك صفحة وثائق مخصصة لهذا.
يتم تخزين جميع كلمات مرور قاعدة البيانات ورموز Slack وبيانات اعتماد S3 مشفرة في قاعدة بيانات Postgresus. يتم فك التشفير فقط عند الحاجة. يتم تخزين المفتاح السري في ملف منفصل عن قاعدة البيانات، لذلك حتى إذا اخترق شخص ما قاعدة بيانات Postgresus (والتي ليست معرضة خارجيًا على أي حال) - فلن يتمكنوا من قراءة أي شيء. يستخدم التشفير AES-256-GCM.
يتم الآن أيضًا تشفير ملفات النسخ الاحتياطي (اختياريًا، ولكن التشفير ممكّن افتراضيًا). إذا فقدت ملفًا أو حفظته في S3 العام - فهذا ليس مخيفًا بعد الآن.
يستخدم التشفير كلاً من الملح و متجه التهيئة الفريد. هذا يمنع المهاجمين من العثور على أنماط لتخمين مفتاح التشفير، حتى إذا سرقوا جميع ملفات النسخ الاحتياطي الخاصة بك.
يتم التشفير في وضع التدفق، ويستخدم AES-256-GCM هنا أيضًا.
على الرغم من النقطتين الأوليين، لا توجد طريقة حماية 100٪. لا يزال هناك احتمال ضئيل أن:
لذلك يجب أن يساعد Postgresus المستخدمين على تقليل الضرر. قد تكون احتمالية مثل هذا الاختراق قريبة من الصفر، ولكن هذا عزاء بارد إذا كنت أنت من يحدث له ذلك.
الآن عندما تضيف مستخدم قاعدة بيانات مع أذونات الكتابة إلى Postgresus، يقدم النظام إنشاء مستخدم للقراءة فقط تلقائيًا وتشغيل النسخ الاحتياطية من خلاله. من المرجح أن ينشئ الأشخاص دورًا للقراءة فقط عندما يستغرق الأمر نقرة واحدة بدلاً من إعداده يدويًا في قاعدة البيانات.
إليك كيف يقدم Postgresus:
يقدم بإصرار شديد:
مع هذا النهج، حتى إذا تم اختراق خادم Postgresus الخاص بك، وتم فك تشفير كل شيء وحصل المهاجمون على حق الوصول إلى قاعدة البيانات الخاصة بك - فلن يتمكنوا على الأقل من إفساد قاعدة البيانات. معرفة أن ليس كل شيء ضاع هو عزاء جيد جدًا.
قدم الإصدار الأول من Postgresus جميع خوارزميات الضغط التي يدعمها PostgreSQL: gzip و lz4 و zstd، مع مستويات ضغط من 1 إلى 9. بصراحة، لم أفهم حقًا لماذا قد يحتاج أي شخص إلى كل هذه الخيارات. لقد اخترت فقط gzip بمستوى 5 كما بدا أنه حل وسط معقول.
ولكن بمجرد أن أصبح المشروع مفتوح المصدر، كان علي أن أبحث في هذا بالفعل. لذلك قمت بتشغيل 21 نسخة احتياطية في جميع التركيبات الممكنة ووجدت أفضل مقايضة بين السرعة والحجم.
لذلك الآن افتراضيًا لجميع النسخ الاحتياطية يتم تعيين zstd بمستوى ضغط 5، إذا كان إصدار PostgreSQL 16 وأعلى. إذا كان أقل - لا يزال gzip (بالمناسبة، شكرًا مرة أخرى للمساهمين لدعم PG 12). إليك zstd 5 مقارنة بـ gzip 5 (إنه في الأسفل):
في المتوسط، يتم ضغط النسخ الاحتياطية ~8 مرات بالنسبة لحجم قاعدة البيانات الفعلي.
هذا سريع - أضفنا دعم k8s الأصلي مع تثبيت Helm. يمكن للفرق التي تشغل k8s في السحابة الآن نشر Postgresus بشكل أسهل. ساعد ثلاثة مساهمين في هذه الميزة.
أنا لست من محبي الوضع الداكن حقًا. لكن كانت هناك العديد من الطلبات، لذلك أضفت واحدًا (~~شكرًا لـ Claude على المساعدة وعين المصمم~~). بشكل مفاجئ، تبين أنه أفضل من الوضع الفاتح وأصبح الافتراضي. لقد أعدت تصميم الموقع من الفاتح إلى الداكن - كان يبدو جيدًا جدًا.
قبل:
بعد:
أولاً، بعض السياق:
اعتقدت أن Postgresus يجب أن يدعم في النهاية النسخ الاحتياطية التزايدية. بعد كل شيء، هذا ما تفعله الأدوات الجادة! حتى ChatGPT يقول إن الأدوات الجادة يمكنها الاسترداد بدقة تصل إلى الثانية والمعاملة.
لذلك بدأت العمل عليها. لكن ثم واجهت الواقع:
للاسترداد - لا يوجد خيار لعدم الاتصال بالقرص مع قاعدة البيانات. لاستعادة من نسخة احتياطية تزايدية، تقوم أداة النسخ الاحتياطي ببساطة باستعادة مجلد pgdata (بشكل أكثر دقة، جزء منه).
إذا كانت قاعدة البيانات كبيرة حقًا، على سبيل المثال، عدة تيرابايت وأكثر - فهناك حاجة إلى ضبط دقيق في التكوينات. هنا واجهة المستخدم هي أكثر عائقًا من المساعدة.
لذلك، إذا كان Postgresus يقوم بعمل نسخة احتياطية من قاعدة بيانات مُدارة - فيكفي القيام بذلك مرة واحدة تقريبًا في الأسبوع. فقط في حالة حدوث طارئ غير متوقع أو إذا كانت السحابة لا تسمح بتخزين النسخ الاحتياطية لفترة كافية. وإلا، اعتمد على النسخ الاحتياطية التزايدية الخاصة بالسحابة.
ولكن إذا كنت بنكًا أو مطور قاعدة بيانات مُدارة، فأنت بحاجة حقًا إلى أفضل تكوين للنسخ الاحتياطي لعشرات ومئات التيرابايت من البيانات. هنا لن يتفوق Postgresus أبدًا على النسخ الاحتياطية المادية من WAL-G أو pgBackRest من حيث راحة وحدة التحكم والكفاءة لقواعد البيانات ذات الحجم بالتيرابايت وأكثر. ولكن، في رأيي، هذه هي بالفعل أدوات متخصصة لمثل هذه المهام، صنعها عباقرة ومشرفو PostgreSQL نفسه.
في رأيي، النسخ الاحتياطية التزايدية مطلوبة حقًا في حالتين:
بالنظر إلى كل هذا، اتخذت قرارًا متعمدًا بإسقاط تطوير النسخ الاحتياطية التزايدية. بدلاً من ذلك، أركز على جعل النسخ الاحتياطية المنطقية مريحة وموثوقة وعملية للاستخدام اليومي من قبل المطورين، DevOps، مسؤولي قواعد البيانات والشركات.
النقاط أعلاه بعيدة كل البعد عن كل شيء. 80٪ من العمل عادة لا يكون مرئيًا. من رأسي، إليك قائمة قصيرة:
pg_dump مؤقتًا أثناء انتظار S3 للحاق به (التنزيل من قاعدة البيانات عادة ما يكون أسرع من التحميل إلى السحابة). استخدام ذاكرة الوصول العشوائي محدود الآن بـ 32 ميجابايت لكل نسخة احتياطية متوازية.والكثير غير ذلك.
بالطبع، لا ينجح كل شيء ويجب التخلي عن بعض الأشياء. أنا أبني Postgresus في وقت فراغي، الذي بالكاد موجود. لذلك لا يمكنني أن أنتشر كثيرًا أو أعقد تجربة المستخدم بميزات غير ضرورية. الكثير من الميزات سيء أيضًا.
أردت أن أجعل Postgresus أداة مراقبة PostgreSQL أيضًا. بما في ذلك موارد النظام للخادم الذي يشغل PostgreSQL:
لقد صنعت حتى الأساس لجمع المقاييس (أي) ونموذج للرسوم البيانية:
اتضح أن PostgreSQL يكشف فقط عن استخدام ذاكرة الوصول العشوائي ومقاييس الإدخال/الإخراج بشكل افتراضي.
تتطلب مراقبة الموارد الأخرى ملحقات. ولكن ليس كل قاعدة بيانات يمكنها تثبيت الملحقات التي أحتاجها، لذلك يمكنني فقط جمع مقاييس جزئية. ثم اكتشفت أن قواعد البيانات السحابية غالبًا لا تسمح بتثبيت الملحقات على الإطلاق.
ثم أدركت أنه يجب تخزين المقاييس في VictoriaMetrics أو على الأقل TimescaleDB، وليس في PostgreSQL الخاص بـ Postgresus، مما سيعقد بناء الصورة.
في النهاية، ستضيف هذه الميزة غير الأساسية:
لذلك تخليت عن مراقبة الموارد وركزت على جعل Postgresus أفضل أداة نسخ احتياطي يمكن أن تكون.
أردت أيضًا إضافة وحدة تحكم SQL. بما أن Postgresus متصل بالفعل بقاعدة البيانات، لماذا لا نقوم بتشغيل الاستعلامات مباشرة منه؟ سيكون مريحًا - لا حاجة لفتح PgAdmin أو DataGrip أو DBeaver في كل مرة.
لم أجد أبدًا وقتًا للعمل عليه، فقط خططت. بدأ أحد المساهمين في الميزة و قدم PR. ولكن كما هو متوقع مع الميزات المعقدة، ظهرت العديد من المتطلبات والحالات الحدية:
هذا في الأساس مشروع كامل بحد ذاته، وليس مجرد علامة تبويب واحدة.
قررنا إسقاط الميزة وتوفير الجهد. اتضح أن هذا كان القرار الصحيح، لأننا أضفنا أدوارًا للقراءة فقط لا تسمح بـ INSERT، UPDATE و DELETE على أي حال.
هذه هي الرحلة التي قام بها Postgresus في ستة أشهر. نما من مشروع متخصص إلى أداة على مستوى المؤسسات تساعد كلاً من المطورين الفرديين وفرق مسؤولي قواعد البيانات بأكملها (فوجئت بمعرفة هذا بعد ~2 شهر فقط من الإصدار الأول، بالمناسبة). أنا سعيد حقًا لأن آلاف المشاريع والمستخدمين يعتمدون على Postgresus.
المشروع لا يتوقف هنا. هدفي الآن هو جعل Postgresus أداة النسخ الاحتياطي PostgreSQL الأكثر ملاءمة في العالم. هناك تراكم كبير من الميزات والتحسينات القادمة تدريجيًا.
أولوياتي الرئيسية لا تزال:
إذا أعجبك المشروع أو وجدته مفيدًا - سأكون ممتنًا لـ نجمة على GitHub أو مشاركته مع الأصدقاء ❤️
\


