การใช้ Zero Downtime Deploymentประสบปัญหาเดียวกัน แต่ฉันต้องการคำแนะนำเกี่ยวกับกลยุทธ์ที่ฉันกำลังพิจารณา
บริบท
แอปพลิเคชันบนเว็บพร้อม Apache / PHP สำหรับการประมวลผลฝั่งเซิร์ฟเวอร์และฐานข้อมูล MySQL / ระบบไฟล์เพื่อการคงอยู่
ขณะนี้เรากำลังสร้างโครงสร้างพื้นฐาน ฮาร์ดแวร์ระบบเครือข่ายทั้งหมดจะมีความซ้ำซ้อนและสายเคเบิลเครือข่ายหลักทั้งหมดจะถูกใช้ในคู่ที่ถูกผูกมัดสำหรับการป้องกันความผิดพลาด เซิร์ฟเวอร์กำลังได้รับการกำหนดค่าให้เป็นคู่ที่มีความพร้อมใช้งานสูงสำหรับความทนทานต่อข้อผิดพลาดของฮาร์ดแวร์และจะมีความสมดุลของโหลดสำหรับทั้งการยอมรับข้อบกพร่องของเครื่องเสมือนและประสิทธิภาพทั่วไป
มันเป็นความตั้งใจของฉันที่เราสามารถใช้การปรับปรุงกับแอปพลิเคชันโดยไม่ต้องหยุดทำงาน ฉันใช้ความเจ็บปวดอย่างมากเมื่อออกแบบโครงสร้างพื้นฐานเพื่อให้แน่ใจว่าฉันสามารถให้เวลาได้ 100% มันน่าผิดหวังอย่างยิ่งที่มีเวลาหยุดทำงาน 10-15 นาทีทุกครั้งที่มีการอัปเดต สิ่งนี้มีความสำคัญอย่างยิ่งเนื่องจากเราตั้งใจที่จะมีวงจรการเผยแพร่ที่รวดเร็วมาก (บางครั้งอาจถึงหนึ่งหรือมากกว่านั้นต่อวัน
โครงสร้างเครือข่าย
นี่เป็นบทสรุปของเครือข่าย:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
หมายเหตุ: เซิร์ฟเวอร์ฐานข้อมูลใช้การจำลองแบบต้นแบบหลัก
กลยุทธ์ที่แนะนำ
เพื่อให้บรรลุนี้ฉันกำลังคิดที่จะแบ่งสคริปต์การอัพเกรด DB schema ออกเป็นสองส่วน การอัพเกรดจะมีลักษณะเช่นนี้:
- เว็บเซิร์ฟเวอร์บนโหนด A ถ่ายแบบออฟไลน์ ทราฟฟิกยังคงถูกประมวลผลโดยเว็บเซิร์ฟเวอร์บนโหนด B
- การเปลี่ยนแปลง Schema ในช่วงเปลี่ยนผ่านจะใช้กับเซิร์ฟเวอร์ฐานข้อมูล
- เว็บเซิร์ฟเวอร์มีการอัปเดตรหัสฐานแคชจะถูกล้างและการดำเนินการอัปเกรดอื่น ๆ
- เว็บเซิร์ฟเวอร์ A ออนไลน์และเว็บเซิร์ฟเวอร์ B ถูกออฟไลน์
- รหัสฐานเว็บ B ถูกอัพเดตแคชจะถูกล้างและการดำเนินการอัพเกรดอื่น ๆ จะถูกดำเนินการ
- เว็บเซิร์ฟเวอร์ B ถูกนำมาออนไลน์
- การเปลี่ยนแปลงแบบแผนสุดท้ายถูกนำไปใช้กับฐานข้อมูล
'Transitional Schema' จะถูกออกแบบมาเพื่อสร้างฐานข้อมูลที่เข้ากันได้ข้ามรุ่น สิ่งนี้ส่วนใหญ่จะใช้ประโยชน์จากมุมมองตารางที่จำลองสกีมาเวอร์ชันเก่าในขณะที่ตารางตัวเองจะถูกเปลี่ยนเป็นสคีมาใหม่ สิ่งนี้ทำให้เวอร์ชันเก่าสามารถโต้ตอบกับฐานข้อมูลได้ตามปกติ ชื่อตารางจะมีหมายเลขเวอร์ชันของสกีมาเพื่อให้แน่ใจว่าจะไม่มีความสับสนเกี่ยวกับตารางที่จะเขียน
'Final Schema' จะลบความเข้ากันได้ย้อนหลังและเป็นระเบียบเรียบร้อย
คำถาม
ในระยะสั้นจะใช้งานได้หรือไม่
โดยเฉพาะอย่างยิ่ง:
จะมีปัญหาเนื่องจากศักยภาพในการเขียนพร้อมกัน ณ จุดเฉพาะของการเปลี่ยนแปลงสกีมาในช่วงเปลี่ยนผ่านหรือไม่? มีวิธีการตรวจสอบให้แน่ใจว่ากลุ่มของแบบสอบถามที่ปรับเปลี่ยนตารางและสร้างมุมมองที่เข้ากันได้แบบย้อนหลังถูกดำเนินการอย่างต่อเนื่องหรือไม่ เช่นกับแบบสอบถามอื่น ๆ ที่ถูกเก็บไว้ในบัฟเฟอร์จนกระทั่งการเปลี่ยนแปลงสคีเสร็จสมบูรณ์ซึ่งโดยทั่วไปจะเป็นมิลลิวินาทีเท่านั้น
มีวิธีที่ง่ายกว่านี้หรือไม่ที่ให้ความเสถียรในระดับนี้ในขณะที่ยังอนุญาตให้อัปเดตโดยไม่ต้องหยุดทำงาน นอกจากนี้ยังเป็นที่นิยมในการหลีกเลี่ยงกลยุทธ์สคีมา 'วิวัฒนาการ' เนื่องจากฉันไม่ต้องการล็อคเข้ากับสคีมาด้านหลัง