Slide 1

Slide 1 text

2018/2/20 TechPlay ランサーズ株式会社 インフラエンジニア / 金澤裕毅 ランサーズで積み重ねた SRE的取り組みとこれから

Slide 2

Slide 2 text

2018/2/20 TechPlay 自己紹介

Slide 3

Slide 3 text

2018/2/20 TechPlay 自己紹介 3 氏名:金澤 裕毅 出身:宮城県仙台市 入社時期:2013年11月 略歴: 大学時代はネットワークを専攻 Windowsパッケージ開発(C++) ASP開発(Java)&インフラ(オンプレ) SNS開発(PHP)&インフラ(オンプレ) ランサーズのインフラ(AWS)

Slide 4

Slide 4 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 5

Slide 5 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 6

Slide 6 text

2018/2/20 TechPlay 6 ランサーズの提供サービス デジタルマーケティング クラウドソーシング シェアリングエコノミー 2016/4 サービス開始 2017/6末 サービス開始 2017夏 サービス開始 2016/4 サービス開始 2008/12 サービス開始

Slide 7

Slide 7 text

2018/2/20 TechPlay 7 ランサーズの提供サービス APIシステム コーポレートサイト お知らせ Quantトップページ 認証システム 広告システム メールシステム 管理画面 電話確認システム 分析システム クラウドソーシング

Slide 8

Slide 8 text

2018/2/20 TechPlay 8 ランサーズを支える技術

Slide 9

Slide 9 text

2018/2/20 TechPlay 9 ランサーズのサーバー構成図(2012/5 – )AWS移行初期 App S3 ELB App Route53 EC2 instance WebSocket Memcached DB Slave DB Master EC2 EC2 instance EC2 instance EC2 instance EC2 instance EC2 instance NFS EC2 instance

Slide 10

Slide 10 text

2018/2/20 TechPlay 10 ランサーズのサーバー構成図(現在) App S3 ELB App CloudFront Cloud Search Route53 EC2 instance WebSocket ErastiCache Memcached ErastiCache Redis Aurora Reader Aurora Writer Api ELB Api EC2 EC2 instance ErastiCache Redis EC2

Slide 11

Slide 11 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 12

Slide 12 text

2018/2/20 TechPlay インフラメンバーとサービス数 12 アプリエンジニアが兼任 インフラ専任1名 + アプリエンジニア 2008 / 12 2013 / 11 2016 / 3 2017 / 10 インフラ専任2名 + アプリエンジニア インフラ専任2名 + 新卒1名 + インターン1名 + アプリエンジニア 5 10 15 25 20

Slide 13

Slide 13 text

2018/2/20 TechPlay インフラチームの方針 13 ●最新のサービス、最新バージョンに追従する ○変化を恐れず、競争力を確保する ○旧バージョンをカスタマイズしない ■最新バージョンを維持し、OSSに貢献する ○新サービスのノウハウを社外にも共有する ●インフラチームをボトルネックにしない ○差し込みの依頼は即対応 ●サーバー運用に留まらず、事業の加速を支援する ○開発環境の支援 ○リリースの支援 ○分析環境の支援

Slide 14

Slide 14 text

2018/2/20 TechPlay インフラチームの業務 14 サーバー運用 安定化 レスポンス改善 負荷改善 冗長化 セキュリティ対策 最新バージョン追従 リソース管理 新サービスローンチ支援 キャパシティプランニング ドメイン、SSL証明書、リポジトリ管理 サーバー費用削減 旧サービス、旧機能の削除 効率化 サーバーのコード化 定型作業の自動化 開発支援 開発環境構築 リリースシステム構築 旧ソースの削除 社内インフラ、情シス系 社内サーバー 社内LAN PC周り 定型作業の委譲 他

Slide 15

Slide 15 text

