mongodb อยู่ตรงไหนในทฤษฎีบท CAP?


121

ทุกที่ที่ฉันมองฉันเห็นว่า MongoDB คือ CP แต่เมื่อฉันขุดลงไปฉันเห็นว่ามันสอดคล้องกันในที่สุด CP เมื่อคุณใช้ปลอดภัย = จริงหรือไม่? ถ้าเป็นเช่นนั้นหมายความว่าเมื่อฉันเขียนด้วย safe = true แบบจำลองทั้งหมดจะได้รับการอัปเดตก่อนที่จะได้รับผลลัพธ์หรือไม่

คำตอบ:


104

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

MongoDB ยังมีความพร้อมใช้งานสูงผ่านการล้มเหลวอัตโนมัติในชุดจำลอง: http://www.mongodb.org/display/DOCS/Replica+Sets


13
อ้างอิงจากaphyr.com/posts/322-call-me-maybe-mongodb-stale-readsแม้ว่าคุณจะอ่านจากโหนดหลักในชุดการจำลองคุณอาจได้รับข้อมูลเก่าหรือสกปรก MongoDB แข็งแกร่งสม่ำเสมอหรือไม่?
Mike Argyriou

3
การทดลองที่ยอดเยี่ยมโดย Kyle มันล่าพังกูจริงๆ ฉันสงสัยว่ามีระบบการผลิตเช่นใช้ MongoDB ทำธุรกรรมการชำระเงินหรือไม่? หากเป็นเพียงเว็บไซต์ส่วนบุคคลใครจะใส่ใจกับความมั่นคงแข็งแรง
ซิน

5
สำหรับการบันทึก MongoDB v3.4 ผ่านการทดสอบที่ออกแบบโดย Kyle ใช่แล้ว MongoDB มีความสอดคล้องกันอย่างมากแม้จะมี ReplicaSet และSharding
Maxime Beugnet

2
คำตอบนี้อาจง่ายเกินไปเนื่องจาก MongoDB สามารถสละความพร้อมใช้งานได้เป็นครั้งคราวโดยขึ้นอยู่กับการกำหนดค่า JoCa อธิบายสถานการณ์ที่ทำงาน CA / CP / AP ได้ดีขึ้น
PaoloC

37

ฉันเห็นด้วยกับโพสต์ของ Luccas คุณไม่สามารถพูดได้ว่า MongoDB คือ CP / AP / CA เพราะจริงๆแล้วมันเป็นการแลกเปลี่ยนระหว่าง C, A และ P ขึ้นอยู่กับทั้งการกำหนดค่าฐานข้อมูล / ไดรเวอร์และประเภทของภัยพิบัตินี่คือภาพสรุปและด้านล่าง คำอธิบายโดยละเอียดเพิ่มเติม

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

สอดคล้อง:

MongoDB มีความสอดคล้องอย่างมากเมื่อคุณใช้การเชื่อมต่อเดียวหรือระดับข้อกังวลในการเขียน / อ่านที่ถูกต้อง( ซึ่งจะทำให้คุณเสียค่าความเร็วในการดำเนินการ ) ทันทีที่คุณไม่ปฏิบัติตามเงื่อนไขเหล่านั้น (โดยเฉพาะเมื่อคุณกำลังอ่านจากแบบจำลองรอง) MongoDB จะสอดคล้องกันในที่สุด

สถานะ:

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

ความอดทนของพาร์ติชัน:

ผ่านการใช้งานของแบบจำลองกล่าวว่าชุด MongoDB ยังประสบความสำเร็จในความอดทนพาร์ทิชัน: ตราบเท่าที่มากกว่าครึ่งหนึ่งของเซิร์ฟเวอร์ของแบบจำลองชุดที่เชื่อมต่อกับแต่ละอื่น ๆหลักใหม่สามารถเลือก ทำไม? เพื่อให้แน่ใจว่าสองเครือข่ายที่แยกจากกันไม่สามารถเลือกเครือข่ายหลักใหม่ได้ เมื่อเชื่อมต่อกันไม่เพียงพอคุณยังคงสามารถอ่านได้ (แต่ไม่มั่นใจว่าสอดคล้องกัน) แต่ไม่สามารถเขียนได้ ชุดนี้ไม่สามารถใช้งานได้จริงเนื่องจากความสม่ำเสมอ


ดังนั้นถ้าฉันใช้ระดับความกังวลในการเขียน / การอ่านที่ถูกต้องก็หมายความว่าการเขียนและการอ่านทั้งหมดจะไปที่ระดับประถมศึกษา (ถ้าฉันเข้าใจถูกต้อง) คนที่สองทำอะไรกันแน่? แค่นั่งสแตนบายในกรณีที่เครื่องหลักดับลง?
tomer.z

