Zookeeper - Hướng dẫn nhanh

ZooKeeper là một dịch vụ điều phối phân tán để quản lý một tập hợp lớn các máy chủ. Điều phối và quản lý một dịch vụ trong môi trường phân tán là một quá trình phức tạp. ZooKeeper giải quyết vấn đề này với kiến ​​trúc và API đơn giản của nó. ZooKeeper cho phép các nhà phát triển tập trung vào logic ứng dụng cốt lõi mà không cần lo lắng về bản chất phân tán của ứng dụng.

Khung ZooKeeper ban đầu được xây dựng tại “Yahoo!” để truy cập các ứng dụng của họ một cách dễ dàng và mạnh mẽ. Sau đó, Apache ZooKeeper trở thành một tiêu chuẩn cho dịch vụ có tổ chức được sử dụng bởi Hadoop, HBase và các khuôn khổ phân tán khác. Ví dụ: Apache HBase sử dụng ZooKeeper để theo dõi trạng thái của dữ liệu được phân phối.

Trước khi tiến xa hơn, điều quan trọng là chúng ta phải biết một hoặc hai điều về các ứng dụng phân tán. Vì vậy, chúng ta hãy bắt đầu cuộc thảo luận với tổng quan nhanh về các ứng dụng phân tán.

Ứng dụng phân tán

Một ứng dụng phân tán có thể chạy trên nhiều hệ thống trong mạng tại một thời điểm nhất định (đồng thời) bằng cách phối hợp với nhau để hoàn thành một tác vụ cụ thể một cách nhanh chóng và hiệu quả. Thông thường, các tác vụ phức tạp và tốn thời gian, sẽ mất hàng giờ để hoàn thành bởi một ứng dụng không phân tán (chạy trong một hệ thống duy nhất) có thể được thực hiện trong vài phút bởi một ứng dụng phân tán bằng cách sử dụng khả năng tính toán của tất cả hệ thống liên quan.

Thời gian để hoàn thành tác vụ có thể được giảm hơn nữa bằng cách cấu hình ứng dụng phân tán để chạy trên nhiều hệ thống hơn. Một nhóm hệ thống trong đó ứng dụng phân tán đang chạy được gọi làCluster và mỗi máy chạy trong một cụm được gọi là Node.

Một ứng dụng phân tán có hai phần, ServerClientứng dụng. Các ứng dụng máy chủ thực sự được phân phối và có giao diện chung để các máy khách có thể kết nối với bất kỳ máy chủ nào trong cụm và nhận được cùng một kết quả. Ứng dụng khách là công cụ để tương tác với một ứng dụng phân tán.

Lợi ích của các ứng dụng phân tán

  • Reliability - Hỏng một hoặc một vài hệ thống không làm cho toàn bộ hệ thống bị hỏng.

  • Scalability - Hiệu suất có thể được tăng lên khi cần thiết bằng cách thêm nhiều máy hơn với thay đổi nhỏ trong cấu hình của ứng dụng mà không có thời gian chết.

  • Transparency - Ẩn sự phức tạp của hệ thống và thể hiện như một thực thể / ứng dụng duy nhất.

Những thách thức của các ứng dụng phân tán

  • Race condition- Hai hoặc nhiều máy đang cố gắng thực hiện một tác vụ cụ thể, mà thực tế chỉ cần một máy thực hiện tại một thời điểm nhất định. Ví dụ: tài nguyên dùng chung chỉ nên được sửa đổi bởi một máy tại bất kỳ thời điểm nào.

  • Deadlock - Hai hoặc nhiều hoạt động chờ nhau hoàn thành vô thời hạn.

  • Inconsistency - Lỗi một phần dữ liệu.

Apache ZooKeeper Meant For là gì?

Apache ZooKeeper là một dịch vụ được sử dụng bởi một cụm (nhóm các nút) để điều phối giữa chúng và duy trì dữ liệu được chia sẻ với các kỹ thuật đồng bộ hóa mạnh mẽ. ZooKeeper tự nó là một ứng dụng phân tán cung cấp các dịch vụ để viết một ứng dụng phân tán.

Các dịch vụ phổ biến do ZooKeeper cung cấp như sau:

  • Naming service- Xác định các nút trong một cụm theo tên. Nó tương tự như DNS, nhưng dành cho các nút.

  • Configuration management - Thông tin cấu hình mới nhất và cập nhật của hệ thống cho một nút tham gia.

  • Cluster management - Tham gia / rời khỏi một nút trong một cụm và trạng thái nút tại thời gian thực.

  • Leader election - Bầu một nút làm lãnh đạo cho mục đích điều phối.

  • Locking and synchronization service- Khóa dữ liệu trong khi sửa đổi nó. Cơ chế này giúp bạn tự động khôi phục lỗi trong khi kết nối các ứng dụng phân tán khác như Apache HBase.

  • Highly reliable data registry - Tính khả dụng của dữ liệu ngay cả khi một hoặc một vài nút không hoạt động.

Các ứng dụng phân tán mang lại rất nhiều lợi ích, nhưng chúng cũng gây ra một số thách thức phức tạp và khó bẻ khóa. Khung ZooKeeper cung cấp một cơ chế hoàn chỉnh để vượt qua tất cả các thử thách. Tình trạng cuộc đua và bế tắc được xử lý bằng cách sử dụngfail-safe synchronization approach. Một nhược điểm chính khác là dữ liệu không nhất quán, mà ZooKeeper giải quyết bằngatomicity.

Lợi ích của ZooKeeper

Dưới đây là những lợi ích của việc sử dụng ZooKeeper -

  • Simple distributed coordination process

  • Synchronization- Loại trừ lẫn nhau và hợp tác giữa các quy trình máy chủ. Quá trình này giúp Apache HBase quản lý cấu hình.

  • Ordered Messages

  • Serialization- Mã hóa dữ liệu theo quy tắc cụ thể. Đảm bảo ứng dụng của bạn chạy nhất quán. Cách tiếp cận này có thể được sử dụng trong MapReduce để điều phối hàng đợi để thực thi các luồng đang chạy.

  • Reliability

  • Atomicity - Truyền dữ liệu thành công hoặc thất bại hoàn toàn, nhưng không có giao dịch nào là một phần.

Trước khi đi sâu vào hoạt động của ZooKeeper, chúng ta hãy xem qua các khái niệm cơ bản của ZooKeeper. Chúng ta sẽ thảo luận về các chủ đề sau trong chương này -

  • Architecture
  • Không gian tên phân cấp
  • Session
  • Watches

Kiến trúc của ZooKeeper

Hãy xem sơ đồ sau. Nó mô tả “Kiến trúc Máy chủ-Máy khách” của ZooKeeper.

Mỗi một trong những thành phần là một phần của kiến ​​trúc ZooKeeper đã được giải thích trong bảng sau.

Phần Sự miêu tả
Khách hàng

Khách hàng, một trong những nút trong cụm ứng dụng phân tán của chúng tôi, truy cập thông tin từ máy chủ. Trong một khoảng thời gian cụ thể, mỗi máy khách sẽ gửi một tin nhắn đến máy chủ để cho máy chủ biết rằng máy khách còn sống.

Tương tự, máy chủ sẽ gửi một xác nhận khi một máy khách kết nối. Nếu không có phản hồi từ máy chủ được kết nối, máy khách sẽ tự động chuyển hướng thư đến máy chủ khác.

