เมื่อต้นปีที่ผ่านมา Slack มีเหตุล่ม 3 ชั่วโมง สัปดาห์นี้ทีมงานก็ออกมารายงานถึงสาเหตุของการล่มครั้งนั้น โดยจุดเริ่มต้นเกิดระหว่างการอัพเกรด Consul แม้จะอัพเกรดเพียงบางส่วน
ทาง Slack ใช้ Consul สำหรับทำ service discovery ให้กับ memcached กระบวนการอัพเกรดครั้งนั้นเป็นการอัพเกรดทีละ 25% โดยอัพเกรด 25% แรกไปก่อนแล้วและไม่มีปัญหาอะไร โดยระหว่างอัพเกรด โหนดที่อัพเกรดจะถอดตัวออกไปและใส่โหนดใหม่ที่ cache ว่างเข้ามาแทน แต่ระหว่างการอัพเดตครั้งนั้นระบบมีโหลดสูง และเมื่อกำลังอัพเกรดก็มี memcached บางส่วนถูกล้างข้อมูล
ปัญหาเกิดขึ้นเมื่อการคิวรี Group Direct Message (GDM) นั้น ไม่ได้ค้นหาแยกตาม shard ของคลัสเตอร์ Vitess (คลัสเตอร์ MySQL) แต่กลับทำ scatter query ส่งคิวรีไปทุก shard เพื่อหาข้อมูล และเมื่อแคชหายไป ตัวไคลเอนต์ก็จะยิงคิวรีเข้า Vitess ทำให้โหลดโดยรวมสูงขึ้น คลัสเตอร์ Vitess เริ่มเกิด timeout ทำให้ข้อมูลไม่ถูกแคช เกิดเป็นปัญหาวนลูปคือไคลเอนต์ที่ขอข้อมูลไม่ได้ก็พยายามยิงคิวรีเข้าไปเรื่อยๆ และแคชก็ไม่มีข้อมูลทำให้ยิงคิวรีตรงเข้า Vitess ไปเรื่อยๆ อีกเช่นกัน
ทาง Slack สรุปบทเรียนโดยปรับกระบวนการอัพเกรด Consul ไม่ให้สร้างปัญหาแบบนี้อีก และแก้ไข scatter query เดิมให้คิวรีแยกตาม shard เพื่อไม่ให้เกิดโหลดสูงอีกครั้ง
ที่มา - Slack
Comments
ปัญหาลักษณะนี้มัน foresee ยาก/ง่ายระดับไหนครับ เท่าที่ดูมีเงื่อนไขประกอบเยอะพอควร
ยิ่งระบบซับซ้อนยิ่งประเมินยากครับ บางทีคิดว่าออกแบบไว้ดีมากแล้ว แต่โดน "พฤติกรรมการทำงานร่วมกันระหว่าง service" (ทำงานเดี่ยวๆ ไม่เป็น แต่พอไปใช้ x คู่กับ y แล้วเป็น) บางอย่างเข้าไป ก็ระเบิดกันมาเยอะแล้วครับ
ลักษณะนี้ก็น่าจะเข้าข่าย
กำลังอยากเก่งด้าน availability เลยครับ แต่เคสแบบนี้ถ้ากันได้ 100% เรียกว่าเทพคงยังดูเก่งไม่พอใช่มั้ยครับ
ระบบที่ซับซ้อนขนาดนี้ มักไม่ใช่ระบบที่เกิดจากคนคนเดียว (หรือหลักหน่วยคน) ครับ มันคือระบบที่เกิดจากคนหลายสิบคน หลายแผนก หลายหน่วยงานมาร่วมกันสร้างขึ้นมา
ซึ่งความเข้าใจการทำงานของระบบของแต่ละคนมีจำกัด จะเก่งแค่ไหนก็ไม่มีวันไปเข้าใจทุกอย่างในระบบได้ ก็ต้องอาศัย learn by mistake แบบนี้ไปเรื่อยๆ ครับ
อย่างกรณีนี้
พอประกอบร่างในเวลาเดียวกัน ก็กลายเป็น Transformer
lewcpe.com , @wasonliw
แต่เอาจริงกลายเป็นโกโก้ครันช์ ฝันร้ายของผมเลยครับ รู้สึกว่าตัวเองเก่งไม่พอซะที
มันเป็น Murphy's Law น่ะครับ เก่งแค่ไหนมันก็จะมีจุดที่พังได้เสมอ หน้าที่ของชาวเรา (หมายถึงทั้ง Engineer ต่างๆ) ก็คือทำให้มันมีโอกาสพังน้อยที่สุด แล้วถ้ามันพังอยู่ก็ให้มันกระทบน้อยที่สุด
onedd.net
ขอบคุณครับ
ต่อให้ระบบมีหน้าที่แค่ print Hello World กลับไปทุกครั้ง มันก็พังเพราะเด็กฝึกงานเตะปลั๊กได้
คมคายยิ่งนัก แม่บ้านถอดปลั๊กไปเสียบเครื่องดูดฝุ่น