LoginSignup
0
0

More than 5 years have passed since last update.

Kubernetes+s3+RDSを使ったファイルの分散処理の仕組みを作ってみた[概要編]

Last updated at Posted at 2016-10-02

概要

友達からファイルの分散処理を頼まれたので作りました。

イメージ的にはファイルの処理要求を書き込むと複数のPodが適当にタスクを分割しファイル処理を自動でやってくれるものです。

今回はs3上に保存されているファイルをダウンロードし、Kubernetes上の計算用Podでファイル処理(今回はハッシュ値計算)を行い、その結果をRDS上のmysqlサーバーに保存します。

myfile_1.png

計算用PodはKubernetesを用いて複数配置し分散処理をさせたいため、etcdサーバーに設定を書き込み、各Podがタスクの内容を取得し処理するようにしました。

etcdサーバーに分割するPod数をもたせ、処理するファイル名の範囲を分割し処理します。

※ファイル名の範囲の分割をかんたんにするためファイル名は16進数を文字列化したものと仮定します。

なお、各ノードにetcdサーバーを配置(記事はこちら)していることが前提となります。

計算用Podの中身

計算用Podの中は3コンテナで構成されています。
なお、全コンテナは同じフォルダーをマウントしています。

myfile_2.png

コンテナについて

  • init-pod
    etcdサーバーから処理内容やs3のキーなどを取得し全コンテナ共用で利用するファイルを初期化します。
    また、etcdサーバーのパラメーターからs3の処理するファイル名の範囲を決定します。
    本当はKubernetesのinit containersという機能を使う予定でしたがうまく動かなかったので他のコンテナの処理が終わるまでsleepします
    他のコンテナの処理が終わった後etcdサーバーに終了を示すデータを書き込み新たな処理内容を取得します。
  • s3-fetch-tool2
    init-podが設定ファイルを生成した後s3からファイルをダウンロードします。
    指定された共用フォルダーに上限10個ファイルが溜まるまでダウンロードします。
    init-podで指定された範囲のファイルを全てダウンロードしたら完了を示すファイル(s3fin)を生成して他のコンテナが終了するまで待機します。
  • file-hasher2
    s3-fetch-tool2がダウンロードしたファイルのハッシュ値を求めRDS上のmysqlにハッシュ値を保存します。
    ハッシュ値の計算アルゴリズムはetcd側で指定されたもので行います(後述)
    s3-fetch-tool2が保存したファイルを全て保存したら完了を示すファイル(hashfin)を生成してinit-podの終了処理を待ちます。

ファイルについて

3コンテナが共通してマウントしているディレクトリ内では3つのファイルと1フォルダーが生成されます。

  • conf.json
    etcdから取得したハッシュ値のアルゴリズムやs3のパス、mysqlのホスト名やユーザー名などが格納されています。
  • filesフォルダー
    s3-fetch-tool2がダウンロードしたファイルを一時的に保存するフォルダーです。
  • s3fin 全ファイルのダウンロードが完了したときにs3-fetch-tool2が生成します。
    全処理完了後init-podコンテナがこのファイルを削除します。
  • hashfin
    全ファイルのハッシュ値計算が完了したときにfile-hasher2が生成します。
    全処理完了後init-podコンテナがこのファイルを削除します。

etcdに保存するデータ

etcdにはs3やmysqlサーバーに接続するためのIDやパスの他、ファイルを処理する要求情報を保存します。
各Podは処理中の情報や完了情報を保存します。

ちょっと複雑ですが以下のような構成になります。(もしかしたらetcdの使い方として間違っているかもしれません。)

設定関係

  • /conf/mysql_host mysqlのホスト名(例:db.rds.amazonaws.com)
  • /conf/mysql_name dbの名前です
  • /conf/mysql_pass mysqlのパスワード
  • /conf/mysql_user mysqlのユーザー名
  • /conf/s3_bucket s3のバケット名
  • /conf/s3_key s3のアクセスキーID
  • /conf/s3_secret s3のシークレットアクセスキー

タスクの要求

  • /req/<requestID>/root
    処理するs3のフォルダー名
  • /req/<requestID>/job
    タスクの分割数(処理をかんたんにするため後どれだけの数で分割するかとします)
  • /req/<requestID>/method
    ハッシュ値の計算アルゴリズム(MD5, SHA1, SHA224, SHA256, SHA384, SHA512)

タスクの割当情報(自動生成)

  • /wip/<requestID>/<jobID>/host
    処理しているPodのホスト名
  • /wip/<requestID>/<jobID>/range/start
    処理対処のファイル名の範囲の開始値
  • /wip/<requestID>/<jobID>/range/end
    処理対処のファイル名の範囲の終了値

タスクの完了情報(自動生成)

  • /done/<requestID>/<jobID>/host
    処理が完了したPodのホスト名

データベースの構造

mysqlには以下のテーブル名と構造で保存します。

カラム名 ID HostName FileName HashMethod Hash Date
int(11)
auto_increment
primary key
text varchar(256) char(10) text datetime
説明 ID 計算したPodのホスト名 計算したファイル名 ハッシュ値の計算アルゴリズム ハッシュ値 書き込み日時

参考

実際に配置してテストする方は配置編を、各コンテナの詳細については詳細編を御覧ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0