انتخاب رهبر
1) چرا شما نیاز به یک رهبر و زمانی که او در همه توجیه
Leader: یک گره که حق انحصاری برای انجام اقدامات حیاتی دارد: شروع یک crown/ETL، هماهنگی قطعات، توزیع کلیدها، تغییر پیکربندی. این ساده ناوردا («یک عملکرد»)، اما می افزاید: خطرات (SPOF، انتخاب مجدد، تاخیر).
از رهبری استفاده کنید اگر:- نیاز به منحصر به فرد بودن اجرای (به عنوان مثال، یک جمع کننده صورتحساب یک بار در دقیقه) ؛
- تغییرات باید سریال شوند (ثبت پیکربندی، قفل توزیع شده)
- پروتکل خوشه ای تکرار رهبری (قایق) را فرض می کند.
- مشکل با idempotence و سفارش توسط کلید حل می شود ؛
- می توان از طریق کار سرقت/صف موازی ؛
- «رهبر» تنها نقطه باریک (طرفداران گسترده) می شود.
2) مدل پایه: اجاره + quorum + دوره
شرایط استفاده
اجاره: رهبر حق دارد T ثانیه ؛ باید تجدید شود.
ضربان قلب: سیگنال دوره ای/سیگنال زنده.
دوره/اصطلاح: تعداد رهبری یکنواخت در حال رشد. شناسایی رهبران «قدیمی»
نشانه شمشیربازی: همان شماره یکنواخت که مصرف کننده منابع (پایگاه داده/ذخیره سازی) بررسی و رد عملیات رهبر قدیمی است.
تغییرناپذیر
در هر زمان، بیش از یک رهبر واقعی (ایمنی).
در صورت شکست، پیشرفت امکان پذیر است: یک فرد جدید (زنده بودن) در یک زمان معقول انتخاب می شود.
عملیات رهبر با یک دوره همراه است ؛ سینکی فقط دوره های جدیدتر را می پذیرد.
3) بررسی الگوریتم ها و پروتکل ها
3. 1 قایق (تکرار رهبری)
وضعیت: پیرو → نامزد → رهبر.
تایمر: اتمام وقت انتخابات تصادفی (jitter), RequestVote; رهبر ورودی ها را به عنوان ضربان قلب نگه می دارد.
تضمین: حد نصاب, هیچ تقسیم مغز تحت پیش نیازهای استاندارد, logbook با یکنواختی منطقی (مدت/شاخص).
3. 2 Paxos/تک فرمان/چند Paxos
مبنای نظری توافق ؛ در عمل - تغییرات (به عنوان مثال، Multi-Paxos) با «هماهنگ کننده انتخاب شده» (آنالوگ رهبر).
سخت تر به طور مستقیم پیاده سازی ؛ پیاده سازی های آماده/کتابخانه ها بیشتر مورد استفاده قرار می گیرند.
3. 3 ZAB (پخش اتمی ZooKeeper)
مکانیسم ZK: تکرار مجله رهبری با مراحل بهبودی ؛ epochs (zxid) و گره های فصلی متوالی برای primitives مانند رهبری.
3. قلدر 4/چانگ رابرتز (حلقه/پادشاه)
الگوریتم های «آموزش» برای توپولوژی های استاتیک بدون quorum. خرابی ها/پارتیشن های جزئی شبکه را در نظر نگیرید - در فروش اعمال نمی شود.
4) سیستم عامل های عملی
4. 1 نگهبان باغ وحش
الگوی EPHEMERAL_SEQUENTIAL: فرآیند «/leader/lock-XXXX »را ایجاد می کند، حداقل تعداد رهبر است.
از دست دادن جلسه ⇒ گره ناپدید می شود ⇒ انتخاب مجدد لحظه ای است.
عدالت از طریق انتظار برای «سلف».
4. 2 etcd (قایق)
رهبری بومی در سطح خوشه ای خود ؛ برای کاربردها - همزمانی etcd: «نشست + Mutex/انتخاب».
اجاره-شناسه с TTL، keepalive ؛ شما می توانید یک دوره را در یک مقدار کلیدی ذخیره کنید.
4. 3 کنسول
'session' + 'KV به دست آوردن': هر کسی که دارای کلید رهبر است. TTL/ضربان قلب در جلسه
4. 4 کوبرنتیز
اجاره هماهنگی API ("هماهنگی. کی 8 اس io/v1 '): ресурс' Lease 'c' holder 'Identity', 'leaseDurationSeconds', 'renewTime'.
کتابخانه مشتری «leaderelection» (مشتری برو) ضبط/تجدید را اجرا می کند ؛ ایده آل برای رهبر غلاف.
5) چگونه یک رهبر «امن» بسازیم
5. 1 نگه داشتن دوران و شمشیربازی
هر سرب دوره را افزایش می دهد (به عنوان مثال etcd/ZK تجدید نظر zxid یا شمارنده جداگانه).
تمام عوارض جانبی رهبر (نوشتن به پایگاه داده، انجام وظایف) باید «دوره» منتقل شود و مقایسه شود:sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
رهبر قدیمی (پس از تقسیم مغز) رد خواهد شد.
5. 2 زمان بندی
'leaseDuration' ≥ '2-3 × ضربان قلبInterval + شبکه + p99 GC مکث'.
مهلت انتخابات - تصادفی (jitter) به طوری که نامزدها برخورد نمی کنند.
اگر تجدید از دست رفته باشد، بلافاصله عملیات بحرانی را متوقف کنید.
5. 3 هویت
'holderId = گره #pid #startTime #rand'. هنگام به روز رسانی/از بین بردن، همان دارنده را بررسی کنید.
5. 4 ناظران
همه پیروان به تغییرات «اجاره/انتخابات» و شروع/توقف با توجه به وضعیت مشترک می شوند.
6) پیاده سازی: قطعات
6. 1 کوبرنتیز (برو)
go import "k8s. io/client-go/tools/leaderelection"
lec:= leaderelection. LeaderElectionConfig{
Lock: &rl. LeaseLock{
LeaseMeta: metav1. ObjectMeta{Name: "jobs-leader", Namespace: "prod"},
Client: coordClient,
LockConfig: rl. ResourceLockConfig{Identity: podName},
},
LeaseDuration: 15 time. Second,
RenewDeadline: 10 time. Second,
RetryPeriod: 2 time. Second,
Callbacks: leaderelection. LeaderCallbacks{
OnStartedLeading: func(ctx context. Context) { runLeader(ctx) },
OnStoppedLeading: func() { stopLeader() },
},
}
leaderelection. RunOrDie(context. Background(), lec)
6. 2 etcd (برو)
go cli, _:= clientv3. New(...)
sess, _:= concurrency. NewSession(cli, concurrency. WithTTL(10))
e:= concurrency. NewElection(sess, "/election/rollup")
_ = e. Campaign (ctx, podID )//blocking call epoch: = sess. Lease ()//use as part of fencing defer e. Resign(ctx)
6. 3 ZooKeeper (جاوا، موزه دار)
java
LeaderSelector selector = new LeaderSelector(client, "/leaders/rollup", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership () performs leader work with try/finally
7) انتخابات مجدد و تخریب خدمات
حرکات تند و تیز از رهبر → «استخوان ماهی» در نمودار. درمان با افزایش leaseDuration/renewDeadline و از بین بردن اره GC/CPU.
برای دوره انتخاب مجدد، brownout را فعال کنید: شدت وظایف پس زمینه را کاهش دهید یا آنها را به طور کامل به یک رهبری تایید کنید.
برای مشاغل طولانی، انجام ایست بازرسی + dokat idempointent پس از تغییر رهبر.
8) تقسیم مغز: چگونه به ماندن بگیرید
استفاده از فروشگاه های CP (etcd/ZK/Consul) با حد نصاب ؛ نميتوني بدون حد نصاب رهبري کني.
هرگز رهبری در کش AP بدون یک داور حد نصاب ساخت.
حتی در مدل CP، نرده ها را در سطح منابع نگه دارید - این بیمه در برابر سناریوهای غیر طبیعی نادر (مکث، رانندگان گیر کرده) است.
9) قابلیت مشاهده و عملکرد
معیارهای اندازه گیری
'leadership _ is _ leader {app}' (سنج 0/1).
'election _ total {result = won' lost 'resign}'.
'lease _ renew _ latency _ ms {p50, p95, p99}', 'lease _ renew _ fail _ total'.
'epoch _ value' (یکنواختی خوشه).
'flaps _ total' تعداد جابجایی رهبر در هر پنجره است.
برای ZK/etcd: تکرار تاخیر، سلامت حد نصاب.
هشدارها
تغییر مکرر سرب (> N در یک ساعت).
شکست تجدید 'تجدید '/بالا p99.
ناپایداری دوره (دو دوره مختلف در گره های مختلف).
هیچ رهبری بیش از X ثانیه وجود ندارد (اگر کسب و کار اجازه ندهد).
سیاهههای مربوط/مسیرهای پیاده روی
رویدادهای پیوند: «epoch»، «holderId»، «reason» (اجاره نامه از دست رفته، جلسه منقضی شده)، «duration _ ms».
10) کتابهای تست (روزهای بازی)
پارتیشن: شکستن شبکه بین 2 منطقه - رهبری تنها در بخش حد نصاب مجاز است.
GC-stop: مصنوعی رهبر را برای 5-10 ثانیه متوقف می کند - باید اجاره نامه را از دست بدهد و کار را متوقف کند.
انحراف ساعت/رانش: اطمینان حاصل کنید که صحت به ساعت دیواری بستگی ندارد (شمشیربازی/دوره ذخیره می شود).
کشتن -9: رهبر ناگهانی سقوط → رهبر جدید ≤ leaseDuration.
ذخیره سازی آهسته: دیسک های آهسته/ورود به سیستم قایق - برآورد زمان انتخابات، زمان اشکال زدایی.
11) ضد الگوهای
«رهبر» از طریق Redis 'SET NX PX' بدون شمشیربازی و بدون حد نصاب.
«leaseDuration» کمتر از p99 مدت زمان عملیات بحرانی است.
توقف/ادامه کار پس از از دست دادن رهبری («من یک دقیقه به پایان خواهد رسید»).
فقدان jitter در تایمر انتخابات → طوفان انتخابات.
یک کار طولانی با هیچ ایست بازرسی - هر فلپ منجر به پخش مجدد از ابتدا می شود.
لینک نزدیک رهبری و مسیریابی ترافیک (چسبنده) بدون fallback - پایین با فلپ دریافت 5xx.
12) چک لیست پیاده سازی
- داور سهمیه انتخاب شده etcd/ZK/Consul/K8s اجاره است.
- ذخیره و انتقال دوره/شمشیربازی به تمام عوارض جانبی رهبر.
- زمان بندی های پیکربندی شده عبارتند از «leaseDuration»، «renewDeadline»، «retryPeriod» با حاشیه شبکه/GC.
- ساخته شده در ناظران و خاموش کردن درست زمانی که رهبری از دست داده است.
- وظایف رهبری idemotent و بازرسی هستند.
- معیارها/هشدارها و ورود به سیستم «epoch/holderId» فعال هستند.
- روزهای بازی برگزار شد: پارتیشن، GC-stop، kill، clock skew.
- سیاستمداران مستند شده اند: چه کسی/چه رهبر انجام می دهد، چه کسی می تواند او را جایگزین کند، چگونه اختلافات دوره را حل کند.
برنامه تخریب: آنچه یک سیستم بدون رهبر انجام می دهد
- تست عملکرد: فلپ ها تحت بار SLO را نابود نمی کنند.
13) سوالات متداول
س: آیا رهبری می تواند بدون حد نصاب ساخته شود ؟
A: در قالب، نه. شما نیاز به یک جزء CP (quorum) یا یک سرویس ابر با تضمین معادل آن دارید.
س: چرا اجاره وجود دارد ؟
A: اجاره قابلیت بقا را فراهم می کند، اما در برابر «رهبر قدیمی» پس از جدایی/مکث محافظت نمی کند. عصر/حصارکشی اثرات رهبر قدیمی را بی اعتبار می کند.
س: پیش فرض های زمان بندی در K8s چیست ؟
A: اغلب «LeaseDuration≈15s»، «RenewDeadline≈10s»، «RetryPeriod≈2s» استفاده می شود. بار P99 و GC خود را مطابقت دهید.
س: چگونه رهبری را به صورت محلی تست می کنید ؟
A: اجرای 3-5 نمونه، تقلید شبکه (tc/netem)، مکث (SIGSTOP)، کشتن رهبر (SIGKILL)، بررسی معیارها/سیاهههای مربوط/epochs.
س: هنگام تغییر رهبران با وظایف طولانی چه باید کرد ؟
A: ایست بازرسی + اسناد idemotent ؛ در صورت از دست دادن رهبری - توقف فوری و آزادی منابع.
14) مجموع
انتخاب قابل اعتماد رهبر یک داور حد نصاب + نظم و انضباط از دوره است. رهبری را به عنوان یک اجاره نامه با یک ضربان قلب نگه دارید، تمام اثرات را با یک نشانه شمشیربازی ضرب کنید، زمان بندی را با یک حاشیه تنظیم کنید، وظایف رهبر را بی نظیر و قابل مشاهده کنید، به طور مرتب سقوط را از دست بدهید. سپس «یک و تنها یک» مجری یک شعار نخواهد بود، بلکه تضمینی است که در برابر مکث، هوس های شبکه و خطاهای انسانی مقاوم است.