〜データツリー編〜こんにちはfukuです。前回は実際にZooKeeperをスタンドアローンで起動して、zkCliからデータツリーの操作に関して説明を行いました。今回は実際のソースコードからデータツリーがどのように実装されているのかを解説していこうと思います。ソースコードはバージョン3.5.3をもとにしています。データツリーのデータ構造データツリーはこれまで説明を行ってきたように、znodeで構成されます。znodeはソースコードではDataNodeクラスで管理されます。DataNodeについてみていきましょう。DataNodeDetaNodeクラスのインスタンス変数には以下のようなものがあります。null;dataはcreateやsetコマンドで指定するznodeのデータを保持します。aclはznodeに設定されている権限情報を管理しますが、今回は権限には触れずに説明を行います。childrenは対象のznodeの子ノードを保持します。なっているので、子ノードの親ノードを除いたパス名が格納されます。"child2"が格納されることになります。最後にstatはStatPersistedクラスのインスタンスが格納されます。StatPersistedクラスはディスク永続化するためのノードの情報が格納されます。StatPersistedクラスの定義は以下となります。children}StatPersistedでは主にノードに関してのバージョン情報とZooKeeperトランザクションID(ZXID)に関する情報を保持します。バージョンやトランザクションに関しては次回以降に説明をできればと思います。StatPersistedの状態は前回紹介した、zkCli.shからgetコマンドの-sオプションによって参照が行えます。0ただしCLIから表示される内容はStatPersistedインスタンスそのものではなく、以下に示すStatクラスのインスタンスへ変換した内容を表示します(StatPersistedのcopyStatメソッドにより変換が行われます)。内容に関してはdataの長さ(dataLength)や子ノードの数(numChildren)が追加される程度で、ほとんど内容としては同じとなります。}DataTreeつづいてデータツリーをメモリ上で管理するDataTreeクラスについてみていきます。DataTreeクラスから、znode管理に関する変数を以下に示します。Boolean>());}ここで上記で紹介したかくインスタンス変数に関して説明をしていきます。nodesnodesはデータツリーが管理するすべてznodeの情報を格納します。ZooKeeperではツリー構造のデータを扱いますが、データ構造上は一般的な親ノードが子ノードのデータポインタを管理するようなツリー構造のデータ構造をしておらず(DataNodeではあくまで子ノードのパス名した管理していませんでした)、DataTreeインスタンスがすべてのznodeのデータポインタを管理するような構造となっています。ZooKeeperでは内部のメタデータを管理するためにデフォルトのデータツリーの状態をDataTreeのコンストラクタで生成します。デフォルトのデータツリーの状態は以下のようになっています。それぞれのパス名とDataNodeへ参照となります。ephemerals変数ephemeralsではEPHEMERALモードのznodeを管理します。HashSet<String>>構造になっていますが、KeyでセッションIDを管理してValueで対象のセッションに紐づくEPHEMERALノードパスを管理するようになっており、特定のセッションが切断された場合に、削除するべきEPHEMERALノードを簡単に参照できるような構造となっています。参考としてセッションを切断した時に呼び出すkillSessionメソッドを記載します。ephemerals.remove(session);で切断対象のセッションに紐づくEPHEMERALノードのパス一覧を取得していることがわかります。containerscontainers変数ではCONTAINERモードのznodeのパスを管理しています。これはZooKeeper内部で自動的にCONTAINERモードのznodeを削除する際に、すべてのCONTAINERノードを簡単に参照できるようにするためです。ttlsttls変数はTTLモードのznodeのパスを管理します。ttlsもcontainersと同じように内部的にttlsを効率よく参照して、生存期間が切れたのznodeを削除するために利用されます。このようにNodeTreeインスタンスでは、すべてのznodeをnodes変数で管理して、EPHEMERALモードなどの特定のモードに関してのznodeに対しては、追加でそれぞれのモードを管理する変数にそのパス情報を格納しながらデータツリー全体を管理しています。おわりに今回は実際にソースコードからデータツリーがメモリ上でどのように管理しているのかをみていきました。次回はさらにznodeを深掘りして理解を深めていけたらと思います。〜znodeステータス編〜こんにちはfukuです。~ZooKeeper操作編~こんにちは、fukuです。ZooKeeperについ...2018-03-02運用中のRedshiftを旧世代から最新世代に移行する方法はじめまして。〜概要とデータノード編〜こんにちは、fukuです。採用情報フロムスクラッチは常に優秀なソフトウェアエンジニアを募集しています。vol.2月別アーカイブ検索リンクb→dashWantedly運営会社はてなブログをはじめよう!f-scratchさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。