Người phục vụ Máy chủ, một trong những nút trong tập hợp ZooKeeper của chúng tôi, cung cấp tất cả các dịch vụ cho khách hàng. Cung cấp xác nhận cho máy khách để thông báo rằng máy chủ còn sống.
Tập hợp Nhóm máy chủ ZooKeeper. Số lượng nút tối thiểu cần thiết để tạo thành một nhóm là 3.
Thủ lĩnh Nút máy chủ thực hiện khôi phục tự động nếu bất kỳ nút nào được kết nối không thành công. Các nhà lãnh đạo được bầu chọn khi khởi động dịch vụ.
Người theo dõi Nút máy chủ tuân theo hướng dẫn của nhà lãnh đạo.

Không gian tên phân cấp

Sơ đồ sau đây mô tả cấu trúc cây của hệ thống tệp ZooKeeper được sử dụng để biểu diễn bộ nhớ. Nút ZooKeeper được gọi làznode. Mọi znode được xác định bằng một tên và được phân tách bằng một chuỗi đường dẫn (/).

  • Trong sơ đồ, đầu tiên bạn có một gốc znodephân tách bằng “/”. Dưới thư mục gốc, bạn có hai không gian tên hợp lýconfigworkers.

  • Các config không gian tên được sử dụng để quản lý cấu hình tập trung và workers không gian tên được sử dụng để đặt tên.

  • Dưới configkhông gian tên, mỗi znode có thể lưu trữ tối đa 1MB dữ liệu. Điều này tương tự như hệ thống tệp UNIX ngoại trừ znode mẹ cũng có thể lưu trữ dữ liệu. Mục đích chính của cấu trúc này là lưu trữ dữ liệu đồng bộ và mô tả siêu dữ liệu của znode. Cấu trúc này được gọi làZooKeeper Data Model.

Mỗi znode trong mô hình dữ liệu ZooKeeper duy trì một statkết cấu. Một thống kê chỉ đơn giản là cung cấpmetadatacủa một znode. Nó bao gồm Số phiên bản, Danh sách kiểm soát hành động (ACL), Dấu thời gian và Độ dài dữ liệu.

  • Version number- Mọi znode đều có số phiên bản, có nghĩa là mỗi khi dữ liệu liên quan đến znode thay đổi, số phiên bản tương ứng của nó cũng sẽ tăng lên. Việc sử dụng số phiên bản là quan trọng khi nhiều khách hàng quản lý vườn thú đang cố gắng thực hiện các hoạt động trên cùng một znode.

  • Action Control List (ACL)- ACL về cơ bản là một cơ chế xác thực để truy cập znode. Nó chi phối tất cả các hoạt động đọc và ghi của znode.

  • Timestamp- Dấu thời gian biểu thị thời gian trôi qua từ việc tạo và sửa đổi znode. Nó thường được biểu diễn bằng mili giây. ZooKeeper xác định mọi thay đổi đối với znodes từ “ID giao dịch” (zxid).Zxid là duy nhất và duy trì thời gian cho mỗi giao dịch để bạn có thể dễ dàng xác định thời gian trôi qua từ yêu cầu này đến yêu cầu khác.

  • Data length- Tổng lượng dữ liệu được lưu trữ trong một znode là độ dài dữ liệu. Bạn có thể lưu trữ tối đa 1MB dữ liệu.

Các loại Znodes

Znodes được phân loại là bền bỉ, tuần tự và phù du.

  • Persistence znode- Znode tồn tại vẫn tồn tại ngay cả sau khi ứng dụng khách tạo ra znode cụ thể đó bị ngắt kết nối. Theo mặc định, tất cả các znodes là liên tục trừ khi được chỉ định khác.

  • Ephemeral znode- Các znodes phù du hoạt động cho đến khi khách hàng còn sống. Khi một khách hàng bị ngắt kết nối khỏi nhóm ZooKeeper, thì các znodes tạm thời sẽ tự động bị xóa. Vì lý do này, chỉ những người znodes phù du mới không được phép sinh thêm con. Nếu một znode tạm thời bị xóa, thì nút phù hợp tiếp theo sẽ lấp đầy vị trí của nó. Các znodes phù du đóng một vai trò quan trọng trong bầu cử Lãnh đạo.

  • Sequential znode- Các znodes tuần tự có thể dai dẳng hoặc phù du. Khi một znode mới được tạo dưới dạng znode tuần tự, thì ZooKeeper đặt đường dẫn của znode bằng cách gắn một số thứ tự gồm 10 chữ số vào tên ban đầu. Ví dụ: nếu một znode với đường dẫn/myapp được tạo dưới dạng znode tuần tự, ZooKeeper sẽ thay đổi đường dẫn thành /myapp0000000001và đặt số thứ tự tiếp theo là 0000000002. Nếu hai znode tuần tự được tạo đồng thời, thì ZooKeeper không bao giờ sử dụng cùng một số cho mỗi znode. Các znodes tuần tự đóng một vai trò quan trọng trong việc Khóa và Đồng bộ hóa.

Phiên

Phiên rất quan trọng đối với hoạt động của ZooKeeper. Các yêu cầu trong một phiên được thực hiện theo thứ tự FIFO. Sau khi máy khách kết nối với máy chủ, phiên sẽ được thiết lập vàsession id được chỉ định cho khách hàng.

Khách hàng gửi heartbeatstại một khoảng thời gian cụ thể để giữ phiên hợp lệ. Nếu nhóm ZooKeeper không nhận được nhịp tim từ máy khách trong hơn khoảng thời gian (thời gian chờ của phiên) được chỉ định khi bắt đầu dịch vụ, nó quyết định rằng máy khách đã chết.

Thời gian chờ của phiên thường được biểu thị bằng mili giây. Khi một phiên kết thúc vì bất kỳ lý do gì, các znodes tạm thời được tạo trong phiên đó cũng sẽ bị xóa.

Xem

Đồng hồ là một cơ chế đơn giản để khách hàng nhận thông báo về những thay đổi trong nhóm ZooKeeper. Khách hàng có thể đặt đồng hồ trong khi đọc một znode cụ thể. Đồng hồ gửi thông báo cho khách hàng đã đăng ký về bất kỳ thay đổi nào của znode (trên đó khách hàng đăng ký).

Thay đổi znode là sửa đổi dữ liệu liên quan đến znode hoặc những thay đổi trong con của znode. Đồng hồ chỉ được kích hoạt một lần. Nếu khách hàng muốn một thông báo lại, nó phải được thực hiện thông qua một thao tác đọc khác. Khi một phiên kết nối hết hạn, máy khách sẽ bị ngắt kết nối khỏi máy chủ và các đồng hồ liên quan cũng bị xóa.

Khi nhóm ZooKeeper bắt đầu, nó sẽ đợi các máy khách kết nối. Khách hàng sẽ kết nối với một trong các nút trong nhóm ZooKeeper. Nó có thể là một nhà lãnh đạo hoặc một nút theo dõi. Sau khi một máy khách được kết nối, nút sẽ gán một ID phiên cho một máy khách cụ thể và gửi một xác nhận cho máy khách. Nếu máy khách không nhận được xác nhận, nó chỉ cần cố gắng kết nối một nút khác trong nhóm ZooKeeper. Sau khi kết nối với một nút, máy khách sẽ gửi nhịp tim đến nút đó trong một khoảng thời gian đều đặn để đảm bảo rằng kết nối không bị mất.

  • If a client wants to read a particular znode, nó gửi một read requestđến nút có đường dẫn znode và nút trả về znode được yêu cầu bằng cách lấy nó từ cơ sở dữ liệu của chính nó. Vì lý do này, các lần đọc diễn ra nhanh chóng trong nhóm ZooKeeper.

  • If a client wants to store data in the ZooKeeper ensemble, nó sẽ gửi đường dẫn znode và dữ liệu đến máy chủ. Máy chủ được kết nối sẽ chuyển yêu cầu đến người lãnh đạo và sau đó người lãnh đạo sẽ gửi lại yêu cầu bằng văn bản cho tất cả những người theo dõi. Nếu chỉ phần lớn các nút phản hồi thành công, thì yêu cầu ghi sẽ thành công và mã trả về thành công sẽ được gửi đến máy khách. Nếu không, yêu cầu ghi sẽ không thành công. Phần lớn các nút được gọi làQuorum.

Các nút trong ZooKeeper Ensemble

Hãy để chúng tôi phân tích tác động của việc có số lượng nút khác nhau trong nhóm ZooKeeper.

  • Nếu chúng ta có a single node, thì tập hợp ZooKeeper không thành công khi nút đó bị lỗi. Nó góp phần vào “Điểm lỗi duy nhất” và nó không được khuyến khích trong môi trường sản xuất.

  • Nếu chúng ta có two nodes và một nút không thành công, chúng tôi cũng không có đa số, vì một trong hai không phải là đa số.

  • Nếu chúng ta có three nodesvà một nút bị lỗi, chúng tôi có đa số và vì vậy, đó là yêu cầu tối thiểu. Bắt buộc đối với một nhóm ZooKeeper phải có ít nhất ba nút trong môi trường sản xuất trực tiếp.

  • Nếu chúng ta có four nodesvà hai nút bị lỗi, nó lại bị lỗi và tương tự như có ba nút. Nút phụ không phục vụ cho bất kỳ mục đích nào và do đó, tốt hơn là bạn nên thêm các nút theo số lẻ, ví dụ: 3, 5, 7.

Chúng tôi biết rằng quá trình ghi đắt hơn quá trình đọc trong tập hợp ZooKeeper, vì tất cả các nút cần phải ghi cùng một dữ liệu trong cơ sở dữ liệu của nó. Vì vậy, tốt hơn là có số lượng nút ít hơn (3, 5 hoặc 7) hơn là có một số lượng lớn các nút cho một môi trường cân bằng.

Sơ đồ sau mô tả ZooKeeper WorkFlow và bảng tiếp theo giải thích các thành phần khác nhau của nó.

Thành phần Sự miêu tả
Viết Quá trình ghi được xử lý bởi nút lãnh đạo. Người lãnh đạo chuyển tiếp yêu cầu viết tới tất cả các znodes và đợi câu trả lời từ các znodes. Nếu một nửa số znodes trả lời, thì quá trình ghi đã hoàn tất.
Đọc Việc đọc được thực hiện bên trong bởi một znode được kết nối cụ thể, vì vậy không cần phải tương tác với cụm.
Cơ sở dữ liệu nhân bản Nó được sử dụng để lưu trữ dữ liệu trong Zookeeper. Mỗi znode có cơ sở dữ liệu riêng và mọi znode đều có cùng một dữ liệu tại mọi thời điểm với sự trợ giúp của tính nhất quán.
Thủ lĩnh Leader là Znode chịu trách nhiệm xử lý các yêu cầu ghi.
Người theo dõi Người theo dõi nhận được yêu cầu viết từ khách hàng và chuyển tiếp chúng đến znode lãnh đạo.
Bộ xử lý yêu cầu Chỉ hiển thị trong nút lãnh đạo. Nó điều chỉnh các yêu cầu ghi từ nút theo dõi.
Chương trình phát sóng nguyên tử Chịu trách nhiệm phát các thay đổi từ nút dẫn đầu đến các nút theo dõi.

Hãy để chúng tôi phân tích cách một nút lãnh đạo có thể được bầu chọn trong nhóm ZooKeeper. Hãy xem xét cóNsố lượng nút trong một cụm. Quy trình bầu cử lãnh đạo như sau:

  • Tất cả các nút tạo ra một znode tuần tự, tạm thời với cùng một đường dẫn, /app/leader_election/guid_.

  • Nhóm ZooKeeper sẽ nối số thứ tự gồm 10 chữ số vào đường dẫn và znode được tạo sẽ là /app/leader_election/guid_0000000001, /app/leader_election/guid_0000000002, Vân vân.

  • Đối với một trường hợp nhất định, nút tạo ra số nhỏ nhất trong znode sẽ trở thành nút dẫn đầu và tất cả các nút khác là người theo dõi.

  • Mỗi nút theo dõi sẽ xem znode có số nhỏ nhất tiếp theo. Ví dụ: nút tạo znode/app/leader_election/guid_0000000008 sẽ xem znode /app/leader_election/guid_0000000007 và nút tạo znode /app/leader_election/guid_0000000007 sẽ xem znode /app/leader_election/guid_0000000006.

  • Nếu nhà lãnh đạo đi xuống, thì znode tương ứng của nó /app/leader_electionN bị xóa.

  • Nút theo dõi tiếp theo trong dòng sẽ nhận được thông báo thông qua người theo dõi về việc loại bỏ người lãnh đạo.

  • Nút theo dõi dòng tiếp theo sẽ kiểm tra xem có các znodes khác có số lượng nhỏ nhất hay không. Nếu không có, thì nó sẽ đảm nhận vai trò của người lãnh đạo. Nếu không, nó tìm thấy nút đã tạo znode có số nhỏ nhất làm thủ lĩnh.

  • Tương tự, tất cả các nút theo dõi khác chọn nút tạo znode có số lượng nhỏ nhất làm nhóm trưởng.

Bầu cử lãnh đạo là một quá trình phức tạp khi nó được thực hiện từ đầu. Nhưng dịch vụ ZooKeeper làm cho nó rất đơn giản. Chúng ta hãy chuyển sang cài đặt ZooKeeper cho mục đích phát triển trong chương tiếp theo.

Trước khi cài đặt ZooKeeper, hãy đảm bảo hệ thống của bạn đang chạy trên bất kỳ hệ điều hành nào sau đây -

  • Any of Linux OS- Hỗ trợ phát triển và triển khai. Nó được ưu tiên cho các ứng dụng demo.

  • Windows OS - Chỉ hỗ trợ phát triển.

  • Mac OS - Chỉ hỗ trợ phát triển.

Máy chủ ZooKeeper được tạo bằng Java và nó chạy trên JVM. Bạn cần sử dụng JDK 6 trở lên.

Bây giờ, hãy làm theo các bước dưới đây để cài đặt khung ZooKeeper trên máy của bạn.

Bước 1: Xác minh cài đặt Java

Chúng tôi tin rằng bạn đã cài đặt môi trường Java trên hệ thống của mình. Chỉ cần xác minh nó bằng lệnh sau.

$ java -version

Nếu bạn đã cài đặt Java trên máy của mình, thì bạn có thể thấy phiên bản Java đã cài đặt. Nếu không, hãy làm theo các bước đơn giản dưới đây để cài đặt phiên bản Java mới nhất.

