Krakenとは
Uberから、Krakenという拡張性と可用性に焦点を当てたP2P型のDocker registryが公開されました。
3Gのdocker imageを2,600ホストから同時にダウンロードしても、半数以上のホストが10秒で完了し、99%のホストで18秒以内にダウンロードを完了するという性能を持つ、強力なDocker registryです。
ただ、このレポジトリに注目した理由は性能や機能ではなく、torrent
というディレクトリがあったからです。
正直、BitTorrentがまだ使われていることすら知らなかったので、「Krakenが言っているtorrentって何を指すんだろう」という興味から覗きました。
※本記事では3bca40a660c0da0a381b84865af3ad3c623283f3のコミットを使用しています。
また、Ubuntuで動作させていますが、サンプルコードがMacのみを想定していたため、スクリプトや設定を少しいじりました。
参考リンク:
Krakenのフロー
Krakenは以下のようなフローで動作します。
つまり、 docker push
をした場合には、
- Proxyサーバーにpush
- Originサーバーを通してimageを保存
という順番でアップロードしたdocker imageがKraken上に保存されます。
また、docker pull
には
という2通りの選択肢がありますが、P2P無しは動作確認目的で、実際の稼働時にはP2Pを使用します。
P2Pダウンロード
さて、以下の画像のようにDocker imageのダウンロード元は既にダウンロードしている別ホストです。
Trackerを通して、要求データがあるホスト(Agent)を見つけ、そこからダウンロードします。
なので、Agentがダウンロードする先は別のAgentです。P2Pですね。
この、「ダウンロード」を司るコードの中にTorrentという言葉が出てきます。
これは、Krakenの開発当初にBitTorrentのdriverを使用していたところから来ているようです。
ただBitTorrentの実装は要求に合わなかったようで、独自にP2Pを実装し直しています。
しかし、Krakenの作成者たちはBitTorrentが大好きなのか、KrakenにBitTorrentとの互換性をもたせたいという夢をROADMAPに掲げています。(ストレージのエンドポイントはただのHTTPなので、Docker registry以外の用途にも使えます)
Scheduler
Scheduler機能がKrakenにも実装されています。
Schedulerは1つのgoプロセス内で動くキューのことで、色々なイベントを順番に実行するために使われます。
例えばKrakenでは、
- 別ホストとのコネクションを確立する
- imageをダウンロードする
- コネクションを切る
などの動作をSchedulerに入れて、順次実行しています。
また、多くの動作はその場で処理を終えるのではなく、ゴルーチンを使って後続処理をしています。
このようにすることで、順次実行しつつ平行に処理できるようになっています。
終わりに
以上Krakenについてでした。