CompactionВ¶
أنواع الضغط¶¶
يتم استخدام مفهوم الضغط لأنواع مختلفة من العمليات في كاساندرا، والشيء المشترك حول هذه العمليات هو أنه يأخذ واحد أو أكثر ستابلز وإخراج ستابلز جديدة. أنواع التفاعلات هي؛
تم تشغيل ضغط طفيفة تلقائيا في كاساندرا. ضغط كبير مستخدم ينفذ ضغط على جميع ستابلز على العقدة. تعريف المستخدم الضغط يقوم المستخدم بتشغيل الضغط على مجموعة معينة من ستابلز. فرك محاولة لإصلاح أي اسطوانات مكسورة. هذا يمكن فعلا إزالة البيانات صالحة إذا كانت البيانات تالفة، إذا حدث ذلك سوف تحتاج إلى تشغيل إصلاح كامل على العقدة. ترقية أوبغرادستابلز ستابلز إلى أحدث إصدار. تشغيل هذا بعد الترقية إلى إصدار رئيسي جديد. تنظيف إزالة أي نطاقات هذه العقدة لا تملك بعد الآن، وعادة ما أثار على العقد المجاورة بعد عقدة تم بوتسترابد منذ تلك العقدة سوف تأخذ ملكية بعض النطاقات من تلك العقد. مؤشر ثانوي إعادة بناء إعادة الفهارس الثانوية على العقدة. أنتيكومباكتيون بعد إصلاح النطاقات التي تم إصلاحها فعلا يتم تقسيم من ستابلز التي كانت موجودة عند بدء الإصلاح. ضغط النطاق الفرعي من الممكن فقط ضغط نطاق فرعي معين - قد يكون هذا مفيدا إذا كنت تعرف رمز مميز قد تم التصرف به بشكل خاطئ - إما تجميع العديد من التحديثات أو العديد من عمليات الحذف. (نوديتول كومباكت - st x - et y) ستختار كل ستستابلز التي تحتوي على المدى بين x و y وتصدر ضغطا لتلك الناقلات. ل ستكس هذا على الأرجح تشمل جميع ستابلز ولكن مع لس يمكن أن يصدر الضغط لمجموعة فرعية من ستابلز. مع لس سيستابل الناتجة ستنتهي في L0.
متى يتم تشغيل ضغط طفيف؟ В¶
# عندما يتم إضافة ستابل إلى العقدة من خلال بيغ / تدفق الخ # عندما يتم تمكين أوتوكومباكتيون بعد تعطيل (نوديتول إنفيلوتوتوكومباكتيون) # عندما يضيف الضغط ستابلز جديدة. # التحقق من وجود طفيفة جديدة كل 5 دقائق.
دمج ستابلز¶¶
الضغط هو حول دمج ستابلز، حيث يتم فرز الأقسام في ستابلز استنادا إلى التجزئة من مفتاح القسم من الممكن دمج ستابلز منفصلة بشكل فعال. يتم فرز محتوى كل قسم أيضا بحيث يمكن دمج كل قسم بكفاءة.
مجموعة القبور وجمع القمامة (غ) غريسك¶
لماذا تومبستونيسВ T
عند تلقي طلب حذف من قبل كاساندرا فإنه لا إزالة البيانات من المتجر الأساسي فعلا. بدلا من ذلك يكتب قطعة خاصة من البيانات المعروفة باسم قبر. ويمثل المقبرة الحذف ويسبب كل القيم التي حدثت قبل أن يظهر القبر في الاستعلامات إلى قاعدة البيانات. ويستخدم هذا النهج بدلا من إزالة القيم بسبب طبيعة توزيع كاساندرا.
الحذف بدون علامات القبور ¶
تخيل مجموعة عقدة ثلاثة لها قيمة [A] متماثلة إلى كل عقدة:
إذا فشل أحد العقد و عملية الحذف لدينا فقط إزالة القيم الموجودة يمكننا في نهاية المطاف مع الكتلة التي تبدو مثل:
ثم عملية إصلاح ستحل محل قيمة [A] مرة أخرى على العقدتين التي تفتقد القيمة:
وهذا من شأنه أن يؤدي إلى إحياء بياناتنا حتى لو تم حذفها.
الحذف مع تومبستونيسВ T
تبدأ مرة أخرى مع ثلاثة عقدة العنقودية التي لها قيمة [A] نسخ متماثل إلى كل عقدة:
إذا بدلا من إزالة البيانات نضيف سجل علامة، فإن لدينا حالة واحدة عقدة الفشل تبدو مثل هذا:
الآن عندما نصدر إصلاح سيتم نسخ القبر إلى النسخة المتماثلة، بدلا من البيانات المحذوفة يجري إحياء:
سوف عملية إصلاح لدينا وضع بشكل صحيح حالة النظام إلى ما نتوقع مع سجل [A] ملحوظ كما حذف على جميع العقد. وهذا يعني أننا سوف ينتهي بنا تراكم القبور التي سوف تتراكم بشكل دائم مساحة القرص. لتجنب إبقاء شواهد القبور إلى الأبد لدينا معلمة تعرف باسم gc_grace_seconds لكل جدول في كاساندرا.
المعلمة gc_grace_seconds و تومبستون ريموفال¶¶
تتحكم المعلمة gc_grace_seconds على مستوى الجدول كم من الوقت ستحافظ كاساندرا على شواهد القبور من خلال أحداث الضغط قبل إزالتها نهائيا. يجب أن تعكس هذه المدة بشكل مباشر مقدار الوقت الذي يتوقع المستخدم السماح به قبل استرداد عقدة فاشلة. بعد انتهاء فترة gc_grace_seconds يمكن إزالة الشاهد (بمعنى أنه لن يكون هناك أي سجل يتم حذف جزء معين من البيانات)، ولكن كقبر يمكن أن يعيش في ستابل واحد والبيانات التي يغطيها في آخر، يجب أن تشمل أيضا الضغط على حد سواء ستابل لشاهد لإزالتها. على وجه التحديد، لتكون قادرة على إسقاط قبر الفعلي ما يلي يجب أن يكون صحيحا؛
يجب أن يكون القبر أقدم من gc_grace_seconds إذا كان القسم X يحتوي على القبر، يجب تضمين ستابل التي تحتوي على القسم بالإضافة إلى جميع ستابلز تحتوي على بيانات أقدم من القبر تحتوي على X في نفس الضغط. نحن لا نحتاج لرعاية إذا كان القسم في ستابل إذا كنا نستطيع أن نضمن أن جميع البيانات في هذا ستابل هو أحدث من القبر. إذا كان القبر أقدم من البيانات فإنه لا يمكن الظل أن البيانات. إذا تم تمكين الخيار only_purge_repaired_tombstones، تتم إزالة شواهد القبور فقط إذا تم إصلاح البيانات أيضا.
إذا ظلت العقدة أسفل أو قطع الاتصال لفترة أطول من gc_grace_seconds سيتم إصلاح البيانات المحذوفة مرة أخرى إلى العقد الأخرى وإعادة الظهور في الكتلة. هذا هو في الأساس نفسه كما في & # 8220؛ يحذف دون شواهد القبر & # 8221؛ الجزء. لاحظ أنه لن يتم إزالة شواهد القبور حتى حدث ضغط حتى إذا انقضى gc_grace_seconds.
القيمة الافتراضية ل gc_grace_seconds هي 864000 أي ما يعادل 10 أيام. يمكن تعيين هذا عند إنشاء جدول أو تغييره باستخدام gc_grace_seconds.
البيانات في كاساندرا يمكن أن يكون خاصية إضافية تسمى الوقت للعيش - وهذا يستخدم لإسقاط البيانات التي انتهت صلاحيتها تلقائيا بمجرد الوصول إلى الوقت. وبمجرد انتهاء مدة البقاء (تل)، يتم تحويل البيانات إلى علامة ضبابية والتي تبقى حول gc_grace_seconds على الأقل. لاحظ أنه إذا قمت بجمع البيانات مع تل والبيانات دون تل (أو طول مختلف فقط من تل) كاساندرا سيكون وقتا عصيبا إسقاط شواهد القبور التي أنشئت منذ القسم قد تمتد العديد من ستابلز وليس كلها يتم ضغط في وقت واحد.
ستابلز بالكامل
إذا كان ستابل يحتوي فقط على شواهد القبور ويضمن أن ستابل ليس الظل البيانات في أي ضغط ستابل أخرى يمكن إسقاط أن ستابل. إذا كنت ترى ستابلز مع فقط شواهد القبور (لاحظ أن تل: إد البيانات تعتبر شواهد القبور مرة واحدة في الوقت للعيش قد انتهت) ولكن لا يتم إسقاطها عن طريق الضغط، فمن المرجح أن ستستابلز أخرى تحتوي على البيانات القديمة. هناك أداة تسمى ستابيكسيردبلوكيرز التي سوف قائمة التي ستابلز هي سروبلابل والتي تمنعهم من إسقاط. هذا مفيد بشكل خاص للضغط سلسلة الوقت مع تيمويندوكومباكتيونستراتيغي (و ديتتيريدكومباكتيونستراتيغي إيقاف).
البيانات التي تم إصلاحها / غير المعالجة
مع الإصلاحات الإضافية كاساندرا يجب أن تتبع ما هي البيانات التي تم إصلاحها وما هي البيانات التي لم يتم إصلاحها. مع أنتيكومباكتيون إصلاح البيانات يتم تقسيمها إلى إصلاحها و ستريبليس أونريبايرد. لتجنب خلط البيانات مرة أخرى يتم تشغيل مثيلات استراتيجية الضغط منفصلة على مجموعتين من البيانات، كل حالة فقط معرفة سوى إصلاحات أو ستريبليس غير إصلاحها. وهذا يعني أنه إذا قمت بتشغيل إصلاح متزايد مرة واحدة ثم مرة أخرى أبدا، قد يكون لديك بيانات قديمة جدا في ستابلز إصلاحها التي تمنع الضغط من إسقاط شواهد القبور في ستريبليس (غير جديد) ربما.
دلائل البيانات ¶
وبما أن شواهد القبور والبيانات يمكن أن تعيش في خراطيم مختلفة، فمن المهم أن ندرك أن فقد خسر قد يؤدي إلى أن تصبح البيانات حية مرة أخرى - الطريقة الأكثر شيوعا لفقدان الأختام هي أن يكون القرص الصلب ينهار. لتجنب جعل البيانات يعيش شواهد القبور والبيانات الفعلية هي دائما في نفس الدليل البيانات. بهذه الطريقة، إذا تم فقدان قرص، يتم فقدان كافة إصدارات قسم ولا يمكن إلغاء حذف البيانات. ولتحقيق ذلك يتم تشغيل مثيل إستراتيجية الضغط لكل دليل بيانات بالإضافة إلى مثيلات إستراتيجية الضغط التي تحتوي على بيانات تم إصلاحها / غير معالجتها، وهذا يعني أنه إذا كان لديك 4 دلائل بيانات سيكون هناك 8 حالات إستراتيجية للضغط. هذا له فوائد قليلة أكثر من مجرد تجنب حذف البيانات:
فمن الممكن لتشغيل المزيد من المعاملات في موازاة - سوف ضغط مستوية لديها عدة مستويات منفصلة تماما، ويمكن لكل واحد تشغيل المعاملات بشكل مستقل عن الآخرين. يمكن للمستخدمين النسخ الاحتياطي واستعادة دليل بيانات واحد. ملاحظة على الرغم من أن حاليا جميع أدلة البيانات تعتبر متساوية، لذلك إذا كان لديك قرص صغير وقرص كبير دعم دليلين البيانات، واحدة كبيرة سوف تكون محدودة من قبل واحد صغير. عمل واحد حول هذا هو خلق المزيد من الدلائل البيانات بدعم من القرص الكبير.
ضربة قبرية واحدة مستقرة
عندما يتم كتابة ستابل رسم بياني مع أوقات انتهاء القبر يتم إنشاء وهذا يستخدم في محاولة للعثور على ستابلز مع العديد من شواهد القبور وتشغيل واحد ستابل الضغط على أن ستابل في أمل أن تكون قادرة على إسقاط شواهد القبور في أن ستابل. قبل البدء في ذلك يتم التحقق أيضا مدى احتمال أن أي القبور سوف تكون في الواقع قادرة على إسقاط كم هذا ستابل تتداخل مع ستابلز أخرى. لتجنب معظم عمليات التحقق هذه يمكن تمكين خيار الضغط unecked_tombstone_compaction.
الخيارات الشائعة ¶
هناك عدد من الخيارات المشتركة لجميع استراتيجيات الضغط.
تمكين (افتراضي: ترو) ما إذا كان يجب تشغيل عمليات تشغيل ثانوية. لاحظ أنه يمكن تمكين & # 8216؛ & # 8217 ؛: ترو كخيار ضغط ثم قم بإجراء & # 8216؛ نوديتول إنفيلوتوتوكومباكتيون & # 8217؛ لبدء تشغيل المعاملات. tombstone_threshold (الافتراضي: 0.2) كم من ستابل ينبغي أن تكون شواهد القبور بالنسبة لنا للنظر في القيام ضغط ستابل واحد من أن ستابل. tombstone_compaction_interval (الافتراضي: 86400s (يوم واحد)) نظرا لأنه قد لا يكون من الممكن إسقاط أي شواهد القبور عند إجراء ضغط ستابل واحد نحن بحاجة للتأكد من أن واحد ستابل لا يحصل باستمرار ريكومباكتد - هذا الخيار يحدد كم مرة يجب أن نحاول ل نظرا ستابل. log_all (الافتراضي: فالس) تسجيل مفصل مفصل جديد، انظر أدناه. unchecked_tombstone_compaction (ديفولت: فالس) يحتوي ضغط ستبل المفرد على فحوصات صارمة تماما لتحديد ما إذا كان يجب بدء تشغيله، فسيؤدي هذا الخيار إلى تعطيل هذه الشيكات وبعض عمليات الاستخدام التي قد تكون مطلوبة. لاحظ أن هذا لا يغير أي شيء للضغط الفعلي، يتم إسقاط شواهد القبور فقط إذا كان آمنا للقيام بذلك - قد مجرد إعادة كتابة ستابل دون أن تكون قادرة على إسقاط أي شواهد القبور. only_purge_repaired_tombstone (افتراضي: فالس) الخيار لتمكين السلامة الإضافية للتأكد من أن يتم إسقاط شواهد القبور فقط إذا تم إصلاح البيانات. min_threshold (الافتراضي: 4) الحد الأدنى لعدد ستابلز قبل بدء الضغط. لم يتم استخدامه ل ليفليدكومباكتيونستراتيغي. max_threshold (الافتراضي: 32) يتم تشغيل الحد الأعلى لعدد ستابلز قبل الضغط. لم يتم استخدامه ل ليفليدكومباكتيونستراتيغي.
وعلاوة على ذلك، انظر القسم الخاص بكل استراتيجية لخيارات إضافية محددة.
ضغط نوديتول الأوامرВ¶
توفر الأداة المساعدة نوديتول عددا من الأوامر المتعلقة بالضغط:
إنفانتيلوتوكومباكتيون تمكين الضغط. ديزابلوتوكومباكتيون تعطيل الضغط. سيتكومباكتيونثروبوت كيفية تشغيل ضغط سريع على الأكثر - الافتراضي إلى 16MB / ثانية، ولكن لاحظ أنه من غير المحتمل أن تصل إلى هذه الإنتاجية. كومباكتيونستاتس الاحصائيات حول المعاملات الحالية والمعلقة. كومباكتيونيستوري قائمة التفاصيل حول آخر المعاملات. سيتكومباكتيونثراشولد تعيين الحد الأدنى / الحد الأقصى ستابل ل عندما لتحريك الضغط، الافتراضي إلى 4/32.
تبديل استراتيجية وخيارات الضغط باستخدام JMXВ J
فمن الممكن للتبديل استراتيجيات الضغط وخياراته على مجرد عقدة واحدة باستخدام جمكس، وهذا هو وسيلة رائعة لتجربة الإعدادات دون التأثير على الكتلة بأكملها. و مبان هو:
وخاصية التغيير هي كومباكتيونباراميترز أو كومباكتيونباراميترزجسون إذا كنت تستخدم جكونسول أو جمك. بناء الجملة لنسخة جسون هو نفسه كما يمكنك استخدامها في عبارة ألتر تابل - على سبيل المثال:
يتم الاحتفاظ الإعداد حتى يقوم شخص بتنفيذ جدول ألتر الذي يمس إعدادات الضغط أو إعادة تشغيل العقدة.
تسجيل ضغط أكثر تفصيلا¶¶
تمكين مع خيار الضغط log_all وسيتم إنتاج ملف سجل ضغط أكثر تفصيلا في دليل السجل الخاص بك.
إستراتيجية الضغط المتدرج الحجم ¶
الفكرة الأساسية سيزتيريدكومباكتيونستراتيغي (ستسس) هو دمج ستستابلز تقريبا نفس الحجم. يتم وضع جميع ستابلز في دلاء مختلفة اعتمادا على حجمها. يتم إضافة ستابل إلى الدلو إذا كان حجم ستابل ضمن betet_low و betet_high للمتوسط الحالي لحجم ستابلز الموجود بالفعل في الجرافة. سيؤدي ذلك إلى إنشاء عدة دلاء وسيتم ضغط أكثر هذه الدلاء إثارة للاهتمام. يتم تحديد الأكثر إثارة للاهتمام من خلال معرفة أي دلو & # 8217؛ s ستابلز يأخذ معظم يقرأ.
ضغط كبير¶¶
عند تشغيل ضغط كبير مع ستكس سوف ينتهي بك الأمر مع اثنين من ستابلز لكل دليل البيانات (واحد للبيانات إصلاح واحد لبيانات غير معالجتها). هناك أيضا خيار (-s) للقيام بالضغط الرئيسي الذي يقسم الإخراج إلى عدة ستابلز. أحجام ستابلز حوالي 50٪، 25٪، 12.5٪. من الحجم الكلي.
ستس أوبتيونسВ¶
DefragmentationВ¶
يتم إلغاء التجزئة عند لمس العديد من ستستابلز أثناء القراءة. يتم وضع نتيجة للقراءة في المذكرة بحيث القراءة القادمة لن يكون للمس العديد من ستابلز. يمكن أن يسبب هذا الكتابة على مجموعة للقراءة فقط.
إستراتيجية الضغط المرتفع ¶
فكرة ليفليدكومباكتيونستراتيغي (لس) هو أن جميع ستابلز وضعت في مستويات مختلفة حيث نضمن عدم وجود ستابلز متداخلة هي في نفس المستوى. من خلال تداخل نحن نعني أن أول / آخر رمز من ستابل واحد أبدا تتداخل مع ستابلز أخرى. وهذا يعني أن سيليكت سيكون لدينا فقط للبحث عن مفتاح التقسيم في ستابل واحد لكل مستوى. كل مستوى هو 10X حجم سابقتها و كل ستابل هو 160MB افتراضيا. L0 حيث يتم تدفق ستابلز / مسح - لا يتم إعطاء ضمانات التداخل هنا.
عند اختيار المرشحين الضغط علينا أن نتأكد من أن الضغط لا تخلق تداخل في المستوى المستهدف. ويتم ذلك من قبل دائما بما في ذلك جميع ستابلز المتداخلة في المستوى التالي. على سبيل المثال إذا اخترنا ستابل في L3، ونحن بحاجة إلى ضمان أن نختار كل ستابلز متداخلة في L4 وتأكد من أن أي من المعاملات الجارية حاليا سوف تخلق تداخل إذا بدأنا هذا الضغط. يمكننا أن نبدأ العديد من المعاملات المتوازية في مستوى إذا كنا نضمن أننا لن تخلق التداخل. بالنسبة إلى L0 - & غ؛ L1 نحن بحاجة دائما تقريبا لتشمل جميع ستابلز L1 منذ معظم ستستابلس L0 تغطية النطاق الكامل. يمكننا أيضا & # 8217؛ ر مدمجة جميع ستستابل L0 مع جميع ستابلز L1 في ضغط واحد منذ أن يمكن استخدام الكثير من الذاكرة.
عند تحديد أي مستوى ل لس المدمجة يتحقق المستويات العليا أولا (مع لس، و & # 8220؛ أعلى & # 8221؛ مستوى واحد مع عدد أكبر، L0 كونها أدنى واحد) وإذا كان المستوى وراء الضغط سيتم بدء في هذا المستوى.
ضغط كبير¶¶
ومن الممكن أن تفعل ضغط كبير مع لس - فإنه سيتم البدء حاليا من خلال ملء L1 ثم مرة واحدة L1 هو الكامل، فإنه لا يزال مع L2 الخ وهذا هو الأمثل الفرعي وسوف تتغير لإنشاء جميع ستابلز في مستوى عال بدلا من ذلك، كاساندرا-11817.
BootstrappingВ¶
أثناء تدفق ستستابلز بوتستراب من العقد الأخرى. يتم الاحتفاظ مستوى ستابل البعيد لتجنب العديد من المعاملات بعد يتم بوتستراب. أثناء بوتستراب العقدة الجديدة أيضا يأخذ الكتابة أثناء تدفق البيانات من عقدة بعيدة - يتم مسح هذه الكتابة إلى L0 مثل جميع الكتب الأخرى وتجنب تلك ستابلز حظر ستابلز البعيد من الذهاب إلى المستوى الصحيح، ونحن لا تفعل سوى ستكس في L0 حتى يتم بوتستراب.
ستسس في L0В¶
إذا سس يحصل على الكثير جدا ستستابلس L0 قراءة ستذهب إلى ضرب جميع (أو أكثر) من ستابلز L0 لأنها من المرجح أن تكون متداخلة. لمعالجة بسرعة أكبر هذا لس تفعل ستكس في L0 إذا كان هناك أكثر من 32 ستابلز هناك. هذا ينبغي تحسين أداء القراءة بسرعة أكبر مقارنة السماح لس تفعل L0 - & غ؛ L1. إذا كنت لا تزال الحصول على الكثير من ستابلز في L0 فمن المرجح أن لس ليس هو الأنسب لعبء العمل الخاص بك و ستسس يمكن أن تعمل بشكل أفضل.
ستابلز ستابلز Star
إذا انتهت عقدة تصل إلى التسوية حيث هناك عدد قليل جدا عالية المستوى ستابلز التي لا تحصل على ضغط أنها قد تجعل من المستحيل على مستويات أقل لإسقاط شواهد القبور الخ على سبيل المثال، إذا كان هناك ستابلز في L6 ولكن هناك بيانات كافية فقط في الواقع الحصول على L4 على عقدة اليسار ستستابلز في L6 سوف تحصل جوعا وليس ضغط. يمكن أن يحدث هذا إذا تغير المستخدم sstable_size_in_mb من 5 ميغابايت إلى 160 ميغابايت على سبيل المثال. لتجنب هذا لس يسعى لتشمل تلك ستيبلز عالية المستوى جوعا في غيرها من المعاملات إذا كان هناك 25 جولات الضغط حيث لم يشارك أعلى مستوى.
خيارات لس ¶
كما تدعم لس خيار بدء التشغيل cassandra. disable_stcs_in_l0 (-Dcassandra. disable_stcs_in_l0 = ترو) لتجنب إجراء ستكس في L0.
نافذة الوقت CompactionStrategyВ Time
تم تصميم تيمويندوكومباكتيونستراتيغي (توكس) خصيصا لأعباء العمل حيث أنه من المفيد أن يكون البيانات على القرص مجمعة حسب الطابع الزمني للبيانات، وهو هدف مشترك عندما يكون عبء العمل هو سلسلة زمنية في الطبيعة أو عند كتابة كافة البيانات مع تل . في حجم العمل تنتهي / تل، ومحتويات ستابل كامل المرجح أن تنتهي في نفس الوقت تقريبا، والسماح لهم بإسقاط تماما، واستعادة مساحة أكثر موثوقية من عند استخدام سيزيردكومباكتيونستراتيغي أو ليفليدكومباكتيونستراتيغي. المفهوم الأساسي هو أن تيمويندوكومباكتيونستراتيغي سيخلق 1 ستابل لكل ملف لنافذة معينة، حيث يتم حساب نافذة ببساطة على أنها مزيج من خيارين رئيسيين:
compaction_window_unit (افتراضي: دايس) جافا تيميونيت (مينوتس، هورس، أو دايس). compaction_window_size (افتراضي: 1) عدد الوحدات التي تشكل نافذة.
مجتمعة، يمكن للمشغل تحديد النوافذ من أي حجم تقريبا، وسوف تيمويندوكومباكتيونستراتيغي العمل على إنشاء ستابل واحد للكتابة داخل تلك النافذة. لكفاءة أثناء الكتابة، سيتم ضغط أحدث نافذة باستخدام سيزتيريدكومباكتيونستراتيغي.
من الناحية المثالية، يجب على المشغلين اختيار a compage_window_unit و compaction_window_size الزوج الذي ينتج حوالي 20-30 ويندوز - إذا كان الكتابة مع 90 يوم تل، على سبيل المثال، نافذة 3 أيام سيكون خيارا معقولا ('compaction_window_unit': 'دايس'، 'compaction_window_size' : 3).
تيمويندوكومباكتيونستراتيغي المخاوف التشغيليةВ¶
الدافع الأساسي ل توكس هو فصل البيانات على القرص بواسطة الطابع الزمني والسماح ستابلز انتهت بشكل كامل لإسقاط أكثر كفاءة. إحدى الطرق المحتملة يمكن تخريب هذا السلوك الأمثل هو إذا تم كتابة البيانات إلى ستابلز من النظام، مع البيانات الجديدة والبيانات القديمة في نفس ستابل. يمكن أن تظهر البيانات خارج النظام بطريقتين:
إذا كان المستخدم يمزج البيانات القديمة والبيانات الجديدة في مسار الكتابة التقليدية، سيتم تجميع البيانات في ميمتابليز وبيغ في نفس ستابل، حيث سيبقى قادم. إذا كان المستخدم & # 8217؛ ق قراءة طلبات للبيانات القديمة يسبب إصلاحات القراءة التي تسحب البيانات القديمة في المذكرة الحالية، أن البيانات سوف يكون كومينغد وبيغ في نفس ستابل.
في حين يحاول توكس تقليل تأثير البيانات المتراكمة، يجب على المستخدمين محاولة تجنب هذا السلوك. على وجه التحديد، يجب على المستخدمين تجنب الاستعلامات التي تحدد الطابع الزمني بشكل صريح عبر ككل باستخدام تيمستامب. بالإضافة إلى ذلك، يجب على المستخدمين تشغيل إصلاحات متكررة (التي تيارات البيانات في مثل هذه الطريقة أنه لا تصبح كومينغد)، وتعطيل إصلاح القراءة الخلفية عن طريق وضع الجدول & # 8217؛ s_re_re_air_chance و dclocal_read_repair_chance إلى 0.
تغيير تيمويندوكومباكتيونستراتيغي خياراتВ¶
يجب على المشغلين الراغبين في تمكين تيمويندوكومباكتيونستراتيغي على البيانات الموجودة النظر في تشغيل عملية ضغط رئيسية أولا، ووضع كل البيانات الموجودة في نافذة واحدة (قديمة). سوف يكتب الأحدث لاحق ثم ستابلز نموذجي كما هو متوقع.
يمكن للمشغلات الذين يرغبون في تغيير compaction_window_unit أو compaction_window_size القيام بذلك، ولكن قد يؤدي إلى مزيد من التفاعلات كما انضمام النوافذ المجاورة معا. إذا كان حجم الإطار هو انخفاض د (على سبيل المثال، من 24 ساعة إلى 12 ساعة)، ثم ستابلز الحالية لن يتم تعديل - توكس لا يمكن تقسيم ستابلز الموجودة في نوافذ متعددة.
&نسخ؛ 2018 مؤسسة برمجيات أباتشي. أباتشي، وشعار ريشة أباتشي، وأباتشي كاساندرا هي علامات تجارية لمؤسسة برمجيات أباتشي.
شريكانت بانغ & # 039؛ ق الملاحظات.
تجاربي وأفكاري.
حجم استراتيجية الضغط المتدرج في أباتشي كاساندرا.
تقنيات ضغط يجمع ستابلز متعددة إلى ستابل واحد لتحسين أداء عمليات القراءة عن طريق الحد من I / O القرص ومساحة حرة من البيانات المحذوفة.
في هذه المقالة سوف نناقش حول استراتيجية ضغط المستوى المتدرج.
إستراتيجية الضغط المتدرج الحجم:
حجم استراتيجية ضغط المتداخلة الجمع بين ستابلز متعددة التي تنتمي إلى نطاق معين حجم البيانات.
سيتم تشغيل هذه الفئات التقنية ستابلز في دلاء مختلفة وعملية الضغط لكل دلو إنديفيولي.
ويستند الضغط على الخصائص التالية:
ستابلز تضاف إلى دلو إذا كان حجم ستابل أقل من 1.5 مرة متوسط حجم هذا الجرد.
مثلا إذا ستابل حجم 14MB و دلو متوسط. حجم 10MB، ثم ستابل ستضاف أن دلو ومتوسط جديد. سيتم حساب حجم دلو. betet_low (الافتراضي 0.5) ستابلز تضاف إلى دلو إذا كان حجم ستابل أكبر من 0.5 أضعاف متوسط حجم تلك المجموعة.
مثلا إذا حجم ستابل هو 7MB ودلو أفغ. حجم 10MB، ثم ستابل ستضاف أن دلو ومتوسط جديد. سيتم حساب حجم دلو. max_threshold (افتراضي 32) الحد الأقصى لعدد ستابلز للسماح في دلو للضغط. min_threshold (الافتراضي 4) الحد الأدنى لعدد ستابلز في دلو لبدء الضغط. min_sstable_size (الافتراضي 50MB) مجموعات عملية التجميع ستابلز التي تختلف في الحجم بنسبة أكبر / أقل من 50٪. هذا يؤدي إلى عملية دلو هو غرامة جدا الحبيبات ل ستابلز الصغيرة. جميع ستابلز ليست مطابقة ثس معايير وجود حجم أقل من min_ststable_size ندخل في دلو واحد الذي متوسط. الحجم أقل من min_sstables_size.
لنفترض أن لدينا ستابلز الأحجام (بالميغابايت) كما 78، 51، 100، 60، 19، 27، 34، 7، 1، 10.
ستابل قبل بدء الضغط.
دعنا نرى كيف تعمل خوارزمية الضغط & # 8230؛
فرز ستابل وفقا لحجم في ترتيب تنازلي. بعد الفرز فوق سبتابل سيكون لدينا قائمة من ستابلز فرزها (بالميغابايت) كما 100، 78، 60، 51، 34، 27، 19، 10، 7، 1.
ستابل مرتبة قبل الظهور للضغط.
إف ((بكيت أفغ سيز * packet_low & لوت؛ ساتابل & # 8217؛ سيز & لوت؛ بكيت أفغ سيز * packet_high) أور (سابتابل & # 8217؛ سيز & لوت؛ min_sstable_size أند بكيت أفغ سيز & لوت؛ min_sstable_size))
ثم إضافة ستابل إلى دلو وحساب متوسط جديد. حجم الجرافة.
إلس إنشاء دلو جديد مع ستابل.
بعد الجلب سيحدث مع packet_low كما 0.5، betet_high كما 1.5، min_sstable_size كما 32MB، min_threshold كما 4 و max_threshold كما 32.
دلو قبل الضغط.
على سبيل الحصر:
حجم الضغط المتدرج لا يعطي أي ضمان حول توزيع عمود صف معين. قد أكون من الممكن أن أعمدة من صف معين مفتاح تنتمي إلى ستابلز مختلفة. في مثل هذه الحالات سوف يقرأ أداء القراءة كما قراءة العملية تحتاج إلى تلمس جميع ستابلز حيث الأعمدة موجودة. في أسوأ الأحوال قد تحتاج إلى مقدار دقيق من المساحة الحرة (100٪) للجمع بين ستابلز.
شارك هذا:
آخر الملاحة.
ترك الرد إلغاء الرد.
مادة جيدة لتقديم لمحة عامة عن ستسس، ومع ذلك فإنه يحتوي على العديد من الأخطاء النحوية التي جعلت القراءة صعبة في بعض النقاط.
خصائص الجدول.
قائمة خصائص جدول ككل وبناء الجملة.
ككل يدعم خصائص الجدول كاساندرا، مثل التعليقات وخيارات الضغط، المدرجة في الجدول التالي.
في أوامر ككل، مثل كريت تابل، قم بإضافة خصائص وقيمها إما في زوج اسم القيمة أو تنسيق خريطة المجموعة:
أرفق سلاسل في علامات اقتباس مفردة.
لا شيء ل rows_per_partition.
كاساندرا 2.0.x: key_only.
تعيين هذه الخاصية في سيناريوهات مابريدوس عندما يكون لديك أي سيطرة على تل. قيمة هذه الخاصية هي عدد الثواني. إذا تم تعيينه، كاساندرا تطبيق محدد تل الافتراضي لكل عمود في الجدول، تعيين على هذه القيمة. عندما يتم تجاوز الجدول تل، كاساندرا شواهد القبور الجدول.
تصفية بلوم.
التخزين المؤقت يحسن استخدام ذاكرة التخزين المؤقت من قبل جدول دون ضبط يدوي. كاساندرا يزن البيانات المخزنة مؤقتا حسب الحجم وتردد الوصول. تنسيق هذا الإعداد مع خصائص التخزين المؤقت العالمية في ملف cassandra. yaml. راجع وثائق كاساندرا 3.0.
استخدام التعليقات لتوثيق بيانات سكل في التعليمات البرمجية التطبيق الخاص بك. يمكن أن تبدأ تعليقات السطر الواحد بشرطة مزدوجة (-) أو شرطة مائلة مزدوجة (//) وتمتد إلى نهاية السطر. أرفق تعليقات متعددة الخطوط في / * و * / حرفا.
الضغط.
سيزتيريدكومباكتيونستراتيغي (ستسس): إستراتيجية الضغط الافتراضية. تؤدي هذه الاستراتيجية إلى ضغط ثانوي عندما يكون هناك عدد من ستابلز حجم مماثل على القرص كما تم تكوينه من قبل الجدول الفرعي سوببروتي min_threshold. لا يتضمن ضغط ثانوي جميع الجداول في مفتاح. انظر سوبربيرتيز ضغط ستكس. داتيتيردكومباكتيونستراتيغي (دتس): هذه الاستراتيجية مفيدة بشكل خاص للبيانات التسلسل الزمني. داتيتيردكومباكتيونستراتيغي مخازن البيانات المكتوبة في غضون فترة معينة من الزمن في نفس ستابل. على سبيل المثال، كاساندرا مخازن آخر ساعة من البيانات الخاصة بك في واحدة ستابل نافذة الوقت، و 4 ساعات القادمة من البيانات في نافذة وقت آخر، وهلم جرا. كاساندرا يؤدي الضغط عندما عدد ستابلز في تلك النوافذ تصل min_threshold (4 افتراضيا). الاستعلامات الأكثر شيوعا لأحمال العمل سلسلة زمنية استرداد آخر ساعة / يوم / شهر من البيانات. كاساندرا يمكن الحد ستابلز عاد إلى تلك التي لديها البيانات ذات الصلة. أيضا، يمكن كاساندرا تخزين مجموعة البيانات تنتهي صلاحيتها باستخدام تل في ستابل مع البيانات الأخرى المقرر أن تنتهي في نفس الوقت تقريبا. كاساندرا يمكن بعد ذلك إسقاط ستابل دون القيام بأي ضغط. انظر أيضا سوبروبيرتيز ضغط دتس. ليفليدكومباكتيونستراتيغي (لس): يخلق ستابلز من حجم ثابت صغير نسبيا (160 مب افتراضيا) التي يتم تجميعها في المستويات. ضمن كل مستوى، ستابلز مضمونة لتكون غير متداخلة. يستخدم لس الستكس للمستوى الأول، يسمى المستوى 0 (L0). كل مستوى ما بعد L0 (L1، L2 وهلم جرا) هو 10 أضعاف كبيرة كما في المستوى السابق. القرص I / O هو أكثر اتساقا ويمكن التنبؤ بها على أعلى من على مستويات أقل كما يتم باستمرار ستابلز ضغطها إلى مستويات أكبر تدريجيا. في كل مستوى، يتم دمج مفاتيح الصف في ستابلز غير متداخلة. هذا يمكن تحسين الأداء للقراءة، لأن كاساندرا يمكن تحديد ستابلز في كل مستوى للتحقق من وجود البيانات الرئيسية الصف. تم تصميم استراتيجية الضغط هذه بعد تنفيذ غوغل ليفيلدب. انظر سوبروبيرتيز ضغط لس.
وتؤدي تحسينات الضغط الهجين (المستوية والحجمية) إلى استراتيجية الضغط المرصوفة إلى تقليل النفقات العامة للأداء على عمليات القراءة عندما لا يتمكن الضغط من مواكبة عبء العمل الثقيل في الكتابة. إذا كاساندرا لا يمكن مواكبة عبء العمل عند استخدام لس، استراتيجية الضغط يتحول إلى ستكس حتى كاساندرا اللحاق بها. لهذا السبب، فمن أفضل الممارسات لتكوين سوبربيرتي max_threshold لجدول لاستخدامها عند حدوث التبديل.
يمكنك تحديد إستراتيجية مخصصة. استخدم اسم الفئة بالكامل كسلسلة ثابتة.
جمع القمامة.
لمزيد من التفاصيل حول الحذف، راجع حول الحذف أو كيف يتم حذف البيانات؟ في وثائق أباتشي كاساندرا 3.0.
ضغط.
قراءة الإصلاحات.
كاساندرا يؤدي إصلاح القراءة كلما يكشف القراءة التناقضات بين النسخ المتماثلة. يمكنك أيضا تكوين كاساندرا لأداء إصلاح القراءة بعد قراءة متسقة تماما. كاساندرا يقارن وينسق جميع النسخ المقلدة، حتى تلك التي لم يتم الوصول إليها في قراءة ناجحة. يتم تعيين احتمال قراءة متسقة من جدول بتشغيل إصلاح قراءة بواسطة dclocal_read_repair_chance و read_repair_chance. الأول من هذه الخصائص يحدد احتمال إصلاح القراءة التي تقتصر على مركز البيانات نفسه عقدة المنسق. تحدد الخاصية الثانية احتمال إجراء إصلاح للقراءة عبر كافة مراكز البيانات التي تحتوي على نسخ متماثلة مطابقة. هذه العملية عبر مراكز البيانات أكثر كثيفة الموارد من العملية المحلية.
التوصیات: إذا كان الجدول مخصصا لبيانات السلاسل الزمنیة، یمكن ضبط كلتا الخواص على 0 (صفر). بالنسبة للجداول الأخرى، فإن الإستراتيجية الأكثر أداء هي تعيين dc_local_read_repair_chance إلى 0.1 و read_repair_chance إلى 0. إذا كنت ترغب في استخدام read_repair_chance، تعيين هذه الخاصية إلى 0.1.
إعادة المحاولة المضاربة.
استخدام الخاصية إعادة المحاولة المضاربة لتكوين حماية القراءة السريعة. في قراءة عادية، كاساندرا يرسل طلبات البيانات إلى العقد متماثلة بما فيه الكفاية لتلبية مستوى الاتساق. في حماية القراءة السريعة، كاساندرا يرسل طلبات قراءة إضافية إلى النسخ المتماثلة الأخرى، حتى بعد أن تم الوفاء مستوى الاتساق. تحدد خاصية إعادة المحاولة المضاربية مشغل هذه الطلبات الإضافية للقراءة.
دائما: إرسال طلبات قراءة إضافية لجميع النسخ المتماثلة الأخرى بعد كل قراءة. X النسبة المئوية: تتتبع كاساندرا باستمرار زمن استجابة القراءة النموذجي لكل جدول (بالمللي ثانية). إذا قمت بتعيين إعادة المحاولة المضاربة إلى X المئين، كاساندرا يرسل طلبات القراءة الزائدة إذا لم يتلقى منسق استجابة بعد X في المئة من الوقت الكمون نموذجي الجدول. N مس: إرسال طلبات قراءة إضافية إلى كافة النسخ المتماثلة الأخرى إذا لم تتلق عقدة المنسق أي ردود ضمن N ميلي ثانية. نون: لا ترسل طلبات قراءة إضافية بعد أي قراءة. على سبيل المثال: أو:
المواضيع المرجعية ككل.
حول استخدام ككل.
يتكون إدخال سكل من البيانات التي تغير البيانات، والبحث عن البيانات، وتخزين البيانات، أو تغيير طريقة تخزين البيانات.
أنواع البيانات المضمنة للأعمدة.
حول استخدام كسباس ككل وخصائص الجدول.
قائمة خصائص جدول ككل وبناء الجملة.
إنشاء خريطة خاصية الضغط و سوبربيرتيز لها.
تكوين ضغط لجدول.
وظائف دعم سكل لتحويل قيمة عمود أو أكثر إلى قيمة جديدة.
حدود ككل العليا.
أوامر سكلش.
داتاستاكس هي علامة تجارية مسجلة لشركة داتاستاكس، Inc. والشركات التابعة لها في الولايات المتحدة و / أو بلدان أخرى.
أباتشي كاساندرا و أباتشي و تومكات و لوسين و سولر و هادوب و سبارك و تينكيربوب و كاساندرا هي علامات تجارية لمؤسسة أباتشي سوفتوار فونداتيون أو الشركات التابعة لها في كندا والولايات المتحدة و / أو بلدان أخرى.
ديت-تيريد، ضغط، إلى داخل، أباتشي، كاساندرا.
لأطروحة الماجستير، وأنا وضعت وقياس استراتيجية أباتشي كاساندرا الضغط الأمثل لسلسلة زمنية. وقد أدرجت في الآونة الأخيرة، استراتيجية ضغط التاريخ المتسلسل (دتس)، في كاساندرا المنبع. نحن الآن استخدامه في الإنتاج في سبوتيفي.
وقد كتب ماركوس إريكسون مشاركة مدونة أخرى حول هذه الميزة على مدونة مطوري داتاستاكس.
ما هي استراتيجية الضغط؟
وتسمى ملفات البيانات التي يتم تخزينها على عقد القرص كاساندرا على القرص سلسلة سلاسل فرز (ستابلز). وهي في الأساس صفيفات مرتبة من البيانات. ويكمن الأداء المتميز لشركة كاساندرا في تخزينها المنظم، فإنه يعترف فقط كم مقارنة أكثر تكلفة عشوائية تسعى إلى عمليات متتابعة على الأجهزة الحديثة. منح هذا الفرق أكبر على محركات الأقراص الثابتة من محركات الأقراص الصلبة. ومع ذلك، فإن حفظ البيانات من التجزؤ له أهمية أساسية بالنسبة لأداء كاساندرا العام.
قد يبدو مصفوفة فرز مثل بنية البيانات البدائية، لكنه يسمح البحث عن مجموعة واحدة الاستعلامات. منذ كاساندرا ليست مهتمة في الكتابة الصغيرة إلى القرص، والتكلفة الرهيبة من الإدراج في صفائف فرزها لا خسارة. كاساندرا لن تفعل تلك على أي حال. Apart from the commit log which optimizes against disk seeks in ways that lie outside the scope of this post, the only kind of write to disk that Cassandra does is a big sequential write of data: the dumping of an in-memory Memtable in the form of a new SSTable. As most writes only touch memory, updating the Memtable (or, as of 2.0, a skip list) makes the amortized cost of a write request very low. Only when a Memtable is large enough, is it dumped to disk.
For a read request on a Cassandra node, the story of performance is not so simple. Performance is strongly correlated to the number of disk seeks needed to find the right value. The primary key that values are stored with consists of:
The partition key, which determines which node data is stored on. Partition keys are hashed. One or more clustering keys that determine clustering. The SSTables are sorted based on the clustering keys.
Cassandra stores per-SSTable indexes in memory, so there’s no need for actual on-disk binary searching to find the right spot in an SSTable. Instead, the problem is finding the right SSTable. Remember that new SSTables are periodically dumped to disk; eventually thousands of SSTables will have been written.
How does Cassandra avoid performing thousands of disk seeks on every read request? Cassandra has ways of filtering some away. These are per-SSTable, and include:
Bloom filters, which can tell when a partition key is not in an SSTable. Minimum & maximum clustering keys, which can help rule out a number of SSTables. Minimum & maximum timestamps, which lets Cassandra reason about whether updates or deletes of values could have come after a particular value was written. (Hashed) partition key ranges, which in case Leveled Compaction Strategy is used, significantly reduces the number of potential SSTables to look in.
But these optimizations don’t help too much if these SSTables are just left untouched. The optimization that does do something about that is compaction . The SSTables are immutable, but they can be compacted, i. e. merged into larger SSTables which when finished lets the original SSTables be garbage collected. This, of course, is yet another sequential disk operation. In short, compaction serves these purposes:
Ensures that Cassandra has to look in as few SSTables as possible on a read request, after applying the list of optimizations mentioned above. Puts ranges of contiguous clustering keys clustered on disk, so that a given range of clustering keys within a single partition lies in as few files as possible. Evicts tombstones and TTL expired data. A tombstone is as “logical delete”; a write with a special “delete this” value.
Which SSTables to choose and when to compact.
Until version 2.0.10 and 2.1.0, Cassandra shipped with two compaction strategies: Size-Tiered Compaction Strategy (STCS) and Leveled Compaction Strategy (LCS). These strategies for choosing what to compact and when and how are as different in approach as one can imagine. Before talking about them, one thing worth noting is that a compaction operation is not at all free. It takes time and space proportional to the combined size of the participating SSTables. And while multiple compactions can run in parallel, incoming requests become slower the more compactions that are running.
STCS has one simple goal: make it so there are as few SSTables on disk as possible at any given time. It does so in an asymptotically optimal way that only compacts SSTables that are close enough in size. On average and in the worst case, the number of SSTables on disk is logarithmic to the total data size on disk.
LCS takes a radically different approach. It not only merges SSTables, but it also splits them to make only a certain range of partition keys live in one SSTable. It then keeps these ranges apart in a smart way that means a partition key can only exist in a small number of files, logarithmic to the total data size on disk. When compared to STCS, it tends to result in fewer seeks per read request, but performs a higher number of compactions with a higher number of SSTables involved in each operation.
Time Series.
One of Cassandra’s most common use-cases is for time series. A time series in Cassandra uses the time of a data point as the clustering key. This kind of use case has a number of useful properties that neither of the two aforementioned compaction strategies take advantage of:
Clustering key and timestamp (Cassandra write time) are directly correlated. Data tends to be sent to Cassandra in time order. Out-of-order writes only happen on a small scale (in a matter of seconds, typically). The only kinds of deletes used are by TTL or entire partitions at once. The rate at which data is written is nearly constant.
A query on a time series is usually a slice query (range query) on a given partition. Perhaps, the most common query is something like “values from the last hour/day/week”.
Since Cassandra holds in-memory metadata about maximum and minimum clustering keys per SSTable, range queries can immediately rule out SSTables that have a range that lies outside the range of the query. But STCS and LCS pay no attention to this. The result after running Size-Tiered Compaction Strategy on a time series is that nearly all SSTables have some old data and some new data in them. Even if just one value is much older or newer than the rest, that changes the minimum/maximum timestamp, and as a result Cassandra sees that the SSTable covers a much larger range of clustering keys. Below is a diagram showing an example run of continuously writing to a new time series with STCS:
The horizontal axis in this diagram represents timestamps from the start of the example run on the left to the end on the right. Compactions were let finish before generating this image. Each rectangle is an SSTable (a total of 11 in this case). The left edge of each rectangle marks its minimum timestamp, the right edge marks the maximum timestamp. While the vertical axis bears no significance, the area of each rectangle represents the size of the data file. The vertical bar represents a slice query. This query asks for all data points, in a given partition, within a certain time span.
In this example, parts of all 11 SSTables need to be read, which results in 11 disk seeks. What we see here is variously sized SSTables covering more or less the full range of clustering keys. Size and age follow no pattern.
Date-Tiered Compaction.
Before getting into details of the new Date-Tiered Compaction Strategy (DTCS), with the previous image fresh in mind, let’s see what DTCS produces in the same scenario:
In this image, you can see 20 SSTables which are spread out much more nicely over the timeline. The number of SSTables is higher, but that is mostly because of a low base_time_seconds setting. That setting determines how old an SSTable has to be to not immediately enter compaction. The slice query now hits only 3 SSTables, which is great, considering the size of the slice in this example covers 20% of the time line. Also, note that all rectangles have nearly the same height. This demonstrates the correlation between size and age of DTCS-compacted SSTables in a dataset where writes are done at a constant pace. The SSTables are not only date-tiered, they are size-tiered too!
You can immediately see how most queries would require Cassandra to look in every SSTable in the STCS case. In the above STCS example, the only somewhat efficient range to query is right at the start of the time span, typically the least important section. In the DTCS case, the SSTables lie in sequence, and only some of the SSTables have to be touched in slice queries. In a single key query or narrow slice query, most of the time only one SSTable has to be touched. A “last hour” query is still less efficient than a query for an earlier hour, but DTCS does the best it can, given the constant influx of SSTables. In practice, the newest SSTables are likely to be disk cached.
When to use DTCS (and when to avoid it)
It’s obvious that DTCS is great at handling time series. That’s what it was designed for. As has been shown here, DTCS also challenges STCS on any dataset that gets writes at a steady rate. This accounts for a high percentage of Cassandra use cases. DTCS is not allergic to more sporadic write patterns either. But something that works against the efforts of the strategy is writes with highly out-of-order timestamps. If an SSTable contains timestamps that don’t match the time when it was actually written to disk, it violates the size-to-age correspondence that DTCS tries to maintain. Such SSTables do appear organically in Cassandra as a result of repairs. The problem is that small SSTables end up in windows dedicated to large SSTables, and merging large files with small files is inefficient. Consider turning off read repairs. Anti-entropy repairs and hinted handoff don’t incur as much additional work for DTCS and may be used like usual.
Also, make sure that all writes use the same timestamp format. Whether it’s microseconds or milliseconds, a mix will behave as extremely out-of-order. As always, make sure that client clocks are synced. It’s the clients, not the servers that set the timestamps. Even DTCS’s idea of “current time” is governed by client timestamps.
Great at removing data.
Cassandra’s log-structured storage has a hard time dealing with deletes. Tombstones are used to represent a delete or expired TTL. Cassandra manages to delete associated values during compactions at a good rate. But existing compaction strategies have a hard time deleting the tombstones themselves, and that can actually become a problem. DTCS helps a lot in purging tombstones, because when they reach the oldest SSTable, Cassandra simply removes any tombstone that is older than GC grace period. An SSTable that is older than all the others have no reason to hold tombstones beyond the grace period.
This is particularly useful for all-TTL datasets, where Cassandra is even able to delete entire SSTables once they have fully expired. DTCS helps keep new and old data separate, so that optimization can kick in considerably more often. This means that an all-TTL dataset with DTCS can be trusted to stay constant in size in the long run, and in an efficient manner.
Sub-properties.
To used DTCS, the user specifies the compaction strategy as DateTieredCompactionStrategy, which is accompanied by a number of sub-properties. The options with the biggest effect on how DTCS behaves are (these properties and default values are subject to change):
timestamp_resolution (default = “MICROSECONDS”) : make sure that this is set to the same format that your clients use when writing timestamps (CQL uses microseconds by default). base_time_seconds (default = 3600 (1 hour)) : this sets the initial window size which dictates how much of the most newly written data should be eagerly compacted together. All data older than base_time_seconds will subsequently be grouped together with other data about the same age, at which point further compactions will start happening increasingly (exponentially) less frequently. This option is similar to the min_sstable_size subproperty in SizeTieredCompactionStrategy. min_threshold (default = 4) : for data not in the current window of newest data, min_threshold dictates how many of these previously compacted windows of the same (time span) size should be created before merging them into one time window min_threshold as large. Windows of the same size are of course adjacent to each other, and there are never more than min_threshold windows of one size (unless min_threshold = 1, of course). max_sstable_age_days (default = 365) : stop compacting SSTables only having data older than than this number of days. Setting this low, reduces the total number of times the same value is rewritten to disk. Since it prevents compaction of the largest SSTables, it can also be used to limit the amount of free disk space needed for compaction.
How DTCS works.
The idea is to act similarly to STCS, but instead of compacting based on SSTable size, compact based on SSTable age. The measurement of age used is the minimum timestamp of the SSTable, subtracted from the maximum timestamp globally. Assuming that writes come at a somewhat steady rate, and that timestamps roughly reflect the time of arrival to Cassandra (two properties that are held for much more than just time series), the size of an SSTable is upper bounded by its age. Furthermore, if SSTables are always merged with similarly aged SSTables, the old ones will be large and the new ones will be small. In other words, while DTCS compacts based on age, this correlation between age and size means that it gets the same asymptotic performance characteristics as STCS, while keeping data grouped by timestamps, as seen in the diagram above.
One way to implement this would be to fully mimic the behavior of STCS and compact SSTables with a relative age difference less than a constant factor. But there is one important property that differs between the size and the age of an SSTable: the size is constant, but the age rises over time. So SSTables that didn’t have ages within that constant factor a moment ago might suddenly have. This is a complication that we want to avoid. It also becomes difficult to reason about the efficiency of such an approach.
The approach that was chosen, instead uses the current time to compute time windows between Unix epoch and now. These windows don’t slide with the passage of time. Instead, as time passes, new time windows appear and old ones get merged into larger windows. The time that needs to pass before creating a new time window is specified by the base_time_seconds subproperty. The number of windows of one size that need to be accumulated before merging them into a bigger one is specified by the min_threshold subproperty. For example, with base_time_seconds=3600 (an hour) and min_threshold=4, the placement of the last few time windows at 7 consecutive hours may look like this:
The condition for compaction is simple: if multiple SSTables have an age that falls into the same window, DTCS will nominate all of those for compaction. The current point in time (computed as the maximum timestamp globally across SSTables) is always located in the latest time window.
The precise definition for when time windows get merged is: the moment min_threshold windows of one size get accompanied by yet another same-sized window, the aforementioned group of windows merge into one. This can have a domino effect as seen in the bottom lane of the image, where a fifth 1-hour window triggered the creation of a fifth 4-hour window, triggering the creation of a 16-hour window.
To keep data clustered based on write time, Date-Tiered Compaction Strategy uses information that other strategies disregard. It is very cheap to keep that structure as long as data is seldom written very out-of-order. This separation of old and new data is excellent for time series. It also holds an advantage against the other strategies at purging deleted data quickly and predictably.
Cassandra compaction strategy options
Pull requests 1.
Deleting compaction is a way to achieve deletes in Apache Cassandra without resorting to tombstones or TTLs. It works by establishing rules for what data should be deleted, then during either standard or user-defined compaction, preventing records that fail conviction from entering the newly compacted SSTable. Secondary indexes are cleaned up at the time that deletion occurs.
DCS base compaction options:
dcs_convictor - required string - what class convicts records during compaction. Must be a valid class name that extends AbstractSimpleDeletingConvictor dcs_underlying_compactor - required string - the underlying compaction strategy to use for sstable selection dcs_is_dry_run - optional boolean - if true, no deletes are performed, instead statistics about what would have been deleted are logged to Cassandra's logs dcs_status_report_ms - optional int - if provided, a status report about the progress of deleting compaction will be logged at this interval dcs_backup_dir - optional string - if provided, records deleted during compaction will be written to SSTable files in this directory.
All other options are passed first to the convictor class, then to the underlying compaction strategy.
The DCS convictors can have their own options. فمثلا:
delete_keys - required string - json string dictionary providing deletion rules in the form of , where ranges are defined as either a single value, or a two-value array of upper and lower bounds to match for this column, where a null value indicates an unbounded edge of the range.
rules_select_statement - required string - CQL SELECT statement to retrieve late TTL rules. The statement must return the following columns: column (text) rulename (any) range (tuple2<string, string>) ttl (bigint)
For given rulename, all columns in that rule must be either partition or cluster keys, and in order for the rule to apply to the row, each column in the rule must match at least one range. If multiple rules match a row, the rule with the lowest TTL will apply. TTL of 0 means delete immediately, TTL < 0 means do not delete. The atoms writetime is compared against the effective TTL, and if the atom is older than the TTL, the atom does not survive compaction.
For a table that includes a field named "tenant" in in the primary key (either partition or cluster), we can apply a compaction-time TTL like this. Note the last lines where we wrap SizeTieredCompactionStrategy - this should work the same way with any other compaction strategy.
With accompanying deletion rules which look like this:
To produce a jar which can be loaded into your Cassandra cluster:
This will place a jar at deleting-compaction-strategy/target/scala-2.10/deleting-compaction-strategy-0.24-SNAPSHOT. jar . Although the target path mentions Scala, there are no Scala dependencies in this jar, and in fact there are no dependencies which are not already part of Cassandra core.
&نسخ؛ 2017 GitHub , Inc. Terms Privacy Security Status Help.
You can't perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Comments
Post a Comment