בחירת המנהיג
1) למה אתה צריך מנהיג וכשהוא מוצדק בכלל
מנהיג - צומת שיש לו הזכות הבלעדית לבצע פעולות קריטיות: הפעלת כתר/ETL, תיאום רסיסים, חלוקת מפתחות, שינוי ההגדרות. היא מפשטת אינווריאנטים (”שחקן אחד”), אך מוסיפה סיכונים (SPOF, בחירה מחדש, לג).
השתמש במנהיגות אם:- צריך ייחודיות של ביצוע (למשל, צובר חיוב פעם בדקה);
- שינויים צריכים להיות סריאליים (קובץ הגדרות, מנעולים מבוזרים)
- פרוטוקול האשכול מניח שכפול מנהיגות (רפסודה).
- הבעיה נפתרת על ידי אידמפוטנטיות וסדר על ידי מפתח;
- יכול להיות מקביל דרך עבודה גניבת תורים/תורים;
- ”מנהיג” הופך לנקודה הצרה היחידה (מאוורר רחב).
2) מודל בסיס: חכירה + מניין + epoch
תנאים
המנהיג זכאי לשניות T; חייבים לחדש.
פעימות לב: הארכה תקופתית/אות חי.
אפוץ '/מונח: מספר המנהיגות גדל באופן חד משמעי. עוזר לזהות מנהיגים ”ישנים”.
סיוף אסימון: אותו מספר מונוטוני שצרכן המשאבים (מסד נתונים/אחסון) בודק ודוחה את פעולותיו של המנהיג הישן.
אינווריאנטים
בכל רגע נתון, לא יותר ממנהיג אחד (ביטחון).
במקרה של כישלון, הקידמה אפשרית: אחד חדש (לביאה) נבחר בזמן סביר.
מבצעי מנהיג מלווים בעידן; החטא מקבל רק תקופות חדשות יותר.
3) סקירה של אלגוריתמים ופרוטוקולים
3. רפסודה 1 (שכפול מנהיגות)
Status: Follower # Process Rader.
טיימרים: זמן בחירות אקראי (jitter), הצבעה חופשית; המנהיג מחזיק נספחים כדופק.
ערבויות: מניין, אין פיצול-מוח תחת תנאים מוקדמים סטנדרטיים, לוגוק עם מונוטוניות לוגית (מונח/אינדקס).
3. 2 פקסוס/צו יחיד/רב פקסוס
בסיס תיאורטי של קונצנזוס; בפרקטיקה - וריאציות (למשל, Multi-Paxos) עם ”מתאם נבחר” (מנהיג אנלוגי).
קשה יותר ליישם ישירות; שימוש רב יותר ביישומים/ספריות.
3. 3 ZAB (שידור אטומי שומר)
מנגנון ZK: שכפול כתב עת מנהיגות עם שלבי התאוששות; epochs (zxid) וצמתים חלופיים רציפים עבור פרימיטיבים כמו מנהיגות.
3. 4 Bully/Chang-Roberts (טבעות/מונרך)
אלגוריתמי ”אימון” לטופולוגיות סטטיות ללא מניין. אל תיקח בחשבון כשלים חלקיים ברשת/מחיצות - אינם חלים במכירות.
4) פלטפורמות מעשיות
4. שומר מזוודות 1
דפוס EPHEMERAL_SEQUENTIAL: התהליך יוצר '/leader/lock-XXXX ', המספר המינימלי הוא המוביל.
אובדן קשר המפגש נעלם הבחירה מחדש היא מיידית.
צדק דרך מחכה ”קודמו”.
4. 2 etcd (רפסודה)
מנהיגות ילידית ברמת האשכול עצמו; עבור יישומים - etcd currency: ”Session + Mutex/Election”.
זיהוי חכירה באמצעות TTL, keepalive; אתה יכול לאחסן עידן בעל ערך מפתח.
4. 3 קונסול
'Session' + 'KV לרכוש': מי שמחזיק את המפתח הוא המנהיג. הפעלה של TTL/פעימות לב.
4. 4 קוברנטס
תיאום חכירה API ("תיאום. K8. io/v1 ':' Lise 'c' holderIdentity ',' leiss DurationSeconds ',' Renewing Time '.
ספריית הלקוח 'leaderelection' (לקוח-go) מיישמת לכידה/חידוש; אידיאלי למנהיגים-תרמילים.
5) כיצד לבנות מנהיג ”בטוח”
5. 1 שמור על העידן והסיף
כל עופרת מגדילה את העידן (לדוגמה: etcd/ZK revision zxid או בדלפק נפרד).
כל תופעות הלוואי של המוביל (כתיבה לבסיס הנתונים, ביצוע משימות) חייבות להיות מועברות ”epoch” ולהשוות:sql
UPDATE cron_state
SET last_run = now(), last_epoch =:epoch
WHERE name = 'daily-rollup' AND:epoch > last_epoch;
המנהיג הישן (אחרי פיצול המוח) יידחה.
5. 2 עיתוי
'Leiss Duration' im '2-3 × heart beatInteral + network + p99 GC pause.
פסק זמן של בחירות - אקראי (ג 'יטר) כדי שהמועמדים לא יתנגשו.
אם החידוש אבד, מיד לעצור פעולות קריטיות.
5. 3 זהות
Holderid = node # pid # stattime # 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 שומר (ג 'אווה, אוצר)
java
LeaderSelector selector = new LeaderSelector(client, "/leaders/rollup", listener);
selector. autoRequeue();
selector. start(); // listener. enterLeadership () performs leader work with try/finally
7) בחירות מחדש והשפלת השירות
נפיחות חדות של המנהיג * ”עצם הדג” בתרשימים. מטופל על ידי הגדלת משך/חידוש דדליין וחיסול מסורי GC/CPU.
עבור תקופת הבחירה מחדש, אפשר brownout: להפחית את העוצמה של משימות רקע או להקפיא אותם לחלוטין למנהיגות מאושרת.
עבור עבודות ארוכות, לעשות נקודות ביקורת + דוקאט אידמפוטנטי לאחר שינוי של מנהיג.
8) פיצול מוח: איך להישאר בחוץ
השתמש במאגרי CP (etcd/ZK/Consul) עם מניין; אתה לא יכול לקחת מנהיג בלי מניין.
לעולם אל תבנו מנהיגות על מטמון ללא פוסק מניין.
אפילו במודל CP, שמור על גידור ברמת המשאבים - זהו ביטוח נגד תרחישים חריגים נדירים (הפסקה, נהגים תקועים).
9) יכולת תצפית ותפעול
מדדים
'leadische _ is _ leader [app]' (מודד 0/1).
'Explication _ סך הכל תוצאה' won 'lost' לכתר.
'חכירה _ renew _ latency _ mm _ p50, p95, p99', 'חכירה _ renew _ fall _ all'.
'epoch _ value' (אשכול מונוטוני).
'פלאפס _ סה "כ' הוא מספר משמרות המנהיג בכל חלון.
עבור ZK/etcd: lag שכפול, בריאות מניין.
התראות
שינוי עופרת תכוף (> N בשעה).
כשלים בחידוש 'חידוש '/high p99.
epoch infeability (שתי תקופות שונות בצמתים שונים).
אין מנהיג יותר מ-X שניות (אם העסק אינו מאפשר).
יומנים/שבילים
מאורעות קישור: 'epoch', 'holderId',' סיבה '(lost lise, session פג תוקף),' משך _ ms'.
10) ספרי משחק (ימי משחק)
מחיצה: לשבור את הרשת בין אזורי 2 - מנהיגות מותרת רק בחלק המניין.
ג 'י-סי-סטופ: לעצור את המנהיג באופן מלאכותי ל-5-10 שנים צריך לאבד את חוזה השכירות ולהפסיק לעבוד.
skew/drift: ודא שהתקינות אינה תלויה בשעון-קיר (סיף/אפוץ 'נשמר).
להרוג -9: התרסקות מנהיג פתאומית # מנהיג חדש Leiss Duration.
אחסון איטי: האט דיסקים/רישום רפסודה - זמן בחירות אומדן, תזמון דיבוג.
11) אנטי דפוסים
”מוביל” דרך ”רדיס” סט NX PX 'with אין גידור ואין מניין.
'Leiss Duration' הוא פחות מ -p99 של משך הפעולה הקריטית.
עצירה/המשך עבודה לאחר אובדן מנהיגות (”אני אסיים דקה”).
חוסר התלהבות בעיתוני הבחירות הוא סערת בחירות.
עבודה אחת ארוכה ללא מחסומים - כל דש תוצאות שידור חוזר מאפס.
קישור קרוב של מנהיגות וניתוב תנועה (דביק) ללא נסיגה - תחתיות עם דש לקבל 5xx.
12) רשימת מימושים
[ ] קוורום נבחר הוא etcd/ZK/Consul/K8s חוזה שכירות.
[ חנות ] ולהעביר עידן/גידור לכל תופעות הלוואי המנהיגות.
[ התזמון המוגדר ] הוא ”Leisded Duration”, ”Reeneweed Deadline”, ”Retracted Perior” עם שולי רשת/GC.
[ ] צופים מובנים וכיבוי נכון כאשר המנהיגות אבודה.
[ משימות מנהיגות ] הן אידמפוטנטיות ומחסום.
[ ] מטריצות/התראות ורישום 'epoch/holderId' מופעלים.
[ ] נערך ימי משחק: מחיצה, ג 'י-סי-סטופ, להרוג, שעון דק.
[ ] מתועדים פוליטיקאים: מי/מה המנהיג עושה, מי יכול להחליף אותו, איך לפתור סכסוכים.
[ תוכנית ההשפלה ]:
[ מבחן ביצועים ]: דשים תחת עומס לא להרוס SLO.
13) FAQ
ש: האם מנהיגות יכולה להיבנות ללא מניין?
א ': בדרבן, לא. אתה צריך רכיב CP (מניין) או שירות ענן עם ערבויות שקולות.
קיו: למה בכלל יש חוזה שכירות?
א ': חכירה מספקת הישרדות, אך אינה מגנה מפני ”המנהיג הזקן” לאחר הפרידה/הפסקה. אפוץ '/סייף פוסל את ההשפעות של המנהיג הישן.
קיו: מהם ברירות המחדל של התזמון K8s?
א ': לעתים קרובות משתמשים ב' Laise Duration's ',' RenewLadine ',' Retraction Time 2 '. התאם את טעינת ה-p99 וה-GC שלך.
קיו: איך בוחנים מנהיגות מקומית?
A: הפעלת 3-5 מקרים, חיקוי רשת (tc/netem), הפוגה (SIGSTOP), kill leader (SIGKILL), בדיקת מטריות/לוגים/epochs.
קיו: מה לעשות עם משימות ארוכות בהחלפת מנהיגים?
A: Checkpoint + idempotent docat; במקרה של אובדן מנהיגות - עצירה מיידית ושחרור משאבים.
14) סיכומים
בחירה אמינה של מנהיג היא פוסק מניין + משמעת של תקופות. לשמור על המנהיגות כחכירה עם פעימות לב, לנצח את כל האפקטים עם סיף אסימון, להגדיר תזמון עם מרווח, להפוך את משימות המנהיג אידיאמפוטנטי וצופה, באופן קבוע לאבד קריסות. ואז אמן ”אחד ויחיד” לא יהיה סיסמה, אלא ערובה לכך שהוא עמיד בפני הפוגה, גחמות רשת וטעויות אנושיות.