อธิบาย Apache ZooKeeper


376

ฉันพยายามที่จะเข้าใจ ZooKeeper วิธีการทำงานและสิ่งที่มันทำ มีแอพพลิเคชั่นใดบ้างที่เทียบเคียงได้กับ ZooKeeper?

ถ้าคุณรู้แล้วคุณจะอธิบาย ZooKeeper กับคนธรรมดาอย่างไร

ฉันลอง apache wiki, zookeeper sourceforge ... แต่ฉันยังไม่สามารถเกี่ยวข้องกับมันได้

ฉันเพิ่งอ่าน thru http://zookeeper.sourceforge.net/index.sf.shtmlดังนั้นจึงไม่มีบริการอื่น ๆ อีกเช่นนี้ใช่ไหม มันง่ายเหมือนการทำซ้ำบริการเซิร์ฟเวอร์หรือไม่?


6
คล้ายกับ แต่ไม่ใช่คำตอบที่คุณต้องการ: stackoverflow.com/questions/1479442/real-world-use-of-zookeeper
zengr


คุณสามารถอ่านบทความนี้ZooKeeper: การประสานงานที่ไม่ต้องรอคอยสำหรับระบบระดับอินเทอร์เน็ตเขียนโดย Yahoo! วิศวกร
yaphet

นี่คือการพูดคุยทางเทคนิคที่แนะนำเกี่ยวกับ Apache ZooKeeperโดย Camille Fournier ซึ่งเป็น CTO ของ RentTheRunway ฉันหวังว่ามันจะเป็นประโยชน์
Genadinik

@Luca Geretti ... ตามที่ฉันบอกไว้ Zookeper ให้ชุด apis เพื่อให้เราสามารถใช้มันเพื่อประสานงานแอปพลิเคชันแบบกระจาย แก้ไขฉันถ้าฉันผิด
3797438

คำตอบ:


434

สรุป ZooKeeper ช่วยให้คุณสร้างแอปพลิเคชันแบบกระจาย

มันทำงานอย่างไร

คุณอาจอธิบาย ZooKeeper เป็นบริการซิงโครไนซ์ที่จำลองแบบด้วยความสอดคล้องในที่สุด มันมีประสิทธิภาพเนื่องจากข้อมูลที่เก็บไว้จะถูกกระจายระหว่างหลายโหนด (ชุดของโหนดนี้เรียกว่า "ensemble") และไคลเอนต์หนึ่งเชื่อมต่อกับใด ๆ ของพวกเขา (เช่น "เซิร์ฟเวอร์" ที่เฉพาะเจาะจง) การโยกย้ายหากโหนดหนึ่งล้มเหลว ตราบใดที่โหนดส่วนใหญ่ยังทำงานอยู่ชุดของโหนด ZooKeeper ก็ยังมีชีวิตอยู่ โดยเฉพาะอย่างยิ่งโหนดหลักจะถูกเลือกแบบไดนามิกโดยฉันทามติภายในชุด; หากโหนดต้นแบบล้มเหลวบทบาทของต้นแบบจะย้ายไปยังโหนดอื่น

วิธีจัดการกับการเขียน

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

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

วิธีจัดการอ่าน

นี่คือที่ที่ ZooKeeper excels: การอ่านพร้อมกันเนื่องจากมีการให้บริการโดยเซิร์ฟเวอร์เฉพาะที่ไคลเอนต์เชื่อมต่อ อย่างไรก็ตามนี่คือเหตุผลของความสอดคล้องในที่สุด: "มุมมอง" ของไคลเอ็นต์อาจล้าสมัยเนื่องจากต้นแบบอัปเดตเซิร์ฟเวอร์ที่เกี่ยวข้องด้วยการหน่วงเวลาแบบ จำกัด แต่ไม่ได้กำหนด

ในรายละเอียด

ฐานข้อมูลที่จำลองแบบของ ZooKeeper ประกอบด้วยแผนผังของznodesซึ่งเป็นเอนทิตีที่แสดงถึงโหนดระบบไฟล์ (คิดว่าเป็นไดเรกทอรี) แต่ละ znode อาจได้รับการเสริมประสิทธิภาพด้วยอาร์เรย์ไบต์ซึ่งเก็บข้อมูล นอกจากนี้แต่ละ znode อาจมี znode อื่น ๆ อยู่ภายใต้การสร้างระบบไดเรกทอรีภายใน

znodes ตามลำดับ

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

znodes ชั่วคราว

นอกจากนี้ znode อาจเป็นephemeral : ซึ่งหมายความว่ามันถูกทำลายทันทีที่ไคลเอนต์ที่สร้างมันยกเลิกการเชื่อมต่อ สิ่งนี้มีประโยชน์เป็นหลักในการทราบเมื่อลูกค้าล้มเหลวซึ่งอาจเกี่ยวข้องเมื่อลูกค้าเองมีความรับผิดชอบที่ลูกค้าใหม่ควรทำ ยกตัวอย่างของการล็อคทันทีที่ลูกค้ามีการปลดล็อคลูกค้าอื่น ๆ สามารถตรวจสอบว่าพวกเขามีสิทธิ์ล็อค

นาฬิกา

ตัวอย่างที่เกี่ยวข้องกับการขาดการเชื่อมต่อของลูกค้าอาจมีปัญหาหากเราต้องการสำรวจสถานะของ znodes เป็นระยะ โชคดีที่ ZooKeeper เสนอระบบเหตุการณ์ที่สามารถตั้งค่านาฬิกาบน znode ได้ นาฬิกาเหล่านี้อาจถูกตั้งค่าให้ทริกเกอร์เหตุการณ์หากมีการเปลี่ยนแปลงหรือลบ znode โดยเฉพาะหรือมีการสร้างเด็กใหม่ภายใต้ สิ่งนี้มีประโยชน์อย่างชัดเจนเมื่อใช้ร่วมกับตัวเลือกแบบลำดับและแบบชั่วคราวสำหรับ znodes

ใช้ที่ไหนและอย่างไร

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

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

ZooKeeper เป็นคุณสมบัติแสงซึ่งหมายความว่ากลไกต่าง ๆ เช่นการเลือกตั้งผู้นำล็อคอุปสรรค ฯลฯ ไม่ได้มีอยู่ แต่สามารถเขียนได้เหนือต้นแบบดั้งเดิม ZooKeeper ถ้า C / Java API เป็นเทอะทะเกินไปสำหรับวัตถุประสงค์ของคุณคุณควรพึ่งพาห้องสมุดที่สร้างขึ้นบน ZooKeeper เช่นกรงและโดยเฉพาะอย่างยิ่งผู้ปกครอง

อ่านเพิ่มเติม

นอกเหนือจากเอกสารทางการซึ่งค่อนข้างดีฉันแนะนำให้อ่านบทที่ 14 ของHadoop: คู่มือสรุปซึ่งมีประมาณ 35 หน้าอธิบายถึงสิ่งที่ ZooKeeper ทำตามด้วยตัวอย่างของบริการกำหนดค่า


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

57
IMO สิ่งนี้ไม่สามารถอธิบายได้ว่า ZooKeeper คืออะไรสำหรับบุคคลทั่วไป เมื่อใดที่ฉันจะต้อง ZooKeeper ฉันจะเขียนอะไรไป มันแก้ปัญหาอะไรได้บ้าง? เป็นที่เก็บคีย์ - ค่าหรือไม่ เครื่องมือค้นหา? ล็อคกระจาย? ทำไมฉันถึงเลือก ZooKeeper มากกว่าเช่น Redis หรือไฟล์หรือ JIRA หรือบันทึกย่อภายหลัง คุณรู้อะไรมากมายเกี่ยวกับ ZooKeeper อย่างชัดเจน แต่คุณอธิบายได้น้อยลงไหม
Dan Passaro

