Slide 1

Slide 1 text

freee 株式会社
 会計freeeのデプロイを10倍早くした話
 2020.01.21

Slide 2

Slide 2 text

プロフィール
 HR系企業を経て2016年11月freee入社。申告freeeのリリースに携わった後、 認証基盤チームへ異動。ログインやセッション管理の改修、二段階認証の開 発等を担当しました。2019年4月よりSRE所属。
 @shuheiktgw Shuhei Kitagwa


Slide 3

Slide 3 text

お話すること
 3  04 振り返り ・ まとめ
  03 モノリスへのアプローチ
  02 検討した選択肢
  01 会計freeeのデプロイ


Slide 4

Slide 4 text

4 会計freeeのデプロイ
 01 Section

Slide 5

Slide 5 text

数字で見る会計freee
 5 40+
 200k+
 1-3
 +3k
 -1.5k
 Developers
 Commits
 Diffs
 /day
 Deploy
 /day


Slide 6

Slide 6 text

6 会計freeeの構成
 Nginx
 Phusion
 Passenger
 Ruby on Rails
 ELB
 EC2s


Slide 7

Slide 7 text

会計freeeのデプロイ
 7 Capistrano
 New Code New Assets New Code New Assets EC2s


Slide 8

Slide 8 text

会計freeeのデプロイ
 8 Old App Old App Old App

Slide 9

Slide 9 text

会計freeeのデプロイ
 9 Old App Old App Old App デタッチ


Slide 10

Slide 10 text

会計freeeのデプロイ
 10 Old App Old App Old App Stop


Slide 11

Slide 11 text

会計freeeのデプロイ
 11 Old App Old App Start


Slide 12

Slide 12 text

会計freeeのデプロイ
 12 New App Old App Old App

Slide 13

Slide 13 text

会計freeeのデプロイ
 13 New App Old App Old App

Slide 14

Slide 14 text

会計freeeのデプロイ
 14 New App Old App Old App

Slide 15

Slide 15 text

会計freeeのデプロイ
 15 New App Old App New App

Slide 16

Slide 16 text

会計freeeのデプロイ
 16 New App Old App New App

Slide 17

Slide 17 text

会計freeeのデプロイ
 17 New App Old App New App

Slide 18

Slide 18 text

会計freeeのデプロイ
 18 New App New App New App

Slide 19

Slide 19 text

会計freeeのデプロイ
 19 New App New App New App

Slide 20

Slide 20 text

会計freeeのデプロイ
 20 New App New App New App ● LBから抜く必要があるため、並列にデプロイできない
 ● 確定申告期など、サーバー台数が多いと50分近くかかることも


Slide 21

Slide 21 text

21 検討した選択肢
 02 Section

Slide 22

Slide 22 text

検討した選択肢
 22 ● Elastic Kubernetes Service (EKS) への移行
 ● Auto Scaling Groupを用いたBlue/Green
 ● アプリケーション・サーバーによるホットデプロイ


Slide 23

Slide 23 text

Elastic Kubernetes Service (EKS) への移行
 23

Slide 24

Slide 24 text

Elastic Kubernetes Service (EKS) への移行
 24 ● Pros
 ○ Kubernetes (Docker)
 ○ 新規マイクロサービスを中心に本番運用実績
 ● Cons
 ○ モノリシックなサービスをKubernetesへ移行した経験がなかった
 ■ もう少し小さいサービスを先に移行させたい
 ○ 当時はKubernetesのモニタリング、セキュリティ周りの統一した規格が未整備


Slide 25

Slide 25 text

Auto Scaling Groupを用いたBlue/Green
 25 Old App

Slide 26

Slide 26 text

Auto Scaling Groupを用いたBlue/Green
 26 Old App New App

Slide 27

Slide 27 text

Auto Scaling Groupを用いたBlue/Green
 27 Old App New App

Slide 28

Slide 28 text

Auto Scaling Groupを用いたBlue/Green
 28 Old App New App

Slide 29

Slide 29 text

Auto Scaling Groupを用いたBlue/Green
 29 New App

Slide 30

Slide 30 text

Auto Scaling Groupを用いたBlue/Green
 30 ● Pros
 ○ イミュータブル・インフラストラクチャの実現
 ○ 既存の構成に変更を加える必要がない
 ● Cons
 ○ AWSがサーバーをプロビジョンする時間がボトルネックになる
 ○ 常に希望通りのサーバー台数が確保される保証がない


Slide 31

Slide 31 text

アプリケーション・サーバーによるホットデプロイ
 31 App Server Old App

Slide 32

Slide 32 text

アプリケーション・サーバーによるホットデプロイ
 32 App Server Old App New App

Slide 33

Slide 33 text

アプリケーション・サーバーによるホットデプロイ
 33 App Server Old App New App

Slide 34

Slide 34 text

アプリケーション・サーバーによるホットデプロイ
 34 App Server New App

Slide 35

Slide 35 text

アプリケーション・サーバーによるホットデプロイ
 35 ● Pros
 ○ 圧倒的に早い
 ○ Capistranoの資産を再利用できる
 ● Cons
 ○ アプリケーション・サーバーの変更による影響範囲が大きい
 ○ 遠ざかるイミュータブル・インフラストラクチャ


Slide 36

Slide 36 text

ホットデプロイを選択
 36 ● Unicornによるホットデプロイ
 ○ デプロイ時間、ロールバック時間
 ○ Phusion Passengerと同じマルチプロセス & プリフォーク
 


