クラウド環境におけるwebアプリケーションの正しい作り方(for perl users)

85
Ipx!up!nblf!uif!xfc!bqqmjdbujpo! po!uif!dmpve Gps!Qfsm!Vtfst cz! Nbtbtij!Ufsvj!bu!ZBQD;;Ipllbjep!3127

Upload: terui-masashi

Post on 16-Apr-2017

942 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
Page 2: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

Masashi Terui @ marcy_teruiI’m a Developer and Cloud Architect.

I’m a Remote-Mulit-Worker at Serverworks Co., Ltd. and Freelance. I’m a member of GCPUG and JAWS-UG.

I’m a best cloud engineer in Hokkaido!!(でありたい) I’m around 30 years old. I’m a father of my son and daughter.

2

Page 3: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

3

Page 4: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

4

クラウドの真の価値って何?

ステップで学ぶポイント

クラウドとはなんだったのか?

まとめ

Page 5: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

5

Page 6: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

6

サーバコストが下がる?

開発コストが下がる?

運用負荷の軽減?

柔軟なスケールによる機会損失低減?

Page 7: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

7

サーバコストが下がる? 短期的には下がる。中長期的には同じか高くなる。 大企業で「数十%削減」とか言ってることがあるけど、あれは移行のタイミングで再設計した効果だったり、元々HWベンダーに保守費をかなり払ってたりする例 経営的にはTCOが下がって変動費に変わって嬉しいことも

Page 8: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

8

開発コストが下がる?

少なくともHW調達やNW等の構築コストは下がる

クラウド特有のサービスや特性についての学習コスト

アプリケーション開発コストが下げられるかどうかはやり方次第

Page 9: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

9

運用コストが下がる?

少なくともHW保守はしなくて良い

仮想サーバはOS以上は自己責任

マネージドサービスと仲良くすると劇的に下げられるが

学習コストはある

Page 10: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

10

柔軟なスケールによる機会損失低減?

クラウドの明確なメリットではある

ただし、その恩恵を受けられるかどうかはアプリケーション次第

なので、この辺を重点的に喋ります

Page 11: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

11

Page 12: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

12

Page 13: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

13

クラウドの真の価値は?

インフラ調達や需給の調整が劇的に早く・楽に

インフラがビジネスの足を引っ張らなくなる

ボトルネックがアプリケーションに移ったら効果が薄れる

(パフォーマンスの考え方と一緒)

Page 14: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

14

Page 15: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

15

アプリケーション開発の世界は、

他者への依存を強めることで発展してきた歴史がある

フルスクラッチ→フレームワーク・ライブラリ

クラウドもこの流れのインフラ版

インフラを他社に依存することで新しい価値にフォーカスする

この流れを突き詰めていくとServerlessに繋がる

Page 16: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

16

Page 17: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

17

Page 18: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

18

Page 19: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

19

Page 20: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

20

Page 21: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

21

Page 22: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

22

または

Page 23: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

23

Page 24: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

24

Page 25: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

25

Page 26: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

26

Page 27: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

27

スケールアップには限界がある

CPUはどちらかというとコア数が大事

高速化 ≒ キャパシティ向上

アプリケーション・ミドルウェアチューニング

Page 28: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

28

Page 29: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

29

c4.8xlarge 36vCPU 60GB $2.122/1h

r3.8xlarge 32vCPU 244GB $3.192/1h

高い

変更しにくい(停止を伴う)

大きくなるほど性能を使い切るのは難しい

Page 30: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

30

Page 31: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

31

Perlはシングルスレッド・同期IO マルチプロセスで複数のリクエストを捌く シングルプロセス非同期IO(Node.jsとか)の場合は逆

コアが少ないと専有されたら死亡・・・ 重たいクエリ バッチ処理 バグ(無限ループ等)

Page 32: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

32

コアが増えても1コア当たりの性能は変わらない

スケールアップで高速化はたかが知れてる

スペックが変われば適切なミドルウェアの設定も変わる

コアが多いと有効に使い切れない可能性

Page 33: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

33

Page 34: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

34

処理時間が半分になれば単位時間あたりの処理数は約2倍になる

1リクエストの処理に1秒かかるのは遅いと思いますか?

特定の遅いページがあるのは問題

リクエストが集中するとあっという間に全体が詰まる

バランス良く高速化が必要

Page 35: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

35

Page 36: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

36

Apache + mod_perlをpreforkで動かすパターン

MaxClientsとか大事だけど限界がある

1ページ見るためにアセットをたくさん取得しなければならない

↑をpreforkで捌くのが問題で必然的にプロセス過多になる

Page 37: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

37

Nginx + Plackが理想

Event driven web server

Proxy Cacheは超強力

Cookieで制御したりもできるからかなりの範囲で使える

複雑化するのでご利用は計画的に

Page 38: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

38

Apache + event_mpm + mod_proxy + Plackもアリ

Event driven web server

.htaccessが使える

mod_perlみたいにApacheの処理にフックするのは無理

Page 39: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

39

CDNを導入する

拡張子等でキャッシュ有無を決めれば、

動的サイトでも大抵問題にならない

クラウドだと通常の通信もアウトバウンド通信料がかかり、

CDNを使っても大差なかったりするので積極的に使うと良い

Page 40: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

40

ここを解決すると性能が一気に上る場合が多い

語りだすと長くなるので省略

とりあえずできるだけ新しいバージョンを使おう

@yoku0825 さんの発表を聞きましたよね? :-)

MySQLはアホの子という時代は終わりつつある

Page 41: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

41

何はともあれSlow query logを取ろう

long_query_time = 0.1

log-queries-not-using-indexes

pt-query-digest便利

→ Slow query log(以外も可)の集計・ランキング

Page 42: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

42

実行計画の見方を知る(↓の意味が分かるくらいにはなっておこう) type/ALL, type/index

DEPENDENT SUBQUERY

UNCACHEABLE SUBQUERY Using temporary

Using filesort

Page 43: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

43

キリがないのでインフラ目線でこれくらいはやっとけってやつ

DB等のコネクションのSingleton実装

ロック粒度の見直し(MySQLの変態なロック機構を意識する)

N+1問題

→ 特にクラウド環境では地理的分散(Multi-AZ)時に大きな問題になる

Page 44: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

44

Page 45: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

45

Page 46: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

46

ステート(セッション)共有・キャッシング

リードレプリカ

ファイストレージ

バッチ処理

Page 47: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

47

Page 48: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

48

Memcached, RedisなどのインメモリKVS DBの問い合わせ結果や加工済みデータをキャッシュする 読み書きの多いSessionデータの格納 大抵は消えても良いはず(無かったら再作成的な)

冗長化だけが目的ならDBでもOK PerlにもDBにセッション入れるモジュールありますよね (PHPで)自作したこともあるけどそんなに難しくない

Page 49: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

49

RedisとMemcachedは併せて語られることが多いが別物 Memcachedの方が運用が楽 本当に永続化しないといけないか考えよう Redisは多様なデータ型やデータ操作という観点で選ぶ Sorted set など Increment, Decrementなど アトミックなデータ操作、Pub/Subなど

Page 50: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

50

Page 51: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

51

DB読み込みの分散

重いクエリの分割(集計バッチ系など)

冗長化

できれば2台以上ほしい

レプリカ追加や再作成時にマスターに触らなくて済む

Page 52: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

52

Master, ReadReplicaのコネクションは明示的に使い分ける SQL見て切り替えるみたいな実装もあるけど、整合性とか色々大変

フェイルオーバー時に接続先を連動して切り替える VIP(使えないクラウドが多い、擬似的に利用する方法とかはある) Domainベース NIC付け替え

ReadReplicaの接続先振り分け マネージドなInternal LBがあるならそれを使う HAProxyなどで冗長化頑張るか個々に入れるとかもアリ(要自動化)

Page 53: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

53

Page 54: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

