هر نوشتن سریع، کار رو یه جای دیگه هل میده
خلاصهٔ کاملتر
نویسنده تو این پست سراغ سؤالی میره که هر استوریج انجینی باید جوابش رو بده: قبل از اینکه به کلاینت بگیم نوشتن موفق بود، چه کاری حتماً باید تموم شده باشه؟ سریعترین جواب اینه که بعد از کپی بایتها تو حافظه برگردیم؛ یه نوشتن بادوامِ محلی منتظر fdatasync() روی SSD همون هاست میمونه؛ و اگه بخوایم نوشته بعد از رفتن اون هاست هم بمونه، باید منتظر یه ولوم شبکهای، آبجکت استوریج یا چند سرور دیتابیس بمونیم.
حرف اصلی اینه که این انتخابها تأخیر و دوام رو با هم جابهجا میکنن. اسم سیستمکال یکیه، ولی یه fdatasync() ممکنه روی یه SSD محلی تموم شه و یکی دیگه پشت همون اینترفیس NVMe منتظر یه سرویس ذخیرهسازی راه دور بمونه. پس یه عدد لتنسی بدون گفتنِ نقطهٔ تأیید تقریباً بیمعنیه: تایمر بعد از حافظه وایساده، بعد از سینک دیسک محلی، یا بعد از جواب آبجکت استور؟
یه ترفند رایج اینه که چند نوشتن یه فلش گرون رو با هم شریک شن: رکوردها میرن تو بچ فعلی، بچ با رسیدن به حجم یا تعداد یا زمان مشخص بسته میشه، یه fdatasync() روش اجرا میشه و همهٔ نویسندههای اون بچ با هم موفق میشن. توان عملیاتی بالا میره، ولی قدیمیترین درخواست بیشترین انتظار رو میکشه و خطای فلش کل بچ رو میندازه.
اگه بخوایم نوشته از مرگ خودِ هاست هم جون سالم به در ببره، سه راه هست: ولوم شبکهای بادوام، آپلود روی آبجکت استوریج قبل از برگردوندن موفقیت، یا رپلیکیت کردن WAL روی چند سرور. تو حالت رپلیکیشن (مثل Raft) لیدر رکورد رو محلی مینویسه، برای فالوئرها میفرسته و بعد از سینک شدن روی اکثریت کامیتش میکنه. نویسنده یادآوری میکنه ack گرفتن از رم سریعتره ولی اگه ماشینها با هم ریاستارت شن، همون نوشتهٔ «موفق» میتونه بپره.
به گفتهٔ نویسنده، Big O دقیقاً همین تفاوت رو قایم میکنه: هزینهٔ یه PUT تو هر سه مسیر همون اندازهٔ کلید بهعلاوهٔ پیلود میمونه، در حالی که کارِ قبل از موفقیت از یه فلش دیسک تا یه رفتوبرگشت شبکه بهعلاوهٔ دو سینک فرق میکنه. کارِ عقبافتاده هم حد لازم داره؛ وگرنه مسیر درخواستِ ارزون فقط یه صف در حال رشد رو پنهان کرده.
نکات کلیدی:
- سرعت یه نوشتن رو نقطهٔ تأیید تعیین میکنه، نه اسم سیستمکال یا اینترفیس دیوایس
- برگشت از حافظه، سینک روی SSD محلی، آبجکت استوریج و اکثریت رپلیکاها هرکدوم بعد از خرابی متفاوتی زنده میمونن
- بچ کردن فلشها توان عملیاتی رو بالا میبره ولی به سقف حجم، تعداد و زمان نیاز داره
- NVMe فقط اینترفیسه؛ یه ولوم راه دور هم میتونه دقیقاً همون شکلی دیده بشه
- Big O رشد کار رو نشون میده، نه اینکه کار ثابت میکروثانیه طول میکشه یا میلیثانیه




