שכפול ועקביות סופו של דבר
שכפול ועקביות סופו של דבר
1) מדוע בסופו של דבר עקביות
כאשר המערכת מופצת על ידי אזורים/אזורים, הקלטה סינכרונית בכל מקום מעניקה איחוי גבוה וזמינות נמוכה במקרה של כשלים ברשת. בסופו של דבר עקביות (EC) מאפשרת היערכות שגויה זמנית של העתקים לטובת:- עיכוב הקלטה נמוך (קליטה מקומית),
- זמינות טובה יותר במהלך מחיצות רשת,
- סולם אופקי.
משימת המפתח מבוקרת עקביות רופפת: המשתמש רואה נתונים ”טריים למדי”, domain invariants נשמרים, קונפליקטים מתגלים ונפתרים באופן צפוי.
2) מודלים עקביים - מה שאנחנו מבטיחים ללקוח
קריאה מיד רואה את הרישום האחרון.
Bounded stale/read-not-oker-than (RNOT): קרא לא ישן יותר מהמארק (LSN/גרסה/זמן).
מערכת יחסים סיבתית (A עד B) נשמרת.
לקוח רואה את ההקלטות האחרונות שלו.
מונוטוני קורא: כל קריאה הבאה אינה ”מתגלגלת לאחור”.
סט של ערבויות בפגישה אחת.
בסופו של דבר: אם אין רישומים חדשים, כל העתקים מתכנסים.
תרגול: לשלב הפעלה + RNOT במסלולים קריטיים ובסופו של דבר במחסנים/מטמונים.
3) שכפול: מכניקה ואנטי ־ אנטרופיה
Synchronous (quorum/RAFT): התקליט נחשב להצלחה לאחר אישור על ידי N nodes; מינימום RPO, מעל p99.
Asynchronous: מנהיג מתחייב באופן מקומי, מפיץ יומן מאוחר יותר; Latency נמוך, RPO> 0.
פיזי (WAL/binlog): מהיר, הומוגני.
Logical/CDC: Row/Event level לשנות את הזרימה, ניתוב גמיש, מסננים.
אנטי-אנטרופיה: פיוס ותיקון מחזוריים (עצי מרקל, השוואת חשיש, חידוש רקע).
4) מזהים גרסה ופקודות סיבתיות
גרסאות מונוטוניות: curment/LSN/epoch; פשוט, אבל לא מקודד מקביליות.
חותמת זמן: סדר חלקי לפי שעון הגיוני.
שעון וקטורי: מתקן ענפים מקבילים ומאפשר לך לזהות עדכונים סותרים (במקביל).
היברידי/TrueTime/Clock-SI: ”לא לפני T” לוגיקה לסדר עולמי.
המלצה: עבור עדכוני CRDT/סותרים - שעון וקטורי; עבור ”לא מבוגר יותר” - LSN/GTID.
5) קונפליקטים: גילוי ופתרון
מצבים טיפוסיים: הקלטה משני אזורים לאותו אובייקט.
אסטרטגיות:1. Last-Write-Wins (LWW) לפי שעה/בול לוגי - פשוט, אבל עלול ”לאבד” עדכונים.
2. מיזוג פונקציות לפי לוגיקת התחום:- שדות נגד מתווספים (G-Counter/PN-Counter),
- סטים משולבים עם ”הוספת ניצחונות/הסרת ניצחונות”,
- כמויות/איזון - רק באמצעות יומני עסקאות, לא באמצעות LWW פשוט.
- 3. CRDT (סוגים מתכנסים): G-Counter, OR-SET, LWW-Register, RGA לרשימות.
- 4. טרנספורמציות מבצעיות (לעיתים נדירות עבור מאגרי מידע, לעיתים קרובות יותר עבור עורכים).
- 5. פתרון ידני: קונפליקט בתיבת הדואר הנכנס, המשתמש בוחר את הגרסה הנכונה.
חוק: דומיין אינווריאנטים מכתיבים אסטרטגיה. עבור כסף/איזון - להימנע LWW; השתמש בעסקאות/אירועים מפוצים.
6) אחריות שיא ואידמפוטנטיות
מפתחות אידמפוטנטים על פקודות (תשלום, משיכה, יצירת) * retry הוא בטוח.
תיבת דואר אלקטרוני ושכפול תיבה על ידי מספר מקש/מספר סידורי.
בדיוק-פעם אחת הוא בלתי ניתן להשגה ללא הנחות חזקות; תרגול לפחות פעם אחת עם אידמפוטנטיות.
תבנית Outbox/Inbox: כתיבה לבסיס הנתונים ופרסום האירוע היא אטומית (עסקה מקומית), תהליך הנמען על ידי idempotency-key.
7) אין קריאות X מבוגרות יותר (RNOT)
טכנאים:- שער LSN/GTID: הלקוח מעביר את הגרסה המינימלית (מתגובת הכתיבה), הנתב/פרוקסי שולח אל ההעתק שתפס את LSN winder X, אחרת - אל המנהיג.
- זמן: ”לא מבוגר מ-2 שניות” - SLA פשוט ללא גרסאות.
- Session Pinning: לאחר הקלטת N שניות, אנו קוראים רק את המנהיג (Read-Your-Wrots).
8) שינוי זרם ומתן מטמון
CDC = אוטובוס אירועים (Kafka/Pulsar) # צרכנים (מטמונים, אינדקסים, חנויות).
נכות מטמון: נושאים 'לבטל: (ns): עיבוד אידמפוטנטי.
בנייה מחדש/הילוך אחורי: אם מתוך סנכרון, להרכיב מחדש את התחזיות מתוך יומן האירוע.
9) סאגות ופיצויים (עסקאות בין-שירות)
בעולם המט "ח, פעולות שנמשכו זמן רב מחולקות לצעדים עם פעולות פיצוי:- המתאם קורא את הצעדים ואת הפיצויים שלהם.
- כוריאוגרפיה: צעדים מגיבים לאירועים ומפרסמים את הדברים הבאים בעצמם.
אינווריאנטים (דוגמה): ”שיווי משקל 0” - בדוק את גבולות שלב + פיצוי על סטייה.
10) ריבוי אזורים ומחיצות רשת
local-write, async-acclate: לכתוב לאזור מקומי + לספק לאחרים (EC).
גיאו-סייף: נתונים ”מודבקים” לאזור (Latency Latency, פחות קונפליקטים).
מסדי נתונים של קוורום (רפסודה) עבור נתוני CP; מחסנים/חנויות - AP/EC.
תוכנית פיצול-מוח: אם התקשורת אבדה, האזורים ימשיכו לפעול בגבולות תחום (כתיבה, מכסות), ואז להתפייס.
11) יכולת תצפית ו ־ SLO
מדדים:- העתק לאג: זמן/LSN-מרחק/offset (p50/p95/p99).
- סטבנס: אחוז התגובות הנמצאות מעל הסף (לדוגמה,> 2s או LSN
- שיעור הקונפליקט: שיעור הקונפליקטים ומיזוג מוצלח.
- זמן ההתכנסות: זמן ההתכנסות של ההעתקים אחרי השיא.
- התפייסות: נפח/זמן הפיגור של חבורות.
- RPO/RTO לפי קטגוריית הנתונים (CP/AP).
- Lag> היעד, עלייה בקונפליקטים, חלונות ”ארוכים” של אי נוחות.
12) עיצוב ערכת נתונים EC
גרסה מפורשת/וקטור בכל כניסה (עמודות 'גרסה', 'vc').
יומני Append בלבד לאינווריאנטים ביקורתיים (מאזנים, אקטואלים).
זיהוי אירועים (פתית שלג/ULID) לצורך הזמנה ושכפול.
שדות קומוטטיבי (דלפקים, סטים) = מועמדי CRDT.
שים עם התאמה/תג, טלאי עם תנאי מוקדם.
13) דפוסי אחסון וקריאה
קרא מודל/CQRS: כתיבה אל ה ”מקור”, קריאה מתחזיות (עשויה לפגר אחרי תצוגה ”מעודכנת”...).
נתיבים מעופשים (קטלוג/טייפ) נגד סטריקים (ארנק/גבולות).
דגלים דביקים/מעופשים בקשת (hader 'x-read-עקביות).
14) רשימת מימושים (0-45 ימים)
0-10 ימים
קטגוריות נתונים: CP-critical (כסף, הזמנות) נגד EU/Steel-OK (קטלוגים, אינדקסי חיפוש).
הגדר SLOs של סטיל (למשל: ”לא מבוגר יותר מ-2”), יעד מפגר.
אפשר איתור אובייקטים ומפתחות אידמפוטנציה ב-API.
11-25 ימים
יישום CDC ו תיבת יוצא/תיבת דואר אלקטרוני, נתיבי נכות מטמון.
הוספת RNOT (שער LSN) והצבת פינג למסלולים כתיבה-קריטיים.
יישום אסטרטגיית מיזוג אחת לפחות (LWW/CRDT/domain) ויומן קונפליקט.
26-45 ימים
אוטומטית אנטי-אנטרופיה (פיוס/תיקון) ודיווחי סטיילינג.
לבלות יום משחק: הפרדת רשת, נחשול בקונפליקטים, התאוששות.
דמיינו על לוחות מחוונים: פיגור, סטריליות, שיעור עימות, התכנסות.
15) אנטי דפוסים
LWW עיוור עבור אינווריאנטים קריטיים (אובדן כסף/נקודות).
חוסר אידמפוטנטיות * כפילות של פעולות במהלך הרכבות.
המודל ”החזק” על כל p99 זנבות מוגזמים ושבריריות במקרה של כישלונות.
לא RNOT/Session מבטיחה * UX ”ממצמץ”, המשתמשים ”לא רואים” את השינויים שלהם.
מטמון חבוי ויישור לא נכון של המקור (לא CDC/נכות).
חוסר בכלי להתפייסות/אנטי-אנטרופיה - נתונים ”במשך מאות שנים” מתפצלים.
16) מדדי בגרות
Replica lag p95 delage target (לדוגמה, בלום 500 ms בתוך אזור, 2 S בין אזורים).
”סטלינס SLO” מבוצעת ב-99% מהבקשות במסלולים ”נוקשים”.
הצלחה בפתרון סכסוכים ב-99. 9%, זמן רזולוציה ממוצע של 1 דקות.
התכנסות זמן אחרי פסגות - דקות, לא שעות.
100% מעסקאות ”כסף” מכוסות על ידי מפתחות אידמפוטנטיות ותיבת דואר אלקטרוני.
17) מתכונים (קטעים)
אם להתאים/ETag (HTTP)
PUT /profile/42
If-Match: "v17"
Body: { "email": "new@example.com" }
אם הגרסה השתנתה - 412 'תנאי מוקדם נכשל' = הלקוח פותר את הקונפליקט.
שאילתה ”לא מבוגר מ ־ LSN” (פסאודו)
x-min-lsn: 16/B373F8D8
הנתב בוחר העתק עם 'replay _ lsn min-isn', אחרת הוא המנהיג.
CRDT G-Counter (רעיון)
כל אזור שומר על דלפק משלו; סה "כ - סך כל הרכיבים שכפול - פעולה היא חולפת.
18) מסקנה
סופו של דבר עקביות היא לא פשרה של איכות, אלא חוזה מודע: איפשהו אנחנו משלמים רעננות למען מהירות וזמינות, אבל אנחנו מגנים על אינווריאנטים קריטיים עם אסטרטגיות תחום וכלים. הזן גרסאות, אידמפוטנטיות, אחריות RNOT/Session, CDC ואנטי-אנטרופיה, מדד לאג/סטביליות/קונפליקטים - והמערכת המבוזרת שלך תהיה מהירה, יציבה וצפויה להתכנס אפילו תחת תקלות ועומס שיא.