บันทึก. แปล: เราขอนำเสนอรายละเอียดทางเทคนิคแก่คุณเกี่ยวกับสาเหตุของการหยุดทำงานล่าสุดในบริการคลาวด์ที่ดูแลโดยผู้สร้าง Grafana นี่เป็นตัวอย่างคลาสสิกว่าฟีเจอร์ใหม่และดูเหมือนมีประโยชน์อย่างมากที่ออกแบบมาเพื่อปรับปรุงคุณภาพของโครงสร้างพื้นฐาน... อาจก่อให้เกิดอันตรายได้อย่างไร หากคุณไม่ได้ระบุถึงความแตกต่างมากมายของแอปพลิเคชันในความเป็นจริงของการผลิต เป็นเรื่องดีเมื่อมีสื่อประเภทนี้ปรากฏขึ้นที่ช่วยให้คุณเรียนรู้ไม่เพียงแต่จากความผิดพลาดของคุณเท่านั้น รายละเอียดอยู่ในการแปลข้อความนี้จากรองประธานฝ่ายผลิตภัณฑ์จาก Grafana Labs
ในวันศุกร์ที่ 19 กรกฎาคม บริการ Hosted Prometheus ใน Grafana Cloud หยุดทำงานประมาณ 30 นาที ขออภัยลูกค้าที่ได้รับผลกระทบจากไฟฟ้าดับทุกท่าน งานของเราคือการจัดหาเครื่องมือตรวจสอบที่คุณต้องการ และเราเข้าใจดีว่าการไม่มีเครื่องมือเหล่านี้อาจทำให้ชีวิตของคุณยากขึ้นได้ เราให้ความสำคัญกับเหตุการณ์นี้เป็นอย่างมาก หมายเหตุนี้จะอธิบายถึงสิ่งที่เกิดขึ้น วิธีที่เราตอบสนอง และสิ่งที่เรากำลังทำเพื่อให้แน่ใจว่าจะไม่เกิดขึ้นอีก
ประวัติศาสตร์
บริการ Grafana Cloud Hosted Prometheus ขึ้นอยู่กับ
เพื่อการอัพเดตที่ราบรื่น บริการ Ingester Cortex จำเป็นต้องมีแบบจำลอง Ingester เพิ่มเติมในระหว่างกระบวนการอัพเดต (บันทึก. แปล:
อย่างไรก็ตาม มักเกิดขึ้นว่าในระหว่างการทำงานปกติ ไม่มีเครื่องจักรใดที่มีทรัพยากรที่ไม่ได้ใช้ถึง 25% นี้ ใช่ เราไม่ได้มุ่งมั่นด้วยซ้ำ: CPU และหน่วยความจำจะมีประโยชน์สำหรับกระบวนการอื่นเสมอ เพื่อแก้ไขปัญหานี้ เราจึงตัดสินใจใช้
ในวันพฤหัสบดีที่ 18 กรกฎาคม เราได้เปิดตัวระดับความสำคัญใหม่สี่ระดับให้กับคลัสเตอร์ของเรา: วิกฤต, สูง, เฉลี่ย и ต่ำ. พวกเขาได้รับการทดสอบบนคลัสเตอร์ภายในที่ไม่มีการรับส่งข้อมูลไคลเอ็นต์เป็นเวลาประมาณหนึ่งสัปดาห์ ตามค่าเริ่มต้น พ็อดที่ไม่มีลำดับความสำคัญที่ระบุจะได้รับ เฉลี่ย ลำดับความสำคัญ คลาสถูกกำหนดไว้สำหรับ Ingesters ด้วย สูง ลำดับความสำคัญ. วิกฤต ถูกสงวนไว้สำหรับการตรวจสอบ (Prometheus, Alertmanager, node-exporter, kube-state-metrics ฯลฯ ) การกำหนดค่าของเราเปิดอยู่ และคุณสามารถดู PR ได้
อุบัติเหตุ
เมื่อวันศุกร์ที่ 19 กรกฎาคม วิศวกรคนหนึ่งได้เปิดตัวคลัสเตอร์ Cortex เฉพาะใหม่สำหรับลูกค้ารายใหญ่ การกำหนดค่าสำหรับคลัสเตอร์นี้ไม่รวมลำดับความสำคัญของพ็อดใหม่ ดังนั้นพ็อดใหม่ทั้งหมดจึงได้รับการกำหนดลำดับความสำคัญเริ่มต้น - เฉลี่ย.
คลัสเตอร์ Kubernetes มีทรัพยากรไม่เพียงพอสำหรับคลัสเตอร์ Cortex ใหม่ และคลัสเตอร์ Cortex ที่ใช้งานจริงที่มีอยู่ไม่ได้รับการอัปเดต (Ingesters ถูกทิ้งไว้โดยไม่มี สูง ลำดับความสำคัญ). เนื่องจาก Ingesters ของคลัสเตอร์ใหม่มีตามค่าเริ่มต้น เฉลี่ย ลำดับความสำคัญ และพ็อดที่มีอยู่ในการผลิตทำงานโดยไม่มีลำดับความสำคัญเลย Ingesters ของคลัสเตอร์ใหม่จะเข้ามาแทนที่ Ingesters จากคลัสเตอร์การผลิต Cortex ที่มีอยู่
ReplicaSet สำหรับ Ingester ที่ถูกขับไล่ในคลัสเตอร์การผลิตตรวจพบพ็อดที่ถูกขับไล่และสร้างพ็อดใหม่เพื่อรักษาจำนวนสำเนาที่ระบุ พ็อดใหม่ถูกกำหนดตามค่าเริ่มต้น เฉลี่ย ลำดับความสำคัญ และ Ingester "เก่า" อีกตัวในการผลิตสูญเสียทรัพยากร ผลลัพธ์ก็คือ กระบวนการหิมะถล่มซึ่งนำไปสู่การแทนที่พ็อดทั้งหมดจากคลัสเตอร์การผลิต Ingester สำหรับ Cortex
ผู้นำเข้าจะมีสถานะและจัดเก็บข้อมูลไว้ 12 ชั่วโมงก่อนหน้า สิ่งนี้ช่วยให้เราสามารถบีบอัดพวกมันได้อย่างมีประสิทธิภาพมากขึ้นก่อนที่จะเขียนลงในพื้นที่จัดเก็บข้อมูลระยะยาว เพื่อให้บรรลุเป้าหมายนี้ Cortex จะแบ่งข้อมูลข้ามชุดโดยใช้ Distributed Hash Table (DHT) และจำลองแต่ละชุดโดยใช้ Ingesters XNUMX ตัวโดยใช้ความสอดคล้องขององค์ประชุมสไตล์ Dynamo Cortex ไม่ได้เขียนข้อมูลไปยัง Ingesters ที่ถูกปิดใช้งาน ดังนั้น เมื่อมี Ingester จำนวนมากออกจาก DHT Cortex จะไม่สามารถจำลองรายการได้เพียงพอ และเกิดการขัดข้อง
การตรวจจับและการแก้ไข
การแจ้งเตือน Prometheus ใหม่ตาม "ข้อผิดพลาดที่ถือว่ารับได้" (ตามข้อผิดพลาดตามงบประมาณ — รายละเอียดจะปรากฏในบทความหน้า) เริ่มส่งเสียงเตือน 4 นาทีหลังจากเริ่มปิดระบบ ในอีกห้านาทีหรือประมาณนั้น เราได้ทำการวินิจฉัยและขยายขนาดคลัสเตอร์ Kubernetes พื้นฐานเพื่อโฮสต์ทั้งคลัสเตอร์ที่ใช้งานจริงใหม่และที่มีอยู่
หลังจากนั้นอีกห้านาที Ingesters รุ่นเก่าก็เขียนข้อมูลได้สำเร็จ ข้อมูลใหม่ก็เริ่มต้นขึ้น และคลัสเตอร์ Cortex ก็กลับมาใช้งานได้อีกครั้ง
ใช้เวลาอีก 10 นาทีในการวินิจฉัยและแก้ไขข้อผิดพลาดหน่วยความจำไม่เพียงพอ (OOM) จากพร็อกซีย้อนกลับการรับรองความถูกต้องที่อยู่ด้านหน้า Cortex ข้อผิดพลาด OOM เกิดจากการเพิ่มขึ้นสิบเท่าใน QPS (เราเชื่อว่าเกิดจากการร้องขอที่ก้าวร้าวมากเกินไปจากเซิร์ฟเวอร์ Prometheus ของลูกค้า)
ผลพวง
เวลาหยุดทำงานทั้งหมดคือ 26 นาที ไม่มีข้อมูลสูญหาย ผู้นำเข้าโหลดข้อมูลในหน่วยความจำทั้งหมดลงในพื้นที่จัดเก็บข้อมูลระยะยาวได้สำเร็จ ในระหว่างการปิดระบบ เซิร์ฟเวอร์ Prometheus ไคลเอ็นต์ที่ถูกบัฟเฟอร์ถูกลบไปแล้ว (ระยะไกล) การบันทึกโดยใช้
การดำเนินการเขียนคลัสเตอร์การผลิต
ผลการวิจัย
สิ่งสำคัญคือต้องเรียนรู้จากเหตุการณ์นี้และดำเนินการตามขั้นตอนที่จำเป็นเพื่อหลีกเลี่ยงไม่ให้เกิดซ้ำ
เมื่อเข้าใจถึงปัญหาหลังเหตุการณ์ เราไม่ควรตั้งค่าเริ่มต้น เฉลี่ย ลำดับความสำคัญจนกว่า Ingesters ทั้งหมดในการผลิตจะได้รับ สูง ลำดับความสำคัญ. นอกจากนี้จำเป็นต้องดูแลล่วงหน้า สูง ลำดับความสำคัญ. ตอนนี้ทุกอย่างได้รับการแก้ไขแล้ว เราหวังว่าประสบการณ์ของเราจะช่วยให้องค์กรอื่นๆ พิจารณาใช้ลำดับความสำคัญของพ็อดใน Kubernetes
เราจะเพิ่มระดับการควบคุมเพิ่มเติมสำหรับการปรับใช้ออบเจ็กต์เพิ่มเติมใดๆ ที่มีการกำหนดค่าส่วนกลางสำหรับคลัสเตอร์ จากนี้ไปจะมีการประเมินการเปลี่ยนแปลงดังกล่าวขоผู้คนมากขึ้น นอกจากนี้ การแก้ไขที่ทำให้เกิดข้อขัดข้องถือว่าเล็กน้อยเกินไปสำหรับเอกสารโปรเจ็กต์แยกต่างหาก โดยจะมีการพูดคุยกันในปัญหา GitHub เท่านั้น จากนี้ไป การเปลี่ยนแปลงการกำหนดค่าทั้งหมดจะมาพร้อมกับเอกสารประกอบโครงการที่เหมาะสม
สุดท้ายนี้ เราจะปรับขนาดของพร็อกซีย้อนกลับการรับรองความถูกต้องโดยอัตโนมัติเพื่อป้องกัน OOM โอเวอร์โหลดที่เราพบเห็น และจะตรวจสอบการตั้งค่าเริ่มต้นของ Prometheus ที่เกี่ยวข้องกับทางเลือกสำรองและการปรับขนาดเพื่อป้องกันปัญหาที่คล้ายกันในอนาคต
ความล้มเหลวยังส่งผลเชิงบวกบางประการเช่นกัน เมื่อได้รับทรัพยากรที่จำเป็น Cortex จะกู้คืนโดยอัตโนมัติโดยไม่มีการแทรกแซงเพิ่มเติม เรายังได้รับประสบการณ์อันมีค่าในการทำงานด้วย
ปล.จากผู้แปล
อ่านเพิ่มเติมในบล็อกของเรา:
- «
การปรับขนาดอัตโนมัติและการจัดการทรัพยากรใน Kubernetes (ภาพรวมและรายงานวิดีโอ) "; - «
การผจญภัยของ Kubernetes Dailymotion: การสร้างโครงสร้างพื้นฐานในระบบคลาวด์ + ภายในองค์กร "; - «
Tinder เปลี่ยนไปใช้ Kubernetes "; - «
เรื่องราวความสำเร็จของ Kubernetes ในการผลิต ตอนที่ 10: เรดดิท '
ที่มา: will.com