ว้าวนี่เป็นคำถามง่าย ๆ ซึ่งเป็นคำตอบที่เป็นไปได้มากมาย ส่วนที่ชัดเจนของคำถามของคุณถามว่ามันสามารถปรับขนาดได้เพื่อเชื่อมต่อกับฐานข้อมูลของคุณโดยตรงหรือผ่านบริการเว็บ คำตอบนั้นง่าย: ค้นหาฐานข้อมูลโดยตรง การเข้าใช้บริการผ่านเว็บช่วยเพิ่มเวลาในการตอบสนองทั้งที่ไม่จำเป็นสำหรับการใช้รหัสหลังไฟร์วอลล์ (โดยและขนาดใหญ่) ตัวอย่างเช่นบริการเว็บต้องการส่วนประกอบบางอย่างในการรับคำขอ, ยกเลิกการจัดทำมัน, สืบค้นฐานข้อมูล, เรียงลำดับการตอบสนองและส่งกลับ ดังนั้นหากรหัสของคุณทำงานอยู่หลังไฟร์วอลล์ให้ช่วยตัวเองให้เกิดปัญหาและเพียงแค่สอบถาม DB โดยตรง
การทำให้เว็บไซต์สามารถปรับขนาดได้ แต่นอกเหนือไปจากคำถามที่คุณโพสต์ในตอนแรก ดังนั้นยกโทษให้ฉันถ้าฉันไปสัมผัสที่นี่ แต่ฉันคิดว่ามันอาจจะมีประโยชน์พิจารณาว่าคุณพูดถึง Facebook โดยเฉพาะ
ฉันอยากจะแนะนำให้คุณอ่านเกี่ยวกับงานและเครื่องมือที่สร้างขึ้นโดยแบรดฟิตซ์แพททริก (ผู้ก่อตั้ง LiveJournal และตอนนี้ที่ Google) เมื่อฉันทำงานกับเขาที่ Six Apart นี่คือบางสิ่งที่ฉันเรียนรู้จากเขาและเกี่ยวกับสถาปัตยกรรมของ LiveJournal ที่ทำให้มันปรับขนาดได้
ใช้ตารางฐานข้อมูลแคบเมื่อเทียบกับคนที่กว้าง สิ่งที่น่าสนใจเกี่ยวกับสิ่งนี้คือการเรียนรู้ว่าอะไรเป็นแรงบันดาลใจในสถาปัตยกรรมนี้ซึ่งกำลังสร้างระบบที่ง่ายและรวดเร็วอัพเกรด หากคุณใช้ตารางกว้างหรือตารางที่แต่ละเขตข้อมูลหรือคุณสมบัติเป็นคอลัมน์ในตารางเมื่อถึงเวลาที่จะอัพเกรดสคีมาฐานข้อมูลตัวอย่างเช่นการเพิ่มคอลัมน์ใหม่ระบบจะต้องล็อคตารางในขณะที่สคีมา มีการนำการเปลี่ยนแปลงมาใช้ เมื่อใช้งานในระดับนี้หมายความว่าการเปลี่ยนแปลงแบบง่าย ๆ กับสกีมาฐานข้อมูลอาจทำให้ฐานข้อมูลขนาดใหญ่ดับ ซึ่งดูดอย่างเห็นได้ชัด ตารางที่แคบในอีกทางหนึ่งก็เพียงเก็บแต่ละคุณสมบัติที่เกี่ยวข้องกับวัตถุเป็นแถวเดียวในฐานข้อมูล ดังนั้นเมื่อคุณต้องการเพิ่มคอลัมน์ใหม่ในฐานข้อมูลทั้งหมดที่คุณต้องทำคือบันทึก INSERT ในตารางซึ่งเป็นการดำเนินการที่ไม่ล็อค ตกลงนั่นเป็นพื้นหลังเล็ก ๆ มาดูกันว่าแบบจำลองนี้แปลในระบบการทำงานเช่น LiveJournal ได้อย่างไร
สมมติว่าคุณต้องการโหลดรายการบันทึก 10 รายการสุดท้ายในบล็อกของบุคคลและสมมติว่ารายการบันทึกประจำวันแต่ละรายการมีคุณสมบัติสิบรายการ ในเค้าโครงตารางแบบกว้างแบบคลาสสิกแต่ละคุณสมบัติจะสัมพันธ์กับคอลัมน์บนตาราง ผู้ใช้จะสอบถามตารางหนึ่งครั้งเพื่อดึงข้อมูลทั้งหมดที่ต้องการ แบบสอบถามจะส่งคืน 10 แถวและแต่ละแถวจะมีข้อมูลทั้งหมดที่ต้องการ (เช่น SELECT * จากรายการเรียงลำดับตามวันที่ จำกัด 10) ในรูปแบบตารางแคบ ๆ แต่สิ่งต่าง ๆ เล็กน้อย ในตัวอย่างนี้มีสองตารางจริง ๆ : ตารางแรก (ตาราง A) เก็บเกณฑ์ง่ายๆที่ต้องการค้นหาโดยเช่น id ของรายการ, id ของผู้เขียน, วันที่ของรายการ, ฯลฯ ตารางที่สอง (ตาราง B) จากนั้นเก็บคุณสมบัติทั้งหมดที่เกี่ยวข้องกับรายการ ตารางที่สองนี้มีสามคอลัมน์: entry_id, key และ value สำหรับทุกแถวในตาราง A จะมี 10 แถวในตาราง B (หนึ่งแถวสำหรับแต่ละคุณสมบัติ) ดังนั้นเพื่อที่จะดึงข้อมูลและแสดงสิบรายการที่ผ่านมาคุณจะต้องมี 11 แบบสอบถาม แบบสอบถามแรกให้รายการรหัสรายการจากนั้นแบบสอบถามสิบรายการถัดไปจะดึงคุณสมบัติที่เกี่ยวข้องกับแต่ละรายการที่ส่งคืนในแบบสอบถามแรก
"Holy moly!" คุณพูดว่า "วิธีการบนโลกที่สามารถปรับขนาดได้มากขึ้น!" มันตอบโต้ได้ง่ายใช่มั้ย ในสถานการณ์แรกเราเพิ่งมีแบบสอบถามฐานข้อมูลหนึ่ง แต่ในโซลูชันที่ "ปรับขนาดได้มากขึ้น" ที่สองเรามี 11 แบบสอบถามฐานข้อมูล ไม่สมเหตุสมผลเลย คำตอบสำหรับคำถามนั้นขึ้นอยู่กับสัญลักษณ์แสดงหัวข้อย่อยถัดไป
ใช้ memcache อย่างอิสระ ในกรณีที่คุณไม่ทราบ memcache นั้นเป็นระบบแคชแบบกระจายเครือข่ายไร้สายแฝงต่ำ มันถูกใช้โดย Facebook, Google, Yahoo และเกือบทุกเว็บไซต์ยอดนิยมและปรับขนาดได้บนโลกใบนี้ มันถูกคิดค้นโดย Brad Fitzpatrick บางส่วนเพื่อช่วยชดเชยค่าใช้จ่ายฐานข้อมูลโดยธรรมชาติในการออกแบบฐานข้อมูลตารางที่แคบ ลองมาดูตัวอย่างเดียวกันกับที่กล่าวไว้ใน # 1 ข้างต้น แต่คราวนี้เรามาแนะนำ memcache กัน
เริ่มกันเลยเมื่อผู้ใช้เยี่ยมชมเพจเป็นครั้งแรกและไม่มีสิ่งใดอยู่ในแคช คุณเริ่มต้นด้วยการสืบค้นตาราง A ซึ่งส่งคืน ID ของ 10 รายการที่คุณต้องการแสดงในหน้า สำหรับแต่ละรายการเหล่านั้นคุณจะค้นหาฐานข้อมูลเพื่อดึงคุณสมบัติที่เกี่ยวข้องกับรายการนั้นและจากนั้นใช้คุณสมบัติเหล่านั้นเป็นวัตถุที่รหัสของคุณสามารถเชื่อมต่อกับ (เช่นวัตถุ) จากนั้นคุณซ่อนวัตถุนั้น (หรือรูปแบบที่เป็นอนุกรมของวัตถุนั้น) ใน memcache
ครั้งที่สองที่มีคนโหลดหน้าเดียวกันคุณเริ่มต้นด้วยวิธีเดียวกัน: โดยการสืบค้นตาราง A สำหรับรายการ ID รายการที่คุณจะแสดง สำหรับแต่ละรายการคุณไปที่ memcache ก่อนและพูดว่า "คุณมีรายการ #X ในแคชหรือไม่" ถ้าใช่แล้ว memcache จะส่งคืนวัตถุรายการให้คุณ ถ้าไม่เช่นนั้นคุณต้องค้นหาฐานข้อมูลอีกครั้งเพื่อดึงคุณสมบัติของมันประกอบเป็นวัตถุและสะสมใน memcache ส่วนใหญ่ครั้งที่สองมีคนเข้าชมหน้าเดียวกันมีแบบสอบถามฐานข้อมูลเดียวเท่านั้นข้อมูลอื่น ๆ ทั้งหมดจะถูกดึงจาก memcache โดยตรง
ในทางปฏิบัติสิ่งที่เกิดขึ้นกับ LiveJournal ส่วนใหญ่คือข้อมูลส่วนใหญ่ของระบบโดยเฉพาะข้อมูลที่มีความผันผวนน้อยกว่านั้นถูกแคชไว้ใน memcache และการสืบค้นเพิ่มเติมไปยังฐานข้อมูลที่จำเป็นในการรองรับสคีมาตารางแคบล้วน แต่ชดเชยทั้งหมด
การออกแบบนี้จะทำให้การแก้ปัญหาที่เกี่ยวข้องกับการประกอบรายการโพสต์ที่เกี่ยวข้องกับเพื่อนของคุณลงในลำธารหรือ "กำแพง" มากมากได้ง่ายขึ้น
จากนั้นให้พิจารณาการแบ่งพาร์ติชันฐานข้อมูลของคุณ แบบจำลองที่กล่าวถึงพื้นผิวด้านบนยังมีปัญหาอื่นและนั่นคือตารางแคบ ๆ ของคุณจะมีขนาดใหญ่ / ยาวมาก และยิ่งแถวเหล่านั้นยิ่งมีงานบริหารมากขึ้น เพื่อชดเชยสิ่งนี้คุณควรจัดการขนาดของตารางของคุณด้วยการแบ่งพาร์ติชั่นของตารางในบางวิธีเพื่อให้กลุ่มผู้ใช้บริการโดยฐานข้อมูลเดียว สิ่งนี้กระจายโหลดบนฐานข้อมูลและรักษาข้อความค้นหาให้มีประสิทธิภาพ
ในที่สุดคุณต้องมีดัชนีที่ยอดเยี่ยม ความเร็วของการสอบถามของคุณจะขึ้นอยู่กับการจัดทำดัชนีตารางฐานข้อมูลของคุณเป็นอย่างดี ฉันจะไม่ใช้เวลามากเกินไปในการอภิปรายว่าดัชนีคืออะไรยกเว้นจะบอกว่ามันเป็นเหมือนระบบแคตตาล็อกบัตรยักษ์ที่จะทำให้การค้นหาเข็มในกองหญ้ามีประสิทธิภาพมากขึ้น หากคุณใช้ mysql ฉันขอแนะนำให้เปิดบันทึกการสืบค้นที่ช้าเพื่อตรวจสอบการสืบค้นที่ใช้เวลานานในการปฏิบัติตาม เมื่อเคียวรีปรากฏขึ้นบนเรดาร์ของคุณ (เช่นเพราะมันช้า) ให้หาดัชนีที่คุณต้องการเพิ่มลงในตารางเพื่อเร่งความเร็ว
"ขอบคุณสำหรับภูมิหลังที่ยอดเยี่ยมทั้งหมดนี้ แต่เป็นสิ่งศักดิ์สิทธิ์ที่เป็นรหัสจำนวนมากที่ฉันจะต้องเขียน"
ไม่จำเป็น. ห้องสมุดหลายแห่งถูกเขียนขึ้นซึ่งทำให้การเชื่อมต่อกับ memcache นั้นง่ายมาก ยังห้องสมุดอื่น ๆ ได้ประมวลกฎหมายกระบวนการทั้งหมดที่อธิบายไว้ข้างต้น; Data :: ObjectDriver ใน Perl เป็นเพียงห้องสมุด สำหรับภาษาอื่นคุณจะต้องทำวิจัยของคุณเอง
ฉันหวังว่าคุณจะพบคำตอบนี้เป็นประโยชน์ สิ่งที่ฉันได้พบบ่อยกว่านั้นคือความสามารถในการปรับขนาดของระบบมักจะน้อยลงและน้อยลงสำหรับรหัสและยิ่งเพิ่มมากขึ้นสำหรับการจัดเก็บข้อมูลเสียงและกลยุทธ์การจัดการ / การออกแบบทางเทคนิค