หนึ่งฐานข้อมูลขนาดใหญ่เทียบกับคนที่เล็กกว่าหลายคน


14

เรามีสถานการณ์คือเราสามารถ (A) ปรับใช้อินสแตนซ์ของแอปพลิเคชันในฐานข้อมูล MySQL หนึ่งรายการโดยใช้คำนำหน้าตารางหรือ (B) ใช้ฐานข้อมูล MySQL ที่แตกต่างกันสำหรับแต่ละอินสแตนซ์ของแอปพลิเคชันเช่น

ตั้งค่า "A":

central_database
  app1_table1
  app1_table2
  app1_tablen
...
  appn_table1
  appn_table2
  appn_tablen

ผลลัพธ์ที่ได้คือฐานข้อมูลขนาดใหญ่ที่มีตารางจำนวนมาก

ตั้งค่า "B":

app1_db
  table1
  table2
  tablen

...

appn_db
  table1
  table2
  tablen

ผลลัพธ์ที่ได้คือฐานข้อมูลจำนวนมากที่มีบางตาราง

ทุกสิ่งเท่าเทียมกัน (เช่นจำนวนข้อมูลจำนวนอินสแตนซ์ของแอป ฯลฯ ) ข้อดีและข้อเสียของการใช้วิธีการอย่างใดอย่างหนึ่งคืออะไร อะไรจะเป็นอันตรายต่อประสิทธิภาพของฐานข้อมูลและการบำรุงรักษา แอปพลิเคชั่นนี้ใช้ PHP 5 รันบน Apache 2.x และเราใช้ MySQL 5.x

ขอบคุณมากสำหรับเวลาและความคิดของคุณ!


1
ที่เกี่ยวข้อง: dba.stackexchange.com/questions/4547/…
Derek Downey

ที่เกี่ยวข้อง: dba.stackexchange.com/questions/1043/…
RolandoMySQLDBA

เนื่องจาก MySQL "ฐานข้อมูล" นั้นเป็น schemas (เช่น namespaces) จริง ๆ แล้วจะไม่มีความแตกต่างในด้านประสิทธิภาพเฉพาะในการบำรุงรักษา
mustaccio

คำตอบ:


14

ฉันใช้ระบบที่มีส่วนที่ดีที่สุดของฐานข้อมูลนับพันกระจายอยู่ในหลาย ๆ เซิร์ฟเวอร์ พวกเขาทั้งหมดมีโครงสร้างที่เหมือนกันและถูกซิงโครไนซ์กับฐานข้อมูลแม่แบบซึ่งอยู่ในแต่ละเครื่อง

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

สิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้คือคุณสามารถเพิ่มเซิร์ฟเวอร์ให้กับการกำหนดค่าด้วยความเร็วของคุณเองเนื่องจากเซิร์ฟเวอร์แต่ละเครื่องเริ่มมีภาระมากเกินไปเพิ่มอีกตัวหนึ่งลงในส่วนผสมแล้วย้าย dbs บางส่วนไปยังเซิร์ฟเวอร์ใหม่และจบลงด้วยความสวยงาม โหลดบาลานซ์ชุดเซิร์ฟเวอร์ วิธีที่ดีและเรียบง่ายในการเพิ่มสเกลให้กับระบบตามที่และเมื่อจำเป็น!

เหตุผลที่ฉันไปด้วยวิธีนี้มากกว่าวิธีฐานข้อมูลขนาดใหญ่เพียงอย่างเดียวคือขนาดที่แท้จริงของฐานข้อมูลที่อาจเกิดขึ้น ... แต่ละฐานข้อมูล 1,000 แห่งมี 200 ตารางและแต่ละตารางภายในแต่ละตาราง ฐานข้อมูลประกอบด้วยข้อมูลหลายร้อยล้านแถว!

การกำหนดค่าฐานข้อมูลเดียวจะต้องใช้ตารางที่แน่นอน (ประมาณ 8 แห่ง) เพื่อให้มีข้อมูลหลายพันล้านแถวและขนาด db ทั้งหมดจะมากกว่า 10Tb เราสามารถมีเซิร์ฟเวอร์หลายตัวที่มีพื้นที่จัดเก็บ RAID 10 5Tb พร้อมฐานข้อมูลจำนวนมากในแต่ละแห่ง

นั่นคือสิ่งที่ฉันจะทำ! หวังว่ามันจะช่วยให้คุณตัดสินใจ ... :)


คำตอบที่ยอดเยี่ยม !!! +1 !!!
RolandoMySQLDBA