Slide 37

Slide 37 text

37 モノリスへのアプローチ
 03 Section

Slide 38

Slide 38 text

課題
 38 ● 「会計freeeのアプリケーション・サーバーを安全に入れ替えたい」
 ○ 影響範囲が大きく、事前の完全な検証が困難
 ○ 対象ドメイン全体を完全に把握することが困難


Slide 39

Slide 39 text

アプローチ
 39 ● プランBを確保する
 ● 変更対象 (ライブラリ等) を深く理解する
 ● 段階的にリリースする


Slide 40

Slide 40 text

アプローチ
 40 ● プランBを確保する
 ● 変更対象 (ライブラリ等) を深く理解する
 ● 段階的にリリースする


Slide 41

Slide 41 text

プランBを確保する
 41 ● 不確実性の低い選択肢をプランBとして確保
 ● 影響範囲の小さいBlue/GreenがプランB
 不確実性高
 不確実性低
 効果高
 効果低
 EKS
 Unicorn
 Blue/Green


Slide 42

Slide 42 text

アプローチ
 42 ● プランBを確保する
 ● 変更対象 (ライブラリ等) を深く理解する
 ● 段階的にリリースする


Slide 43

Slide 43 text

変更対象を深く理解する
 43 ● Unicornのソースコードから3点を把握
 ○ 起動からリクエストを捌き始めるまでの流れ
 ○ ホットデプロイ (USR2) シグナルを受け取った場合の処理
 ○ 各パラメーターの使われ方と影響範囲
 ● プリフォーク型のアーキテクチャであるため、forkの処理も合わせて抑える
 ○ ホットデプロイでは環境変数が更新されない
 ○ PreloadによるFile Descriptorの共有


Slide 44

Slide 44 text

PreloadによるFile Descriptorの共有
 44 Master
 Process
 File
 Descriptor
 Connection
 Redis


Slide 45

Slide 45 text

PreloadによるFile Descriptorの共有
 45 Master
 Process
 File
 Descriptor
 Worker
 Process
 Worker
 Process


Slide 46

Slide 46 text

PreloadによるFile Descriptorの共有
 46 Master
 Process
 File
 Descriptor
 Worker
 Process
 Worker
 Process


Slide 47

Slide 47 text

PreloadによるFile Descriptorの共有
 47 Master
 Process
 File
 Descriptor
 Worker
 Process
 Worker
 Process


Slide 48

Slide 48 text

PreloadによるFile Descriptorの共有
 48 Master
 Process
 File
 Descriptor
 Worker
 Process
 Worker
 Process
 File
 Descriptor
 File
 Descriptor


Slide 49

Slide 49 text

PreloadによるFile Descriptorの共有
 49 ● Linuxのforkの処理が正しく理解できていれば事象の原因、対策が打てる
 ○ 親子間でOpen File Tableがコピーされる
 ○ 同じFile Descriptorへの参照を保持している


Slide 50

Slide 50 text

アプローチ
 50 ● プランBを確保する
 ● 変更対象 (ライブラリ等) を深く理解する
 ● 段階的にリリースする


Slide 51

Slide 51 text

段階的にリリースする
 51 ● パフォーマンス劣化やバグを多層でテスト
 1. テスト環境での負荷試験
 2. 他サービスでのリリース
 3. 本番環境でのカナリアリリース


Slide 52

Slide 52 text

テスト環境での負荷試験
 52 ● Unicorn vs Phusion Passenger、通常時 vs ホットデプロイ時
 ● 「負荷試験コトハジメ」(https://bit.ly/35Xtncb)
 ○ インクリメンタルに負荷試験を行う
 ■ フェーズ1: 単一クライアント、単一API
 ■ フェーズ2: 複数クライアント、単一API
 ■ フェーズ3: 複数クライアント、シナリオベース
 ● 完璧にやろうとしすぎない、次ステージ以降でカバー
 ホットデプロイ時


Slide 53

Slide 53 text

他サービスでの先行リリース
 53 ● 規模の小さいサービスで先行リリース
 ○ 運用を通じた各種パラメーター、モニタリング等の調整
 ○ 複数回リリースの経験


Slide 54

Slide 54 text

本番環境でのカナリアリリース
 54 ● 本番リクエストを2%程度
 ● Nginxログからレスポンスタイムを集計
 Uncorn
 98%
 2%


Slide 55

Slide 55 text

55 振り返り ・ まとめ
 04 Section

Slide 56

Slide 56 text

Unicornへ移行した結果
 56 移行
 分


Slide 57

Slide 57 text

移行して正直どうだったか?
 57 ● 25分 -> 2、3分へ短縮できる効果は大きい 
 ○ デプロイ数の増加、ロールバックの安心感
 ● 一部本番へ流出した問題があった
 ○ Redis connection、Releasesの消失
 ○ 時間 x 規模が必要な事象は発見しづらい
 ■ リプレイテストの仕組みなど
 ● Capistranoの辛さを感じる日々
 ○ サーバーの状態変化に起因した問題を引くことが多い


Slide 58

Slide 58 text

まとめ
 58 ● モノリスへのアプローチ
 ○ プランBを確保する
 ○ 変更対象 (ライブラリ等) を深く理解する
 ○ 段階的にリリースする
 
 ● 今後
 ○ モノリスがEKSへ移行中
 ○ モノリスの分割が進行中
 ○ 自動カナリアリリースを準備中


Slide 59

Slide 59 text

スモールビジネスを、
 世界の主役に。