Bước 1.1: Tải xuống JDK

Tải xuống phiên bản JDK mới nhất bằng cách truy cập liên kết sau và tải xuống phiên bản mới nhất. Java

Phiên bản mới nhất (trong khi viết hướng dẫn này) là JDK 8u 60 và tệp là “jdk-8u60-linuxx64.tar.gz”. Vui lòng tải xuống tệp trên máy của bạn.

Bước 1.2: Giải nén tệp

Nói chung, các tệp được tải xuống downloadsthư mục. Xác minh nó và giải nén thiết lập tar bằng các lệnh sau.

$ cd /go/to/download/path
$ tar -zxf jdk-8u60-linux-x64.gz

Bước 1.3: Di chuyển đến thư mục opt

Để cung cấp Java cho tất cả người dùng, hãy di chuyển nội dung java đã giải nén vào thư mục “/ usr / local / java”.

$ su 
password: (type password of root user)
$ mkdir /opt/jdk $ mv jdk-1.8.0_60 /opt/jdk/

Bước 1.4: Đặt đường dẫn

Để đặt đường dẫn và các biến JAVA_HOME, hãy thêm các lệnh sau vào tệp ~ / .bashrc.

export JAVA_HOME = /usr/jdk/jdk-1.8.0_60
export PATH=$PATH:$JAVA_HOME/bin

Bây giờ, hãy áp dụng tất cả các thay đổi vào hệ thống đang chạy hiện tại.

$ source ~/.bashrc

Bước 1.5: Các lựa chọn thay thế Java

Sử dụng lệnh sau để thay đổi các lựa chọn thay thế Java.

update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_60/bin/java 100

Bước 1.6

Xác minh cài đặt Java bằng lệnh xác minh (java -version) được giải thích trong Bước 1.

Bước 2: Cài đặt ZooKeeper Framework

Bước 2.1: Tải xuống ZooKeeper

Để cài đặt ZooKeeper framework trên máy của bạn, hãy truy cập liên kết sau và tải xuống phiên bản ZooKeeper mới nhất. http://zookeeper.apache.org/releases.html

Hiện tại, phiên bản mới nhất của ZooKeeper là 3.4.6 (ZooKeeper-3.4.6.tar.gz).

Bước 2.2: Giải nén tệp tar

Giải nén tệp tar bằng các lệnh sau:

$ cd opt/
$ tar -zxf zookeeper-3.4.6.tar.gz $ cd zookeeper-3.4.6
$ mkdir data

Bước 2.3: Tạo tệp cấu hình

Mở tệp cấu hình có tên conf/zoo.cfg sử dụng lệnh vi conf/zoo.cfg và tất cả các tham số sau để đặt làm điểm bắt đầu.

$ vi conf/zoo.cfg

tickTime = 2000
dataDir = /path/to/zookeeper/data
clientPort = 2181
initLimit = 5
syncLimit = 2

Khi tệp cấu hình đã được lưu thành công, hãy quay lại thiết bị đầu cuối một lần nữa. Bây giờ bạn có thể khởi động máy chủ của người giữ vườn thú.

Bước 2.4: Khởi động máy chủ ZooKeeper

Thực hiện lệnh sau:

$ bin/zkServer.sh start

Sau khi thực hiện lệnh này, bạn sẽ nhận được phản hồi như sau:

$ JMX enabled by default
$ Using config: /Users/../zookeeper-3.4.6/bin/../conf/zoo.cfg $ Starting zookeeper ... STARTED

Bước 2.5: Khởi động CLI

Gõ lệnh sau:

$ bin/zkCli.sh

Sau khi gõ lệnh trên, bạn sẽ được kết nối với máy chủ ZooKeeper và bạn sẽ nhận được phản hồi sau.

Connecting to localhost:2181
................
................
................
Welcome to ZooKeeper!
................
................
WATCHER::
WatchedEvent state:SyncConnected type: None path:null
[zk: localhost:2181(CONNECTED) 0]

Dừng máy chủ ZooKeeper

Sau khi kết nối máy chủ và thực hiện tất cả các thao tác, bạn có thể dừng máy chủ của người giữ vườn thú bằng cách sử dụng lệnh sau.

$ bin/zkServer.sh stop

Giao diện dòng lệnh ZooKeeper (CLI) được sử dụng để tương tác với nhóm ZooKeeper cho mục đích phát triển. Nó rất hữu ích để gỡ lỗi và làm việc với các tùy chọn khác nhau.

Để thực hiện các hoạt động ZooKeeper CLI, trước tiên hãy bật máy chủ ZooKeeper của bạn ( “bin / zkServer.sh start” ) và sau đó, máy khách ZooKeeper ( “bin / zkCli.sh” ). Khi máy khách khởi động, bạn có thể thực hiện thao tác sau:

  • Tạo znodes
  • Lấy dữ liệu
  • Xem znode để biết các thay đổi
  • Đặt dữ liệu
  • Tạo con của một znode
  • Liệt kê các con của một znode
  • Kiểm tra trạng thái
  • Loại bỏ / Xóa một znode

Bây giờ chúng ta hãy xem từng lệnh trên với một ví dụ.

Tạo Znodes

Tạo một znode với đường dẫn đã cho. Cácflagđối số chỉ định liệu znode đã tạo sẽ là tạm thời, liên tục hay tuần tự. Theo mặc định, tất cả các znodes là liên tục.

  • Ephemeral znodes (cờ: e) sẽ tự động bị xóa khi một phiên hết hạn hoặc khi máy khách ngắt kết nối.

  • Sequential znodes đảm bảo rằng đường dẫn znode sẽ là duy nhất.

  • Tập hợp ZooKeeper sẽ thêm số thứ tự cùng với phần đệm 10 chữ số vào đường dẫn znode. Ví dụ: đường dẫn znode / myapp sẽ được chuyển đổi thành / myapp0000000001 và số thứ tự tiếp theo sẽ là / myapp0000000002 . Nếu không có cờ nào được chỉ định, thì znode được coi làpersistent.

Cú pháp

create /path /data

Mẫu vật

create /FirstZnode “Myfirstzookeeper-app”

Đầu ra

[zk: localhost:2181(CONNECTED) 0] create /FirstZnode “Myfirstzookeeper-app”
Created /FirstZnode

Để tạo ra một Sequential znode, thêm vào -s flag như hình bên dưới.

Cú pháp

create -s /path /data

Mẫu vật

create -s /FirstZnode second-data

Đầu ra

[zk: localhost:2181(CONNECTED) 2] create -s /FirstZnode “second-data”
Created /FirstZnode0000000023

Để tạo một Ephemeral Znode, thêm vào -e flag như hình bên dưới.

Cú pháp

create -e /path /data

Mẫu vật

create -e /SecondZnode “Ephemeral-data”

Đầu ra

[zk: localhost:2181(CONNECTED) 2] create -e /SecondZnode “Ephemeral-data”
Created /SecondZnode

Hãy nhớ rằng khi mất kết nối máy khách, znode tạm thời sẽ bị xóa. Bạn có thể thử nó bằng cách thoát khỏi ZooKeeper CLI và sau đó mở lại CLI.

Lấy dữ liệu

