آزمون جایگزینی: آیا یک جریان TCP برقرارشده زنده میماند؟
یک خروجی پشتیبان میتواند هر اتصال جدیدی را بپذیرد و در همان حال انتقال در حال اجرا را قطع کند. هر دو نتیجه را آزمایش کنید و حالت بازگشت را در برنامه نگه دارید.
دو نتیجه در جملهٔ «پشتیبان کار میکند» پنهان است. درخواست جدیدی موفق میشود و این بازیابی است. انتقالی که از قبل در جریان است ادامه مییابد و این پیوستگی است. اینها وعدههای متفاوتی هستند و بیشتر طرحهای جایگزینی اولی را فراهم میکنند در حالی که دومی بیصدا منقضی میشود. پیش از انتخاب سازوکار تصمیم بگیرید کدام را لازم دارید و آزمون را طوری بنویسید که بتواند آن دو را از هم جدا کند.
دو نتیجه که مانند یک موفقیت به نظر میرسند
کلاینتی را در 10.90.0.42 با اتصالی به 198.51.100.20:443 در نظر بگیرید. خروجی اصلی آن را به یک نشانی و درگاه عمومی تبدیل میکند و خروجی پشتیبان به دیگری. نشانی داخلی کلاینت هرگز تغییر نمیکند و به همین دلیل مردم انتظار دارند اتصال زنده بماند.
سرور نشانی داخلی نمیبیند. او نقطهٔ پایانی تبدیلشده را میبیند و این نقطه پس از جابهجایی متفاوت است.
بنابراین جریان قدیمی منقضی میشود در حالی که اتصال تازه به همان سرویس بیدرنگ کار میکند. هر دو مشاهده همزمان درستاند.
سرور هنگام تغییر خروجی چه میبیند
یک اتصال TCP با چهارگانهٔ خود شناسایی میشود و تغییر نشانی یا درگاه مبدأ برای میزبان گیرنده اتصال دیگری میسازد. بستههایی که از مبدأ جدید روی اتصالی میرسند که سرور آن را نمیشناسد دور ریخته میشوند یا با بازنشانی پاسخ داده میشوند. هیچ چیز در نشانی کلاینت VPN این پیوند را در طول آن تغییر حفظ نمیکند.
جایگزینی حالتدار دقیقاً برای پرهیز از همین وضع وجود دارد و با تبادل حالت تبدیل و حالت اتصال میان دستگاههای ارسال کار میکند. این ویژگی جفت است نه تونل و باید طراحی و آزمایش شود، نه فرض.
پیش از آنکه به کسی پیوستگی وعده دهید بررسی کنید که جفت واقعاً حالت را نگه میدارد. فرمانهای زیر وضعیت کنونی را در دو طرف نشان میدهند.
conntrack -L -d 198.51.100.20 2>/dev/null | head
ss -tin dst 198.51.100.20
tcpdump -ni any host 198.51.100.20 -c 10چرا یک نشانی عمومی یکسان کافی نیست
نگه داشتن یک نشانی عمومی در هر دو مسیر شروع خوبی است، چون آنگاه سرور همان نقطهٔ پایانی مبدأ را میبیند. اما بهتنهایی کافی نیست. دستگاه ارسال هنوز به حالت تبدیل، حالت دیوار آتش و مسیر بازگشت قابل استفاده نیاز دارد و اینها باید روی همان دستگاهی وجود داشته باشند که پس از جابهجایی ترافیک را حمل میکند.
RFC 3022 تبدیل نشانی را توصیف میکند و تبادل حالت میان دستگاههای تبدیلکننده را بخشی از طرح پشتیبان میداند. نشانی شناور یا رونوشت پروفایل، پیکربندی را جابهجا میکند بیآنکه حالت را جابهجا کند.
به همین دلیل آزمونی که فقط از راه پشتیبان پینگ میکند چیز بسیار کمی اثبات میکند. پینگ هیچ حالت اتصالی برای از دست دادن ندارد.
تصمیم بگیرید نیاز چقدر قوی است
اگر کاربران میتوانند پس از خرابی دوباره متصل شوند، طرح، طرح بازیابی است و آزمون پذیرش یک درخواست تازه است. اگر انتقال فایل باید زنده بماند، طرح به همگامسازی حالت و آزمونی بسیار دقیقتر نیاز دارد. اگر نشست راه دور باید زنده بماند، نیاز باز هم قویتر است و شاید به سازوکاری در سطح برنامه بهجای سطح شبکه نیاز داشته باشد.
نیاز را به شکل جملهای با نتیجهٔ قابل اندازهگیری بنویسید، مثلاً بارگذاری بدون شروع دوباره کامل میشود یا اپراتور در عرض یک دقیقه دوباره متصل میشود. سپس ارزانترین سازوکاری را انتخاب کنید که آن را برآورده میکند و این اغلب طرح بازیابی است.
روشن بگویید وقتی مسیر اصلی بازمیگردد چه میشود، چون بازگشت خودکار میتواند اتصالی را قطع کند که تازه روی پشتیبان بازیابی شده بود. آن حالت به برنامهٔ آزمون تعلق دارد، نه به پانویس.
جریان قدیمی و درخواست تازه را بررسی کنید
یک انتقال بیخطر و طولانی از مسیر اصلی آغاز کنید، سپس یک درخواست تازهٔ جداگانه به همان سرویس. بافت برنامه، نشانی خروجی مشاهدهشده و زمان را ثبت کنید. مسیر اصلی را به روشی تأییدشده قطع کنید و در حین ارسال درخواست تازه از راه پشتیبان، انتقال اصلی را زیر نظر بگیرید.
سه مقدار را گزارش کنید: آیا جریان قدیمی ادامه یافت، بازنشانی شد یا منقضی شد؛ چه زمانی عملیات تازه نخستین بار کار کرد؛ و آیا بازگشت چیزی را قطع کرد. همان سه خط سند پذیرش است.
ss -tin dst 198.51.100.20
curl -sS -o /dev/null -w '%{http_code} %{time_total}\n' https://198.51.100.20/
tcpdump -ni any port 443 -c 20اگر بار کاری داده مینویسد، پس از پایان مهلت یک عملیات نامطمئن را کورکورانه تکرار نکنید. ممکن است نوشتن پیش از گم شدن پاسخ رسیده باشد. نتیجه را از برنامه بپرسید یا فقط جایی دوباره تلاش کنید که عملیات خودتوان است. سپس بیانیهٔ پذیرش را در سه بخش بنویسید: عملیات تازه زیر سیاست خروجی بازیابی میشوند، جریانهای موجود رفتار قطع مستندشده را دارند، و برنامه بهسلامت از سر میگیرد. آن بیانیه آزمونپذیر است و دربارهٔ آنچه طرح وعده نمیدهد صادق است.