54

基本だけど、複数台構成では共有する必要がある NFSは単一障害点になるからダメ 運用で死ねるからダメなやつ GlusterFS, s3fs等

オブジェクトストレージをAPIで操作するのが一番確実 一時的な認証でクライアントに直接アクセスさせたりする手も PerlはSDK用意されてないことが多いけど。。。

Page 55: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

55

Page 56: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

56

複数台構成における悩みの一つ

冗長化が難しい バッチ専用サーバというリソースの無駄

その定期バッチほんとうに必要ですか?

オンライン処理からキューイングしてバックエンドで処理できないか? 夜間バッチはリソースが固定なので空きの多い夜間にという発想→ リソースが柔軟に変更できるクラウドではどうなの?

Page 57: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

57

マネージドサービスの活用

CloudWatch Events

Azure Scheduler

AppEngine scheduled task

AWS Batch → New!!

Page 58: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

58

Page 59: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

59

Page 60: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

60

スケールアウト構成のやつを確実に実行していれば基本大丈夫

GlusterFS使っちゃうとか微妙なことをするとここで困る

運用の変化(ここが大きい) サーバプロビジョニング

アプリケーションデプロイ

サーバメトリクスとログの収集・集約

Page 61: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

61

Page 62: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

62

Page 63: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

63

テンプレート化

VMイメージ

Dockerコンテナ

cloud-initなどによる起動時の自動構成変更

コード化

シェルスクリプト, Dockerfile

Chef, Puppet, Ansible, Itamae など

Page 64: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

64

Page 65: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

65

自動で増減する、台数が固定ではない、対象が変わる

Blue/Green deployment

ローリングデプロイ

オートディスカバリ

Pull型デプロイ

Page 66: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

66

Page 67: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

67

サーバが消えるとそこに載っているログも消える

複数台のどこで発生したログか追うのは難しい

収集と集約

サーバ単位よりも役割単位で見れると良い

可視化が重要

Page 68: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

68

自動サーバが増減する環境では必然的にエージェント型

監視ミドルウェアの運用がしんどい問題

時系列DBの運用がしんどい問題

サービスの活用

NewRelic, Stackdriver, Mackerel, Datadog etc…

Page 69: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

69

収集 rsyslog Fluentd, CloudWatch Logs Agent

集約・可視化 Elasticsearch + Kibana MongoDB(Capped collection) + Rockmongo, mongo-express オブジェクトストレージ(保管用) BigQuery(分析用)

Page 70: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

70

Page 71: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

71

RDBとNoSQLは使い分け それぞれ得意なデータ構造や操作がある NoSQLで失敗する例は大抵RDBの置き換えをしようとして失敗する それぞれが得意な領域だけオフロードする DBの種類が増えてもマネージドに寄せれば運用負荷は軽減できる トランザクションが本当に必要かどうかは一考の価値がある JOINができない、結果整合性だからといって本当に使えないのか?レプリケーションとシャーディングをしたMySQLも同じでは?

Page 72: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

72

Page 73: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

73

Page 74: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

74

Page 75: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

75

Page 76: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

76

Page 77: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

77

Page 78: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

78

クラウドにおける普遍的な概念や思想を知る Design for Failure, Twelve-Factor App などなど Cloud Design Pattern, Reference Architecture などなど APIやサービスの特性

制約を知る NWや物理的な制約・ルール セキュリティの考え方、認証・認可、権限管理

Page 79: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

79

Page 80: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

80

Page 81: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

81

Page 82: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

82

Page 83: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

83

クラウドの真の価値は時間と手間の短縮

パフォーマンスもクラウド活用もボトルネックを作らないことが大事

思想や制約を受け入れることでパフォーマンスが上がる(性能も時間も)

クラウドはインフラのフレームワークと考えると良いかも

困ったら相談してください :-)

Page 84: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)

84

明日です!(もう満員だけど、少しだけ拡張するかも?)

https://serverless.connpass.com/event/43745/

Page 85: クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)