Nó trả về dữ liệu liên quan của znode và siêu dữ liệu của znode được chỉ định. Bạn sẽ nhận được thông tin như thời điểm dữ liệu được sửa đổi lần cuối, nơi nó được sửa đổi và thông tin về dữ liệu. CLI này cũng được sử dụng để chỉ định đồng hồ hiển thị thông báo về dữ liệu.

Cú pháp

get /path

Mẫu vật

get /FirstZnode

Đầu ra

[zk: localhost:2181(CONNECTED) 1] get /FirstZnode
“Myfirstzookeeper-app”
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 16:15:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 22
numChildren = 0

Để truy cập một znode tuần tự, bạn phải nhập đường dẫn đầy đủ của znode.

Mẫu vật

get /FirstZnode0000000023

Đầu ra

[zk: localhost:2181(CONNECTED) 1] get /FirstZnode0000000023
“Second-data”
cZxid = 0x80
ctime = Tue Sep 29 16:25:47 IST 2015
mZxid = 0x80
mtime = Tue Sep 29 16:25:47 IST 2015
pZxid = 0x80
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 0

Đồng hồ đeo tay

Đồng hồ hiển thị thông báo khi dữ liệu znode hoặc con của znode được chỉ định thay đổi. Bạn có thể đặt mộtwatch chỉ trong get chỉ huy.

Cú pháp

get /path [watch] 1

Mẫu vật

get /FirstZnode 1

Đầu ra

[zk: localhost:2181(CONNECTED) 1] get /FirstZnode 1
“Myfirstzookeeper-app”
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 16:15:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 22
numChildren = 0

Đầu ra tương tự như bình thường getnhưng nó sẽ đợi các thay đổi znode trong nền. <Bắt đầu tại đây>

Đặt dữ liệu

Đặt dữ liệu của znode được chỉ định. Sau khi hoàn thành thao tác đặt này, bạn có thể kiểm tra dữ liệu bằng cách sử dụngget Lệnh CLI.

Cú pháp

set /path /data

Mẫu vật

set /SecondZnode Data-updated

Đầu ra

[zk: localhost:2181(CONNECTED) 1] get /SecondZnode “Data-updated”
cZxid = 0x82
ctime = Tue Sep 29 16:29:50 IST 2015
mZxid = 0x83
mtime = Tue Sep 29 16:29:50 IST 2015
pZxid = 0x82
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x15018b47db00000
dataLength = 14
numChildren = 0

Nếu bạn chỉ định watch tùy chọn trong get lệnh (như trong lệnh trước), sau đó đầu ra sẽ tương tự như hình dưới đây:

Đầu ra

[zk: localhost:2181(CONNECTED) 1] get /FirstZnode “Mysecondzookeeper-app”

WATCHER: :

WatchedEvent state:SyncConnected type:NodeDataChanged path:/FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x84
mtime = Tue Sep 29 17:14:47 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0

Tạo con / znode con

Tạo con tương tự như tạo znodes mới. Sự khác biệt duy nhất là đường dẫn của znode con cũng sẽ có đường dẫn mẹ.

Cú pháp

create /parent/path/subnode/path /data

Mẫu vật

create /FirstZnode/Child1 firstchildren

Đầu ra

[zk: localhost:2181(CONNECTED) 16] create /FirstZnode/Child1 “firstchildren”
created /FirstZnode/Child1
[zk: localhost:2181(CONNECTED) 17] create /FirstZnode/Child2 “secondchildren”
created /FirstZnode/Child2

Liệt kê trẻ em

Lệnh này được sử dụng để liệt kê và hiển thị children của một znode.

Cú pháp

ls /path

Mẫu vật

ls /MyFirstZnode

Đầu ra

[zk: localhost:2181(CONNECTED) 2] ls /MyFirstZnode
[mysecondsubnode, myfirstsubnode]

Kiểm tra trạng thái

Statusmô tả siêu dữ liệu của một znode được chỉ định. Nó chứa các chi tiết như Dấu thời gian, Số phiên bản, ACL, Độ dài dữ liệu và Znode trẻ em.

Cú pháp

stat /path

Mẫu vật

stat /FirstZnode

Đầu ra

[zk: localhost:2181(CONNECTED) 1] stat /FirstZnode
cZxid = 0x7f
ctime = Tue Sep 29 16:15:47 IST 2015
mZxid = 0x7f
mtime = Tue Sep 29 17:14:24 IST 2015
pZxid = 0x7f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 23
numChildren = 0

Loại bỏ một Znode

Loại bỏ một znode được chỉ định và đệ quy tất cả các con của nó. Điều này chỉ xảy ra nếu có sẵn một znode như vậy.

Cú pháp

rmr /path

Mẫu vật

rmr /FirstZnode

Đầu ra

[zk: localhost:2181(CONNECTED) 10] rmr /FirstZnode
[zk: localhost:2181(CONNECTED) 11] get /FirstZnode
Node does not exist: /FirstZnode

Xóa bỏ (delete /path) lệnh tương tự như remove lệnh, ngoại trừ thực tế là nó chỉ hoạt động trên các znodes không có con.

ZooKeeper có liên kết API chính thức cho Java và C. Cộng đồng ZooKeeper cung cấp API không chính thức cho hầu hết các ngôn ngữ (.NET, python, v.v.). Sử dụng API ZooKeeper, một ứng dụng có thể kết nối, tương tác, thao tác dữ liệu, điều phối và cuối cùng là ngắt kết nối khỏi nhóm ZooKeeper.

ZooKeeper API có một tập hợp các tính năng phong phú để có được tất cả các chức năng của nhóm ZooKeeper một cách đơn giản và an toàn. API ZooKeeper cung cấp cả phương thức đồng bộ và không đồng bộ.

Tập hợp ZooKeeper và API ZooKeeper hoàn toàn bổ sung cho nhau về mọi mặt và nó mang lại lợi ích tuyệt vời cho các nhà phát triển. Hãy để chúng tôi thảo luận về liên kết Java trong chương này.

Kiến thức cơ bản về API ZooKeeper

Ứng dụng tương tác với nhóm ZooKeeper được gọi là ZooKeeper Client hoặc đơn giản Client.

Znode là thành phần cốt lõi của nhóm ZooKeeper và API ZooKeeper cung cấp một tập hợp nhỏ các phương pháp để thao tác tất cả các chi tiết của znode với nhóm ZooKeeper.

Khách hàng nên làm theo các bước dưới đây để có tương tác rõ ràng và rõ ràng với nhóm ZooKeeper.

  • Kết nối với nhóm ZooKeeper. Tập hợp ZooKeeper chỉ định ID phiên cho máy khách.

  • Gửi nhịp tim đến máy chủ theo định kỳ. Nếu không, nhóm ZooKeeper hết hạn ID phiên và máy khách cần kết nối lại.

  • Lấy / Đặt znodes miễn là ID phiên hoạt động.

  • Ngắt kết nối khỏi nhóm ZooKeeper sau khi hoàn thành tất cả các nhiệm vụ. Nếu máy khách không hoạt động trong một thời gian dài, thì nhóm ZooKeeper sẽ tự động ngắt kết nối máy khách.

Java Binding