2018/2/20 TechPlay インフラチームの業務 15 サーバー運用 安定化 レスポンス改善 負荷改善 冗長化 セキュリティ対策 最新バージョン追従 リソース管理 新サービスローンチ支援 キャパシティプランニング ドメイン、SSL証明書、リポジトリ管理 サーバー費用削減 旧サービス、旧機能の削除 効率化 サーバーのコード化 定型作業の自動化 開発支援 開発環境構築 リリースシステム構築 旧ソースの削除 社内インフラ、情シス系 社内サーバー 社内LAN PC周り 定型作業の委譲 他 ●SREとして認知されている業務

Slide 16

Slide 16 text

2018/2/20 TechPlay インフラチームの業務 16 サーバー運用 安定化 レスポンス改善 負荷改善 冗長化 セキュリティ対策 最新バージョン追従 リソース管理 新サービスローンチ支援 キャパシティプランニング ドメイン、SSL証明書、リポジトリ管理 サーバー費用削減 旧サービス、旧機能の削除 効率化 サーバーのコード化 定型作業の自動化 開発支援 開発環境構築 リリースシステム構築 旧ソースの削除 社内インフラ、情シス系 社内サーバー 社内LAN PC周り 定型作業の委譲 他 ●ランサーズのインフラチームが重視している業務 インフラチームを介さずに 完結できる仕組みの構築

Slide 17

Slide 17 text

2018/2/20 TechPlay インフラチームの業務 17 サーバー運用 安定化 レスポンス改善 負荷改善 冗長化 セキュリティ対策 最新バージョン追従 リソース管理 新サービスローンチ支援 キャパシティプランニング ドメイン、SSL証明書、リポジトリ管理 サーバー費用削減 旧サービス、旧機能の削除 効率化 サーバーのコード化 定型作業の自動化 開発支援 開発環境構築 リリースシステム構築 旧ソースの削除 社内インフラ、情シス系 社内サーバー 社内LAN PC周り 定型作業の委譲 他 ●スタートアップで必要とされる業務 組織が拡大すれば 管理部に委譲できる クラウド化も選択肢

Slide 18

Slide 18 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 19

Slide 19 text

2018/2/20 TechPlay MyIsam→InnoDBに移行 19 ●MySQLのFULLTEXT インデックスが度々壊れ、サービスが全停止 ○MySQL5.1ではMyISAMでしか利用できなかった ■トランザクション未対応 ●RDSに移行し、MySQL5.6にバージョンアップ ○InnoDBでFULLTEXT インデックスが利用できるように ■トランザクション対応 DB Master DB Slave001 DB Slave002 DB Slave003 DB Slave004 DB MultiAZ DB Master DB Slave001 EC2 EC2 DB Slave002 EC2 DB Slave003 EC2 DB Slave004 EC2 MySQL5.1 MySQL5.6

Slide 20

Slide 20 text

2018/2/20 TechPlay CakePHP Viewキャッシュの廃止(NFSの廃止) 20 ●TOPページが真っ白になる障害が度々発生 ○NFSに格納したCakePHPのビューキャッシュが原因 ■複数台の同時書き込み時に発生していた ●Memcachedに移行してViewキャッシュを廃止 ○開発スピードも向上 ■アプリ側のビューキャッシュ処理がなくなり処理がシンプルに ●NFSも廃止 ○SPOF(単一障害点)の解消 EC2 EC2 instanc e NFS App MemCached EC2 instance View Cache EC2 App

Slide 21

Slide 21 text