1
เนื่องจาก Zookeeper มีการเขียนเชิงเส้นฉันไม่ได้หยุดใช้ Asynchronous APIs เพื่อสร้างโหนดและรับการตอบกลับในการโทรกลับหรือไม่ แม้ว่าภายในอาจไม่อนุญาตให้มีการเขียนพร้อมกันหรือฉันขาดอะไรไป?
jdk2588

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

2
ขัดต่อคำถามที่ถามโดยสมบูรณ์และอย่างเต็มที่ ถ้ามันเป็นนาฬิกาเขาจะมองหา "อุปกรณ์เก็บเวลา" ไม่ใช่คำอธิบายของการล้อเลียนรถไฟล้อการหลบหนีและการมีปฏิสัมพันธ์ของพวกเขาตามช่วงเวลาของการแกว่งเวลาโมเมนต์ความเฉื่อยและผลกระทบของคริสตัลแซฟไฟร์เทียม
Rick O'Shea

10

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

ยิ่งกว่านั้นผู้นำที่ได้รับเลือกใหม่จะอัพเดตผู้ติดตามของตนด้วยข้อเสนอที่ขาดหายไปหรือด้วยภาพรวมของรัฐหากผู้ติดตามมีข้อเสนอมากมายที่ขาดหายไป

Zookeeper ยังมี API ที่ใช้งานง่ายมาก บล็อกโพสต์นี้เป็นตัวอย่าง Zookeeper Java APIมีตัวอย่างบางส่วนหากคุณกำลังมองหาตัวอย่าง

แล้วเราจะใช้สิ่งนี้ที่ไหน หากบริการแบบกระจายของคุณต้องการการจัดการการกำหนดค่าส่วนกลางที่เชื่อถือได้และสอดคล้องล็อคคิว ฯลฯ คุณจะพบว่า Zookeeper เป็นตัวเลือกที่น่าเชื่อถือ


4
"Zookeeper เป็นระบบ CP (อ้างอิงจาก CAP Theorem) ที่ให้ความสอดคล้องและความอดทนต่อการแบ่งพาร์ติชัน" ฉันคิดว่า Zookeeper มีความเชี่ยวชาญและผู้ติดตามเมื่อผู้ฝึกหัดลงจากนั้นผู้ติดตามคนใดคนหนึ่งจะได้รับเลือกให้เป็นหัวหน้า AP อย่างไรก็ตาม C ในที่สุดก็สม่ำเสมอ
YuFeng Shen

5
ในแง่ของทฤษฎีบท CAP จริง ๆ แล้ว "C" หมายถึง linearizability ZooKeeper ในความเป็นจริงให้ "ลำดับความสอดคล้อง" และมันหมายถึงการปรับปรุงจากลูกค้าจะถูกนำมาใช้ในลำดับที่พวกเขาได้รับ .. นี่คืออ่อนแอกว่า linearizability แต่ยังคงแข็งแกร่งมากกว่า "ความมั่นคงในที่สุด" ผู้ดูแลสวนไม่ใช่ A และนี่เป็นเพราะหากผู้นำไม่สามารถเลือกได้ (ไม่มีโควรัม) ผู้ดูแลสัตว์จะไม่สามารถร้องขอได้ นี่คือเหตุผลที่มันไม่สามารถใช้ได้อย่างมาก
Binu George

7

ฉันเข้าใจ ZooKeeper โดยทั่วไป แต่มีปัญหากับคำว่า "องค์ประชุม" และ "สมองแตก" ดังนั้นบางทีฉันสามารถแบ่งปันสิ่งที่ค้นพบกับคุณ (ฉันถือว่าตัวเองเป็นคนธรรมดา)