@ tomer.z คุณอาจต้องการอ่านส่วนนี้ของคู่มือ: คุณสามารถใช้ secondaries เพื่ออ่าน หากคุณใช้ระดับการอ่าน "ส่วนใหญ่" การอ่านจะใช้ได้ทันทีที่สมาชิกส่วนใหญ่รับทราบการอ่าน เช่นเดียวกับระดับการเขียน "ส่วนใหญ่" หากคุณใช้ระดับความกังวล "ส่วนใหญ่" สำหรับทั้งสองอย่างแสดงว่าคุณมีฐานข้อมูลที่สอดคล้องกัน คุณอาจต้องการอ่านรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ในคู่มือ
JoCa

18

เมื่อมีบทความใหม่ที่ยอดเยี่ยมปรากฏขึ้นและการทดลองที่ยอดเยี่ยมของ Kyleในสาขานี้คุณควรระมัดระวังในการติดป้าย MongoDB และฐานข้อมูลอื่น ๆ เช่น C หรือ A

แน่นอนว่า CAP ช่วยในการติดตามโดยไม่ต้องใช้คำพูดมากนักว่าฐานข้อมูลมีความสำคัญอย่างไร แต่คนมักลืมไปว่า C ใน CAP หมายถึงความสอดคล้องของอะตอม (linearizability) เป็นต้น และสิ่งนี้ทำให้ฉันรู้สึกเจ็บปวดมากที่ต้องเข้าใจเมื่อพยายามจัดประเภท ดังนั้นนอกจาก MongoDB จะให้ความสม่ำเสมอที่แข็งแกร่งแล้วนั่นไม่ได้หมายความว่านั่นคือ C ด้วยวิธีนี้หากมีการจัดประเภทนี้ฉันขอแนะนำให้เจาะลึกมากขึ้นว่ามันใช้งานได้จริงอย่างไรเพื่อไม่ทิ้งความสงสัย


10

ใช่มันเป็น CP safe=trueเมื่อใช้ นี่หมายความว่าข้อมูลที่ส่งไปยังมาสเตอร์ดิสก์ หากคุณต้องการให้แน่ใจว่ามันมาถึงแบบจำลองบางตัวด้วยให้ดูที่พารามิเตอร์ 'w = N' โดยที่ N คือจำนวนของแบบจำลองที่ข้อมูลจะต้องถูกบันทึกไว้

ดูสิ่งนี้และสิ่งนี้สำหรับข้อมูลเพิ่มเติม


3

ฉันไม่แน่ใจเกี่ยวกับ P สำหรับ Mongo ลองนึกภาพสถานการณ์:

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

ปัญหาคือขนาดไฟล์ดัมพ์มี จำกัด และหากคุณมีพาร์ติชั่นเป็นเวลานานคุณจะสูญเสียข้อมูลของคุณไปตลอดกาล

คุณสามารถพูดได้ว่ามันไม่น่าจะเกิดขึ้น - ใช่เว้นแต่ในระบบคลาวด์ซึ่งเป็นเรื่องธรรมดามากกว่าที่คิด

ตัวอย่างนี้เป็นเหตุผลว่าทำไมฉันจึงต้องระมัดระวังอย่างมากก่อนที่จะมอบหมายจดหมายใด ๆ ให้กับฐานข้อมูลใด ๆ มีหลายสถานการณ์และการใช้งานที่ไม่สมบูรณ์แบบ

หากใครทราบว่าสถานการณ์นี้ได้รับการแก้ไขใน Mongo รุ่นต่อ ๆ ไปหรือไม่โปรดแสดงความคิดเห็น! (ฉันไม่ได้ติดตามทุกอย่างที่เกิดขึ้นมาระยะหนึ่งแล้ว .. )


2
โปรโตคอลการเลือกตั้งของ MongoDB ได้รับการออกแบบมาให้มี (มากที่สุด) หลักเดียว หลักสามารถเลือกได้ (และยั่งยืน) โดยสมาชิกส่วนใหญ่ของการลงคะแนนเสียงชุดจำลองที่กำหนดค่าไว้อย่างเข้มงวด (n / 2 +1) ในกรณีของพาร์ติชันเครือข่ายสามารถเลือกพาร์ติชันหลักได้เพียงพาร์ติชันเดียว (ที่มีสมาชิกโหวตส่วนใหญ่) ลำดับต้นก่อนหน้าในพาร์ติชันส่วนน้อยจะก้าวลงจากตำแหน่งและกลายเป็นรอง นี่เป็นวิธีที่ชุดแบบจำลองได้ผลมาโดยตลอด ในกรณีที่การเขียนหลักในอดีตยอมรับการเขียนที่ไม่ได้จำลองแบบการเขียนจะถูกย้อนกลับ (บันทึกลงในดิสก์) เมื่อสมาชิกนั้นเข้าร่วมชุดการจำลองอีกครั้ง
Stennie