2018/2/20 TechPlay 21 VPCの細分化、MultiAZ化 AWS Cloud Virtual Private Cloud ap-northeast-1c Master Slave001 Slave003 Batch1 KPI EC2 instance EC2 App ap-northeast-1a Asterisk EC2 instance PrivateApp EC2 instance EC2 App Route53 10.0.151.0/24 10.0.52.0/24 10.0.152.0/24 EC2 10.0.51.0/24 Slave002 Mail Websocket EC2 instance EC2 instance LJP EC2 instance Gateway LJPPrivate LJP 10.0.104.0/24 10.0.106.0/24 10.0.150.0/24 10.0.6.0/24 10.0.4.0/24 10.0.1.0/24 10.0.101.0/24 NAT 10.0.50.0/24 S3 Bucket EC2 instance NAT EC2 instance MultiAZ Master Slave001 Batch KPI EC2 instance EC2 Ap ap-northeast-1b Asterisk EC2 instance PrivateApp EC2 instance EC2 10.0.1.0/24 Mail Websocket EC2 instance EC2 instance LJP LJPPrivate NAT 10.0.0.0/24 EC2 instance Slave002 Slave003 ●新インスタンスが使えるAZに引っ越し ○2つのAZに分散し、サブネットを細分化 新インスタンスが 使えないAZ

Slide 22

Slide 22 text

2018/2/20 TechPlay 2つのAZに分散する意味 22 RDS Master RDS Read Replica App ap-northeast-1a EC2 instance ELB App EC2 instance App EC2 instance RDS Multi AZ RDS Read Replica App ap-northeast-1c EC2 instance ELB App EC2 instance App EC2 instance AZ間の通信遅延は 数ミリ〜数十ミリ secレベル Route53

Slide 23

Slide 23 text

2018/2/20 TechPlay 2つのAZに分散する意味 23 RDS Multi AZ RDS Master RDS Read Replica App ap-northeast-1a EC2 instance ELB App EC2 instance App EC2 instance RDS Read Replica App ap-northeast-1c EC2 instance ELB App EC2 instance App EC2 instance Route53 ●AZレベルの障害を想定

Slide 24

Slide 24 text

2018/2/20 TechPlay Auroraへの移行 24 ●レプリカ遅延対策 ○10sを超えることもあり、データ齟齬の原因となっていた ○Aurora移行後、30ms以下に改善 ●ストレージが自動拡張されるようになり、管理性も向上 RDS Aurora lancers000 lancers001 lancers002 lancers003 DB Master DB Slave001 DB Slave002 DB Slave003 DB MultiAZ 10sを超えることも ほぼ30ms以下

Slide 25

Slide 25 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 26

Slide 26 text

2018/2/20 TechPlay 26 負荷、レスポンス対策 ●サーバー負荷、レスポンスは継続的に改善が必要 ○放っておくと悪化する一方 ●負荷、レスポンスの悪化要因 ○アクセス数の増加 ○データ数の増加 ○サービスの機能追加 ●レスポンスの種類 ○サーバーレスポンス ■極端に遅いページが1つでもあるとユーザーは不快に感じる ●DBが原因であることがほとんど ○ブラウザレスポンス ■CDN等で対策 ■フロントエンジニアやデザイナーと協力して改善

Slide 27

Slide 27 text

2018/2/20 TechPlay 27 アプリケーションサーバーのチューニング ●AWSのサーバーサイズに合わせた設定が必要 ○メモリ、CPU比率が固定されている ●CPU最適化インスタンスの場合 ■c4.large ●2コア ●3.75GB ■c4.xlarge ●4コア ●7.5GB ●CPUを利用してメモリを節約 移行前 移行後 StartServers 10 MinSpareServers 10 MaxSpareServers 20 ServerLimit 190 MaxClients 190 MaxRequestsPerChild 50 デフォルトは3000 プロセスをこまめに削除 してメモリを確保

Slide 28

Slide 28 text

2018/2/20 TechPlay 28 アプリケーションサーバーの負荷、レスポンス対策 ●ELBのSSL Terminationの利用 ○EC2内はhttpで処理 ■SSL機能を使わなくなり、メモリ使用量が半減 ●CDN(CloudFront)の利用 ○静的ファイルをCloudFrontにキャッシュ ■ブラウザレスポンスの改善 ■リクエスト削減によるサーバー負荷の改善 EC2 ELB https://www.lancers.jp/ http://www.lancers.jp/ SSL Terminate EC2 ELB EC2 ELB https://static.lancers.jp/ CloudFront https://static.lancers.jp/

