it-swarm.asia

ما هي المشاكل التي سأحصل عليها عند إنشاء قاعدة بيانات لكل عميل؟

أتذكر من podcast stackoverflow أن Fog Creek استخدام قاعدة بيانات لكل عميل لـ Fogbugz . أفترض أن هذا يعني أن خوادم Fogbugz On Demand لديها 10 آلاف من قواعد البيانات.

لقد بدأنا للتو في تطوير تطبيق ويب ولدينا مشكلة مماثلة لحلها (الكثير من العملاء ببياناتهم المعزولة).

ما هي المشاكل التي يجب أن أتوقعها باستخدام قاعدة بيانات لكل عميل؟ كيف يمكنني حلها؟

أفكاري الأولية

مزايا قاعدة البيانات لكل عميل

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

مساوئ

  • هل يمكن لـ MySQL التعامل مع 5000 قاعدة بيانات؟ هل تمتص الأداء؟
  • قد يكون من الصعب تكرار التغييرات على المخطط عبر جميع قواعد البيانات. سيكون علينا حقًا أن يكون لدينا خطة تلقائية لهذا ، مثل إصدار المخطط والبرنامج النصي الذي يفهم كيفية نقل قاعدة البيانات من إصدار إلى آخر.
  • قد يكون القيام بأي شيء مشترك بين جميع عملائنا أمرًا صعبًا أو مستحيلًا
  • مشابه لما سبق ، لكن أي تحليلات نرغب في إجرائها عبر جميع عملائنا قد تكون مستحيلة. كيف يجب أن نتتبع الاستخدام عبر جميع العملاء على سبيل المثال؟
49
Rik Heywood

يُسمى هذا الحل بتصميم متعدد المستأجرين حيث يمتلك كل مستأجر (عميل) قاعدة بياناته الخاصة. وبالنظر إلى ذلك ، هناك بعض الاعتبارات الأخرى للنهج البديل وهي قاعدة بيانات واحدة:

  1. مع وجود قاعدة بيانات واحدة ، يجب أن يكون الجميع على نفس الإصدار مهما كان. لا يمكن ترقية بعض العملاء وليس آخرين. يمكن أن يكون هذا مشكلة إذا كان العميل يريد إصلاحًا عاجلاً لتطبيق غير جاهز للإصدار الواسع.
  2. مع قاعدة بيانات واحدة ، عند إجراء ترقية ، يكون كل عميل معطلاً. إذا حدث خطأ ما ، فإن كل عميل يخطئ.
  3. مع قاعدة بيانات واحدة ، يكون من الصعب اختناق الموارد. على سبيل المثال ، إذا كان أحد العملاء يدق قاعدة البيانات ، فمن الصعب منحه المزيد من الموارد بشكل منفصل عن أي شخص آخر.
  4. من الأصعب السماح للمستخدمين باستضافة إصداراتهم الخاصة من تطبيقك. إذا كنت تبني حلاً سيتم استخدامه من قبل الشركات الكبيرة ، فغالباً ما يكون هذا غير بداية. يريد قسم تكنولوجيا المعلومات لديهم التحكم الكامل في الوصول إلى النظام.
  5. ربما يكون من الأرخص توسيع قواعد البيانات بدلاً من توسيعها. أي أن الحاجة إلى الاستثمار في أجهزة أسرع لاستضافة قاعدة بيانات واحدة لحكمها جميعًا ربما يكون أكثر تكلفة من القدرة على توسيع نطاق العملاء إلى خوادم قواعد بيانات أصغر وأقل تكلفة. لا أستطيع أن أقول هذا بشكل نهائي لأنه يعتمد بشكل كبير على برنامج الخادم. إذا التزمت بـ MySQL ، فربما يكون هذا صحيحًا لأن تكاليف الترخيص لا تكاد تذكر. ومع ذلك ، إذا انتقلت إلى SQL Server على سبيل المثال ، يصبح التدرج أكثر تكلفة بكثير إلا إذا كنت تستخدم بيئة VPS ومردودية التكلفة مقابل توسيع التغييرات. ومع ذلك ، يمكنني القول أنه بمجرد أن تصبح قاعدة بياناتك كبيرة جدًا ، تتطلب الإدارة مستويات خبرة أكبر من أي وقت مضى. تتطلب قواعد البيانات الكبيرة جدًا التلاعب بمجموعات ملفات متعددة ودفع فهارس معينة إلى محاور مختلفة للحصول على أداء أفضل. باختصار ، يمكن أن يتعقدوا بسرعة كبيرة.

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

