การจำลองแบบมาสเตอร์ - มาสเตอร์ไม่ดีอย่างที่คุณคิดว่าไปที่พร็อกซี round-robin และโซลูชัน 'ง่าย' ที่คล้ายกัน หากคุณส่งข้อมูลที่ขัดแย้งกันเพื่อแยกเซิร์ฟเวอร์ให้เร็วพอ (เร็วกว่าความล่าช้าระหว่างเซิร์ฟเวอร์ซึ่งบนเซิร์ฟเวอร์ที่ใช้งานจริงอาจมีความยาวไม่เกินวินาที*
) ทั้งสองจะรับข้อมูล หากคุณมีเซิร์ฟเวอร์ประมูลคุณเพียงแค่ขายรถคันเดียวกันสองครั้ง ใครซื้อมัน ขึ้นอยู่กับว่าคุณจะถาม DB ใด!
แอปพลิเคชันจะต้องทราบว่ามีฐานข้อมูลจริง 2 ฐานและจำเป็นต้องรู้ทั้งที่อยู่ IP ของพวกเขา ถ้าคุณต้องการที่จะ "ขาย" คุณควรจะ fe
DB_number = `auction_number` % `number_of_databases`
( %
สำหรับmodulo
)
... และส่งไปยังฐานข้อมูล DB_number หากคุณได้รับข้อผิดพลาดในการเชื่อมต่ออาจทำกับอีกอันหนึ่ง (แต่ในกรณีของเซิร์ฟเวอร์ประมูลฉันจะแสดงข้อผิดพลาด)
นอกจากนี้ที่อยู่ IP ควรเป็นwackamole -d ระหว่างเซิร์ฟเวอร์ทั้งสอง ในสถานการณ์ภัยพิบัติที่เซิร์ฟเวอร์ฐานข้อมูลหนึ่งหยุดทำงานเป็นเวลาสองสามชั่วโมงในช่วงเวลาที่มีการใช้งานสูงสุดคุณจะพบว่าแอปพลิเคชันจะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ที่ขาดไปและหยุดพักจนกระทั่ง TIMEOUT พูด 3 วินาที ทันใดนั้นครึ่งหนึ่งของการสืบค้นของคุณใช้เวลานานกว่า 3 วินาที (และพวกเขาทั้งหมดไปที่ฐานข้อมูลเดียวกันในที่สุด - ซึ่งไม่ได้ทำให้มันทำงานเร็วกว่าก่อนเกิดภัยพิบัติ) สิ่งนี้ไม่ทำให้ httpd ของคุณมีความสุขเนื่องจากอาจมีกลุ่มการเชื่อมต่อที่ จำกัด ของเธรดตัวจัดการคำขอพร้อมกัน ...
*
ความล่าช้าในการจำลองแบบบนเซิร์ฟเวอร์ที่ใช้งานจริงอาจนานถึงสองวินาทีเต็ม - ฉันได้ทดสอบสิ่งนี้ใน colocation ระยะไกลและในดาต้าเซ็นเตอร์ของเราและประมาณ 99% ของเวลาที่เป็น 0 แต่บางครั้ง mysql แสดง 1s ในทราฟฟิกจำนวนมากฉันมีการชนกันมากมายเนื่องจากแอปพลิเคชันไคลเอนต์ทำการร้องขอสองครั้งทำให้เกิดแบบสอบถามสองรายการแทรกและเลือก สำหรับบางกรณีแถวก็ไม่ได้มีเลยดังนั้นเราใช้แฮชของหมายเลขผู้ใช้และแก้ไขปัญหา
ฉันหวังว่าคุณจะได้เรียนรู้จากความผิดพลาดของฉัน ;-)