Slide 29

Slide 29 text

2018/2/20 TechPlay 29 サーバーのスケールアップ ●M1系インスタンス時代(サーバーレスポンス1000ms超) ●M1系→ C3系インスタンスへ移行

Slide 30

Slide 30 text

2018/2/20 TechPlay 30 サーバーのスケールアップ ●C3系→C4系インスタンスへの移行 ○PV → HVM AMIへ移行 ■Ansibleでコード化 ●CentOS6 → Amazon Linuxで再構築 ○ミドルウェアのバージョンが最新に ○EBS最適化 ○拡張ネットワーキング ○Magnetic → SSD 負荷、レスポンス改善の取り組み アプリケーションサーバー

Slide 31

Slide 31 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 32

Slide 32 text

2018/2/20 TechPlay 32 スロークエリの監視 ●1分毎にスロークエリをチェック ○以下のSQLで取得 ●取得結果をChatWorkに通知 SELECT * FROM mysql.slow_log WHERE start_time >= '1分前の時刻'

Slide 33

Slide 33 text

2018/2/20 TechPlay 33 インデックスチューニング ●無計画に作成されたインデックスの見直し ○MySQLは1テーブルにつき1インデックスしか使えない ○MySQLは常に最適なインデックスを選択してくれるとは限らない ■適切でない複合インデックスを選択する場合も ●インデックスの掃除から開始 ○適切でないインデックスの削除 ■概ね改善するが、一部のクエリが悪化する場合も ●事前に悪化するクエリを検出しておく必要がある

Slide 34

Slide 34 text

2018/2/20 TechPlay 34 インデックス変更前後のクエリ速度比較スクリプト ●ランサーズの各画面で流れるクエリログをスクリプト化 ○インデックスの変更前後でレスポンス値を比較 $ ./sql_measure.sh help_beginner 62 mypage_experience 19 mypage_menu 18 mypage_profile 752 mypage_portfolio_lists 118 … profile_search 38 skill 69 top 17168 … user_login 63 work_create_expert 13 work_create_start 30 work_competition_logo 14 work_search 45 work_search_logo 107 work_search_all_budgetfrom 118 work_search_all_deadline 47 work_search_all_started 49 work_search_business 253 work_search_design 341 work_search_media 131 work_search_system 195 work_search_task 312 work_search_translation 94 work_search_web 270 work_search_writer 187 … インデックス削除後に 悪化するクエリ

Slide 35

Slide 35 text

2018/2/20 TechPlay 35 インデックスチューニングの具体例 ●インデックス対象カラムの置き換え ○作成日時(created)でのソートをidソートに置き換え ■CakePHPは各テーブルにidがつく(Primary Key) ■createdのソート順とidのソート順は基本的に一致する ●カーディナリティの低いインデックスの見直し ○例えば削除フラグ(deleted)(カーディナリティ2) ■deleted = 0のレコードが大多数 ■deleted = 1の検索は滅多に行われない ○複合インデックス ■カーディナリティの低いカラムが先に来ているパターン ●FORCE INDEXの利用 ○一時的な手段として ■定期的に観測が必要 +-----------------+---------------------------------------+--------------+---------------------+-------------+ | Table | Key_name | Seq_in_index | Column_name | Cardinality | +-----------------+---------------------------------------+--------------+---------------------+-------------+ | categorizations | PRIMARY | 1 | id | 12672606 | | categorizations | category_id | 1 | category_id | 29402 | | categorizations | categorization_type | 1 | categorization_type | 3600 | | categorizations | categorization_type_categorization_id | 1 | category_id | 154 | | categorizations | categorization_type_categorization_id | 2 | categorization_type | 6336303 | | categorizations | categorization_type_categorization_id | 3 | categorization_id | 3168151 | +-----------------+---------------------------------------+--------------+---------------------+-------------+

