[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
SlideShare a Scribd company logo
10年続いているWebサービスの
画像サーバをノーメンテで
FTPサーバからS3互換のストレー
ジサーバに移行している話
GMO Pepabo, Inc.
Masataka Kono
2015-10-03
PHPカンファレンス
自己紹介
● カラーミーショップのエンジニア
● ペパボに入社して2年9ヶ月
● Webプログラマー歴も2年9ヶ月
● PHPerです
● Twitterは @mapyo です
● みんなからは「ぼいらー」
ぼいらー?
ぼいらー?
ペパボはあだ名で呼び合う文化がある。
入社するとあだ名どうする?という会話がある。
ペパボに入った時に、最初に開かれた飲み会で過去
に半年間ほどボイラーのメンテナンスをしていたという
経験を話したら、次の日から、
ぼいらーと呼ばれるようになってた。
お話させて頂く内容
● 講演のタイトルに出てくる用語の説明
● 移行のイメージ
● ファイルアクセスを抽象化してくれるライブラリを
探したりPHP5.3対応したり
● 画像サーバとのやり取りを共通化
● ひたすらリファクタリング
● 具体的なデータの移行の方法
● ひたすら移行していく
講演のタイトル
10年続いているWebサービスの
画像サーバをノーメンテで
FTPサーバからS3互換のストレー
ジサーバに移行している話
講演のタイトルに出てくる用語の説明
● 10年続いているWebサービスとは?
● 画像サーバ(FTPサーバ)とは?
● S3互換のストレージサーバとは?
10年続いているWeb
サービスとは?
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
カラーミーショップ
● 10年続くネットショップ運営サービス
● 大部分はPHP
● 独自フレームワーク
● Rails(公開api)
● CoffeeScript
● AngularJS
● エンジニア募集中!
画像サーバ(FTPサーバ)
とは?
画像サーバ(FTPサーバ)の定義
● ブラウザでアップした商品画像などのファイル置き場
● 直接FTPサーバにユーザさんがアクセスする事はない
● 全部で18台。総容量6T弱
● 4ロールでFTPサーバにアクセス
画像サーバの参照方法
CDN経由で全てアクセスされる
S3互換のストレージサー
バとは?
S3互換のストレージサーバ
● 今回の移行プロジェクトと同時に開始
● 社内用の大統一オブジェクトストレージサービス
● APIがS3互換で裏側がMogileFS
● S3のAPIが使用可能(全てではない)
● Bayt(ベイト)と名付けられました
● 今回のお話では一先ずS3と思って頂けると。
※僕は作ってません。
※この細かい話は出てきません
※詳細は第3回ペパボテックカンファレンスで発表されたスライドをご確認ください。
http://www.slideshare.
net/lamanotrama/mogilefsprivate-s3
http://www.slideshare.net/hiboma/mogilefs-
private-s3-api
移行のイメージ
● FTPサーバとやり取りしているロジックを1箇所
に集約
● そのロジックを変更してS3互換サーバに更新が
かかるように
※データの移行方法については後ほど説明します。
※言うのは簡単だけどやるのは大変。。。
ライブラリを探す
● ファイルアクセスを抽象化してくれるライブラリ
● FTPからS3互換サーバに移行した時に同じイン
ターフェースになるように。
● 自作するのはそれなり手間がかかりそうだ
なぁ。
Flysystem
● GitHubのスター数は2000以上!
● FTP, S3だけじゃなくてLocalとかDropboxとか
Azureとかいろいろ
● Laravel, Symfony, Zendなど、メジャーなフレー
ムワークで簡単に使える仕組みも用意されてい
る
https://github.com/thephpleague/flysystem
http://flysystem.thephpleague.com/api/
めっちゃ便利そう!!
あ、、、
https://github.
com/thephpleague/flysystem/blob/master/comp
PHPのバージョンの壁
● サービスでメインで動いているPHPのバージョンは5.3系
● とはいえ、今からPHPのバージョンアップに時間は裂けな
い。。
● 他にもあったけど、機能が足りなかった
● 最初は、このライブラリの実装を参考に5.3でも動くようにし
ていた。
● でも、コピペしてPHP5.3対応してるだけな感じ。。。
FlysystemをPHP5.3で
も動くようにしよう!
よし!
という事で動くようにしました
https://github.com/mapyo/flysystem
https://github.com/mapyo/flysystem-aws-s3-v2
やったこと
● PHP5.3でテストを動かす
● テストコードをPHP5.3対応
● テストを実行
● ひたすら直す!
● []→array()
● traitをよしなに対応
● Travisで一応5.3〜5.6のテストは通っている
画像サーバとのやり取りを共通化!
● Flysystemを使いつつ、画像サーバ特有の処理
を共通化したものを作る
● しかし、4つのロールで画像サーバとやりとりす
る処理がある
● コピペコードにならないように社内用の
Composerライブラリに追加。テストも書いた。
ひたすらリファクタリング!!!
● 画面は50画面近く。細かい修正もいれるともっ
とあった。
● グローバル関数やグローバル変数との戦い
● FTPのコネクションをグローバル変数に入れて
いくつかのグローバル関数で使いまわしてたり
● ある程度まとまったグローバル関数たちをまと
めてクラス化したり
● 移行の話が出てきてから、リファクタリングが一
通り終った期間が4ヶ月間くらい。
● 一人で粛々と仕様を決めてリファクタリングしま
くってた
(こればっかりやってたわけではなくて、作業待ち
の時間もありました)
リファクタリングは無事終了。
ノーメンテで画像データ
を移行する方法
ノーメンテで画像データを移行する方法
1. APPサーバからFTPサーバとS3互換サーバの
両方に更新されるように修正
2. FTPサーバからS3互換サーバへファイルをイン
ポートする
3. FTPサーバになくて、S3互換サーバにあるファ
イルをS3互換サーバから消す。
4. CDNの接続先を切り替える(FTP→S3)
5. FTPとS3両方に更新していた処理をやめる
1.FTPサーバとS3互換サーバ両方に更新
追加、更新、削除
(put, delete)
画像サーバにアップする
処理を共通化しているの
で、変更箇所は共通化し
た部分のみ!
移行を始める時にこの
機能をまずはリリース。
2.FTPからS3サーバにファイルを送る
1. rsyncする
2. インポートする
※一工夫あり
インポートする処理について
● s3cmdを使ってファイルをputする
● 既にファイルがある場合はputをスキップ
● つまり、S3互換サーバにないファイルのみput
する
※ちょっとややこしいのでもう一回戻って説明しま
す。
※1パターンを除いてこれで対応可能
別途対応しないといけないパターン
● rsync〜インポートするまでの時間に、削除され
たファイル。
● S3互換サーバに削除されたファイルが残ってし
まうので消す
※もう一回戻りましょう。
3.余分なファイルの削除とチェック
● S3互換サーバからファイルの一覧取得
● FTPサーバからファイルの一覧取得
● 2つを比較
● S3互換サーバにあって、FTPサーバにないもの
をS3互換サーバから削除
PHPで削除用スクリプトを作って対応
4.CDNの接続先を切り替える
変更前
4.CDNの接続先を切り替える
変更後
5.画像を同時に更新する処理をやめる
以上でノーメンテで切り
替えできました!
やったー!!!
この作業を×18台!
● 1台につき、3日〜4日くらい
● 並列で進められる部分は進めた
● インポートの処理が負荷の関係で並列で出来なかった
● だいたい3ヶ月くらいかかった。
しかし!
先月、無事に全台移行
が完了しました!
やったー!!!1
そして、、、
最後に
● 画像サーバを移行しようという話が出たのが今
年の1月。
● そこからどうしようか考えて共通処理作ってリ
ファクタリングしてデータを移行して終ったのが
9月
● 長かった。。。。
最後に2
● ユーザさんとしては全く普段と変わらない
● しかし、裏側の仕組みはガラリと変わっている
● というのがなんか面白かった
● 大きな障害もなく、無事移行が完了出来たのが
一番よかった!!!
ありがとうございまし
た!!!
以上です!!

More Related Content

10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話