21.9.10

CAP theorem

ความสามารถในการขยายตัวของระบบ (Scalable) กับ Service
รูปข้างล่างเป็นจำนวนผู้ใช้บน Facebook


  • ใน Facebook ตอนนี้มีผู้ใช้กว่า 500 ล้านคน
  • ประมาณ 50% ของผู้ใช้ทั้งหมดเข้าใช้งานทุกวัน
  • แต่ละคนใช้งานระบบเฉลี่ยอยู่ที่ 20 นาทีต่อคน
  • ในแต่ละเดือนมี 30 ล้าน content เช่น status update, comments, likes, photo uploads, video uploads, chat messages, inbox messages, group events, fan pages, friend connects, ... ถูกแชร์บน facebook
  • ในแต่ละเดือน application ถูกใช้มากกว่าล้านคน

  • ลองคิดเล่นๆ ว่าเค้าต้องออกแบบระบบยังไงให้ยืดหยุ่นรองรับการขยายตัว เพื่อให้รองรับปริมาณการใช้บริการต่างๆ จะเห็นว่าความสามารถในการขยายตัว จะสัมพันธ์กับสัดส่วนของบริการ และ product ใหม่ๆ ที่จะตามออกมา เหมือนอย่างที่ Google หลังจากค้นคว้าวิจัยเทคโนโลยี GFS, MapReduce, BigTable และถูกนำไปใช้ไม่นานหลังจากนั้นก็มีบริการและ product ใหม่ๆ ออกมา ในสัดส่วนที่เร็วกว่าแต่ก่อนมาก จะเห็นว่าภาพจะเป็นไปในแนวทางนี้ Infrastructure (scalable) -> Services-> Customer need

    Distributed system กับ ทฤษฏี CAP
    ระบบที่มีความสามารถในการขยายตัวส่วนใหญ่จะเป็นอยู่ใน model ของ distributed system เมื่อเราพูดถึง distributed เราจะต้องเจอกับทฤษฏี CAP ซึ่งมันเป็นแนวคิดที่เรียบง่ายแต่ไว้ใช้อธิบายเรื่องที่ซับซ้้อน ตัวทฤษฏี CAP มีต้นกำเนิดมาจาก Dr. Eric Brewer ในปี 2000 และกลายมาเป็นทฤษฏีที่มีผลกระทบต่อ โลก internet ในเวลาต่อมา

    CAP มาจากคำว่า Consistency, Availability, Partition Tolerance ซึ่งมันบอกว่าระบบที่เป็น distributed storage จะสามารถรองรับคุณสมบัติแค่สองคุณสมบัติเท่านั้น นั่นคือเราไม่สามารถเลือกทั้งหมดได้พร้อมๆ กัน ณ เวลาใดเวลาหนึ่ง ซึ่งแต่ละคุณสมบัติมีรายละเอียดดังนี้
  • Consistency ทุก node จะเห็นข้อมูลกันเดียวกันในเวลาเดียวกันไม่ว่าจะเข้าถึงข้อมูลที่ node ใดใน cluster ก็ตาม ดังนั้นข้อมูลจึงมีแค่สองสถานะคือถูก กับไม่ถูก โดย consistency มีสองประเภทคือ strongly consistent และ weak consistency
  • ตัวอย่างของ strongly consistent จะเทียบได้กับ database ที่มีคุณสมบัติ ACID (Atomicity, Consistency, Isolation, Durability)
  • ส่วน weak consistency จะเจอเมื่อเนื้อข้อมูลของเรามีการ replicate กันโดยแต่ละ node ใน cluster ก็จะมีข้อมูลเดียวกันอยู่ แต่อาจไม่ใช่ version ล่าสุด ข้อมูล version ล่าสุดจะถูกเก็บอยู่ใน node ใด node หนึ่งในวง cluster แล้วจะ replicate ข้อมูลล่าสุดออกไป ดังนั้นในตอนสุดท้ายข้อมูลในทุก node ก็จะเป็นข้อมูลชุดเดียวกัน
  • Availability ถึงแม้ node ใด node หนึ่ง fail แต่ก็จะไม่ขัดขวางการทำงานของระบบ ตัวระบบยังคงสามารถให้บริการต่อได้ เท่ากับว่าระบบจะต้องถูกออกแบบให้มี High-Availability เพื่อให้บริการได้ตลอดเวลาไม่ว่าจะเกิดเหตุการณ์ใดๆ ขึ้น เช่นเมื่อมีบาง node failures ขณะที่ software หรือ hardware กำลัง upgrade แต่ระบบโดยรวมยังคงให้บริการได้ต่อไป
  • Partition Tolerance ระบบยังคงต้องทำงานต่อไปถึงแม้ว่าเส้นทางการเชื่อมต่อระหว่าง node จะเสียหาย แต่ client ยังเข้าถึงได้อยู่
  • ถ้าระบบสามารถทนต่อสภาพเช่นนี้ได้ ตัว database ก็จะสามารถทำงานได้ตาม อ่าน, เขียนได้ตามปกติขณะที่ database 2 rack แยกออกจากกัน
  • ถ้าไม่รองรับคุณสมบัตินี้แล้วเราอาจทำการอ่านข้อมูลได้เพียงอย่างเดียว แต่ไม่สามารถที่จะเขียนข้อมูลลงใน database ได้

  • สำหรับ RDBMS ได้คุณสมบัติ CA นั่นคือ Consistency และ Availability แต่ no Partition tolerance นั่นคือเมื่อ host หนึ่ง fail ไป RDBMS ก็จะหยุดการทำงานไปด้วย ดังนั้น RDBMS จึงต้องพยายามการันตีว่าจะต้องให้บริการได้ตลอด (High-Availability) เพราะฉะนั้นจึงไม่เกิดกรณี Partition Tolerance แน่ๆ

    No comments:

    Post a Comment