Slide 36

Slide 36 text

2018/2/20 TechPlay 36 SQLのCOUNT文をなくす ● 旧TOPページの仕事カテゴリ一覧

Slide 37

Slide 37 text

2018/2/20 TechPlay 37 SQLのCOUNT文をなくす ● 旧TOPページの仕事カテゴリ一覧 ○ 数十個のCOUNT文

Slide 38

Slide 38 text

2018/2/20 TechPlay 38 SQLのCOUNT文をなくす ●日次バッチで更新しキャッシュするように修正 ○DB1台削減できた

Slide 39

Slide 39 text

2018/2/20 TechPlay 39 全文検索への移行 ●ランサー検索をCloudSearchに移行 ○DB負荷が半減 lancers 000 lancers 001 lancers 002 lancers 003 Cloud Search App EC2 ランサー検索

Slide 40

Slide 40 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 41

Slide 41 text

2018/2/20 TechPlay サーバーのコード化 41 ●PV AMI→HVM AMI移行のタイミングで導入 ○AMIでの移行が困難なため新規に構築する必要があった ○現サーバー仕様を把握することから始まった。。。 ■漏れなく再現しないと障害に ●新規サービスを新VPCに作成するタイミングで導入 ●インフラの構成変更も管理

Slide 42

Slide 42 text

2018/2/20 TechPlay 42 データ取得作業の委譲 ●SSH Tunnelingサーバー経由でPrivate VPCの参照用Readerに接続 ○エンジニア以外の社員もSQLでデータ取得 EC2 Aurora Reader SSH Tunneling SQLクライアント 接続先:SSH Tunnelingサーバー 接続ポート:8025(任意に設定) $ ssh -N -f -p 22 -i /home/mysqluser/.ssh/ec2.id_rsa ec2- user@EC2のIPアドレス -g -L 8025:lancers001.xxx.ap- northeast-1.rds.amazonaws.com:3306 Lancers EC2 instance

Slide 43

Slide 43 text

2018/2/20 TechPlay 43 アクセスログのAthena対応 App S3 ELB App EC2 instance Log EC2 EC2 instance Amazon Athena time:2018-02-15T11:38:53+09:00 server_addr:10.0.6.11 host:xxx.xxx.xxx.xxx method:GET reqsize:1624 uri:/mypage/ query: status:200 size:83 referer:https://www.lancers.jp/mypage/?ref=header_text ua:Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko forwardedfor:180.63.228.57 reqtime:0.080 apptime:0.080 user_id:1701012 alternative_id:- timecard_env:- { "time":"2018-02-15T11:38:53+09:00 ", "server_addr":"10.0. 6.11", "host":"xxx.xxx.xxx.xxx", "method":"GET", "reqsize":"1624", "uri":"/mypage/ ", "query":"", "status":"200", "size":“83", "referer":"https://www.lancers.jp/mypage/?ref=header_text ", "ua":"Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko forwardedfor:180.63.228.57 reqtime:0.278 ", "forwardedfor":"111.239.118.99", "reqtime":"0.080", "apptime":"0.080", "user_id":"1701012", "alternative_id":"-", "timecard_env":"-" } ●Nginxログをタグ付きのフォーマットに ○解析しやすい形式に変更 ●td-agentでlogサーバーに変更 ○JSON形式でS3に格納 ■AthenaでSQLアクセス可能に SQLでアクセス可能 User Analyst

Slide 44

Slide 44 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 45

Slide 45 text

2018/2/20 TechPlay 開発環境構築の自動化と委譲 45 ●Dockerで常に最新の開発環境を提供(後述) ●GitHub Wikiに構築手順を集約 ○リモートでも構築しやすい環境に

Slide 46

Slide 46 text

