เรามีแอปพลิเคชั่นที่ผสมผสานทั้งความรวดเร็ว (<1 วินาที) และการย้ายฐานข้อมูลที่ช้า (> 30 วินาที) ตอนนี้เรากำลังเรียกใช้การย้ายฐานข้อมูลเป็นส่วนหนึ่งของ CI แต่จากนั้นเครื่องมือ CI ของเราต้องรู้สตริงการเชื่อมต่อฐานข้อมูลทั้งหมดสำหรับแอปของเรา (ในหลาย ๆ สภาพแวดล้อม) ซึ่งไม่เหมาะ เราต้องการเปลี่ยนกระบวนการนี้เพื่อให้แอปพลิเคชันรันการย้ายฐานข้อมูลของตัวเองเมื่อเริ่มต้น
นี่คือสถานการณ์:
เรามีแอพพลิเคชั่นนี้หลายตัว - ประมาณ 5 ตัวในการผลิต มาเรียกพวกเขาnode1, ..., node5
กัน แต่ละแอปเชื่อมต่อกับอินสแตนซ์ของ SQL Server เดียวและเราไม่ได้ใช้การปรับใช้แบบหมุนเวียน (แอพทั้งหมดจะถูกปรับใช้พร้อมกันเท่าที่ฉันรู้)
ปัญหา: ว่าเรามีการโยกย้ายที่ใช้เวลานาน ในกรณีนี้node1
เริ่มต้นจากนั้นเริ่มดำเนินการโยกย้าย ตอนนี้node4
เริ่มและการโยกย้ายที่ใช้เวลานานยังไม่เสร็จดังนั้นจึงnode4
เริ่มการโยกย้าย -> ความเสียหายของข้อมูลที่เป็นไปได้หรือไม่ คุณจะป้องกันปัญหานี้อย่างไรหรือเป็นปัญหาที่สำคัญพอที่จะกังวลได้อย่างไร
ฉันกำลังคิดที่จะแก้ปัญหานี้ด้วยการล็อคแบบกระจาย AA (ใช้etcd
หรืออะไรก็ได้ตามบรรทัดเหล่านั้น) โดยพื้นฐานแล้วแอพทั้งหมดพยายามที่จะได้รับการล็อคโดยมีเพียงหนึ่งในนั้นเท่านั้นที่ได้รับมันและเรียกใช้การย้ายข้อมูลจากนั้นปลดล็อค เมื่อแอปที่เหลือเริ่มต้นและเข้าสู่ส่วนที่สำคัญการโยกย้ายทั้งหมดจะถูกเรียกใช้แล้วสคริปต์การโยกย้ายก็จะออก
อย่างไรก็ตามลำไส้ของฉันกำลังพูดว่า "นี่มันเกินจะต้องมีวิธีแก้ปัญหาที่ง่ายกว่า" ดังนั้นฉันจึงคิดว่าฉันจะขอให้ที่นี่เพื่อดูว่าใครมีความคิดที่ดีกว่านี้อีก