Hãy để chúng tôi hiểu bộ API ZooKeeper quan trọng nhất trong chương này. Phần trung tâm của API ZooKeeper làZooKeeper class. Nó cung cấp các tùy chọn để kết nối tập hợp ZooKeeper trong hàm tạo của nó và có các phương thức sau:

  • connect - kết nối với quần thể ZooKeeper

  • create - tạo một znode

  • exists - kiểm tra xem một znode có tồn tại hay không và thông tin của nó

  • getData - lấy dữ liệu từ một znode cụ thể

  • setData - đặt dữ liệu trong một znode cụ thể

  • getChildren - nhận tất cả các nút phụ có sẵn trong một znode cụ thể

  • delete - nhận một znode cụ thể và tất cả các con của nó

  • close - đóng kết nối

Kết nối với ZooKeeper Ensemble

Lớp ZooKeeper cung cấp chức năng kết nối thông qua phương thức khởi tạo của nó. Chữ ký của hàm tạo như sau:

ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

Ở đâu,

  • connectionString - Máy chủ lưu trữ nhóm ZooKeeper.

  • sessionTimeout - thời gian chờ của phiên tính bằng mili giây.

  • watcher- một đối tượng thực hiện giao diện “Watcher”. Nhóm ZooKeeper trả về trạng thái kết nối thông qua đối tượng watcher.

Hãy để chúng tôi tạo một lớp trợ giúp mới ZooKeeperConnection và thêm một phương pháp connect. Cácconnect phương thức tạo một đối tượng ZooKeeper, kết nối với nhóm ZooKeeper, sau đó trả về đối tượng.

Đây CountDownLatch được sử dụng để dừng (đợi) quá trình chính cho đến khi máy khách kết nối với nhóm ZooKeeper.

Nhóm ZooKeeper trả lời trạng thái kết nối thông qua Watcher callback. Lệnh gọi lại của Watcher sẽ được gọi khi máy khách kết nối với nhóm ZooKeeper và lệnh gọi lại của Watcher gọicountDown phương pháp của CountDownLatch để mở khóa, await trong quy trình chính.

Đây là mã hoàn chỉnh để kết nối với một nhóm ZooKeeper.

Mã hóa: ZooKeeperConnection.java

// import java classes
import java.io.IOException;
import java.util.concurrent.CountDownLatch;

// import zookeeper classes
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.KeeperException.Code;
import org.apache.zookeeper.data.Stat;

public class ZooKeeperConnection {

   // declare zookeeper instance to access ZooKeeper ensemble
   private ZooKeeper zoo;
   final CountDownLatch connectedSignal = new CountDownLatch(1);

   // Method to connect zookeeper ensemble.
   public ZooKeeper connect(String host) throws IOException,InterruptedException {
	
      zoo = new ZooKeeper(host,5000,new Watcher() {
		
         public void process(WatchedEvent we) {

            if (we.getState() == KeeperState.SyncConnected) {
               connectedSignal.countDown();
            }
         }
      });
		
      connectedSignal.await();
      return zoo;
   }

   // Method to disconnect from zookeeper server
   public void close() throws InterruptedException {
      zoo.close();
   }
}

Lưu đoạn mã trên và nó sẽ được sử dụng trong phần tiếp theo để kết nối nhóm ZooKeeper.

Tạo một Znode

Lớp ZooKeeper cung cấp create methodđể tạo một znode mới trong nhóm ZooKeeper. Chữ ký củacreate phương pháp như sau:

create(String path, byte[] data, List<ACL> acl, CreateMode createMode)

Ở đâu,

  • path- Đường dẫn znode. Ví dụ: / myapp1, / ​​myapp2, / myapp1 / mydata1, myapp2 / mydata1 / myanothersubdata

  • data - dữ liệu để lưu trữ trong một đường dẫn znode cụ thể

  • acl- danh sách kiểm soát truy cập của nút được tạo. API ZooKeeper cung cấp giao diện tĩnhZooDefs.Idsđể có được một số danh sách acl cơ bản. Ví dụ, ZooDefs.Ids.OPEN_ACL_UNSAFE trả về một danh sách acl cho các znodes đang mở.

  • createMode- loại nút, hoặc tạm thời, tuần tự hoặc cả hai. Đây làenum.

Hãy để chúng tôi tạo một ứng dụng Java mới để kiểm tra createchức năng của API ZooKeeper. Tạo một tệpZKCreate.java. Trong phương thức chính, hãy tạo một đối tượng kiểuZooKeeperConnection và gọi cho connect phương pháp kết nối với nhóm ZooKeeper.

Phương thức kết nối sẽ trả về đối tượng ZooKeeper zk. Bây giờ, hãy gọi chocreate phương pháp của zk đối tượng với tùy chỉnh pathdata.

Mã chương trình hoàn chỉnh để tạo một znode như sau:

Mã hóa: ZKCreate.java

import java.io.IOException;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;

public class ZKCreate {
   // create static instance for zookeeper class.
   private static ZooKeeper zk;

   // create static instance for ZooKeeperConnection class.
   private static ZooKeeperConnection conn;

   // Method to create znode in zookeeper ensemble
   public static void create(String path, byte[] data) throws 
      KeeperException,InterruptedException {
      zk.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE,
      CreateMode.PERSISTENT);
   }

   public static void main(String[] args) {

      // znode path
      String path = "/MyFirstZnode"; // Assign path to znode

      // data in byte array
      byte[] data = "My first zookeeper app”.getBytes(); // Declare data
		
      try {
         conn = new ZooKeeperConnection();
         zk = conn.connect("localhost");
         create(path, data); // Create the data to the specified path
         conn.close();
      } catch (Exception e) {
         System.out.println(e.getMessage()); //Catch error message
      }
   }
}

Sau khi ứng dụng được biên dịch và thực thi, một znode với dữ liệu được chỉ định sẽ được tạo trong nhóm ZooKeeper. Bạn có thể kiểm tra nó bằng ZooKeeper CLIzkCli.sh.

cd /path/to/zookeeper
bin/zkCli.sh
>>> get /MyFirstZnode

Sự tồn tại - Kiểm tra sự tồn tại của một Znode

Lớp ZooKeeper cung cấp exists methodđể kiểm tra sự tồn tại của một znode. Nó trả về siêu dữ liệu của một znode, nếu znode được chỉ định tồn tại. Chữ ký củaexists phương pháp như sau:

exists(String path, boolean watcher)

Ở đâu,

  • path - Đường dẫn znode

  • watcher - giá trị boolean để chỉ định xem có xem một znode được chỉ định hay không

Hãy để chúng tôi tạo một ứng dụng Java mới để kiểm tra chức năng “tồn tại” của API ZooKeeper. Tạo một tệp “ZKExists.java” . Trong phương thức chính, tạo đối tượng ZooKeeper, “zk” bằng đối tượng “ZooKeeperConnection” . Sau đó, gọi phương thức “tồn tại” của đối tượng “zk” với “đường dẫn” tùy chỉnh . Danh sách đầy đủ như sau -

Mã hóa: ZKExists.java

import java.io.IOException;

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;

public class ZKExists {
   private static ZooKeeper zk;
   private static ZooKeeperConnection conn;

   // Method to check existence of znode and its status, if znode is available.
   public static Stat znode_exists(String path) throws
      KeeperException,InterruptedException {
      return zk.exists(path, true);
   }

   public static void main(String[] args) throws InterruptedException,KeeperException {
      String path = "/MyFirstZnode"; // Assign znode to the specified path
			
      try {
         conn = new ZooKeeperConnection();
         zk = conn.connect("localhost");
         Stat stat = znode_exists(path); // Stat checks the path of the znode
				
         if(stat != null) {
            System.out.println("Node exists and the node version is " +
            stat.getVersion());
         } else {
            System.out.println("Node does not exists");
         }
				
      } catch(Exception e) {
         System.out.println(e.getMessage()); // Catches error messages
      }
   }
}