2018/2/20 TechPlay 46 ランサーズ開発環境の歴史(2008 ~ 2010) ●開発人数:2人 ●PC環境 ○Windowsデスクトップ ●開発環境 ○Linuxサーバーに直接ログイン ■CentOS ●開発ツール ○ソース管理:SVN ○直接ログインしてVimで開発

Slide 47

Slide 47 text

2018/2/20 TechPlay 47 ランサーズ開発環境の歴史(2011 ~ 2013) ●開発人数:4人~10人 ●PC環境 ○Windowsデスクトップ ○デザイナーはMac ●開発環境 ○社内開発サーバー(VMWare ESXi) ●開発ツール ○ソース管理:SVN ○直接ログインしてVimで開発 ○ssh経由でIDEを使う人も

Slide 48

Slide 48 text

2018/2/20 TechPlay 48 ランサーズ開発環境の歴史(2014 ~ 2015) ●開発人数:10人~20人 ●PC環境 ○Windowsデスクトップ ○エンジニアもMacに移行し始める ●開発環境 ○VirtualBox + Vagrant ○Ansibleで個人PC内に開発環境を構築 ■アプリチームで管理 ●開発ツール ○ソース管理:SVN→Githubに移行 ○PC上のエディタで開発 ■VirtualBox共有フォルダ ○PHP Stormでデバッグする人も

Slide 49

Slide 49 text

2018/2/20 TechPlay 49 ランサーズ開発環境の歴史(2016 ~ 2017) ●開発人数:20人以上 ●PC環境 ○ほとんどMac ○Windowsは数人 ●開発環境 ○VirtualBox + Docker Toolbox ○Dockerfile + Ansibleでコンテナ構築 ■インフラチームで管理 ■開発者は構築済のコンテナをpullするだけ ●開発ツール ○ソース管理:Github ○PC上のエディタで開発 ■VirtualBox共有フォルダ Dockerマウント ○PHP Stormのデバッグも可能

Slide 50

Slide 50 text

2018/2/20 TechPlay 50 ランサーズ開発環境の歴史(2017 ~ ) ●開発人数:20人以上 ●PC環境 ○Mac ○Windows ○Linux ●開発環境 ○Docker For Mac(Windows) ○Dockerfile + Ansibleでコンテナ構築 ○インフラチームで管理 ■開発者は構築済のコンテナをpullするだけ ●開発ツール ○ソース管理:Github ○PC上のエディタで開発 ■Dockerマウント or Docker Sync ○PHP Stormのデバッグも可能

Slide 51

Slide 51 text

2018/2/20 TechPlay 51 Dockerへ移行した理由 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) ●マシンリソース問題 ○新規サービス開発の度にVMを作成

Slide 52

Slide 52 text

2018/2/20 TechPlay 52 Dockerへ移行した理由 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) ●マシンリソース問題 ○新規サービス開発の度にVMを作成

Slide 53

Slide 53 text

2018/2/20 TechPlay 53 Dockerへ移行した理由 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.13 HDD 50GB メモリ 1GB WordPress (コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) ●マシンリソース問題 ○新規サービス開発の度にVMを作成

Slide 54

Slide 54 text

2018/2/20 TechPlay 54 Dockerへ移行した理由 192.168.33.15 HDD 50GB メモリ 1GB 認証システム 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.13 HDD 50GB メモリ 1GB WordPress (コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) ●マシンリソース問題 ○新規サービス開発の度にVMを作成

Slide 55

Slide 55 text

2018/2/20 TechPlay 55 Dockerへ移行した理由 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) ●VMを1つにまとめる

Slide 56

Slide 56 text

2018/2/20 TechPlay 56 Dockerへ移行した理由 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379 ●VMを1つにまとめる

Slide 57

Slide 57 text

2018/2/20 TechPlay 57 Dockerへ移行した理由 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) WordPress Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) ●VMを1つにまとめる ○バージョン混在の問題 ○言語別、バージョン別に環境が欲しい

Slide 58

Slide 58 text

