สรุป 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 ทำตามด้วยตัวอย่างของบริการกำหนดค่า