@DaveRix - คุณจะย้าย dbs ไปยังเซิร์ฟเวอร์ใหม่โดยไม่หยุดทำงานได้อย่างไร
Pratik Bothra

1
@ pratik-bothra - โชคดีที่ไม่ใช่ปัญหาเนื่องจากปริมาณงานของลูกค้าของเรานั้นมีเวลาทำการมากและเราสามารถทำการย้ายข้อมูลทั้งหมดนอกเวลางานได้ ไม่ 'หยุดทำงาน' เช่นนี้ แต่ไม่สามารถเข้าถึงไคลเอนต์นั้นได้ในระหว่างการโยกย้าย
Dave Rix

ถ้าคุณต้องเปลี่ยนโครงสร้างข้อมูลสำหรับแต่ละพันฐานข้อมูลล่ะ? นั่นเป็นความเจ็บปวดที่แท้จริงในตูดใช่มั้ย
Vincent

@Vincent ไม่ได้จริงๆเพราะพวกเขาทำข้อมูลให้ตรงกันกับแม่แบบโดยใช้สคริปต์ที่สร้างขึ้นเอง ทำการเปลี่ยนแปลงเทมเพลตและปล่อยให้สคริปต์การซิงค์ทำงานอย่างวิเศษในอีกไม่กี่วันข้างหน้าเนื่องจากข้อมูลถูกโหลดไปยังฐานข้อมูลอื่น
Dave Rix

11

แอปพลิเคชันที่คุณกำลังสร้างแอปพลิเคชัน SaaS อยู่หรือไม่ ถ้าเป็นเช่นนั้นฉันขอแนะนำให้คุณพิจารณาแนวทางที่สาม - มีหนึ่งฐานข้อมูลพร้อมโครงสร้างทั่วไปสำหรับอินสแตนซ์ของแอปพลิเคชันทั้งหมดที่มีความแตกต่างเดียว - เพิ่มคอลัมน์ userid / applicationid ในตารางทั้งหมด สิ่งนี้จะลดต้นทุนการพัฒนา / บำรุงรักษาแอปพลิเคชันของคุณอย่างมาก ในประสบการณ์ของฉันเป็นหนึ่งในวิธีที่ดีที่สุดในการจัดเก็บข้อมูลผู้เช่าหลายคน

ดูเอกสารทางเทคนิคที่ยอดเยี่ยมนี้ของ Microsoft ในสถาปัตยกรรมข้อมูลที่มีหลายผู้เช่า

นอกจากนี้ยังเน้นถึงข้อดี / ข้อเสียของวิธีการที่คุณกล่าวถึง


1
นี่เป็นจุดที่น่าสนใจมาก ในขณะที่ฉันเห็นด้วยกับหลักการมันก็คุ้มค่าที่จะพิจารณาความเสี่ยงที่เกี่ยวข้องกับแพลตฟอร์ม SaaS ที่กระจายตัวทางภูมิศาสตร์ ตัวอย่างเช่นหากแพลตฟอร์ม SaaS เดียวของคุณมีผู้ใช้ทั้งในสหรัฐอเมริกาและยุโรปก็ควรมีอินสแตนซ์ของเซิร์ฟเวอร์ในทั้งสองทวีปเพื่อลดเวลาในการตอบสนอง นี่ค่อนข้างง่ายที่จะบรรลุด้วยอินสแตนซ์ฐานข้อมูลหลาย ๆ อัน (และจะส่งผลให้มีค่าใช้จ่ายในการจัดการฐานข้อมูลจำนวนเล็กน้อย) แต่ก็เป็นสิ่งที่คุณต้องคำนึงก่อนเสมอเมื่อออกแบบเลเยอร์แอปพลิเคชันของผู้เช่าหลายแพลตฟอร์ม
Kosta Kontos

9

การตั้งค่า B นั้นง่ายต่อการจัดการ

แต่ละคนtablenอยู่ในโฟลเดอร์ที่แตกต่างกัน ที่สามารถเป็นประโยชน์มากถ้าคุณทำไม่ต้องการที่จะทดสอบขีด จำกัด ของระบบปฏิบัติการ

ตัวอย่างเช่นนายจ้างของฉันโฮสต์ MySQL สำหรับระบบ CRM ของตัวแทนจำหน่ายรถยนต์ ลูกค้ามีตัวแทนจำหน่าย 800 คน ฐานข้อมูลตัวแทนจำหน่ายแต่ละแห่งมี 160 ตาราง นั่นคือ 128,000 ตาราง

  • ภายใต้การตั้งค่า A ตารางทั้งหมด 128,000 ตารางจะอยู่ภายใต้ฐานข้อมูลเดียว
  • ภายใต้การตั้งค่า B ชุด 160 ตารางแต่ละชุดจะอยู่ในโฟลเดอร์ย่อยภายใต้ / var / lib / mysql

