พื้นหลังเล็กน้อย
ฉันใช้พลอยอพาร์ทเม้นท์เพื่อเรียกใช้แอพหลายผู้เช่ามาหลายปีแล้ว ตอนนี้เมื่อเร็ว ๆ นี้ความต้องการในการขยายฐานข้อมูลออกไปยังโฮสต์ที่แยกต่างหากได้มาถึงแล้วเซิร์ฟเวอร์ db ก็ไม่สามารถติดตามได้อีกต่อไป (ทั้งการอ่านและการเขียนมีมากเกินไป) - และใช่ฉันปรับขนาดฮาร์ดแวร์ให้สูงสุด ฮาร์ดแวร์ 64 คอร์, 12 Nvm-e ไดรฟ์ในการโจมตี 10, 384Gb ram เป็นต้น)
ฉันกำลังพิจารณาที่จะทำสิ่งนี้ต่อผู้เช่า (1 tenant = 1 การเชื่อมต่อฐานข้อมูล config / pool) เพราะนั่นจะเป็นวิธีที่ "ง่าย" และมีประสิทธิภาพในการเพิ่มnumber-of-tenants
ความจุได้มากขึ้นโดยไม่ต้องเปลี่ยนรหัสแอปพลิเคชัน
ตอนนี้ฉันกำลังเรียกใช้ rails 4.2 atm. และอีกไม่นานจะอัพเกรดเป็น 5.2 ฉันเห็นว่า Rails 6 เพิ่มการสนับสนุนสำหรับคำจำกัดความการเชื่อมต่อต่อโมเดลอย่างไรก็ตามนั่นไม่ใช่สิ่งที่ฉันต้องการจริงๆเพราะฉันมี schema ฐานข้อมูลแบบมิเรอร์ทั้งหมดสำหรับผู้เช่า 20 คนของฉัน โดยทั่วไปฉันจะสลับ "ฐานข้อมูล" ต่อคำขอ (เป็นมิดเดิลแวร์) หรือต่อแบ็คกราวน์ (มิดเดิลแวร์ด้านข้าง) อย่างไรก็ตามนี่เป็นเรื่องเล็กน้อยและจัดการ ny gem อพาร์ทเม้นท์เนื่องจากมันเพิ่งตั้งค่าsearch_path
ใน Postgresql และไม่เปลี่ยนการเชื่อมต่อจริง เมื่อเปลี่ยนเป็นกลยุทธ์การโฮสต์ต่อผู้เช่าฉันจะต้องสลับการเชื่อมต่อทั้งหมดตามคำขอ
คำถาม:
- ฉันเข้าใจว่าฉันสามารถทำงาน
ActiveRecord::Base.establish_connection(config)
ตามคำขอ / แบ็คกราวน์ได้ - แต่ตามที่ฉันเข้าใจแล้วนั่นทำให้เกิดการจับมือการเชื่อมต่อฐานข้อมูลใหม่ทั้งหมดและจะสร้าง db pool ใหม่เพื่อวางไข่ในราง - ใช่ไหม? ฉันเดาว่าจะเป็นการฆ่าตัวตายของการแสดงเพื่อให้ได้ค่าใช้จ่ายในทุก ๆ การร้องขอของฉัน - ฉันจึงสงสัยว่าถ้าใครสามารถเห็นตัวเลือกที่มีรางของเช่นการสร้างการเชื่อมต่อ / พูลฐานข้อมูลหลาย ๆ อัน (รวมทั้งหมด 20) จากจุดเริ่มต้น (เช่นเมื่อบูตแอพพลิเคชั่น) แล้วสลับระหว่างพูลเหล่านั้นตามคำขอ เพื่อให้เขาเชื่อมต่อฐานข้อมูลเรียบร้อยแล้วและพร้อมใช้งาน
- ทั้งหมดนี้เป็นเพียงความคิดที่ไม่ดีและฉันควรจะมองหาวิธีการที่แตกต่างออกไปหรือไม่? เช่น 1 แอปอินสแตนซ์ = หนึ่งการเชื่อมต่อเฉพาะกับผู้เช่าหนึ่งราย หรืออย่างอื่น.
master
สาขาRails ปัจจุบัน Rails Egde นั้นจะใช้เป็นตัวเลือกหรือไม่สนับสนุนคุณสมบัตินั้นกับ Rails ปัจจุบันของคุณ?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
หมายความว่าจะใช้พูล (re-) แทนการสร้างการเชื่อมต่อใหม่ทั้งหมดทุกครั้งหรือไม่