it-swarm.asia

تكوين PostgreSQL لأداء الكتابة

يستضيف أحد خوادم PostgreSQL العديد من قواعد البيانات (1-3) التي تتلقى دفقًا ثابتًا من البيانات. البيانات ليست منظمة بشكل خاص ، فهي تصل إلى الوقت الحالي ومجموعة متنوعة من البيانات المرصودة لتلك اللحظة بالذات. معدل البيانات مرتفع إلى حد ما ؛ يعمل حوالي غيغابايت في اليوم لقاعدة بيانات واحدة ، حوالي عشره لقاعدة بيانات أخرى. لا أتوقع أن يزيد هذا المعدل. أداء القراءة هو أولوية أقل بكثير وهو مقبول حاليًا.

لدي هذه الرسالة في السجلات:

LOG:  checkpoints are occurring too frequently (15 seconds apart)
HINT:  Consider increasing the configuration parameter "checkpoint_segments".

تم تعيين هذه القيمة حاليًا على 16 ، وهي مجاملة لـ pgtune.

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

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

30
Daniel Lyons

1 غيغابايت في اليوم ليست عالية من تحميل الكتابة. تنتشر على مدار اليوم ، والتي تصل إلى حوالي 50 كيلوبايت في الثانية. يمكن أن يعالج محرك أقراص USB بطيء ذلك. أفترض أنه أكثر رشقة بالرغم من ذلك. كما يقترح a_horse_with_no_name ، قم بزيادة شرائح نقاط التحقق. 100 أو نحو ذلك ليس خارج المألوف.

ثم زيادة checkpoint_timeout إلى ساعة واحدة ، بالإضافة إلى النظر في زيادة checkpoint_completion_target إلى شيء أقرب إلى 1.0 (100٪). يخبر هدف الإكمال PostgreSQL بمدى قوة الكتابة في الخلفية بحيث يكتمل بنسبة٪ x قبل تشغيل نقطة تفتيش ، مما يفرض كتابة جميع البيانات دفعة واحدة من WAL وسيبطئ النظام إلى الزحف أثناء حدوثه.

السبب الذي يجعلك لا تقوم بتعيينه عادةً على 100٪ هو أنه من الشائع جدًا الكتابة إلى نفس الكتلة أكثر من مرة ، ومن خلال تأخير كتابة WAL إلى المتجر الرئيسي ، فإنك تمنع كتابة نفس الكتلة مرتين بدون سبب.

إذا كان من غير المحتمل أن تكتب إلى نفس الكتلة أكثر من مرة قبل انتهاء المهلة ، أي أن كل ما تفعله هو إدراج ثم ضبطه مرتفعًا إلى حد كبير لرفعه إلى 0.9 أو نحو ذلك. أسوأ ما سيحدث هو أنك ستكتب أكثر قليلاً مما قد تحتاج إليه ، لكن تأثير نقاط التفتيش سينخفض ​​بشكل كبير.

24
Scott Marlowe

في نظام "الكتابة بكثافة" ، من المحتمل أن تكون محدودًا بالمعدل الذي يمكن كتابة WAL أثناء نشاط الذروة.

إذا كان بإمكانك حقًا "قبول فقدان بعض البيانات الحديثة في حالة فشل" ، فيمكنك إيقاف تشغيل التزامن المتزامن أي:

يمكن أن يكون بديلاً مفيدًا عندما يكون الأداء أكثر أهمية من اليقين الدقيق حول متانة المعاملة

إذا كنت قادرًا على تغيير أجهزتك ، فيمكنك التفكير في أيٍّ منها لتحسين الكتابة:

  • RAID10 عبر RAID5
  • الكثير من المغازل (قد يعني 2.5 "بدلاً من 3.5" على سبيل المثال)
  • SAS فوق SATA
  • 15K أكثر من 10K محركات
  • SSD

--تعديل

استنادًا إلى تعليقك على @ إجابة سكوت الممتازة : "حجم الكتابة في الواقع شبه موحد تمامًا" ، ومعدل البيانات الضمني "50 كيلوبايت في الثانية" ، أشك في أنك بحاجة إلى القيام بأي شيء يخاطر بالبيانات خسارة. ربما سيساعدك معرفة ما يتم تعيين بعض معلمات التكوين الأخرى.

10
Jack says try topanswers.xyz

يمكنك أيضًا التحقق من تكرار/حجم عملياتك: واجهت مشكلة مؤخرًا كنت أحاول فيها تحديث أكثر من مليون سجل في معاملة واحدة. لقد تلقيت رسائل سجل مشابهة لتلك التي وصفها OP ، ولكن تعذر إكمال المعاملة حتى بعد عدة ساعات. عندما قمت بتقسيم الكتابة إلى عدة معاملات أصغر (10000 سجل أو نحو ذلك) ، انخفض إجمالي الوقت المطلوب إلى حوالي 15 دقيقة.

ما حدث = أعتقد حدث هو أن Postgres أمضى الكثير من الوقت في كتابة السجلات التي checkpoint_timeout انقضى قبل أن يتمكن من تحقيق تقدم كبير في حفظ السجلات. لست متأكدا مما إذا كان هذا التفسير صامدا. ما زلت أتلقى التحذيرات ، ولكن تتم معالجة جميع عمليات الكتابة في النهاية. ومع ذلك ، فقد احتجت (ووجدت) حلاً برمجيًا بدلاً من واحد يتطلب إعادة تكوين قاعدة البيانات.

انظر أيضًا http://www.postgresql.org/docs/9.3/static/wal-configuration.html

5
Sarah Messer