2018/2/20 TechPlay 58 Vagrant + Ansible時代の問題点 ●構築に時間がかかる ○PHP、MySQLのビルド時間:1.5時間 ○MySQLのインポート時間:2.5時間以上 ●構成更新時の問題 ○Appサーバーに新しいミドルウェアを追加 ■Ansible PlaybookにPRを投げる ●誰が検証するの? ○検証中は開発できない ○再構築も時間がかかる(元に戻らないリスクも) ●誰もPlaybookを更新しなくなる ○更新差分は手動でカバー ○原因不明のエラーがさらに増える ●Windows環境での構築が不安定 ○Virtualbox、Vagrant、Ansibleのバージョン相性がシビア ■成功率50%以下 ○Windowsユーザーが激減

Slide 59

Slide 59 text

2018/2/20 TechPlay 59 VMをDockerに置き換え 192.168.33.15 HDD 50GB メモリ 1GB 認証システム 192.168.33.11 HDD 50GB メモリ 2GB App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 MySQL 5.6 (3306) Memcached(11211) 192.168.33.13 HDD 50GB メモリ 1GB WordPress (コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 MySQL 5.6(3306) 192.168.33.12 HDD 50GB メモリ 1GB メッセージ(チャット) Nginx(3443) node.js(3001) Redis(6379) HDD 20GB メモリ 2GB 172.17.6.11 App(ランサーズ本体) Apache 2.2 (80) PHP 5.3 172.17.4.51 コーポレート、ブログ等) Apache 2.4(80) PHP 5.5 172.17.4.152 メッセージ(チャット) Nginx(3443) node.js (3001) 172.17.106.55 認証システム 新サービス開発の度に VMを作成 1つのVMに 各種コンテナを配置

Slide 60

Slide 60 text

2018/2/20 TechPlay 60 Docker移行の方針 ●本番環境と極力同じ構成を再現 ○AWSのマネージド系のサービス ■Dockerfileで作成 ○AWSのEC2で構築しているサーバー ■Dockerfile + Ansibleで作成 ■Ansibleを実行するコンテナを用意 ●本番と同じPlaybookで構築 App ELB ErastiCache Memcached ErastiCache Redis Aurora EC2 instance Wordpress EC2 instance WebSocket App Redis MySQL ELB WordPress Memcached WebSocket EC2 instance ELB RDS ELB SSL Terminate リバースプロキシ データ入り

Slide 61

Slide 61 text

2018/2/20 TechPlay 61 Docker移行の方針 EC2 MySQLデータ 開発用データ App Ansible WordPress MySQL WebSocket WordPress App WebSocket MySQL Playbook docker push docker pull docker build Amazon ECR ●構築に時間をかけない ○コンテナをpullするだけで完了 コンテナは インフラチームが構築 アプリチームは コンテナをpullするだけ

Slide 62

Slide 62 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 63

Slide 63 text

2018/2/20 TechPlay 63 リリースの自動化と委譲 ●Webからリリース可能なシステムを構築 ○アプリエンジニアやデザイナーでもリリース可能

Slide 64

Slide 64 text

2018/2/20 TechPlay 64 リリースフロー EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance Developer ●Githubにpush

Slide 65

Slide 65 text

2018/2/20 TechPlay 65 リリースフロー EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance Developer ●Webデプロイシステムからリリース

Slide 66

Slide 66 text

2018/2/20 TechPlay 66 リリースフロー EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance Developer ●DeployサーバーがGithubからpull

Slide 67

Slide 67 text

2018/2/20 TechPlay 67 リリースフロー EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance composer install Developer ●composer installの実行 ○開発用Appコンテナを起動

Slide 68

Slide 68 text

2018/2/20 TechPlay 68 リリースフロー EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance rsync Developer ●カナリア環境にrsync ○最終確認

Slide 69

Slide 69 text

2018/2/20 TechPlay 69 リリースフロー EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance rsync Developer ●本番環境にrsync

Slide 70

