ต้องย้อนไปตอนที่เราทำงานกับระบบที่รันอยู่บน Computer เครื่องเดียว เช่น Database ที่อยู่บน Computer เครื่องเดียวที่มี CPU , Ram และ Storage บนเครื่องเดียวแล้วรันทุกสิ่งอย่างบนเครื่องนั้นเช่น Database, Server, Job, etc.. ซึ่งทำให้ Computer เครื่องนั้นจะต้อง “ Shared resouce ” ให้กับสิ่งที่ Executed อยู่ในเครื่อง มันจะไม่มีปัญหาเลยถ้า Application หรือ Software ของเราสามารถทำงานได้แบบไม่ช้าลง ไม่มี Down-time หรือ ผู้ใช้งานเข้าถึงได้รวดเร็วไม่ติดขัด
ซึ่งในความเป็นจริงแล้วเป็นไปได้ยาก เพราะ Application ของเราจะต้องใหญ่ขึ้น เก็บข้อมูลมากขึ้น และ Process ข้อมูลที่เยอะขึ้น ทำให้ Computer เครื่องเดียวเริ่มรับภาระไม่ไหวจนมีอาการออกมาเช่น Performance เริ่มช้าลงแบบเห็นได้ชัด, ตัว Application มี Down-time มากขึ้น, Storage เริ่มใกล้เต็มขึ้นทุกที
เพื่อนๆ หลายๆคนอาจจะเคยเจอ หรือ เคยทำการเพิ่ม Resource ให้ “ใหญ่ขึ้น” หรือเรียกว่า Vertical Scaling เช่น เพิ่ม Ram อีก slot, เปลี่ยน cpu ให้แรงขึ้น หรือ แม้แต่เปลี่ยน hard-disk ให้ใหญ่ขึ้น มันช่วยได้ไหม?… ได้สิ แต่อาจจะไม่คุ้มใน Cost ที่เสียไปและผลลัพธ์ที่ได้กลับมา เพราะ cost ที่เอาไปเพิ่ม Resource สุดท้ายแล้วมันจะไปติด Bottle-neck ของโดยรวมอยู่ดีเพราะยังเกิดการ “ Shared Resource”
งั้นเรามาเพิ่มเครื่องแบบไม่ Shared Resource หรือที่เรียกว่า “ Shared-Nothing Architectures ” (Horizontal Scaling) ประโยชน์ที่ได้จะมี
Scalability : สามารถเก็บข้อมูลที่ใหญ่ขึ้น เพิ่มขึ้นได้เรื่อยโดยการเพิ่มเครื่องออกไป
Fault tolerance/high availability : ถ้าหากมีเครื่องใด เครื่องหนึ่งเกิดพังลง เรายังมีเครื่องอื่นๆ ที่ scaled ไว้อยู่มาทำงานทดแทนได้
Latency : หากผู้ใช้งานเรามาจากหลายๆประเทศ เราสามารถที่จะวางเครื่องไว้ใกล้ตำแหน่งผู้ใช้งานได้ทำให้ผู้ใช้งานสามารถเข้าถึงได้รวดเร็ว
แบบนี้มันต้องดีมากๆและควรใช้ตลอดเลยหนะสิ… ก็ไม่เสมอไปครับ เพราะมันไม่ได้มีแค่ประโยชน์ที่ได้มาเท่านั้น แต่มันพกปัญหามาให้ด้วย และปัญหาค่อนข้างจะสำคัญซะด้วย ถ้าเราพูดถึง การ Distribute Data หรือการ Scale Data ออกไปหลายๆเครื่องแบบนี้ ซึ่งจะพาเราไปรู้จักกับ Replication กับ Partitioning กันต่อ
Replication กับ Partitioning คืออะไร ต่างกันอย่างไร?
Replication คือการที่เรา Clone Data ออกไปที่เครื่องอื่นจากเครื่องหลัก ทำให้เราจะมีชุดข้อมูลที่เหมือนกันในหลายๆเครื่อง หากเครื่องใดเครื่องหนึ่งพัง จะยังมีอีกเครื่องหนึ่งที่ทำงานแทนได้ เพราะชุดข้อมูลเหมือนกันนั่นเอง (จะต้องมีข้อมูลเท่ากันนะ ถ้าอีกตัวนึงชุดข้อมูลมีไม่เท่ากับตัวที่พัง จะทำให้ Data inconsistency ทันที และนี่แหละ คือปัญหา จะกล่าวต่อในบทความต่อไป )
Partitioning คือการแบ่งข้อมูลจากชุดใหญ่ 1 ชุด สับออกเป็นชุดเล็กๆ หลายๆชุดและแบ่งไปให้เครื่องอื่น (เรียกว่า Sharding) การทำแบบนี้จะทำให้การ Query เร็วขึ้น เพราะข้อมูลถูกสับให้เล็กลงทำให้ Query engine ทำงาน Scope ที่น้อยลงนั่นเอง
ทั้งสองตัวลักษณะการทำงานต่างกันโดยสิ้นเชิงแต่สามารถทำงานร่วมกันได้ดังภาพข้างล่างนี้
จากรูปข้างบนจะเห็นได้ว่าได้ทำการ Parition ออกเป็น สองส่วน คือ สองชุดข้อมูล และ สองชุดข้อมูลนี้ สามารถ Clone ออกมา หรือ Replicate ออกมา เป็น Replica ที่ 2 นั่นเอง แล้วถ้ามีการอัพเดตข้อมูล เช่นมีการเพิ่ม Record ใหม่เป็น
800 , ford is living for learn
เข้าไปใน dataset คำถามคือจะต้องเอาเข้าไปใน Partition ไหน? และ Replica ไหน? จะต้องเอาเข้าทั้งสองตัวเลยไหม ถ้าแบบนั้นจะช้าไหม แล้วต้องเขียน Code เองที่ Application layer จัดการพวกนี้เองเลยไหม? ทั้งหมดนี้มีคนเจอปัญหาและแก้ไขปัญหาไปก่อนเราแล้วเรียบร้อย ซึ่งในบทความต่อไปจะเป็นการนำปัญหาพวกนี้ไปแก้ไขกันในหัวข้อ [Replication] Master-Slave สารพัดประโยชน์และปัญหา ตามไปตำกันต่อได้เลยครับบ