عیب یابی خوشه Seatunnel Cluster Split-Brain: یک شیرجه عمیق به پیکربندی فندق و خرابی های ناشی از GC

پیکربندی خوشه
قسمت | شرح |
---|---|
مقدار | 3 سرور |
مشخصات | Alibaba Cloud ECS 16C64G |
حالت شکاف | 50 شکاف استاتیک |
پیکربندی حافظه ST | -xms32g -xmx32g -xx: maxmetaspacesize = 8g |
مسائل استثنا
از ماه آوریل ، سه مورد از پدیده های تقسیم شده از مغز خوشه ای رخ داده است ، همه شامل یک گره خاص است که به صورت تقسیم شده از مغز یا خاموش شدن خودکار می شود.
سیاهههای اصلی به شرح زیر است:
گره
چاپ موضوع فندق چاپ عمل آهسته ورود به سیستم.
بعد از یک زمان ضربان قلب فندق دهه 60 ، می بینیم که 198 خوشه را ترک کردبشر
198 گره کارگر
ما می توانیم ببینیم که در حال حاضر قادر به بدست آوردن ضربان قلب از گره های خوشه ای Hazelcast نیست ، با مدت زمان بیش از 60000ms.
تلاش برای اتصال مجدد به خوشه
پس از آن ، هرگونه درخواست ارسال شده به این گره – از جمله نمایشگاه های وضع موجود یا ارسال شغلی – Become گیر کرده و هیچ وضعیتی را برنمی گرداند.
در این مرحله ، کل خوشه در دسترس نیست و وارد یک حالت بن بست می شود. رابط های بررسی سلامت که برای گره ها نوشتیم همه غیرقابل دستیابی هستند. خرابی سرویس در ساعات اوج صبح رخ داده است، بنابراین پس از مشاهده در سیاهههای مربوط که این خوشه وارد یک حالت تقسیم مغز شد ، ما به سرعت خوشه را دوباره راه اندازی کردیم.
بعد از تنظیم پارامتر ، شماره خاموش کردن گره خودکار حتی اتفاق افتاد
تجزیه و تحلیل مسئله
این مسئله ممکن است در فندق باشد خرابی تنظیم شبکه خوشه، با دلایل احتمالی زیر:
- زمان NTP نمونه های ECS در خوشه متناقض است.
- جیغ شبکه در موارد ECS در خوشه باعث دسترسی دسترسی به آن نمی شود.
- Seatunnel GC کامل را تجربه می کند که منجر به ایستادن JVM می شود و در نتیجه خرابی تنظیمات ایجاد می شود.
دو موضوع اول توسط همکاران عملیات ما رد شد: بدون مشکل در شبکه شناسایی شدند ، سرویس Alibaba Cloud NTP به طور عادی کار می کند ، و ساعتهای سرور هماهنگ می شوند در هر سه سرور.
با توجه به شماره سوم ، در آخرین ورود به سیستم بهداشت و درمان Hazelcast قبل از ناهنجاری روی گره 198 ، متوجه شدیم که cluster time
در -100 میلی ثانیه بود ، که به نظر می رسد تأثیر محدودی دارد.
بنابراین در طول راه اندازی های بعدی ، پارامترهای ورود به سیستم JVM GC را برای مشاهده مدت زمان کامل GC اضافه کردیم. ما مشاهده کردیم که در بدترین حالت 27 سال به طول انجامید. از آنجا که این سه گره از طریق پینگ یکدیگر را کنترل می کنند ، این به راحتی منجر به فندق بیش از زمان ضربان قلب دهه 60 می شود.
ما همچنین متوجه شدیم که هنگام همگام سازی یک جدول Clickhouse 1.4 میلیارد ردیف ، استثنائات کامل GC احتمالاً پس از مدتی کار انجام می شود.
راه حل
زمان ضربان قلب خوشه ST را افزایش دهید
ردیاب خرابی خوشه Hazelcast وظیفه تعیین اینکه عضو خوشه ای غیرقابل دسترسی باشد یا سقوط کرده است ، وظیفه دارد.
اما طبق گفته های مشهور نتیجه FLP، در سیستم های ناهمزمان ، تمایز بین یک عضو تصادف شده و یک عضو آهسته غیرممکن است. یک راه حل برای این محدودیت استفاده از ردیاب خرابی غیرقابل اعتمادبشر یک ردیاب غیرقابل اعتماد به اعضا اجازه می دهد تا دیگران را به شکست ، به طور معمول بر اساس معیارهای زنده بودن ، مشکوک کنند ، اگرچه ممکن است اشتباه کند.
Hazelcast ردیاب های خرابی داخلی زیر را ارائه می دهد: Deadline Failure Detector
وت Phi Accrual Failure Detector
بشر
به طور پیش فرض ، Hazelcast از ردیاب شکست مهلت استفاده می کند.
یک ردیاب خرابی پینگ نیز وجود دارد که در صورت فعال بودن ، به موازات آشکارسازهای فوق کار می کند و می تواند خرابی ها را در آن تشخیص دهد OSI Layer 3 (لایه شبکه)بشر این ردیاب است به طور پیش فرض غیرفعال استبشر
ردیاب خرابی مهلت
از زمان بندی مطلق برای ضربان قلب از دست رفته/گمشده استفاده می کند. پس از زمان وقوع ، یک عضو در نظر گرفته می شود که تصادف/غیرقابل دسترسی است و به عنوان مظنون مشخص می شود.
پارامترها و توضیحات مربوطه:
hazelcast:
properties:
hazelcast.heartbeat.failuredetector.type: deadline
hazelcast.heartbeat.interval.seconds: 5
hazelcast.max.no.heartbeat.seconds: 120
مورد پیکربندی | شرح |
---|---|
hazelcast.heartbeat.failuredetector.type |
حالت ردیاب خرابی خوشه: مهلت. |
hazelcast.heartbeat.interval.seconds |
فاصله ای که اعضا در آن پیام های ضربان قلب به یکدیگر ارسال می کنند. |
hazelcast.max.no.heartbeat.seconds |
در صورت عدم دریافت ضربان قلب ، زمان مشکوک به یک عضو خوشه. |
ردیاب خرابی phi-acculal
فواصل بین ضربان قلب در یک پنجره زمان کشویی ، میانگین و واریانس این نمونه ها را اندازه گیری می کند و سطح سوء ظن (PHI) را محاسبه می کند.
با افزایش آخرین ضربان قلب ، مقدار PHI افزایش می یابد. اگر شبکه آهسته یا غیرقابل اعتماد شود و منجر به افزایش میانگین و واریانس شود ، اعضا بعد از مدت زمان طولانی بدون ضربان قلب مشکوک می شوند.
پارامترها و توضیحات مربوطه:
hazelcast:
properties:
hazelcast.heartbeat.failuredetector.type: phi-accrual
hazelcast.heartbeat.interval.seconds: 1
hazelcast.max.no.heartbeat.seconds: 60
hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100
مورد پیکربندی | شرح |
---|---|
hazelcast.heartbeat.failuredetector.type |
حالت ردیاب خرابی خوشه: PHI-ACCUAL |
hazelcast.heartbeat.interval.seconds |
فاصله ای که اعضا در آن پیام های ضربان قلب به یکدیگر ارسال می کنند |
hazelcast.max.no.heartbeat.seconds |
مدت زمان مشکوک به عضویت به دلیل ضربان قلب از دست رفته. با یک ردیاب تطبیقی ، این می تواند کوتاهتر از زمان بندی تعریف شده برای ردیاب مهلت باشد |
hazelcast.heartbeat.phiaccrual.failuredetector.threshold |
آستانه PHI برای در نظر گرفتن یک عضو غیرقابل دسترسی. مقدار کمتری شکست را با تهاجمی تر تشخیص می دهد اما مثبت کاذب را افزایش می دهد. مقادیر بالاتر محافظه کارتر هستند اما شکست های واقعی را آهسته تر تشخیص می دهند. پیش فرض 10 است |
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size |
تعداد نمونه ها برای حفظ در تاریخ. پیش فرض 200 است |
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis |
حداقل انحراف استاندارد برای محاسبه PHI در یک توزیع عادی |
اسناد مرجع:
برای بهبود دقت ، ما تصویب کردیم توصیه های جامعه برای استفاده phi-accrual
در hazelcast.yml
، و زمان بندی را در دهه 180 تنظیم کنید:
hazelcast:
properties:
# Newly added parameters
hazelcast.heartbeat.failuredetector.type: phi-accrual
hazelcast.heartbeat.interval.seconds: 1
hazelcast.max.no.heartbeat.seconds: 180
hazelcast.heartbeat.phiaccrual.failuredetector.threshold: 10
hazelcast.heartbeat.phiaccrual.failuredetector.sample.size: 200
hazelcast.heartbeat.phiaccrual.failuredetector.min.std.dev.millis: 100
بهینه سازی پیکربندی GC
Seatunnel به طور پیش فرض از جمع کننده زباله G1 استفاده می کند. هرچه پیکربندی حافظه بزرگتر باشد ، بیشتر احتمال دارد که YoungGC یا MixedGC حافظه کافی را به طور کارآمد (حتی با چند رشته خواندن) بازیابی کنند ، و باعث افزایش مکرر FullGC می شوند.
(Java 8 FullGC را در حالت تک رشته ای کنترل می کند ، که بسیار کند است.)
اگر چندین گره خوشه ای به طور همزمان FullGC را تحریک کنند ، احتمال خرابی شبکه های خوشه ای به شدت افزایش می یابد.
بنابراین ، هدف ما این است که اطمینان حاصل کنیم که YoungGC/MixedGC می تواند با استفاده از پردازش چند رشته ای ، حافظه کافی را تا حد ممکن بازیابی کند.
پارامترهای بهینه شده:
-Xms32g
-Xmx32g
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server
-XX:MaxMetaspaceSize=8g
-XX:+UseG1GC
-XX:+PrintGCDetails
-Xloggc:/alidata1/za-seatunnel/logs/gc.log
-XX:+PrintGCDateStamps
بنابراین ، ما سعی کردیم مدت زمان مکث GC مجاز را افزایش دهیم:
-- This parameter sets the target maximum pause time. The default is 200 milliseconds.
-XX:MaxGCPauseMillis=5000
مجموعه زباله های مخلوط از این پارامتر و مدت زمان GC تاریخی استفاده کنید تا تخمین بزنید که چه تعداد از مناطق را می توان در 200 متر هدف جمع آوری کرد. اگر فقط تعداد معدودی جمع آوری شود و اثر GC مورد نظر حاصل نشود ، G1 یک استراتژی ویژه دارد: پس از مکث و جمع آوری توقف در جهان (STW) ، موضوعات سیستم را از سر می گیرد و سپس STW دیگری را انجام می دهد و یک GC مختلط را برای جمع آوری بخشی از مناطق اجرا می کند. این تکرار تا ‐xx: g1mixedgccounttarget = 8 (پیش فرض 8 بار است).
به عنوان مثال: اگر 400 منطقه نیاز به جمع آوری داشته باشند ، و حد 200ms اجازه می دهد تا فقط 50 منطقه در یک زمان جمع آوری شوند ، تکرار این روند 8 بار همه آنها را جمع می کند. این از مکث طولانی STW از یک مجموعه واحد جلوگیری می کند.
پارامترهای JVM پس از اولین بهینه سازی:
-Xms32g
-Xmx32g
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server
-XX:MaxMetaspaceSize=8g
-XX:+UseG1GC
-XX:+PrintGCDetails
-Xloggc:/alidata1/za-seatunnel/logs/gc.log
-XX:+PrintGCDateStamps
-XX:MaxGCPauseMillis=5000
سیاهههای مربوط به GC:
زمان مکث GC مخلوط – این پارامتر فقط یک مقدار هدف است و نتایج مشاهده شده همه در محدوده مورد انتظار بودند:
سیاهههای مربوط به GC کامل:
با این حال ، هنوز هم نمی توان از GC های کامل جلوگیری کرد و هر یک حدود 20 ثانیه طول کشید. این پارامترهای اضافی فقط عملکرد GC را با حاشیه بهبود می بخشد.
با مشاهده سیاههها ، متوجه شدیم که در طول سناریوهای مختلط ، نسل قدیمی به درستی جمع آوری نشده است – مقدار زیادی از داده ها بدون تمیز کردن در نسل قدیمی باقی مانده است.
بنابراین ما سعی کردیم حافظه نسل قدیمی و چندین پارامتر G1 GC مربوط به عملکرد را تنظیم کنیم.
پارامترهای بهینه شده به شرح زیر بود:
-Xms42g
-Xmx42g
-XX:GCTimeRatio=4
-XX:G1ReservePercent=15
-XX:G1HeapRegionSize=32M
حافظه Heap (-xms / -xmx) از 32 گرم به 42 گرم افزایش یافته است ، به طور غیرمستقیم حد بالایی نسل قدیمی را افزایش می دهد ، که از لحاظ نظری باید فرکانس GC های کامل را کاهش دهد.
نسبت زمان CPU مورد استفاده توسط موضوعات GC (-xx: gctimeratio) از 10 ٪ به 20 ٪ افزایش یافته است. فرمول 100/(1+gctimeratio) است. این باعث افزایش زمان CPU مجاز برای GC می شود.
فضای رزرو شده (-xx: G1ReservePercent) از 10 ٪ به 15 ٪ افزایش یافت. نارسایی تخلیه به زمانی اشاره دارد که G1 نتواند مناطق جدید را در فضای پشته تخصیص دهد و یک GC کامل را تحریک کند. افزایش فضای رزرو شده می تواند به جلوگیری از چنین سناریوهایی کمک کند ، اگرچه فضای قابل استفاده در نسل قدیمی را کاهش می دهد. بنابراین ما حافظه پشته را افزایش دادیم. این تنظیم در موارد زیر کمک می کند:
- هیچ منطقه رایگان در هنگام کپی کردن اشیاء زنده از نسل جوان در دسترس نیست.
- هیچ منطقه رایگان در هنگام تخلیه اشیاء زنده از نسل قدیمی در دسترس نیست.
- هیچ فضای پیوسته ای در نسل قدیمی برای تخصیص اشیاء بزرگ موجود نیست.
اندازه منطقه Heap (-xx: G1HeaPregionSize)-برای بهینه سازی مجموعه اشیاء بزرگ ، 32 مگابایت را تنظیم کنید.
پارامترهای JVM پس از بهینه سازی دوم:
-Xms42g
-Xmx42g
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server
-XX:MaxMetaspaceSize=8g
-XX:+UseG1GC
-XX:+PrintGCDetails
-Xloggc:/alidata1/za-seatunnel/logs/gc.log
-XX:+PrintGCDateStamps
-XX:MaxGCPauseMillis=5000
-XX:GCTimeRatio=4
-XX:G1ReservePercent=15
-XX:G1HeapRegionSize=32M
پس از بهینه سازی ، ما در آن روز کاهش قابل توجهی در تعداد FullGC ها مشاهده کردیم ، اما ما هنوز به حالت ایده آل داشتن صفر کامل نرسیدیم.
تجزیه و تحلیل ورود به سیستم بیشتر نشان داد که مرحله تقاطع موازی زمان زیادی را مصرف می کند و اغلب با سقط جنین روبرو می شود.
ما از تنظیم پارامتر زیر استفاده کردیم:
-XX:ConcGCThreads=12
-XX:InitiatingHeapOccupancyPercent=50
تعداد موضوعات GC که همزمان با برنامه (-xx: concgcthreads) اجرا می شود از 4 به 12 افزایش یافته است. هرچه این مقدار پایین تر باشد ، توان کاربرد آن بالاتر است ، اما خیلی کم GC را خیلی طولانی می کند. هنگامی که چرخه همزمان GC خیلی طولانی است ، افزایش تعداد نخ های GC می تواند کمک کند. با این حال ، این تعداد موضوعات موجود برای منطق برنامه را کاهش می دهد ، که بر توان تأثیر می گذاردبشر برای سناریوهای همگام سازی داده های آفلاین ، اجتناب از FullGC از اهمیت بیشتری برخوردار است و این پارامتر را بسیار مهم می کند.
آستانه علامت گذاری همزمان برای نسل قدیمی (-xx: IndiatingHeapoCcupancyPercent) از 45 ٪ به 50 ٪ افزایش یافته و باعث افزایش همزمان قبل و بهبود عملکرد مخلوط می شود.
پارامترهای JVM پس از بهینه سازی سوم:
-Xms42g
-Xmx42g
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/seatunnel/dump/zeta-server
-XX:MaxMetaspaceSize=8g
-XX:+UseG1GC
-XX:+PrintGCDetails
-Xloggc:/alidata1/za-seatunnel/logs/gc.log
-XX:+PrintGCDateStamps
-XX:MaxGCPauseMillis=5000
-XX:InitiatingHeapOccupancyPercent=50
-XX:+UseStringDeduplication
-XX:GCTimeRatio=4
-XX:G1ReservePercent=15
-XX:ConcGCThreads=12
-XX:G1HeapRegionSize=32M
منابع تنظیم JVM:
نتایج بهینه سازی
از آنجا که پیکربندی در تاریخ 26 آوریل بهینه شد ، هیچ حادثه تقسیم شده از مغز رخ نداده است، و نظارت بر دسترسی به سرویس نشان می دهد که تمام گره ها به حالت عادی برگشته اند.
بعد از تنظیم JVM در تاریخ 30 آوریل ، در تعطیلات روز مه ، ما به دست آوردیم صفر کامل روی سه گره، و هیچ متوقف یا ناهنجاری دیگری در رابط های بررسی سلامت سیستم مشاهده نشد.
اگرچه این به هزینه برخی از توان کاربردی نخ نیز رسید ، ما از ثبات خوشه اطمینان حاصل کردیم که پایه و اساس محکم برای ورود به سیستم بزرگ در مقیاس بزرگ زتا را فراهم می کند.