Sau khi ứng dụng được biên dịch và thực thi, bạn sẽ nhận được kết quả bên dưới.

Node exists and the node version is 1.

Phương thức getData

Lớp ZooKeeper cung cấp getDatađể lấy dữ liệu được đính kèm trong một znode cụ thể và trạng thái của nó. Chữ ký củagetData phương pháp như sau:

getData(String path, Watcher watcher, Stat stat)

Ở đâu,

  • path - Đường dẫn znode.

  • watcher - Chức năng gọi lại kiểu Watcher. Nhóm ZooKeeper sẽ thông báo thông qua lệnh gọi lại của Watcher khi dữ liệu của znode được chỉ định thay đổi. Đây là thông báo một lần.

  • stat - Trả về siêu dữ liệu của một znode.

Hãy để chúng tôi tạo một ứng dụng Java mới để hiểu getDatachức năng của API ZooKeeper. Tạo một tệpZKGetData.java. Trong phương thức chính, tạo một đối tượng ZooKeeperzk sử dụng anh ấy ZooKeeperConnectionvật. Sau đó, hãy gọi chogetData phương thức của đối tượng zk với đường dẫn tùy chỉnh.

Đây là mã chương trình hoàn chỉnh để lấy dữ liệu từ một nút được chỉ định -

Mã hóa: ZKGetData.java

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;

public class ZKGetData {

   private static ZooKeeper zk;
   private static ZooKeeperConnection conn;
   public static Stat znode_exists(String path) throws 
      KeeperException,InterruptedException {
      return zk.exists(path,true);
   }

   public static void main(String[] args) throws InterruptedException, KeeperException {
      String path = "/MyFirstZnode";
      final CountDownLatch connectedSignal = new CountDownLatch(1);
		
      try {
         conn = new ZooKeeperConnection();
         zk = conn.connect("localhost");
         Stat stat = znode_exists(path);
			
         if(stat != null) {
            byte[] b = zk.getData(path, new Watcher() {
				
               public void process(WatchedEvent we) {
					
                  if (we.getType() == Event.EventType.None) {
                     switch(we.getState()) {
                        case Expired:
                        connectedSignal.countDown();
                        break;
                     }
							
                  } else {
                     String path = "/MyFirstZnode";
							
                     try {
                        byte[] bn = zk.getData(path,
                        false, null);
                        String data = new String(bn,
                        "UTF-8");
                        System.out.println(data);
                        connectedSignal.countDown();
							
                     } catch(Exception ex) {
                        System.out.println(ex.getMessage());
                     }
                  }
               }
            }, null);
				
            String data = new String(b, "UTF-8");
            System.out.println(data);
            connectedSignal.await();
				
         } else {
            System.out.println("Node does not exists");
         }
      } catch(Exception e) {
        System.out.println(e.getMessage());
      }
   }
}

Khi ứng dụng được biên dịch và thực thi, bạn sẽ nhận được kết quả sau

My first zookeeper app

Và ứng dụng sẽ đợi thêm thông báo từ nhóm ZooKeeper. Thay đổi dữ liệu của znode được chỉ định bằng ZooKeeper CLIzkCli.sh.

cd /path/to/zookeeper
bin/zkCli.sh
>>> set /MyFirstZnode Hello

Bây giờ, ứng dụng sẽ in đầu ra sau và thoát.

Hello

Phương pháp setData

Lớp ZooKeeper cung cấp setDataphương pháp sửa đổi dữ liệu được đính kèm trong một znode được chỉ định. Chữ ký củasetData phương pháp như sau:

setData(String path, byte[] data, int version)

Ở đâu,

  • path - Đường dẫn znode

  • data - dữ liệu để lưu trữ trong một đường dẫn znode xác định.

  • version- Phiên bản hiện tại của znode. ZooKeeper cập nhật số phiên bản của znode bất cứ khi nào dữ liệu bị thay đổi.

Bây giờ chúng ta hãy tạo một ứng dụng Java mới để hiểu setDatachức năng của API ZooKeeper. Tạo một tệpZKSetData.java. Trong phương thức chính, tạo một đối tượng ZooKeeperzk sử dụng ZooKeeperConnectionvật. Sau đó, hãy gọi chosetData phương pháp của zk đối tượng với đường dẫn được chỉ định, dữ liệu mới và phiên bản của nút.

Đây là mã chương trình hoàn chỉnh để sửa đổi dữ liệu được đính kèm trong một znode được chỉ định.

Mã: ZKSetData.java

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;

import java.io.IOException;

public class ZKSetData {
   private static ZooKeeper zk;
   private static ZooKeeperConnection conn;

   // Method to update the data in a znode. Similar to getData but without watcher.
   public static void update(String path, byte[] data) throws
      KeeperException,InterruptedException {
      zk.setData(path, data, zk.exists(path,true).getVersion());
   }

   public static void main(String[] args) throws InterruptedException,KeeperException {
      String path= "/MyFirstZnode";
      byte[] data = "Success".getBytes(); //Assign data which is to be updated.
		
      try {
         conn = new ZooKeeperConnection();
         zk = conn.connect("localhost");
         update(path, data); // Update znode data to the specified path
      } catch(Exception e) {
         System.out.println(e.getMessage());
      }
   }
}

Sau khi ứng dụng được biên dịch và thực thi, dữ liệu của znode được chỉ định sẽ được thay đổi và nó có thể được kiểm tra bằng cách sử dụng ZooKeeper CLI, zkCli.sh.

cd /path/to/zookeeper
bin/zkCli.sh
>>> get /MyFirstZnode

getChildrenMethod

Lớp ZooKeeper cung cấp getChildrenđể lấy tất cả các nút con của một znode cụ thể. Chữ ký củagetChildren phương pháp như sau:

getChildren(String path, Watcher watcher)

Ở đâu,

  • path - Đường dẫn znode.

  • watcher- Chức năng gọi lại kiểu “Watcher”. Tập hợp ZooKeeper sẽ thông báo khi znode được chỉ định bị xóa hoặc một con trong znode được tạo / xóa. Đây là thông báo một lần.

Mã hóa: ZKGetChildren.java

import java.io.IOException;
import java.util.*;

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.data.Stat;

public class ZKGetChildren {
   private static ZooKeeper zk;
   private static ZooKeeperConnection conn;

   // Method to check existence of znode and its status, if znode is available.
   public static Stat znode_exists(String path) throws 
      KeeperException,InterruptedException {
      return zk.exists(path,true);
   }

   public static void main(String[] args) throws InterruptedException,KeeperException {
      String path = "/MyFirstZnode"; // Assign path to the znode
		
      try {
         conn = new ZooKeeperConnection();
         zk = conn.connect("localhost");
         Stat stat = znode_exists(path); // Stat checks the path

         if(stat!= null) {

            //“getChildren” method- get all the children of znode.It has two
            args, path and watch
            List <String> children = zk.getChildren(path, false);
            for(int i = 0; i < children.size(); i++)
            System.out.println(children.get(i)); //Print children's
         } else {
            System.out.println("Node does not exists");
         }

      } catch(Exception e) {
         System.out.println(e.getMessage());
      }

   }

}