จากมุมมองของระบบปฏิบัติการและความสามารถในการจัดการ i-nodes (หรือตาราง FAT สำหรับ Windows) ซึ่งรวมถึงการมีจำนวนไฟล์สูงสุดต่อโฟลเดอร์:

  • ภายใต้การตั้งค่า A คุณจะต้องกังวลเกี่ยวกับ 128,000 ไฟล์ภายใต้โฟลเดอร์เดียว ระบบปฏิบัติการของคุณสามารถรองรับไฟล์จำนวนมากภายใต้โฟลเดอร์เดียวได้หรือไม่?
  • ภายใต้การตั้งค่า B ไม่ต้องกังวล

หากคุณต้องใช้โครงสร้างตารางโดยใช้ALTER TABLEหรือ DDL อื่น ๆ :

  • ภายใต้การตั้งค่า A คุณจะต้องสคริปต์ DDL ที่จำเป็นโดยใช้ PHP (หรือสคริปต์ MySQL เฉพาะ) กับชื่อตารางและแบบสอบถามที่เกี่ยวข้องก่อนที่จะเข้าถึงและทำการเปลี่ยนแปลง
  • ภายใต้การตั้งค่า B เชื่อมต่อกับฐานข้อมูลที่ถูกต้องจากนั้นเข้าถึงตารางที่มีชื่อเหมือนกันทุกครั้ง กระบวนทัศน์การเข้าถึงจะสะอาดอยู่เสมอ:
    • ฐานข้อมูลเฉพาะ
    • โฟลเดอร์เฉพาะภายใต้ /var/lib/mysql
    • SpecName TableName

หากคุณต้องการใส่ฐานข้อมูลต่าง ๆ ลงในดิสก์ที่แตกต่าง

  • ภายใต้การตั้งค่า A symlink สำหรับทุกตารางที่ย้ายไปยังดิสก์ที่แยกต่างหากจะทำให้ปัญหา "จำนวน inodes ในโฟลเดอร์" แย่ลงเท่านั้น การเข้าถึงดิสก์ I / O และตารางโดยรวมทำให้ซับซ้อนมากขึ้นและเพิ่มภาระเซิร์ฟเวอร์โดยรวมเนื่องจาก.frmมีการเข้าถึงไฟล์ซ้ำ ๆ
  • ภายใต้การตั้งค่า B เพียงแค่ย้ายโฟลเดอร์ฐานข้อมูลทั้งหมดไปยังตัวยึดข้อมูลแยกต่างหาก สามารถแจกจ่ายดิสก์ I / O ได้ตามต้องการ
  • ถ้ำ: หมดกำลังใจอย่างมากสำหรับ InnoDB

พูดเปรียบเทียบคุณอยากได้อะไร

  • อพาร์ทเมนต์ขนาดยักษ์พร้อมห้องนอนหนึ่งห้องห้องน้ำหนึ่งห้องและห้องครัวหนึ่งห้อง (SetupA)
  • อพาร์ทเมนต์หลายแห่งแต่ละห้องมีห้องนอนห้องน้ำและห้องครัว (SetupB)

เมื่อพูดถึงการซ่อมหม้อน้ำในอพาร์ตเมนต์:

  • ด้วยการติดตั้ง A ผู้เช่าทุกคนอาจไม่สะดวกและต้องมีส่วนร่วมเพราะคุณต้องพูดคุยกับผู้เช่าที่ได้รับผลกระทบต่อหน้าทุกคนเหมือนเป็นธุรกิจของทุกคน
  • ด้วยการตั้งค่า B นอกเหนือจากการได้ยินเสียงกระแทกบนผนังหรือในท่อผู้เช่าสามารถใช้ชีวิตส่วนตัวของพวกเขาได้
  • รายการนี้และคำอุปมาอุปมัยสามารถไปเรื่อย ๆ

IHMO แม้ว่างบประมาณอาจเป็นแรงผลักดันในการตัดสินใจออกแบบ / โครงสร้างพื้นฐาน แต่ฉันก็อยากจะแยกฐานข้อมูลต่อลูกค้า


3

ฉันยังมีผลิตภัณฑ์ SaaS และใช้การตั้งค่าเช่นเดียวกับ Dave Rix ที่กล่าวถึง

ลูกค้าแต่ละรายมีฐานข้อมูลของตนเอง