42
Thomas

في تجربتي لا يجب إنشاء قاعدة بيانات واحدة لكل عميل. اسمحوا لي أن أقدم لكم مثالا:

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

استخدمنا Firebird وتم تعييني بعد أن تم شحن المنتج ، ولكن هذا أعطاني المعرفة بعدم العمل مطلقًا مع قواعد البيانات المنفصلة.

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

14
eiefai

قد ترغب في الاحتفاظ بقاعدة بيانات أخرى لتتبع الإصدار الذي يوجد فيه كل عميل ، حتى تتمكن من تتبع أي منها خضع أو لم يخضع للجولة الأخيرة من التعديلات.

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

بما أن "قواعد بيانات" mysql هي مجرد مخططات ، كما أشار Gaius ، إذا كانت كلها تعمل من نفس نسخة الخادم ، يمكنك فقط تأهيل اسم الجداول التي تحاول تعديلها ، أو الحصول على المعلومات من:

alter schema.table ...
select ... from schema.table

...

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

...

لاحظ أيضًا أنهم لا يستخدمون mySQL لتبادل المكدس ، إنهم يستخدمون SQL Server.

وليس لدي أي فكرة عن نوع الأداء العام الذي سيكون موجودًا في mysql على هذا النطاق ، لا أعتقد أنني قد تجاوزت 30 قاعدة بيانات في mysql.

9
Joe

لدي عميل Web/DB Hosting الذي يحتوي على أكثر من 750 قاعدة بيانات للعملاء بنفس عدد الجداول (162) وهياكل الجدول نفسها. مجتمعة ، يبلغ إجمالي بيانات عملاء عملائي 524 غيغابايت (95٪ InnoDB)

تخيل جميع قواعد البيانات هذه تتنافس على 13G من تجمع العازلة innodb على تسعة خوادم DB عبر النسخ المتماثل الدائري. لم يكن التوسع مع تكوين الأجهزة هذا كافياً. على الفور ، أوصينا العميل بالتوسع.

لقد قمنا مؤخرًا بترحيل هذا العميل إلى 3 خوادم DB بقوة حصانية أكبر بكثير (بأي ثمن ، ابق بعيدًا عن SSD في البيئات عالية الكتابة ، دائمًا !!!). قمنا بترقيتها من MySQL 5.0.90 إلى MySQL 5.5.9. شوهدت الاختلافات الدرامية على الفور تقريبا.

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

في حالة عميلي ، تقوم شركتي بتخفيضه من 9 خوادم DB (Quad Code ، 32GB RAM ، 824G RAID10) إلى خوادم DB أسرع (Dual HexaCore [هذا صحيح 12 وحدة معالجة مركزية] ، 192GB RAM ، 1.7TB RAID10) من MySQL 5.5 .9 (للجدول الاستفادة من وحدات المعالجة المركزية المتعددة). بالإضافة إلى ذلك ، تخيل 150 جيجا بايت من ذاكرة التخزين المؤقت الداخلية في 50 قسمًا من 3 جيجا بايت لكل منها (تجمعات ذاكرة التخزين المؤقت المتعددة InnoDB هي ميزة جديدة في MySQL 5.5). لقد عمل مقياس أصغر ، ولكنه ضخم للغاية ، على البنية التحتية الفريدة لموكلي.

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

7
RolandoMySQLDBA

يقوم MySQL بإنشاء قواعد بيانات في أدلة منفصلة لذلك يعتمد الكثير على نظام التشغيل الأساسي وعدد مقابض الملفات/الملفات التي يمكنه التعامل معها. لا ينبغي أن يكون مشكلة مع أنظمة التشغيل الحديثة ولكن من هنا سيأتي الكثير من الاختناق.

2
David Hall

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

الجانب السلبي الوحيد الذي يمكنني رؤيته هو أنه سيتعين عليك تحديث كل قاعدة بيانات يدويًا عند إنشاء إصدار جديد. هذا يمكن أتمتة بسهولة بالرغم من ذلك.

1
Sean Siegel