Trước khi chạy chương trình, chúng ta hãy tạo hai nút con cho /MyFirstZnode bằng cách sử dụng ZooKeeper CLI, zkCli.sh.

cd /path/to/zookeeper
bin/zkCli.sh
>>> create /MyFirstZnode/myfirstsubnode Hi
>>> create /MyFirstZnode/mysecondsubmode Hi

Bây giờ, biên dịch và chạy chương trình sẽ xuất ra các znodes đã tạo ở trên.

myfirstsubnode
mysecondsubnode

Xóa một Znode

Lớp ZooKeeper cung cấp deletephương pháp để xóa một znode được chỉ định. Chữ ký củadelete phương pháp như sau:

delete(String path, int version)

Ở đâu,

  • path - Đường dẫn znode.

  • version - Phiên bản hiện tại của znode.

Hãy để chúng tôi tạo một ứng dụng Java mới để hiểu deletechức năng của API ZooKeeper. Tạo một tệpZKDelete.java. Trong phương thức chính, tạo một đối tượng ZooKeeperzk sử dụng ZooKeeperConnectionvật. Sau đó, hãy gọi chodelete phương pháp của zk đối tượng với chỉ định path và phiên bản của nút.

Mã chương trình hoàn chỉnh để xóa một znode như sau:

Mã hóa: ZKDelete.java

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.KeeperException;

public class ZKDelete {
   private static ZooKeeper zk;
   private static ZooKeeperConnection conn;

   // Method to check existence of znode and its status, if znode is available.
   public static void delete(String path) throws KeeperException,InterruptedException {
      zk.delete(path,zk.exists(path,true).getVersion());
   }

   public static void main(String[] args) throws InterruptedException,KeeperException {
      String path = "/MyFirstZnode"; //Assign path to the znode
		
      try {
         conn = new ZooKeeperConnection();
         zk = conn.connect("localhost");
         delete(path); //delete the node with the specified path
      } catch(Exception e) {
         System.out.println(e.getMessage()); // catches error messages
      }
   }
}

Zookeeper cung cấp một cơ sở hạ tầng phối hợp linh hoạt cho môi trường phân tán. ZooKeeper framework hỗ trợ nhiều ứng dụng công nghiệp tốt nhất hiện nay. Chúng ta sẽ thảo luận về một số ứng dụng đáng chú ý nhất của ZooKeeper trong chương này.

Yahoo!

Khung ZooKeeper ban đầu được xây dựng tại “Yahoo!”. Một ứng dụng phân tán được thiết kế tốt cần đáp ứng các yêu cầu như tính minh bạch của dữ liệu, hiệu suất tốt hơn, tính mạnh mẽ, cấu hình tập trung và điều phối. Vì vậy, họ đã thiết kế khung ZooKeeper để đáp ứng những yêu cầu này.

Apache Hadoop

Apache Hadoop là động lực thúc đẩy sự phát triển của ngành Dữ liệu lớn. Hadoop dựa vào ZooKeeper để quản lý và điều phối cấu hình. Chúng ta hãy xem một kịch bản để hiểu vai trò của ZooKeeper trong Hadoop.

Giả sử rằng một Hadoop cluster cầu 100 or more commodity servers. Do đó, cần có các dịch vụ điều phối và đặt tên. Khi có sự tính toán của số lượng lớn các nút, mỗi nút cần phải đồng bộ hóa với nhau, biết nơi truy cập các dịch vụ và biết chúng nên được cấu hình như thế nào. Tại thời điểm này, các cụm Hadoop yêu cầu các dịch vụ nút chéo. ZooKeeper cung cấp các tiện ích chocross-node synchronization và đảm bảo các tác vụ trên các dự án Hadoop được tuần tự hóa và đồng bộ hóa.

Nhiều máy chủ ZooKeeper hỗ trợ các cụm Hadoop lớn. Mỗi máy khách giao tiếp với một trong các máy chủ ZooKeeper để lấy và cập nhật thông tin đồng bộ hóa của nó. Một số ví dụ thời gian thực là:

  • Human Genome Project- Dự án Bộ gen người chứa hàng terabyte dữ liệu. Khung Hadoop MapReduce có thể được sử dụng để phân tích tập dữ liệu và tìm ra các sự kiện thú vị cho sự phát triển của con người.

  • Healthcare - Các bệnh viện có thể lưu trữ, truy xuất và phân tích các bộ hồ sơ bệnh án của bệnh nhân khổng lồ, thường có kích thước bằng terabyte.

Apache HBase

Apache HBase là một cơ sở dữ liệu NoSQL mã nguồn mở, phân tán, được sử dụng để truy cập đọc / ghi thời gian thực của các tập dữ liệu lớn và chạy trên HDFS. HBase saumaster-slave architecturenơi HBase Master cai quản tất cả nô lệ. Nô lệ được gọi làRegion servers.

Cài đặt ứng dụng phân tán HBase phụ thuộc vào một cụm ZooKeeper đang chạy. Apache HBase sử dụng ZooKeeper để theo dõi trạng thái của dữ liệu được phân phối trên toàn bộ máy chủ chính và khu vực với sự trợ giúp củacentralized configuration managementdistributed mutexcác cơ chế. Dưới đây là một số trường hợp sử dụng của HBase -

  • Telecom- Ngành viễn thông lưu trữ hàng tỷ bản ghi cuộc gọi di động (khoảng 30TB / tháng) và truy cập các bản ghi cuộc gọi này trong thời gian thực trở thành một nhiệm vụ to lớn. HBase có thể được sử dụng để xử lý tất cả các bản ghi trong thời gian thực một cách dễ dàng và hiệu quả.

  • Social network- Tương tự như ngành viễn thông, các trang như Twitter, LinkedIn và Facebook nhận được khối lượng dữ liệu khổng lồ thông qua các bài đăng do người dùng tạo. HBase có thể được sử dụng để tìm các xu hướng gần đây và các sự kiện thú vị khác.

Apache Solr

Apache Solr là một nền tảng tìm kiếm mã nguồn mở, nhanh chóng được viết bằng Java. Nó là một công cụ tìm kiếm phân tán nhanh chóng, có khả năng chịu lỗi. Được xây dựng trên đầu trang củaLucene, nó là một công cụ tìm kiếm văn bản hiệu suất cao, đầy đủ tính năng.

Solr sử dụng rộng rãi mọi tính năng của ZooKeeper như quản lý cấu hình, bầu cử lãnh đạo, quản lý nút, Khóa và đồng bộ hóa dữ liệu.

Solr có hai phần riêng biệt, indexingsearching. Lập chỉ mục là một quá trình lưu trữ dữ liệu ở định dạng thích hợp để có thể tìm kiếm sau này. Solr sử dụng ZooKeeper để lập chỉ mục dữ liệu trong nhiều nút và tìm kiếm từ nhiều nút. ZooKeeper đóng góp các tính năng sau:

  • Thêm / xóa các nút khi cần thiết

  • Sao chép dữ liệu giữa các nút và sau đó giảm thiểu mất mát dữ liệu

  • Chia sẻ dữ liệu giữa nhiều nút và sau đó tìm kiếm từ nhiều nút để có kết quả tìm kiếm nhanh hơn

Một số trường hợp sử dụng của Apache Solr bao gồm thương mại điện tử, tìm kiếm việc làm, v.v.