ฉันจะให้คำแนะนำเพิ่มเติม:

  • คุณควรมีฐานข้อมูล "ตัวควบคุม" โหลดบาลานซ์ (ต้นแบบหลัก) ที่เก็บตำแหน่งฐานข้อมูล (ip) ชื่อฐานข้อมูลและชื่อลูกค้า คอนโทรลเลอร์นี้เป็นที่ที่แอปพลิเคชันของคุณทราบว่าฐานข้อมูลลูกค้าแต่ละรายนั้นอยู่ที่ไหน

  • แอปพลิเคชันของคุณสามารถไปได้ทุกที่ที่ต้องการ - คุณสามารถมีฐานข้อมูลสำหรับดาต้าเซ็นเตอร์จำนวนมากทั่วโลก

  • ใบสมัครของคุณสามารถเติบโตได้มากเท่าที่คุณต้องการ ถ้าเป็น Web SaaS คุณสามารถสร้างเว็บเซิร์ฟเวอร์แบบสมดุลโหลดชี้ไปที่แต่ละฐานข้อมูลได้เช่นเดียวกับเวลาที่ลงชื่อเข้าใช้ของลูกค้า

  • คุณสามารถสร้าง VIEW / ฐานข้อมูลที่กำหนดเองสำหรับลูกค้าบางรายได้โดยไม่ส่งผลกระทบต่อผู้อื่น เป็นสิ่งสำคัญหากคุณพยายามเสนอการปรับแต่งซึ่งเป็นส่วนหนึ่งของธุรกิจของคุณ

  • คุณสามารถตั้งค่าฟาร์มฟาร์ม + ฐานข้อมูลฟาร์มสองแห่ง: แห่งหนึ่งสำหรับ "EDGE" และอีกฟาร์มสำหรับรีลีส "เสถียร" จากนั้นคุณจะต้องมีลูกค้ากลุ่มเล็ก ๆ ที่เต็มใจที่จะทดสอบสิ่งต่าง ๆ และยืนยันว่าทุกอย่างทำงานได้อย่างที่คาดหวัง (กล่าวอีกนัยหนึ่งคือการประกันคุณภาพ [QA]) ก่อนที่คุณจะนำไปใช้กับลูกค้าทั้งหมดของคุณ

  • คุณควรมีงานสำรองข้อมูลอัตโนมัติต่อฐานข้อมูลอย่างน้อยวันละครั้ง

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

    ตัวอย่างเช่น 5 เซิร์ฟเวอร์หลัก + เซิร์ฟเวอร์ทาส 1 ที่มี 5 ฐานข้อมูลที่ทำงานบนพอร์ตต่าง ๆ - มี RAM เพียงพอที่จะทำ

  • คุณควรใช้เครื่องมือ "การโยกย้าย" เพื่อย้ายฐานข้อมูลหนึ่งไปยังเซิร์ฟเวอร์อื่นทุกครั้งที่คุณต้องการ

  • คุณควรย้ายลูกค้าวีไอพีไปยังเซิร์ฟเวอร์ฐานข้อมูลที่ปลอดภัย / พร้อมใช้งานมากขึ้นเพื่อป้องกันรายได้ของคุณ โปรดจำไว้ว่าลูกค้า 20% หลายเท่าคิดเป็น 80% ของรายได้ของคุณ ดูแลลูกค้าพิเศษ

  • คุณควรจะมีตัวรวบรวม "ขยะ" สำรอง - ลบเพื่อทำการ "สำรองข้อมูลล่าสุด" และลบฐานข้อมูลเมื่อลูกค้าออกจาก บริษัท ของคุณ

  • คุณต้องมีภาพฐานข้อมูลที่คุณส่งออกและใช้สำหรับบัญชีใหม่

  • คุณต้องมีเครื่องมือการแก้ไขฐานข้อมูลเพื่อใช้โปรแกรมปรับปรุงใหม่กับบัญชีที่มีอยู่

  • เก็บเวอร์ชันของแพตช์ SQL ทั้งหมดของคุณโดยใช้เครื่องมือการกำหนดเวอร์ชันเช่นการโค่นล้มหรือคอมไพล์และสร้างหมายเลขของคุณเอง xxx-4.3.0.sql - บางครั้งการแพตช์ผิดพลาดและคุณต้องรู้วิธีการกู้คืน / ทำภารกิจการปะแก้ให้เสร็จสิ้น

นี่คือทั้งหมดที่ฉันทำใน บริษัท ของฉันด้วยผลิตภัณฑ์ที่มีฐานข้อมูลประมาณ 5k กับแต่ละตารางประมาณ 600 ตาราง

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