100日後にエンジニアになるキミ - 88日目 - データ - データ転送について

昨日までのはこちら

[100日後にエンジニアになるキミ - 86日目 - データベース - Hadoopについて](https://qiita.com/otupy/items/0016a1b9f496627619b6)

[100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について](https://qiita.com/otupy/items/6a4f960ba4df06e27050)

[100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて](https://qiita.com/otupy/items/f53e2e7d16adf80b5acf)

[100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について](https://qiita.com/otupy/items/5828ac7450c5ba8d6931)

[100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1](https://qiita.com/otupy/items/0196897ae4d2134794fa)

[100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて](https://qiita.com/otupy/items/f1a5e81633b868f3b5ed)

[100日後にエンジニアになるキミ - 53日目 - Git - Gitについて](https://qiita.com/otupy/items/0abaad82a7f3fea73f1f)

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)

今回はデータの転送に関するお話です

## データ転送について

WEB系のサービスにおいて、ログデータの収集はサービスの継続に大きな影響を与えます。

通常はWEBサーバーが稼働している場所にログが出力されますが
集計などを行う場合はWEBサーバー以外の場所で行うことが多いはずです。

昨今のデータ量の増大化を考えると、集計専用のデータベースなどに
ログデータを貯めて集計を行うケースが多いため、ログファイルを別のサーバー等に
移動させる処理が必要となります。

そういったファイルの転送の仕組みがサービスには必要不可欠になるため
ファイルの転送を行う専用のソフトウェアを導入していたりします。

### fluentdについて

`Fluentd`はクロスプラットフォームのデータ収集ソフトウェアです。
主にRuby言語で書かれており開発者は[古橋貞之](https://twitter.com/frsyuki)(Treasure Data)さんです。

[Fluentd github](https://github.com/fluent/fluentd)

オープンソースで公開されており、Linuxや各種OSで動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/4f79f587-8d34-5eb4-a4d2-284893d9a6de.png)

割とデータ周りの作業を行うエンジニアには馴染みのあるツールなのではないでしょうか。

インプットとアウトプットを指定する形で使用します。
サーバーtoサーバーの用途で利用したり、プラグインなどを活用することで
出力先としてはローカルファイル意外に、`AWS S3`、`Hadoop HDFS`、`MongoDB`、`Cassandra`
`MySQL`、`PostgreSQL`、`Redis`etcを選ぶことができます。。

ログファイル自体は欠損させると問題になることから、いったん`S3`などのストレージに貯めて
改めて集計用のデータベースに格納すると言うケースが多いように感じます。

基本的にはログを出力するアプリケーションが稼働しているサーバーに
インストールして稼働させる形になります。


### ログの収集のユースケース

アクセスログ、およびアプリケーションログの収集は以下のような手順が考えられます。

1.サーバ上のアプリケーションがログを出力する
2.そのログを各サーバ上に起動してある転送用Fluentdが受け取る
3.Fluentdはネットワーク越しにログ集約用Fluentd(もしくはAWS S3など)
  に対して転送する
4.ログ集約用Fluentdは集まってきたログをどこかに書き込む
(file, AWS S3, Hadoop HDFS, MongoDB など)


ざっくりとしたログの転送の仕組みはこうです。

![fluentd.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/b732294e-45de-af47-0c67-6585935885e5.jpeg)

アプリケーション側ではログは非同期でどんどん生成されていきます。
そのため取りこぼしがないように一同に迅速に集約しておく必要があります。

ログファイルの命名規約などを決めておきルールにしたがって
転送をするようにして、転送後は元のサーバーのファイルは消されていきます。

集める際はファイルの種別や日付などでまとめ、検索や取り出し
データベースへの格納などがスムーズに運ぶように整理するようにします。


昔はテープなどでデータをバックアップしたりしていましたが
最近ではクラウドストレージに集約しておくケースも増えています。


## まとめ

ゲームやWEB系のサービスではログ解析は必須ですがログ解析をするための準備として
ログを収集する仕組みも不可欠です。

サーバーサイドのエンジニアや、データを取り扱うエンジニアを目指す場合は
データ転送の仕組みを抑えておくと良いでしょう。

君がエンジニアになるまであと12日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython