การจำลองแบบ Drupal Master / Slave


10

ฉันได้ติดตั้งเซิร์ฟเวอร์ MySQL สองเครื่องด้วยการจำลองแบบ Master / Slave สำหรับฐานข้อมูล drupal และฉันยืนยันว่าฐานข้อมูลนั้นซิงค์และทำซ้ำ

ตอนนี้ฉันกำลังพยายามชี้ drupal ไปยังฐานข้อมูลทั้งคู่โดยทั่วไปเพื่อวัตถุประสงค์ในการ failover / redundancy นั่นคือถ้าฉันต้องการรีบูตเซิร์ฟเวอร์ฐานข้อมูลหลักของฉันฉันไม่ต้องการให้เว็บไซต์ของเราล้มลง (การอ่านอย่างเดียวเป็นที่ยอมรับในสถานการณ์ความล้มเหลว)

บนพื้นฐานของบทความต่อไปนี้ ฉันแก้ไขsettings.phpดังนี้:

$databases['default']['default'] = array(
  'driver' => 'mysql',
  'database' => 'sdrupal',
  'username' => 'drupal',
  'password' => 'topsecret',
  'host' => 'masterdb.ptp.local',
);
$databases['default']['slave'][] = array(
  'driver' => 'mysql',
  'database' => 'sdrupal',
  'username' => 'drupal',
  'password' => 'topsecret',
  'host' => 'slavedb.ptp.local',
);

การกำหนดค่านั้นใช้ได้จนกว่าฉันจะปิดต้นแบบ (หยุดบริการ mysqld) - เมื่อฉันทำเช่นนั้นเว็บไซต์ของฉันจะปุก:

PDOException: SQLSTATE [HY000] [2013] การเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ที่ 'การอ่านแพคเก็ตการสื่อสารเริ่มต้น' ระบบผิดพลาด: 111 ใน drupal_is_denied () (สาย 1895 ของ /www/includes/bootstrap.inc) เพิ่มเติม

PDOException: SQLSTATE [HY000] [2013] การเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ที่ 'การอ่านแพคเก็ตการสื่อสารเริ่มต้น' ระบบผิดพลาด: 111 ใน dblog_watchdog () (บรรทัดที่ 141 จาก /www/modules/dblog/dblog.module)

เคล็ดลับที่จะทำให้การทำงานนี้คืออะไร?

คำตอบ:


6

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

ต่อไปนี้จะทำให้การเขียนทั้งหมดไปที่ master1 และการอ่านทั้งหมดไปที่ master2 หาก master1 ล้มเหลวแบบสอบถามทั้งหมดจะไปที่ master2 หาก master2 ล้มเหลวแบบสอบถามทั้งหมดจะไปที่ master1

'master' => array('master1', 'master2')
'slave' => array('master2', 'master1')

ต่อไปนี้จะทำให้แบบสอบถามทั้งหมดไปที่ master1 หาก master1 ล้มเหลวแบบสอบถามทั้งหมดจะไปที่ master2:

'master' => array('master1', 'master2')
'slave' => array('master1', 'master2')

ขอบคุณสำหรับคำตอบนี้ ฉันเข้าใจว่านี่ค่อนข้างเก่าและอาจล้าสมัย คุณมีเคล็ดลับสำหรับการนำไปใช้ใน Drupal รุ่นล่าสุดหรือไม่?
Gaurav Ojha

4

เพื่อประโยชน์ของผู้อื่น - ดีที่สุดเท่าที่ฉันจะหาได้ - นอกกรอบ Drupal 7 ดูเหมือนจะไม่มีฐานข้อมูลที่มีความพร้อมใช้งานสูงในตัว

คุณสามารถติดตั้งเซิร์ฟเวอร์ mysql สองเครื่องในการกำหนดค่า master / slave แต่วิธีที่ดีที่สุดที่จะทำได้คือส่งการเขียนทั้งหมดไปที่ master และการอ่านทั้งหมดไปยัง slave ที่ให้การกระจายน้ำหนักดิบ แต่ไม่ล้มเหลว

กล่าวคือหากเซิร์ฟเวอร์ mysql หลักล่มการเดิมพันทั้งหมดจะถูกปิด - เว็บไซต์จะมีข้อความแสดงข้อผิดพลาดที่น่าเกลียดซึ่งบ่นว่า PHP ไม่สามารถเข้าถึงฐานข้อมูลหลักได้

ตามเนื้อผ้าที่ฉันเข้าใจวิธีจัดการกับซอฟต์แวร์อื่น ๆ คือการใช้ mysql ndb clusters หรือ mysql proxy - แต่หลังจากอ่านสักนิด - เทคโนโลยีเหล่านี้ดูเหมือนจะไม่ค่อยดีกับ Drupal

อย่างไรก็ตามฉันพบโมดูล Drupal ที่เรียกว่า auto-slave ( http://drupal.org/project/autoslave ) มันไม่ได้ใช้กันอย่างแพร่หลาย (มี 12 เว็บไซต์ที่ใช้งานได้ตามสถิติ) แต่ดูเหมือนว่าจะสามารถทำสิ่งที่เราต้องการได้ สามารถกำหนดค่าได้หลายวิธี:

Master / Slave

Writes go to Master
Reads go to Slave

Drawbacks:
If master is down, the durpal site displays a prominent message that the site is in "read only" mode.

มาสเตอร์ / มาสเตอร์ (ว่างสูง)

Read and Writes go to master1 (primary) unless its unavailable.
If master1 is unavailable, reads and writes go to master2 (secondary)

Drawbacks:
There is no load distribution. All load (reads and writes) go to either master1 or to master2

Master / Master / Slave (ความพร้อมใช้งานสูง / ประสิทธิภาพสูง)

Writes go to Master1 (primary) unless its down then they go to Master2
Reads go to the slave unless its down
Drawbacks:
Requires a minimum of three database servers (master/master/slave)

จนถึงตอนนี้เราได้ทำการติดตั้งครั้งแรก (Master / Slave) เรียบร้อยแล้ว ฉันจะพยายามตั้งค่า Master / Master / Slave ต่อไป

หวังว่านี่จะช่วยคนอื่นได้


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