بازگشت به کتابخانهکتابخانه14.4دیتابیس‌های سراسری: Spanner و TrueTime
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 14.4فصل ۱۴سیستم‌های توزیع‌شده پیشرفته

دیتابیس‌های سراسری: Spanner و TrueTime

  • ~۱۳ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

سخت‌ترین مسئله دیتابیس توزیع‌شده: تراکنش قوی روی داده‌ای که در چند قاره کپی شده است. دهه‌ها گفته می‌شد «یا سازگاری یا سرعت جهانی» — تا اینکه Google با Spanner ترفند عجیبی زد: به‌جای حدس زدن زمان، عدم‌قطعیتِ زمان را اندازه گرفت و صبر کرد.

مسئله: ساعت، دشمنِ ترتیب

در فصل ۹ دیدیم که ساعت ماشین‌ها دقیق نیست (skew چند میلی‌ثانیه تا ثانیه). حالا تصور کن تراکنش T1 در اروپا commit می‌شود و یک میلی‌ثانیه بعد T2 در آمریکا — با ساعت‌های معمولی هیچ‌کس نمی‌تواند بگوید کدام اول بود؛ ولی برای external consistency (همان linearizability در مقیاس سراسری) باید ترتیب واقعی حفظ شود.

TrueTime: نه «زمان دقیق»، بلکه «بازه دقیقِ عدم‌دقت»

TrueTime API
به‌جای یک عدد، بازه [earliest, latest] برمی‌گرداند: «الان حتماً داخل این بازه است». منابع زمان: ساعت‌های اتمی + GPS در دیتاسنترها + همگام‌سازی مداوم؛ پهنای بازه معمولاً چند میلی‌ثانیه است.
Commit-Wait
تراکنش وقتی commit می‌کند که timestamp اش را بگیرد و تا گذشتِ latest صبر کند — یعنی مطمئن شویم «گذشته» واقعاً گذشته. نتیجه: اگر T1 قبل از T2 در دنیای واقعی تمام شد، timestamp اش هم کوچک‌تر است.
Snapshot Read جهانی
خواندن در یک timestamp مشخص بدون قفل: هر replica نسخه‌های نگهداشته را تا آن لحظه برمی‌گرداند — خواندن سازگار سراسری بدون متوقف‌کردن نوشتن‌ها.

قیمت: commit-wait چند میلی‌ثانیه تأخیر به هر تراکنش اضافه می‌کند و به زیرساخت زمانِ ویژه نیاز دارد. CockroachDB همین ایده را با HLC (فصل ۹) و بدون ساعت اتمی پیاده می‌کند و برای اطمینان، «عدم‌قطعیت بیشتر» را با مکانیزم‌های دیگر جبران می‌کند. درس بزرگ‌تر: جادوی Spanner نه در الگوریتم که در صادقانه‌مدل‌کردنِ زمان است — عدم‌قطعیت را پنهان نکرد، اندازه‌اش گرفت و کنارش حساب کرد.

کی دیتابیس سراسری می‌خواهی؟

  • وقتی چند region فعال می‌خواهی ولی از درد conflict resolution و multi-leader فرار می‌کنی: Spanner/Cockroach تراکنش سازگار سراسری می‌دهند به قیمت تأخیر نوشتن (RTT بین region ها + commit-wait).
  • برای اغلب سیستم‌ها همان الگوی فصل ۹ کافی است: home region برای نوشتن + replica برای خواندن جهانی.
  • قبل از انتخاب، SLO بخوان: اگر کاربرانت در یک قاره‌اند، دیتابیس سراسری پیچیدگی اضافه است؛ اگر RTO/RPO≈0 بین‌قاره‌ای با سازگاری قوی می‌خواهی، این خانواده ساخته شده برای دقیقاً همان.

به زبان ساده

Spanner با ساعت‌های اتمی و اتم GPS بازه «عدم قطعیت زمان» را می‌سنجد و با صبرکردنِ آن بازه، به همه دنیا یک ترتیب واحدِ تراکنش می‌دهد.

مثال واقعی

دو نفر در دو سرِ زمین هم‌زمان آخرین بلیت را می‌خرند؛ Spanner به‌جای حدس زدن ساعت، چند میلی‌ثانیه صبر می‌کند تا مطمئن شود کدام تراکنش واقعاً اول بود.

دانش‌سنجی

آزمون درس

۴ Q
01
TrueTime چه چیزی متفاوت از NTP ارائه می‌دهد؟
02
Commit-Wait در Spanner چرا وجود دارد؟
03
چرا snapshot read در Spanner قفل نمی‌گیرد؟
04
برای سرویسی با کاربران یک کشور و SLO معمولی، Spanner-خانواده…