สมมติว่าเรามีกลุ่ม ZooKeeper 5 เซิร์ฟเวอร์ หนึ่งในเซิร์ฟเวอร์จะกลายเป็นผู้นำและอื่น ๆ จะกลายเป็นผู้ติดตาม

  • เซิร์ฟเวอร์ 5 ตัวเหล่านี้ก่อให้เกิดองค์ประชุม องค์ประชุมเพียงหมายความว่า "เซิร์ฟเวอร์เหล่านี้สามารถลงคะแนนว่าใครควรจะเป็นผู้นำ"

  • ดังนั้นการลงคะแนนจึงขึ้นอยู่กับเสียงส่วนใหญ่ เสียงข้างมากหมายถึง "มากกว่าครึ่ง" ดังนั้นมากกว่าครึ่งหนึ่งของจำนวนเซิร์ฟเวอร์จะต้องยอมรับว่าเซิร์ฟเวอร์ใดเซิร์ฟเวอร์หนึ่งเป็นผู้นำ

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

  • ส่วนใหญ่เป็นเหตุผลที่คุณควรใช้เซิร์ฟเวอร์จำนวนคี่ หากคุณมีเซิร์ฟเวอร์ 4 ตัวและสมองที่แยกซึ่ง 2 เซิร์ฟเวอร์แยกกันทั้งสอง "เซิร์ฟเวอร์ทีม" อาจพูดว่า "เฮ้เราต้องการตัดสินใจว่าใครคือผู้นำ!" แต่คุณควรตัดสินใจเลือกเซิร์ฟเวอร์ 2 ตัวอย่างไร ด้วย 5 เซิร์ฟเวอร์นั้นง่าย: ทีมเซิร์ฟเวอร์ที่มี 3 เซิร์ฟเวอร์ส่วนใหญ่และได้รับอนุญาตให้เลือกผู้นำคนใหม่

  • แม้ว่าคุณจะมีเพียง 3 เซิร์ฟเวอร์และหนึ่งในนั้นล้มเหลวอีก 2 ตัวยังคงเป็นเซิร์ฟเวอร์ส่วนใหญ่และยอมรับว่าหนึ่งในนั้นจะกลายเป็นผู้นำคนใหม่

ฉันรู้ว่าเมื่อคุณคิดเกี่ยวกับมันบางครั้งและเข้าใจเงื่อนไขที่ไม่ซับซ้อนอีกต่อไป ฉันหวังว่านี่จะช่วยให้ทุกคนเข้าใจข้อกำหนดเหล่านี้ได้


1

Zookeeper เป็นเซิร์ฟเวอร์โอเพ่นซอร์สส่วนกลางสำหรับการบำรุงรักษาและจัดการข้อมูลการกำหนดค่าการตั้งชื่อแบบแผนและการซิงโครไนซ์สำหรับสภาพแวดล้อมคลัสเตอร์แบบกระจาย Zookeeper ช่วยให้ระบบแบบกระจายลดความซับซ้อนในการจัดการโดยมอบความหน่วงแฝงต่ำและความพร้อมใช้งานสูง Zookeeper เป็นโครงการย่อยสำหรับ Hadoop แต่ตอนนี้มันเป็นโครงการอิสระระดับสูงของ Apache Software Foundation

ข้อมูลมากกว่านี้


2
อะไรทำให้คุณพูดว่าผู้ดูแลสัตว์เลี้ยงเป็นศูนย์กลาง? Zookeeper สามารถและควรจะแจกจ่าย
Benjamin Hammer Nørgaard

1

ฉันขอแนะนำแหล่งข้อมูลต่อไปนี้:

  1. กระดาษ: https://pdos.csail.mit.edu/6.824/papers/zookeeper.pdf
  2. การบรรยายนำเสนอโดย MIT 6.824 จาก 36:00: https://youtu.be/pbmyrNjzdDk?t=2198

ฉันขอแนะนำให้ดูวิดีโออ่านกระดาษแล้วดูวิดีโออีกครั้ง มันจะง่ายต่อการเข้าใจถ้าคุณรู้ว่าแพก่อน

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