سؤال

حاليًا ، حصلت على صور (6 ميغابايت) مخزنة كقطعة في جدول Innodb. مع نمو حجم البيانات ، تزداد النسخ الاحتياطي الليلي الأداء الأبطأ وأبطأ الأداء العادي.

لذلك ، تحتاج البيانات الثنائية إلى الانتقال إلى نظام الملفات. (سيتم حفظ مؤشرات الملفات في DB.)

البيانات لها شجرة مثل العلاقة:

- main site
  - user_0
    - album_0
    - album_1
    - album_n
  - user_1
  - user_n
etc...

الآن أريد أن يتم توزيع البيانات بالتساوي على بنية الدليل. كيف يمكنني إنجاز هذا؟

أعتقد أنني يمكن أن أحاول MD5('userId, albumId, imageId'); وقم بتقطيع السلسلة الناتجة للحصول على مسار الدليل الخاص بي:

  /var/imageStorage/f/347e/013b/c042/51cf/985f7ad0daa987d.jpeg

هذا من شأنه أن يتيح لي تعيين الحرف الأول لخادم وتوزيع بنية الدليل بالتساوي على خوادم متعددة.

هذا سيكون ليس حافظ على الصور المنظمة لكل مستخدم ، من المحتمل أن تنشر الصور لألبوم واحد عبر خوادم متعددة.

سؤالي هو:
ما هي أفضل طريقة لتخزين بيانات الصورة في نظام الملفات بطريقة متوازنة ، مع الحفاظ على بيانات المستخدم/الألبوم معًا؟

هل أفكر في الاتجاه الصحيح؟ أم أن هذه هي الطريقة الخاطئة لفعل الأشياء تمامًا؟

تحديث:
سأذهب ل md5(user_id) سلسلة تقطيع للانقسام على أعلى مستوى. ثم ضع جميع بيانات المستخدم في نفس الدلو. سيضمن ذلك توزيعًا متساويًا للبيانات مع الحفاظ على تخزين بيانات المستخدم القريبة من بعضها البعض.

  /var
   - imageStorage
     - f/347e/013b
       - f347e013bc04251cf985f7ad0daa987d
         - 0
           - album1_10
             - picture_1.jpeg
         - 1
           - album1_1
             - picture_2.jpeg
             - picture_3.jpeg
           - album1_11
             - picture_n.jpeg
         - n
           - album1_n

أعتقد أنني سأستخدم الألبوم المنقسم من الخلف (أحب هذه الفكرة!) من أجل الحفاظ على عدد الألبومات لكل دليل أصغر (على الرغم من أنه لن يكون ضروريًا لمعظم المستخدمين).

شكرًا!

هل كانت مفيدة؟

المحلول

ما عليك سوى تقسيم معرف المستخدم الخاص بك من الخلف. على سبيل المثال

UserID = 6435624 
Path = /images/24/56/6435624

أما بالنسبة للنسخ الاحتياطي ، يمكنك استخدام النسخ المتماثل MySQL ونسخ احتياطي قاعدة بيانات الرقيق لتجنب المشكلات (على سبيل المثال الأقفال) أثناء النسخ الاحتياطي.

نصائح أخرى

شيء واحد حول توزيع أسماء الملفات على أدلة مختلفة ، إذا كنت تفكر في تقسيم أسماء الملفات MD5 إلى أسماء فرعية مختلفة (وهي فكرة جيدة عمومًا) ، أقترح الحفاظ على التجزئة الكاملة كاسم ملف وتكرار الأسماء القليلة الأولى كأسماء دليل. وبهذه الطريقة ، ستجعل من السهل تحديد الملفات على سبيل المثال عندما تضطر إلى نقل الدلائل.

على سبيل المثال

ABCDEFGH.JPG -> A/AB/ABC/ABCDEFGH.JPG

إذا لم يتم توزيع أسماء الملفات الخاصة بك بالتساوي (وليس تجزئة) ، فحاول اختيار طريقة تقسيم تحصل على توزيع متساو

أنا أستخدم هذه الاستراتيجية معرفًا فريدًا من معرف صورة

  • عكس السلسلة
  • Zerofill مع الصفر الرائد إذا كان هناك عدد فردي من الأرقام
  • قطع السلسلة إلى أرقام فرعية
  • بناء المسار على النحو التالي

    17 >> 71 >> /71.jpg
    163 >> 0361 >> /03/61.jpg
    6978 >> 8796 >> /87/96.jpg    
    1687941 >> 01497861 >> /01/49/78/61.jpg
    

تضمن هذه الطريقة أن كل مجلد يحتوي على ما يصل إلى 100 صورة و 100 من طراز الفرعية ويتم توزيع الحمل بالتساوي بين المجلدات اليسرى.

علاوة على ذلك ، تحتاج فقط إلى معرف الصورة للوصول إلى الملف ، لا حاجة لقراءة جدول الصور الذي يحتوي على بيانات تعريف أخرى. لا يتم تخزين بيانات المستخدم عن قرب معًا بالفعل ، ويمكن التنبؤ بعلاقة مسار الهوية ، وهذا يعتمد على احتياجاتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top