บทวิเคราะห์หลังเหตุการณ์บริการ Tarsnap หยุดให้บริการ
(mail.tarsnap.com)- เซิร์ฟเวอร์กลางของ Tarsnap บน Amazon EC2 us-east-1 ล่มด้วยสถานะ
failed system status checkทำให้บริการหยุดให้บริการเป็นเวลาประมาณ 26 ชั่วโมง 16 นาที นับตั้งแต่ราว 2023-07-02 13:07:58 UTC - ตรวจพบเหตุขัดข้องเมื่อ 13:10 UTC แต่มีการใช้หลักปฏิบัติด้านปฏิบัติการที่ปิดการเริ่มทำงานอัตโนมัติของโค้ดเซิร์ฟเวอร์ไว้ เพื่อให้มนุษย์ตรวจสอบเองหลังการรีบูตที่ไม่คาดคิด
- การกู้คืนดำเนินการโดยอ่าน เฮดเดอร์เมทาดาทา จากระบบไฟล์แบบ log-structured บน Amazon S3 แล้วนำงานมาเล่นซ้ำตามลำดับในเครื่อง โดยขั้นแรกเสร็จเมื่อ 2023-07-03 01:49:49 UTC
- ระหว่างกระบวนการสร้างสถานะขึ้นใหม่ พบกรณีที่ไม่ได้ทดสอบของการจัดการ machine re-owned ที่เขียนไว้ในปี 2014 และการลืมตั้งค่าเริ่มต้นของลอจิกการดำเนินการต่อ อีกทั้งขีดจำกัด throughput ของดิสก์ก็ทำให้การกู้คืนช้าลง
- แม้ Tarsnap ไม่มี SLA ที่ชัดเจน แต่ตามนโยบายที่ให้เครดิตสำหรับเหตุขัดข้องที่เห็นว่ายุติธรรม จึงมอบ เครดิต 50% ของค่าพื้นที่จัดเก็บหนึ่งเดือนให้ทุกบัญชีเมื่อ 2023-07-13
การเกิดเหตุขัดข้องและการตอบสนองเบื้องต้น
- ราว 2023-07-02 13:07:58 UTC เซิร์ฟเวอร์กลางของ Tarsnap ออฟไลน์ในรีเจียน Amazon EC2 us-east-1
- สถานะ EC2 คือ
failed system status check - สำหรับเครื่องเสมือน สถานะนี้อาจบ่งชี้ได้หลายสาเหตุ เช่น ไฟดับ ฮาร์ดแวร์ของเซิร์ฟเวอร์จริงล้มเหลว หรือเครือข่าย EC2 ขัดข้อง
- ในช่วงเวลาเดียวกันไม่พบรายงานเหตุขัดข้องของ EC2 เป็นวงกว้าง จึงมองว่าน่าจะเป็นความล้มเหลวของฮาร์ดแวร์แบบแยกส่วนมากที่สุด
- สถานะ EC2 คือ
- ระบบมอนิเตอร์ตรวจพบเหตุขัดข้องเมื่อ 2023-07-02 13:10 UTC
- เฝ้าระวังโดยทำการเขียน อ่าน และลบ archive ทุก 5 นาทีจากรีเจียน EC2 อื่น
- การแจ้งเตือนทางข้อความเมื่อ 13:10 UTC ไม่สามารถปลุกได้ แต่การแจ้งเตือนทางโทรศัพท์เมื่อ 13:15 UTC ทำให้เริ่มตอบสนอง
- จากการตรวจสอบเบื้องต้นไม่พบข้อผิดพลาดชั่วคราวที่ชัดเจน จึงสรุปว่าระบบตายแล้วและเริ่มเตรียมอินสแตนซ์ EC2 ทดแทน
หลักปฏิบัติด้านปฏิบัติการที่หลีกเลี่ยงการรีสตาร์ตอัตโนมัติ
- ราว 2023-07-02 13:52 UTC Amazon รีสตาร์ตเซิร์ฟเวอร์ที่มีปัญหาบนอินสแตนซ์ EC2 ใหม่
- เป็นเวลาประมาณ 45 นาทีหลังเริ่มเกิดเหตุขัดข้อง
- ระบบปฏิบัติการ FreeBSD บูตขึ้นมา แต่โค้ดเซิร์ฟเวอร์ของ Tarsnap ไม่ได้เริ่มทำงานโดยอัตโนมัติ
- เหตุผลที่ปิดการเริ่มทำงานอัตโนมัติไว้ คือเพื่อให้ตรวจสอบสถานะด้วยตนเองก่อนรับทราฟฟิกหลังการรีบูตที่ไม่คาดคิด
- ตามหลักปฏิบัติด้านปฏิบัติการ “การป้องกันข้อมูลสูญหายเมื่อมีบางอย่างพัง” สำคัญกว่า “การเพิ่มความพร้อมใช้งานของบริการให้สูงสุด”
- หลังรีบูต ล็อกของเซิร์ฟเวอร์แสดง ความเสียหายของระบบไฟล์
- มองว่าสาเหตุของเหตุขัดข้องอาจทำให้ฮาร์ดแวร์ตาย หรือทำให้การเชื่อมต่อระหว่างเซิร์ฟเวอร์กับ Elastic Block Store ที่เก็บระบบไฟล์ถูกตัด
- จึงตัดสินใจตั้งค่าเซิร์ฟเวอร์ใหม่ต่อไป แทนการกู้คืนเซิร์ฟเวอร์เดิม
โครงสร้างล็อกบน S3 และขั้นตอนการกู้คืน
- บริการ Tarsnap จัดเก็บข้อมูลใน Amazon S3 เป็น ระบบไฟล์แบบ log-structured
- แต่ละ S3 object มีเฮดเดอร์ที่บรรจุเมทาดาทาของรายการล็อกทั้งหมด และอาจมีข้อมูลของรายการล็อกด้วย
- รายการล็อก
start write transactionมีเฉพาะเฮดเดอร์ที่ระบุเครื่องและ transaction nonce โดยไม่มีข้อมูลล็อก - รายการล็อก
store data blockมีทั้งเฮดเดอร์ที่ระบุเครื่องและชื่อบล็อก รวมถึงข้อมูลบล็อก
- ในสถานะปกติ เมทาดาทาของรายการล็อกจะถูกแคชไว้บน EC2 และจะไม่อ่านซ้ำจาก Amazon S3
- การอ่านจาก Amazon S3 จะเกิดขึ้นเฉพาะเมื่ออ่านข้อมูลบล็อกเพื่อตอบสนองคำขอจากไคลเอนต์ tarsnap
- การกู้คืนสถานะของอินสแตนซ์ EC2 แบ่งเป็นสองขั้น
- ขั้นแรก อ่าน เฮดเดอร์เมทาดาทา ทั้งหมดจาก S3
- จากนั้น เล่นซ้ำ (replay) งานทั้งหมดในเครื่อง
- ในระบบจัดเก็บแบบ log-structured เมื่อมีการลบข้อมูล รายการล็อกจะถูกเขียนใหม่เพื่อคืนพื้นที่จัดเก็บ ดังนั้นจึงไม่สามารถทำสองขั้นนี้พร้อมกันได้
- รายการล็อกมีหมายเลขลำดับ จึงสามารถเล่นซ้ำตามลำดับที่ถูกต้องได้ แต่ต้องจัดเรียงหลังจากค้นหาก่อน
ข้อบกพร่องและคอขวดที่พบระหว่างการกู้คืน
- ขั้นแรกดำเนินไปโดยไม่มีปัญหาและเสร็จเมื่อ 2023-07-03 01:49:49 UTC
- โปรเซสกู้คืนถูกตั้งค่าให้ส่งคำขอพร้อมกันไปยัง Amazon S3 จำนวน 250 รายการ
- ค่านี้เป็นการตั้งค่าตามระดับที่ Amazon S3 รองรับได้เมื่อ 10 ปีก่อน และปัจจุบันน่าจะสามารถเพิ่มได้มาก
- ขั้นที่สองล้มเหลวแทบจะทันที
- เกิดข้อผิดพลาดว่ารายการล็อกที่ถูกเล่นซ้ำกำลังบันทึกข้อมูลที่เป็นของเครื่องซึ่งไม่มีอยู่
- สาเหตุคือโค้ดจัดการการย้ายบัญชีของเครื่องที่เขียนไว้ในปี 2014
- เมื่อผู้ใช้ Tarsnap ต้องย้ายเครื่องข้ามบัญชี จะใช้วิธีบันทึกรายการล็อก
machine registrationใหม่แล้วลบรายการเดิม - แม้มีการทดสอบอยู่ แต่ขาดกรณีที่สร้างสถานะเซิร์ฟเวอร์ขึ้นใหม่หลังจากเครื่องถูก re-owned ในขณะที่มีข้อมูลถูกจัดเก็บแล้ว
- เนื่องจากรายการล็อกการลงทะเบียนเครื่องใหม่มีหมายเลขลำดับสูงกว่า ระหว่างการเล่นซ้ำจึงดูเหมือนว่าข้อมูลถูกจัดเก็บลงในเครื่องที่ยังไม่มีอยู่
- หลังระบุสาเหตุได้แล้ว ได้ปิดการทำงานของ “seatbelt” นั้นและดำเนินการสร้างสถานะขึ้นใหม่ต่อ
- หลังจากนั้นไม่นานก็เกิดข้อผิดพลาดว่าไม่พบข้อมูลใน Amazon S3
- เพราะในการพยายามดำเนินการต่อ มีการข้ามขั้นตอนดาวน์โหลดข้อมูลจาก S3 ทำให้ค่า
maximum log entry sequence numberไม่ถูกตั้งค่าเริ่มต้นและยังคงเป็น 0 - หลังแก้ปัญหานี้แล้ว การสร้างสถานะขึ้นใหม่ก็ดำเนินต่อได้ตามปกติ
- การสร้างสถานะขึ้นใหม่ดำเนินไปช้ากว่าที่จำเป็น
- หากรู้ว่าคอขวดคือ throughput ของดิสก์ ก็สามารถตั้งค่า throughput ของ EBS volume ที่เกี่ยวข้องให้สูงขึ้นได้
- เนื่องจากอดนอนจึงไม่สามารถเฝ้าดูโปรเซสได้อย่างใกล้ชิด ไม่เช่นนั้นอาจตรวจพบคอขวดจาก gstat(8) และ Amazon CloudWatch แล้วตั้งค่า EBS volume ใหม่ได้
การกลับมาให้บริการและการให้เครดิต
- ราว 2023-07-03 15:10 UTC โปรเซสสร้างสถานะขึ้นใหม่เสร็จสิ้น
- ไม่ได้บันทึกเวลาที่เสร็จสิ้นอย่างแน่นอนไว้
- วางเซิร์ฟเวอร์ไว้ในโหมดอ่านอย่างเดียวและทำการทดสอบอย่างรวดเร็ว
- ตรวจสอบว่าเมื่อเทียบกับสถานะของเซิร์ฟเวอร์เดิมแล้ว ตรงกันยกเว้นข้อมูลไม่กี่วินาทีสุดท้ายที่ระบบไฟล์ของเซิร์ฟเวอร์เดิมสูญเสียไป ณ เวลาที่เกิดเหตุขัดข้อง
- ทราฟฟิกจริงครั้งแรกหลังเหตุขัดข้องเกิดขึ้นเมื่อ 2023-07-03 15:25:58 UTC
- เป็นเวลาประมาณ 26 ชั่วโมง 16 นาที หลังเริ่มเกิดเหตุขัดข้อง
- Tarsnap ไม่มี SLA ที่ชัดเจน แต่ใช้นโยบายให้เครดิตสำหรับเหตุขัดข้องที่ดูยุติธรรม
- เมื่อ 2023-07-13 ได้มอบเครดิต 50% ของค่าพื้นที่จัดเก็บหนึ่งเดือนให้กับทุกบัญชี Tarsnap
- การดำเนินการเครดิตเกิดขึ้นหลังจากจัดการเหตุขัดข้องและได้พักผ่อนแล้ว
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
นึกไม่ถึงจริง ๆ ว่าบทความนี้จะขึ้นไปอยู่บนสุดของ HN อยากตอบคำถามนะ แต่ตอนนี้สี่ทุ่มแล้ว และลูกหลับไปตั้งแต่ห้าโมงเย็น ถ้าโชคดีน่าจะได้นอนสัก ประมาณ 4 ชั่วโมง ก่อนที่ลูกจะตื่น
ตอนเช้าจะกลับมาตรวจดูและตอบคำถาม
การระบุชัดเจนว่าไม่มี SLA นั้นดี แต่รู้สึกเหมือนมีความเสี่ยงใหญ่ ๆ คั่นอยู่ระหว่างตัวผมกับแบ็กอัพของผม
อ่าน https://www.amazon.com/No-Cry-Sleep-Solution-Toddlers-Presch... แล้วก็เห็นผลอยู่บ้าง หาได้ตามห้องสมุดทุกแห่ง หรือก็คือ Blockbuster สำหรับหนังสือนั่นแหละ
ในช่วงไม่กี่สัปดาห์ที่ผ่านมา ผมเองก็มีอินสแตนซ์ EC2 บางตัวล่มลงโดยมีอาการเหมือนถูกตัดจาก EBS และกรณีของผมอยู่ใน eu-west
ส่วนที่บอกว่า “Tarsnap ไม่มี SLA แต่ถ้าดูยุติธรรมก็จะให้เครดิตสำหรับเหตุขัดข้อง” ตามนโยบายที่ค่อนข้างคลุมเครือนี้ แล้วในวันที่ 2023-07-13 ก็เติมเครดิต 50% ของค่าจัดเก็บหนึ่งเดือนให้บัญชี Tarsnap ของทุกคน แสดงให้เห็นดีว่า Percival เป็นคนแบบไหน
เครดิตนี้ดูค่อนข้างใจกว้างในแง่ของการ ชดเชยให้ลูกค้าอย่างเพียงพอ และต่างจากผู้ให้บริการคลาวด์รายใหญ่ ๆ ตรงที่ไม่ได้ทำให้ลูกค้าแต่ละรายต้องมาร้องขอเอง แถมยังมี postmortem ที่ชัดเจน เป็นเทคนิค และละเอียดอีกด้วย ผมคิดว่าทุกที่ควรทำแบบนี้
ค่อนข้างดีใจที่ได้อยู่ในโลกที่มี Tarsnap อยู่ และคิดราคาเป็นหน่วย picodollars
ถ้าตั้งค่าและทดสอบ ขั้นตอนกู้คืนจากภัยพิบัติ ไว้อย่างเหมาะสม ก็น่าจะลด downtime ได้มากกว่านี้มาก
จำเป็นต้องสร้างระบบ staging แยกต่างหากเต็มรูปแบบ ทำให้สามารถปิดแล้วสร้างใหม่ได้ ทดสอบโหมดความล้มเหลวต่าง ๆ เป็นระยะ และจัดทำเอกสารรายละเอียดขั้นตอนทั้งหมดของการกู้คืนระบบ
ในระยะยาวก็น่าลองคิดดูว่าจะเพิ่มรายได้จนสามารถจ้าง พนักงานพาร์ตไทม์ ซึ่งจะช่วยได้มากเมื่อเกิดเรื่องคล้าย ๆ กันได้หรือไม่
เราก็เป็นผู้ให้บริการโซลูชันคลาวด์รายเล็ก และโฟกัสที่ ML API เช่นกัน แต่ยิ่งเวลาผ่านไปก็ยิ่งชัดเจนว่าเมื่อใช้ฮาร์ดแวร์คลาวด์ ไม่ว่าจะเป็นแบบ dedicated หรือ virtual ความขัดข้องจะเกิดขึ้นเป็นระยะ ๆ RAM, HDD หรือชิ้นส่วนฮาร์ดแวร์อื่น ๆ อาจเสียได้ทุกเมื่อ ดังนั้นหากจะให้บริการออนไลน์แบบ high availability ในระยะยาว ต้องคำนึงถึงเรื่องนี้ 100%
ขอชื่นชม postmortem ที่ซื่อสัตย์และการรับมือกับสถานการณ์ยาก ๆ ได้ดี อย่างไรก็ตาม ในเรื่อง การอดนอน ถ้ามีคนที่แก้ปัญหาได้อยู่แค่คนเดียว ก็ไม่จำเป็นต้องอายที่จะยอมรับเวลา outage เพิ่มขึ้นอีกเล็กน้อยเพื่อให้มีสติปลอดโปร่ง
การไปนอนสักพักในขณะที่สัญญาณเตือนกำลังดังอาจรู้สึกแปลก ๆ แต่เมื่ออะดรีนาลีนผสมกับการนอนไม่พอ มันง่ายมากที่จะทำให้ปัญหาแย่ลง
จากคำอธิบาย ดูเหมือนว่า กระบวนการกู้คืน นี้น่าจะทดสอบเป็นประจำได้ค่อนข้างง่าย และน่าจะช่วยจับบั๊กที่ยังเหลืออยู่หรือประเมินเวลาการกู้คืนได้
อย่างที่มักพูดกันว่า แบ็กอัพที่ได้ทดสอบแล้วเท่านั้นถึงจะเป็นแบ็กอัพจริง
จากนี้ไปจะจัดให้การซ้อมประจำปีมีลำดับความสำคัญสูงอย่างแน่นอน
การได้เห็น postmortem ที่เป็นมืออาชีพ สุภาพ และซื่อสัตย์แบบนี้เป็นเรื่องดีเสมอ
อาจจะพูดโดยอิงจากข้อมูลบริษัท Tarsnap ที่เก่าแล้วก็ได้ แต่ปัจจัยเดียวที่ทำให้ผมลังเลที่จะใช้ Tarsnap อย่างจริงจังคือ เหตุขัดข้อง Colin Percival แบบไม่คาดคิด หรือก็คือความเสี่ยงจากบุคคลสำคัญ
ผมคิดว่าคงไม่ใช่แค่ผมคนเดียว
ส่วนตัวผมจะเลือกวิธีที่เรียบง่ายกว่า จากประสบการณ์ของผม การจะไปให้ถึงระดับความน่าเชื่อถือของระบบที่เรียบง่าย ต้องเพิ่มความซับซ้อนเข้าไปมหาศาล และความซับซ้อนส่วนใหญ่ทำให้สถานการณ์แย่ลง
เรื่องนี้เห็นได้ชัดในการทำเซิร์ฟเวอร์คลัสเตอร์ เซิร์ฟเวอร์เดี่ยวที่มีไฟฟ้าและเครือข่ายเสถียร จะน่าเชื่อถือกว่าความพยายามใด ๆ ที่จะทำบริการนั้นให้ซ้ำซ้อน จนกว่าจะไปถึงระดับที่ต้นทุนและความซับซ้อนเพิ่มขึ้นราว 5 เท่า ถึงตอนนั้นจึงจะได้ค่าเฉลี่ยระยะเวลาระหว่างความขัดข้องใกล้เคียงกับเซิร์ฟเวอร์เดี่ยว และหลังจากนั้นจึงค่อยปรับปรุงได้จริง
ผมเชื่ออย่างแรงกล้าว่าเส้นทางที่ดีที่สุดสู่ความน่าเชื่อถือจริง ๆ คือ ความเรียบง่ายเท่าที่เป็นไปได้ และการมีแบ็กอัปที่ดี หากต้องการความพร้อมใช้งาน 24 ชั่วโมง 7 วันต่อสัปดาห์ ตัวเลือกทางเทคโนโลยีที่ใช้ได้ก็จะถูกจำกัดลงค่อนข้างมาก
นี่คืองานของ Colin มีชื่อของ Colin ติดอยู่ และมันสำคัญกับ Colin มาก
ที่ BigBackupCorp คงยากจะได้บริการแบบเดียวกัน พนักงานก็เปลี่ยนแทนกันได้ ผู้บริหารก็เปลี่ยนแทนกันได้ และพูดตรง ๆ ผมในฐานะลูกค้าก็เป็นสิ่งที่เปลี่ยนแทนได้เช่นกัน ถ้าบริษัทเปลี่ยนทิศทางและตัดสินใจจะกลายเป็น BigFlowerArrangementShippingCorp
ข้อดีของธุรกิจขนาดเล็กคือมันขับเคลื่อนด้วยผลประโยชน์ของตัวเองล้วน ๆ ไม่มีการเล่นราคาหุ้นหรือกลเม็ดแบบ VC ถ้าเป็นธุรกิจที่ทำกำไรได้ ก็จะมีใครสักคนเข้ามาซื้อกิจการ แล้วเอาชื่อตัวเองแขวนไว้และทำให้เป็นงานของตัวเอง ผมคิดว่าอินเทอร์เน็ตแบบเปิดได้ประโยชน์มากจากสิ่งแบบนี้
ความเสี่ยงนี้สามารถทำให้เล็กลงได้เท่าที่ต้องการด้วยการวางแผนอย่างรอบคอบ
บริการอย่าง Tarsnap ควรเป็นเพียงหนึ่งในหลายชั้น และควรสร้าง แบ็กอัปหลายชั้น พร้อมตรวจสอบเป็นประจำ
ข้อผิดพลาดอย่างรายการ log ที่ถูก replay บันทึกข้อมูลของเครื่องที่ไม่มีอยู่จริง น่าจะจับได้ด้วยการเขียน โมเดล TLA+
ถ้าใช้ชุดอย่าง restic+backblaze ค่าใช้จ่ายจะต่ำลงหลายหลัก เลยสงสัยว่าข้อดีของการใช้ Tarsnap คืออะไร ไม่รู้ว่าต้องมีความต้องการเฉพาะแบบไหนถึงจะมีแรงจูงใจจ่าย 3000 ดอลลาร์ต่อ TB-ปี
สำหรับคนที่ถามเรื่อง bus factor ต่ำ คุณคงไม่ได้เก็บแบ็กอัปไว้กับบริการเดียวหรือที่เดียวใช่ไหม? คุณคงใช้ Tarsnap ร่วมกับ Restic+Backblaze, Rsync.net, S3 ฯลฯ ใช่ไหม? “แบ็กอัปคือภาษีที่จ่ายเพื่อให้ได้ความหรูหราในการกู้คืน”
ตัวอย่างเช่น ผมใช้บริการอื่นสำหรับไลบรารีวิดีโอและภาพถ่าย แต่แบ็กอัปฐานข้อมูลบัญชีและเอกสารสำคัญไว้กับ Tarsnap
ผมใช้ Tarsnap มา 10 ปีแล้ว แทบไม่เคยมีปัญหาด้านความพร้อมใช้งาน และเท่าที่จำได้ก็แทบไม่เคยมีปัญหาใด ๆ เลย
ฟังดูเหมือนว่า downtime 26 ชั่วโมงส่วนใหญ่ถูกใช้ไปกับการกู้คืนแบ็กอัป บังเอิญว่านี่เป็นเหตุผลตรง ๆ ที่ผมใช้ Tarsnap ใน สภาพแวดล้อม production ไม่ได้
ในมุมผู้ใช้ การกู้คืนแบ็กอัปช้าจนน่าทรมาน ผมไม่มีความอดทนจะรอหลายชั่วโมงเพราะบริการแบ็กอัปตอนที่ระบบของผมออฟไลน์อยู่ ตอนนี้อาจดีขึ้นแล้วก็ได้ แต่ครั้งสุดท้ายที่ผมลองใช้เมื่อหลายปีก่อน การกู้คืนแบ็กอัปไม่กี่ GB ใช้เวลาประมาณระดับเป็นชั่วโมง