ฉันจะเพิ่มข้อมูลที่อัปเดตและการอ้างอิงถึงคำตอบที่ยอดเยี่ยมของ @ max-malysh ด้านบน
ในระยะสั้นถ้าคุณทำอะไรกับต้นแบบมันจะต้องจำลองบนทาส Postgres ใช้เร็กคอร์ด WAL สำหรับสิ่งนี้ซึ่งจะถูกส่งหลังจากทุกการกระทำที่ล็อกบนมาสเตอร์ไปยังทาส จากนั้นทาสจะดำเนินการดำเนินการและทั้งสองซิงค์อีกครั้ง ในหลายสถานการณ์คุณอาจขัดแย้งกับทาสกับสิ่งที่เข้ามาจากนายในการกระทำ WAL โดยส่วนใหญ่มีธุรกรรมที่เกิดขึ้นกับทาสซึ่งขัดแย้งกับสิ่งที่การกระทำของ WAL ต้องการเปลี่ยนแปลง ในกรณีนี้คุณมีสองทางเลือก:
- ชะลอการใช้แอคชัน WAL สักหน่อยปล่อยให้ Slave ทำธุรกรรมที่ขัดแย้งกันเสร็จแล้วจึงใช้การดำเนินการ
- ยกเลิกแบบสอบถามที่ขัดแย้งกันบนทาส
เราเกี่ยวข้องกับ # 1 และสองค่า:
max_standby_archive_delay
- นี่คือความล่าช้าที่ใช้หลังจากการตัดการเชื่อมต่อระหว่าง master และ slave เป็นเวลานานเมื่อข้อมูลถูกอ่านจากไฟล์เก็บถาวร WAL ซึ่งไม่ใช่ข้อมูลปัจจุบัน
max_standby_streaming_delay
- ความล่าช้าที่ใช้ในการยกเลิกการสอบถามเมื่อได้รับรายการ WAL ผ่านการจำลองแบบสตรีมมิง
โดยทั่วไปหากเซิร์ฟเวอร์ของคุณมีไว้สำหรับการจำลองแบบที่มีความพร้อมใช้งานสูงคุณต้องการให้ตัวเลขเหล่านี้สั้น การตั้งค่าเริ่มต้น30000
(มิลลิวินาทีหากไม่ได้ระบุหน่วย) เพียงพอสำหรับสิ่งนี้ อย่างไรก็ตามหากคุณต้องการตั้งค่าบางอย่างเช่นที่เก็บถาวรการรายงานหรือแบบจำลองการอ่านที่อาจมีข้อความค้นหาที่ใช้งานมานานมากคุณจะต้องตั้งค่านี้เป็นค่าที่สูงขึ้นเพื่อหลีกเลี่ยงการค้นหาที่ถูกยกเลิก การ900s
ตั้งค่าที่แนะนำด้านบนดูเหมือนจะเป็นจุดเริ่มต้นที่ดี ฉันไม่เห็นด้วยกับเอกสารอย่างเป็นทางการเกี่ยวกับการกำหนดมูลค่าที่ไม่มีที่สิ้นสุด-1
ว่าเป็นความคิดที่ดีซึ่งอาจปิดบังรหัสข้อบกพร่องและทำให้เกิดปัญหามากมาย
ข้อแม้ประการหนึ่งเกี่ยวกับการสืบค้นที่ใช้เวลานานและการตั้งค่าเหล่านี้ให้สูงขึ้นคือการสืบค้นอื่น ๆ ที่ทำงานบนทาสควบคู่ไปกับคำค้นหาที่ทำงานเป็นเวลานานซึ่งทำให้การดำเนินการ WAL ล่าช้าจะเห็นข้อมูลเก่าจนกว่าการสืบค้นแบบยาวจะเสร็จสิ้น นักพัฒนาจะต้องเข้าใจสิ่งนี้และจัดลำดับการสืบค้นที่ไม่ควรทำงานพร้อมกัน
สำหรับคำอธิบายที่เต็มรูปแบบของวิธีการmax_standby_archive_delay
และmax_standby_streaming_delay
การทำงานและทำไมไปที่นี่