PostgreSQL ความพร้อมใช้งาน / ความสามารถในการปรับขนาดสูงโดยใช้ HAProxy และ PGBouncer


17

ฉันมีเซิร์ฟเวอร์ PostgreSQL หลายเครื่องสำหรับเว็บแอปพลิเคชัน โดยทั่วไปแล้วจะเป็นทาสหลักและทาสหลายคนในโหมดฮอตสแตนบาย (การจำลองการส่งกระแสข้อมูลแบบอะซิงโครนัส)

ฉันใช้ PGBouncer สำหรับการรวมการเชื่อมต่อ: หนึ่งอินสแตนซ์ที่ติดตั้งบนเซิร์ฟเวอร์ PG แต่ละตัว (พอร์ต 6432) เชื่อมต่อกับฐานข้อมูลบน localhost ฉันใช้โหมดกลุ่มธุรกรรม

ในการโหลดการเชื่อมต่อแบบอ่านอย่างเดียวของฉันกับทาสฉันใช้ HAProxy (v1.5) กับ conf มากกว่าหรือน้อยกว่าเช่นนี้

listen pgsql_pool 0.0.0.0:10001
        mode tcp
        option pgsql-check user ha
        balance roundrobin
        server master 10.0.0.1:6432 check backup
        server slave1 10.0.0.2:6432 check
        server slave2 10.0.0.3:6432 check
        server slave3 10.0.0.4:6432 check

ดังนั้นเว็บแอปพลิเคชันของฉันเชื่อมต่อกับ haproxy (พอร์ต 10001) นั่นคือการเชื่อมต่อโหลดบาลานซ์บน pgbouncer หลายตัวที่กำหนดค่าไว้ใน PG slave แต่ละตัว

นี่คือกราฟตัวแทนของสถาปัตยกรรมปัจจุบันของฉัน:

haproxy> pgbouncer> postgresql

มันใช้งานได้ดีเช่นนี้ แต่ฉันรู้ว่ามีการดำเนินการบางอย่างที่แตกต่างกันนี้: เว็บแอปพลิเคชันเชื่อมต่อกับอินสแตนซ์ PGBouncer เดียวที่เชื่อมต่อกับ HAproxy ซึ่งโหลดสมดุลกับเซิร์ฟเวอร์ PG หลายตัว:

pgbouncer> haproxy> postgresql

วิธีที่ดีที่สุดคืออะไร อันแรก (อันปัจจุบันของฉัน) หรืออันที่สอง? มีข้อได้เปรียบของการแก้ปัญหาอย่างใดอย่างหนึ่งมากกว่าที่อื่น ๆ ?

ขอบคุณ

คำตอบ:


10

การกำหนดค่าปัจจุบันของ HAProxy -> PGBouncer -> PGServer approch ดีกว่า และนั่นใช้งานได้เท่านั้น นี่คือเหตุผล: HAProxy เปลี่ยนเส้นทางการเชื่อมต่อไปยังเซิร์ฟเวอร์อื่น ส่งผลให้การเปลี่ยนแปลงที่อยู่ MAC ในการเชื่อมต่อฐานข้อมูล ดังนั้นหาก PGBouncer สูงกว่า HAProxy ทุกครั้งที่การเชื่อมต่อในพูลได้รับการทำให้ใช้งานไม่ได้เนื่องจากการเปลี่ยนแปลงที่อยู่ MAC


7

pgbouncer ดูแลการเชื่อมต่อในพูลด้วยเซิร์ฟเวอร์ postgres เวลาสร้างการเชื่อมต่อ TCP มีความสำคัญในสภาพแวดล้อมที่มีปริมาณมาก

ลูกค้าที่ทำการร้องขอ DB จำนวนมากจะต้องตั้งค่าการเชื่อมต่อกับ PGBouncer ระยะไกลสำหรับแต่ละคำขอ สิ่งนี้มีราคาแพงกว่าการใช้ PgBouncer ในเครื่อง

ดังนั้น IMO, PGBouncer -> HAProxy -> PGServer น่าจะดีกว่า HAProxy -> PGBouncer -> PGServer โดยเฉพาะอย่างยิ่งเมื่อ PGBouncer อยู่ในแอปพลิเคชันไคลเอนต์


1

ฉันไม่เห็นด้วยกับคำตอบของโดนาเทลโล

คุณจะเห็นว่าหากแอปพลิเคชันของคุณไม่ได้จัดการการเชื่อมต่อฐานข้อมูลโดยใช้พูลภายในเครื่องมันจะสร้างการเชื่อมต่อใหม่ทุกครั้งที่ต้องการสืบค้น DB ที่เกิดขึ้นเหมือนกันเมื่อใช้ PgBouncer ดังนั้นคุณจะได้รับการปรับปรุงที่ดีมากโดยใช้มัน

เมื่อ PgBouncer กำลังจัดการการเชื่อมต่อ PostgreSQL โดยรวมกำไรกันเวลาที่แอปของคุณใช้ในการเปิดการเชื่อมต่อลดลงอย่างมากเมื่อเทียบกับเมื่อเปิดการเชื่อมต่อกับฐานข้อมูลโดยตรง นั่นเป็นเพราะ PG ค่อนข้างช้าในการตรวจสอบและตรวจสอบข้อมูลรับรองและทุกอย่างทุกครั้งที่มีการร้องขอการเชื่อมต่อ

ดังนั้นแอพวิธี -> HAProxy -> [PgBouncer -> PostgreSQL] นั้นดีกว่าเพราะ PgBouncer ช่วยประหยัดเวลาในการเชื่อมต่อกับ PG โหมดการรวมกำไรเป็นสิ่งสำคัญที่จะต้องคำนึงถึงเช่นกัน คุณต้องระวังพฤติกรรมของแอพของคุณ มันเป็นธุรกรรมส่วนใหญ่หรือไม่? หรือว่าจะใช้ประโยค SQL ขนาดเล็กจำนวนมากพร้อมกันพร้อม ๆ กันไหม? พารามิเตอร์เหล่านั้นทั้งหมดมีผลต่อประสิทธิภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.