تکرار و سازگاری احتمالی
تکرار و سازگاری احتمالی
1) چرا ثبات نهایی
هنگامی که سیستم توسط مناطق/مناطق توزیع می شود، ضبط همزمان در همه جا باعث تأخیر زیاد و دسترسی کم در صورت خرابی شبکه می شود. سازگاری احتمالی (EC) اجازه می دهد تا ناهماهنگی موقت کپی ها به خاطر:- تاخیر ضبط کم (پذیرش محلی)،
- در دسترس بودن بهتر در طول پارتیشن های شبکه،
- مقیاس افقی.
وظیفه اصلی کنترل سازگاری سهل انگاری است: کاربر می بیند «نسبتا تازه» داده ها، ثابت دامنه حفظ می شوند، درگیری شناسایی و حل و فصل قابل پیش بینی.
2) مدل های سازگاری - آنچه ما به مشتری قول می دهیم
قوی: خواندن بلافاصله آخرین ورودی را می بیند.
stale محدود/read-not-old-than (RNOT): خواندن قدیمی تر از علامت (LSN/version/time).
علیت: یک رابطه «علی» (A به B) حفظ می شود.
Read-Your-Writes: مشتری ضبط های اخیر خود را می بیند.
مونوتونیک می خواند: هر خواندن بعدی «به عقب رانده نمی شود».
جلسه: مجموعه ای از تضمین ها در یک جلسه.
احتمالی: اگر هیچ ورودی جدیدی وجود نداشته باشد، تمام کپی ها همگرا می شوند.
تمرین: جلسه + RNOT را در مسیرهای بحرانی و احتمالی در فروشگاه ها/انبارها ترکیب کنید.
3) تکرار: مکانیک و ضد آنتروپی
Synchronous (quorum/RAFT): رکورد پس از تایید توسط N گره موفقیت آمیز در نظر گرفته می شود. حداقل RPO، بالاتر از p99.
ناهمزمان: رهبر به صورت محلی مرتکب می شود، بعدا وارد سیستم می شود ؛ تاخیر کم، RPO> 0.
فیزیکی (WAL/binlog): سریع، همگن.
Logical/CDC: جریان تغییر سطح ردیف/رویداد، مسیریابی انعطاف پذیر، فیلترها.
ضد آنتروپی: آشتی دوره ای و تعمیر (درختان مرکل، مقایسه هش، پس زمینه دوباره همگام سازی).
4) شناسه نسخه و سفارشات علیت
نسخه های یکنواخت: افزایش/LSN/دوره ؛ ساده، اما موازی سازی را رمزگذاری نکنید.
برچسب زمانی Lamport: ترتیب جزئی توسط ساعت منطقی.
ساعت بردار: شاخه های موازی را برطرف می کند و به شما امکان می دهد به روز رسانی های متناقض (همزمان) را تشخیص دهید.
Hybrid/TrueTime/Clock-SI: منطق «نه قبل از T» برای نظم جهانی.
توصیه: برای CRDT/به روز رسانی های متضاد - ساعت بردار ؛ برای «قدیمی نیست» - LSN/GTID.
5) درگیری: کشف و حل و فصل
شرایط معمول: ضبط از دو منطقه به همان شی.
استراتژی ها:1. Last-Write-Wins (LWW) by hour/logical stamp - ساده است، اما ممکن است به روز رسانی ها را از دست بدهد.
2. ادغام توابع توسط منطق دامنه:- زمینه های شمارنده اضافه می شوند (G-Counter/PN-Counter)،
- مجموعه ها با «add-wins/remove-wins» ترکیب می شوند،
- مقادیر/تعادل - فقط از طریق مجلات معامله، نه از طریق یک LWW ساده.
- 3. CRDT (انواع همگرا): G-Counter، OR-Set، LWW-Register، RGA برای لیست ها.
- 4. تحولات عملیاتی (به ندرت برای پایگاه داده ها، بیشتر برای ویراستاران).
- 5. وضوح دستی: درگیری در «صندوق ورودی»، کاربر نسخه صحیح را انتخاب می کند.
قانون: ناورداهای دامنه استراتژی را دیکته می کنند. برای پول/تعادل - اجتناب از LWW ؛ استفاده از معاملات/رویدادهای جبران شده.
6) ضمانت ضبط و idempotency
کلید Idempotent در دستورات (پرداخت, برداشت, ایجاد) → تلاش مجدد امن است.
deduplication صندوق ورودی و خروجی توسط کلید idempotence/شماره سریال.
دقیقا یک بار بدون محل قوی غیر قابل دستیابی است ؛ تمرین حداقل یک بار + idemotency.
الگوی صندوق ورودی/صندوق ورودی: نوشتن در پایگاه داده و انتشار رویداد اتمی است (معامله محلی)، گیرنده با کلید idempointency پردازش می شود.
7) بدون خواندن قدیمی تر X (RNOT)
تکنسین ها:- دروازه LSN/GTID: مشتری حداقل نسخه (از پاسخ نوشتن) را انتقال می دهد، روتر/پروکسی به ماکت ارسال می کند که با LSN ≥ X گرفتار شده است، در غیر این صورت - به رهبر.
- محدود به زمان: «نه بزرگتر از 2 ثانیه» - SLA ساده بدون نسخه.
- پین جلسه: پس از ضبط N ثانیه، ما فقط رهبر (Read-Your-Writes) را می خوانیم.
8) تغییر جریان و مذاکره کش
CDC → اتوبوس رویداد (Kafka/Pulsar) → مصرف کنندگان (انبارها، شاخص ها، فروشگاه ها).
ناتوانی حافظه پنهان: موضوعات 'invalidate: {ns}: {id}'; پردازش بی نظیر.
بازسازی/Backfill: اگر از همگام سازی، جمع آوری پیش بینی از ورود به سیستم رویداد.
9) ساگا و جبران خسارت (معاملات بین سرویس)
در جهان EC، عملیات طولانی مدت به مراحل با اقدامات جبرانی تقسیم می شوند:- ارکستراسیون: هماهنگ کننده مراحل و جبران آنها را فرا می خواند.
- طراحی رقص: مراحل به وقایع واکنش نشان می دهند و خود را منتشر می کنند.
ثابت (به عنوان مثال): «تعادل ≥ 0» - مرزهای گام + جبران انحراف را بررسی کنید.
10) پارتیشن های چند منطقه ای و شبکه
Local-write, async-replicate: نوشتن در منطقه محلی + تحویل به دیگران (EC).
Geo-fencing: داده ها به منطقه «چسبیده» می شوند (تاخیر کم، درگیری های کمتر).
پایگاه داده های Quorum (قایق) برای داده های CP ؛ انبارها/فروشگاه ها - AP/EC.
طرح تقسیم مغز: اگر ارتباطات از دست رفته باشد، مناطق همچنان در محدوده دامنه (نوشتن شمشیربازی، سهمیه) ادامه می دهند، سپس آشتی می کنند.
11) قابلیت مشاهده و SLO
معیارها:- تاخیر ماکت: زمان/LSN-فاصله/افست (p50/p95/p99).
- Staleness: درصد پاسخ هایی که بالاتر از آستانه هستند (به عنوان مثال،> 2s یا LSN
- نرخ درگیری: نرخ درگیری و ادغام موفق.
- زمان همگرایی: زمان همگرایی ماکت ها بعد از پیک.
- تطبیق بکلاگ: حجم/زمان دستههای تاخیری.
- RPO/RTO بر اساس طبقه بندی داده ها (CP/AP).
- تاخیر> هدف, افزایش درگیری, «طولانی» پنجره های غیر قابل اجرا.
12) طراحی طرح داده EC
نسخه صریح/بردار در هر ورودی (ستون 'نسخه'، 'vc').
اضافه کردن فقط سیاهههای مربوط برای ثابت بحرانی (تعادل، اقلام تعهدی).
شناسه رویداد (snowflake/ULID) برای سفارش و deduplication.
زمینه های جابجایی (شمارنده ها، مجموعه ها) → نامزدهای CRDT.
طراحی API: PUT با if-match/etag، PATCH با پیش شرط.
13) الگوهای ذخیره سازی و خواندن
مدل/CQRS را بخوانید: نوشتن به «منبع»، خواندن از پیش بینی ها (ممکن است عقب بماند → نمایش «به روز شده»...).
مسیرهای Stale-OK (کاتالوگ/نوار) در مقابل سخت (کیف پول/محدودیت).
پرچمهای Sticky/Bounded-stale در درخواست) سرآیند «x-read-consistency» (.
14) چک لیست پیاده سازی (0-45 روز)
0-10 روز
طبقه بندی داده ها: CP-بحرانی (پول، سفارشات) در مقابل اتحادیه اروپا/فولاد-OK (کاتالوگ، شاخص های جستجو).
تعریف SLO های استیل (به عنوان مثال «قدیمی تر از 2S»)، تاخیر هدف.
فعال کردن نسخه بندی شی و idempotency-کلید در API.
11-25 روز
پیاده سازی CDC و صندوق ورودی/صندوق ورودی، مسیرهای ناتوانی حافظه پنهان.
اضافه کردن RNOT (دروازه LSN) و جلسه پینینگ به مسیرهای نوشتن بحرانی.
پیاده سازی حداقل یک استراتژی ادغام (LWW/CRDT/دامنه) و ورود به سیستم درگیری.
26-45 روز
خودکار ضد آنتروپی (آشتی/تعمیر) و گزارش یک ظاهر طراحی شده.
صرف روز بازی: جدایی شبکه، افزایش درگیری ها، بازیابی.
تجسم در داشبورد: تاخیر، خستگی، نرخ درگیری، همگرایی.
15) ضد الگوهای
LWW کور برای ناورداهای بحرانی (از دست دادن پول/امتیاز).
عدم توانایی → تکرار عملیات در طول retrains.
مدل «قوی» در کل → بیش از حد دم p99 و شکنندگی در صورت شکست.
بدون تضمین RNOT/جلسه → UX «چشمک می زند»، کاربران «تغییرات خود را نمی بینند».
عدم توازن حافظه پنهان و منبع (بدون CDC/ناتوانی).
فقدان یک ابزار آشتی/ضد آنتروپی - داده ها «برای قرن ها» واگرایی.
16) معیارهای بلوغ
Replica lag p95 ≤ هدف (به عنوان مثال، ≤ 500 میلی ثانیه در یک منطقه، ≤ 2 بین مناطق).
SLO پایدار ≥ 99٪ از درخواست ها در مسیرهای «سخت» انجام می شود.
موفقیت در حل مشکلات ≥ 99 9٪، متوسط زمان وضوح ≤ 1 دقیقه.
زمان همگرایی پس از قله - دقیقه، نه ساعت.
100٪ از معاملات «پول» توسط کلید های idempotency و صندوق خروجی/صندوق پوشش داده می شود.
17) دستور العمل (قطعه)
اگر مطابقت/ETag (HTTP)
PUT /profile/42
If-Match: "v17"
Body: { "email": "new@example.com" }
اگر نسخه تغییر کرده باشد - «412 پیش شرط شکست خورده» → مشتری درگیری را حل می کند.
پرسوجو «قدیمیتر از LSN نیست») شبه (
x-min-lsn: 16/B373F8D8
روتر یک کپی با «replay _ lsn ≥ x-min-lsn» انتخاب می کند، در غیر این صورت رهبر است.
CRDT G-شمارنده (ایده)
هر منطقه شمارنده خود را نگه می دارد ؛ مجموع - مجموع تمام اجزای Replication - عملیات تعویض است.
18) نتیجه گیری
سازگاری نهایی مصالحه با کیفیت نیست، بلکه یک قرارداد آگاهانه است: جایی که ما به خاطر سرعت و در دسترس بودن تازه بودن را پرداخت می کنیم، اما ما با استراتژی ها و ابزارهای دامنه محافظت می کنیم. نسخه ها، idempotency، RNOT/Session warranties، CDC و anti-entropy را وارد کنید، اندازه گیری تاخیر/staleness/conflicts - و سیستم توزیع خود را سریع، پایدار و قابل پیش بینی همگرا حتی در زیر اشکالات و بارهای پیک.