Slide 70 text

2018/2/20 TechPlay 70 リリースシステム EC2 App Deploy EC2 instance EC2 Canaria App EC2 instance S3 Cloud Front rsync 静的 ファイル キャッシュ クリア composer install node install go build Wordpress EC2 instance EC2 Api Developer ●ランサーズ以外のサービスにも拡張 ○unicornの再起動 ○S3への配置 ○CloudFrontのキャッシュクリア

Slide 71

Slide 71 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 72

Slide 72 text

2018/2/20 TechPlay 72 不要なサービス、ソースコードの削除 ●不要サービス、機能の削除 ○更新されず、効果の薄いサービスや機能の削除 ■残しておくとセキュリティ面のリスクを抱える ○ほとんど交渉作業 ■オーナー不在の場合が多い ●何のために作ったのかもはや理由が曖昧なことも ●ソースコードの削除 ○一時的に残しておいてそのまま放置されたソースなど ○使われないソースが検索でヒットすると初見の開発者が混乱 ■生産性低下の原因に

Slide 73

Slide 73 text

2018/2/20 TechPlay ランサーズの提供サービス インフラチーム サービス安定化の取り組み 負荷、レスポンス対策(アプリ) 負荷、レスポンス対策(DB) 定型作業の自動化と委譲 定型作業の自動化と委譲(開発環境) 定型作業の自動化と委譲(リリース) 削除 今後の計画

Slide 74

Slide 74 text

2018/2/20 TechPlay 74 新バージョンへの対応 ●PHP、CakePHPのバージョンアップ ○2017年から本格的に開始 ■現在:PHP 5.3 + CakePHP 1.3 ○バージョンアップ手順 ■Apache + mod_php → Nginx + PHP-FPM ■CakePHP 1.3 → CakePHP 2.8 ■PHP 5.3 → PHP 5.6 ■CakePHP 2.8 → CakePHP 2.9 ■PHP 5.6 → PHP 7 ■CakePHP 2.9 → CakePHP 3 ●MySQLのバージョンアップ ○Aurora MySQL 5.6 → 5.7 ■開発環境で検証中 ●MySQLコンテナを5.7に更新 イマココ

Slide 75

Slide 75 text

2018/2/20 TechPlay 75 分析基盤の構築 ●ログのリアルタイム解析 ●DBやZendeskの問い合わせログも集約したDHWの作成 ●過去ログのAthena対応 App S3 ELB App EC2 instance Log EC2 EC2 instance Athena User Analyst Aurora Elasticserch Service

Slide 76

Slide 76 text

2018/2/20 TechPlay 76 本番環境のDocker化、API化、マイクロサービス化、サーバーレス化 ●本番環境のDocker化 ○アプリエンジニアが開発、リリース、運用を全て行える仕組み ○リリース時間の短縮が課題 ●API化の促進 ○言語に依存しないサービス運用環境 ○開発スピードの改善 ○アプリチームの責任範囲を明確にする ●マイクロサービス化 ○モノリシックのまま膨れ上がったプロダクトを分割 ●サーバーレスで済む機能は積極的にサーバーレス化 ○運用工数の削減 ○サーバー費用の削減 Amazon ECR Amazon ECS Amazon API Gateway AWS Lambda

Slide 77

Slide 77 text

2018/2/20 TechPlay 77 SREチームの設立 ●チーム体制でSREを行う ○事業横断チーム ●初期サービスのPDCAサイクルのスピードアップ ○アプリエンジニアで運用まで完結する仕組みの構築 ●各サービスのSREの促進 ○ランサーズで培ったノウハウを他サービスにも適用していく ○軌道に乗ったサービス全てにSREを適用したい

Slide 78

Slide 78 text

2018/2/20 TechPlay 78 SREエンジニア採用中! https://www.wantedly.com/projects/178494

Slide 79

Slide 79 text

2018/2/20 TechPlay 御静聴ありがとうございました!