2

Mongodb ไม่อนุญาตให้เขียนถึงมัธยมศึกษา อนุญาตให้อ่านเพิ่มเติมจากรอง แต่ไม่สามารถเขียนได้ ดังนั้นหากหลักของคุณลดลงคุณจะไม่สามารถเขียนได้จนกว่ามัธยมศึกษาจะกลายเป็นหลักอีกครั้ง นั่นคือวิธีที่คุณเสียสละความพร้อมใช้งานสูงในทฤษฎีบท CAP การทำให้การอ่านของคุณเป็นเพียงการอ่านหลักเท่านั้นคุณสามารถมีความสม่ำเสมอที่ดีได้


2

MongoDB เลือก Consistency over Availability ทุกครั้งที่มี Partition ความหมายคือเมื่อมีพาร์ติชัน (P) จะเลือก Consistency (C) เหนือ Availability (A)

เพื่อให้เข้าใจสิ่งนี้เรามาทำความเข้าใจกันว่า MongoDB ใช้ชุดการจำลองอย่างไร Replica Set มีโหนดหลักเดียว วิธีเดียวที่ "ปลอดภัย" ในการคอมมิตข้อมูลคือการเขียนไปยังโหนดนั้นจากนั้นรอให้ข้อมูลนั้นส่งไปยังโหนดส่วนใหญ่ในชุด (คุณจะเห็นแฟล็กนั้นสำหรับ w = ส่วนใหญ่เมื่อส่งการเขียน)

พาร์ติชันสามารถเกิดขึ้นได้ในสองสถานการณ์ดังนี้:

  • เมื่อโหนดหลักหยุดทำงาน: ระบบจะไม่พร้อมใช้งานจนกว่าจะเลือกหลักใหม่
  • เมื่อโหนดหลักขาดการเชื่อมต่อจากโหนดรองมากเกินไประบบจะไม่พร้อมใช้งาน คนที่สองคนอื่น ๆ จะพยายามเลือกหลักใหม่และหลักปัจจุบันจะก้าวลงจากตำแหน่ง

โดยทั่วไปเมื่อใดก็ตามที่พาร์ติชันเกิดขึ้นและ MongoDB จำเป็นต้องตัดสินใจว่าจะทำอย่างไรมันจะเลือก Consistency over Availability ระบบจะหยุดยอมรับการเขียนลงในระบบจนกว่าจะเชื่อว่าสามารถดำเนินการเขียนเหล่านั้นได้อย่างปลอดภัย


"มันจะหยุดรับการเขียนลงในระบบจนกว่าจะเชื่อว่าสามารถดำเนินการเขียนเหล่านั้นได้อย่างปลอดภัย " แล้วreadsล่ะ? จะยังคงอ่านได้ในช่วงเวลานั้นหรือไม่
Josh

1

MongoDB ให้สอดคล้องและพาร์ทิชันอดทน

ในบริบทของฐานข้อมูลแบบกระจาย (NoSQL) หมายความว่าจะมีการแลกเปลี่ยนระหว่างความสอดคล้องและความพร้อมใช้งานอยู่เสมอ เนื่องจากระบบแบบกระจายจำเป็นต้องมีความทนทานต่อพาร์ติชันเสมอ (กล่าวคือจะไม่เป็นฐานข้อมูลแบบกระจายหากไม่สามารถใช้งานพาร์ติชันได้)

ความสม่ำเสมอ - ระบบจะกลายเป็นความสอดคล้องกันในที่สุด ข้อมูลจะแพร่กระจายไปยังทุกที่ที่ควรไม่ช้าก็เร็ว แต่ระบบจะยังคงรับข้อมูลเข้าและไม่ได้ตรวจสอบความสอดคล้องของทุกธุรกรรมก่อนที่จะย้ายไปยังรายการถัดไป

ความพร้อมใช้งาน - โดยค่าเริ่มต้น Mongo DB Client (ไดรเวอร์ MongoDB) จะส่งคำขออ่าน / เขียนทั้งหมดไปยังผู้นำ / โหนดหลัก ทำให้ระบบมีความสอดคล้องกัน แต่ไม่สามารถใช้งานได้เนื่องจาก - หากผู้นำตัดการเชื่อมต่อจากคลัสเตอร์จะใช้เวลาสองสามวินาทีในการเลือกผู้นำคนใหม่ ดังนั้นจึงทำให้ไม่สามารถเขียนและอ่านได้ในช่วงเวลาดังกล่าว

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