【jaws days 2014】ランサーズを支えるrds

67
ククククククククク Lancers クククク RDS for MySQL http://www.lancers.jp/ 時時時時時時時時時時時時時時時時時時時時時 「」 [2014/03/15 JAWS DAYS 2014] 時時時時時時時時時 時時時時時時時時時 時時 時時 [Kanazawa Yuki]

Upload: yuki-kanazawa

Post on 12-Jun-2015

1.989 views

Category:

Engineering


7 download

DESCRIPTION

JAWS DAYS 2014で発表させて頂きました、ランサーズのRDS移行に関する資料です。

TRANSCRIPT

Page 1: 【JAWS DAYS 2014】ランサーズを支えるRDS

「クラウドソーシングLancers 」

を支える RDS for MySQL

http://www.lancers.jp/

「時間と場所に囚われない新しい働き方の創出」

[2014/03/15 JAWS DAYS 2014]

ランサーズ株式会社インフラエンジニア金澤 裕毅  [Kanazawa Yuki]  

Page 2: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

自己紹介(基本情報)

氏名 金澤 裕毅

世代 1976 年生まれ

出身 宮城県仙台市

・大学時代はネットワークを専攻・第一期( 2002 年~ 2010 年)  ・ Windows パッケージ開発  ・ ASP 開発、インフラ担当   ・札幌に 2 年間転勤・第二期( 2010 年~ 2013 年 11 月)  ・不動産ポータル、地域 SNS・第三期( 2013 年 11 月~現在)  ・ランサーズのインフラ担当

略歴

2

Page 3: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

自己紹介(基本情報)

CloudWatch

・ロードアベレージ・ HDD 使用状況・メモリ使用状況・月額利用料金・2週間以上の値

も見れると嬉しい…

好きな AWS のサービス

3

Page 4: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

ランサーズ社内における役割

4

CTO

ディレクター デザイナー エンジニア

ココ

インフラ

【社外インフラ】 AWS チューニング全般

【社内インフラ】 ルーター設定 開発環境の支援 PC 設定

Page 5: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

本日お話しさせていただく内容

5

① ランサーズ ( 株 ) のご紹介

②AWS 移行の背景

③RDS→EC2→RDS に移行した経緯

④RDS のメリット・デメリット

⑤RDS 移行のポイント

⑥ ランサーズの RDS 運用

Page 6: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 6

① ランサーズ ( 株 ) のご紹介

②AWS 移行の背景

③RDS→EC2→RDS に移行した経緯

④RDS のメリット・デメリット

⑤RDS 移行のポイント

⑥ 今後の取組み

Page 7: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

会社紹介(概要)

7

ランサーズ株式会社

設立

事業内容

ビジョン

2008 年 4 月 1 日

クラウドソーシングサービス「 Lancers 」の運営

「時間と場所に囚われない新しい働き方の創出」

2013 年 6 月 鎌倉→渋谷に移転しました

Page 8: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

クラウドソーシングとは?

• 米国で 2000 年頃に誕生したインターネットサービスの一つ

• 仕事を頼みたい人や企業と、自分のスキルや労働力を売りたい人をネット上でマッチングすること

満員電車にサヨナラする方法 ~ 時間と場所にとらわれない新しい働き方~

秋好 陽介 ( 著 )

Cloud (雲)ではなくCrowd (群衆)

8

Page 9: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

サービス紹介「 Lancers 」

9

日本初+国内最大級のオンライン完結型アウトソーシングサービス

依頼数

約 28 万件依頼総額

約 220 億円会員数

約 26 万人依頼案件の例

• ロゴ、イラスト• Web システム、スマホ• データ入力、記事作成

Page 10: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

依頼可能な仕事カテゴリは「 74 」

10

Page 11: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

仕事タイプに合わせて選べる3つの依頼方式

11

歯科医院のロゴマーク作成提案: 32 件 納期: 7 日間  発注額: 5 万円

特定地域不動産データ収集1作業: 5 円 件数: 1,400 件 納期: 10 日

映画データの情報収集1作業: 25 円 件数: 100 件 納期: 3日

FLASH のゲーム制作提案: 9 件 納期: 3か月 発注額: 100-500 万円

美容室ホームページの制作提案: 8 件 納期: 1か月 発注額: 10-50 万円

Web サービスのネーミング提案: 305 件 納期: 7 日間  発注額: 2 万円

【コンペ方式】 【プロジェクト方式】 【タスク方式】

ロゴ・ネーミング・バナー等 Web制作・アプリ開発等 記事 / コラム・データ収集等

Page 12: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

ランサーズの会員詳細

12

毎月報酬を得ている

2,000 人

生活できる報酬を得ている

200 人

Page 13: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

ランサーズが実現する世界

13

2016 年に 1 万人がランサーズだけで

生活できるレベルの報酬を獲得する

Page 14: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

ランサーズ依頼件数の推移

14

年間 300%成長中!

2012201120102009 2013

2012 年 5 月AWS に移行

2013 年 11月

金澤 JOIN

Page 15: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

ランサーズを支える技術

15

Web DB Monitor

RDS S3EC2 CloudWatch

App

Page 16: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

開発環境

16

subversion

■ バージョン管理、コーディングチェック

■リリース

移行中

Fablic で App 全台に一括適用(Python製の一括デプロイツール )

デプロイ後に API でリリース情報を自動通知

Page 17: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 17

②AWS 移行の背景

③RDS→EC2→RDS に移行した経緯

④RDS のメリット・デメリット

⑤RDS 移行のポイント

⑥ 今後の取組み

① ランサーズ ( 株 ) のご紹介

Page 18: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

なぜAWS に移行しようと思ったのか

18

HDD圧迫(大容量プランにするか???) App サーバメモリ逼迫( 4GB だったため、不足。。。) スケールしない( AP2 台 DB2 台の構成 DNS ラウンドロビンだった) ⇒契約したプラン上、 1 台だけ増やす、 HDD増量が出来ない

移行を考え出した「きっかけ」

2012 年からサービス拡大期へ TV 紹介も狙い出す

AWS 移行前の「問題例」

どれぐらいアクセスが増えるのか? TV効果は一時的?

Page 19: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

AWS に決定するまで

19

どのクラウドサービスにするか

判断ポイント1

現行レンタルサーバでいくか?クラウドにするか?

費用とスペックなら「 sakura 」 スケーラブル、運用コストを下げるなら「 AWS 」⇒sakura は、アクセス急増に対応できない、初期導入コストあり、 時間もかかる(用意してもらう時間、設定する時間) ⇒『成長するサービスなら AWS だ!』

判断ポイント2

sakura クラウドを選ぶ際のメリデメ(例)

nifty クラウドを選ばなかった理由・・・単純に高く、価格面で折り合わなかった

[ メリット ] ホスティングサービスが従量課金のように使用可能、 IO高性能、安価

[ デメリット ] サービス種類、管理ツール、ウェブでの情報

sakura

AWS

vs

sakuraクラウド

niftyクラウド

vs

Page 20: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

CentOS の入手

20

開発環境と同じCentOS を使いたい

当初、自作しようと試みるがハマッて

しまった・・

時間がないため、既に構築済みの物を選択Cloudpack さん提供の

AMI

Page 21: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

ファイルデータの移行

21

500GBほどあった画像などのファイルデータを S3へ移動

① PHP の SDK を使ったアップロードバッチスクリプトを作成② 社内の ESXi をインスタンスフル稼働させて叩きまくる③ 何 10 時間もかけて移動

ESXi

VM VM VMバックアップ

DBバッチ処理 バッチ処理 バッチ処理

Page 22: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

AWS 移行前後のシステム構成

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ElasticLoad Balancer

EC2DB Slave

EC2DB Slave

EC2DB Master

ap-northeast-1a

移行後

App App

移行前

DB Master DB Slave

Internet

Internet

Data Center

DNS ラウンドロビン

Page 23: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 23

④RDS のメリット・デメリット

⑤RDS 移行のポイント

⑥ 今後の取組み

① ランサーズ ( 株 ) のご紹介

③RDS→EC2 に移行した経緯

②AWS 移行の背景

Page 24: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

AWS 移行直後( 2012 年 5 月)の RDS問題

24

困った点①

ログが見れない!!(スローログ、クエリログはテーブル出力)(バイナリログ参照不可)

デフォルトタイムゾーンが UTC で変更できない!!

※コネクションを張るたびに +9 時間する必要

困った点②

MyIsam のスナップショットは未サポート→MyIsam の FullText インデックスを利用していた

困った点③

Page 25: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

AWS 移行直後( 2012 年 5 月)の RDS問題

25

移行リリース直後、アクセス増加に連れて負荷が高まっていた⇒原因調査の結果、どうやら DBかもしれないとの仮説 しかし RDS で細かいデータが見れず詳細調査が出来ない (= vmstat, sysstat, top 等 が利用不可)

 ⇒ EC2 への移行を決断

移行したが・・・結果、 EC2 でも重いまま ⇒さらに調査すると、 I/Oがボトルネックになっていることが発覚

ログを解析し、チューニング移行前のレンタルサーバでは 高性能な HDDが使われていたため、問題が発覚しなかった

 ⇒その後、 2013 年 11 月まで EC2 で MySQL を運用

Page 26: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 26

④RDS のメリット・デメリット

⑤RDS 移行のポイント

⑥ 今後の取組み

① ランサーズ ( 株 ) のご紹介

③RDS→EC2→RDS に移行した経緯

②AWS 移行の背景

Page 27: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

EC2 の MySQL 運用で困ったこと

27

• EC2 の障害でリブート• 20 台あって 3,4ヶ月に 1度くらい

• DB Master にリブートがかかり、 MyIsam の FullTextIndexが壊れる• そしてスレーブ停止• 半年で 4回+----+---------+------------------------+--------------------------------------------------------------------| id | user_id | user | userprofile +----+---------+------------------------+--------------------------------------------------------------------| 1 | 1 | la an nc ce er rs s | 仕事 事マ マー ーケ ケッ ット トプ プレ レイ イス ス「 「 l la an nc| 2 | 2 | yo os su uk ke e | はじ じめ めま まし して て、 、 y yo os su uk ke e と と申 申し しま| 3 | 3 | re ee et t | イン ンタ ター ーネ ネッ ット トサ サー ービ ビス スを を企 企画 画+----+---------+------------------------+--------------------------------------------------------------------

Page 28: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

RDSが改善されてきた…

28

• RDS の値下げ• EC2 の 2倍近い費用 → 差がほとんどなくなってきた

• MySQL 5.6対応( 2013 年 7 月)• バイナリログの転送が可能になった

• mysqlbinlog の remote server オプション

• Inno DB の FullTextIndexがサポートされた• MySQL 5.6.4から対応

• Management Console の充実• Web 上でほぼ全てをコントロール可能になった

• パラメータの設定等

  ⇒再び RDSへの移行を決断

Page 29: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 29

⑤RDS 移行のポイント

⑥ 今後の取組み

① ランサーズ ( 株 ) のご紹介

④RDS のメリット・デメリット

②AWS 移行の背景

③RDS→EC2→RDS に移行した経緯

Page 30: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved30

RDS化前後のシステム構成

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ElasticLoad Balancer

EC2DB Slave

EC2DB Slave

EC2DB Master

ap-northeast-1a

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ap-northeast-1a

RDSMaster

RDS Read Replica

RDS Multi AZ

ap-northeast-1c

RDS化前

RDS化後

Page 31: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 31

RDS(MySQL) のメリット

• Multi AZ配置• マスタ DB と異なる AZ にスタンバイを用意• 障害時に自動フェイルオーバー

• 停止時間は 2 分~ 7 分(計測値)

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ap-northeast-1a

RDSMaster

RDS Read Replica

RDS Multi AZ

ap-northeast-1c

db-master.xxxxx.ap-northeast-1.rds.amazonaws.com

Page 32: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

RDS(MySQL) のメリット

• リードレプリカ(参照専用スレーブ)を手軽に作成できる• メニューから選択するだけ

Page 33: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 33

RDS(MySQL) のメリット

• ポイントタイムリカバリ• 任意の時間に DB を戻すことが可能

• 35 日前まで保管可能(要設定)

Page 34: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

RDS(MySQL) のメリット

• ClowdWatch• EC2よりも豊富(空きメモリ、空き HDD も確認可)

Page 35: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 35

RDS(MySQL) のメリット

• スナップショット機能• Manual Snapshot

• 手動スナップショット• インスタンス削除時に取得するか訊かれる

• Automated Snapshot• 毎日自動的に取得される差分スナップショット• 35 日間まで取得可能• マスター DBが消えると削除される

Page 36: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 36

RDS(MySQL) のメリット

• パフォーマンス• 適切なデフォルトパラメータ設定• EBS ボリュームのストライプによる IOPS パフォーマンスの向上

EC2 RDS 移行後

DB

PHP

DB

PHP

Page 37: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 37

RDS(MySQL) のデメリット

• EC2 に比べて若干割高• m3.medium: $0.17/h (東京リージョン)• db.m1.medium: $0.215/h (東京リージョン)

• MultiAZ スタンバイ機は使えない• でも料金は 2 台分

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ap-northeast-1a

RDSMaster

RDS Read Replica

RDS Multi AZ

ap-northeast-1c

バックアップ専用利用不可

Page 38: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 38

RDS(MySQL) のデメリット

• SSH ログインできない• RDS接続用の EC2 サーバーを用意しておく• mysqldump のエクスポート結果もここに格納

MySQLClient

EC2

RDSdb-master.xxx.ap-northeast-1.rds.amazonaws.com

$ mysql -h db-master.xxx.ap-northeast-1.rds.amazonaws.com -u mysqluser –p

Page 39: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 39

RDS(MySQL) のデメリット

• リードレプリカに ELB利用不可• 自前でロードバランシングする必要がある

• ランサーズでは HAProxy を利用

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ap-northeast-1a

RDSMaster

RDS Read Replica

RDS Multi AZ

ap-northeast-1c

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ElasticLoad Balancer

EC2DB Slave

EC2DB Slave

EC2DB Master

ap-northeast-1a

HAProxy をインストール

実はたまにLost する…

Page 40: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 40

RDS(MySQL) のデメリット

• Tritonn 、 Mroongaが使えない• 日本語全文検索ができる MySQL パッケージ

• RDS を選択したら全文検索は自前で構築しましょう!• Groonga とか• Solr とか• ErasticSearch とか

mysql> SELECT * FROM timetable WHERE MATCH(title) AGAINST(" クラウド ");+----+-----------------------------------------------------+---------------------+| id | title | start |+----+-----------------------------------------------------+---------------------+| 35 | 「クラウドソーシング Lancers 」を支える RDS for MySQL | 2014-03-15 17:00:00 |+----+-----------------------------------------------------+---------------------+1 row in set (0.00 sec)

Page 41: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 41

RDS(MySQL) のデメリット

• インスタンスを STOP できない• 稼働したくない場合は final snapshot を取得して削除• 稼働したい場合は final snapshotから復旧

• 10 分超かかる

• ( EC2 と比べて)スケールアップ、ダウンに時間がかかる• 10 分〜 50 分

• バイナリログの保持期間は 7 日間まで• 35 日間ではない• 7 日間以上保持したい場合は EC2 に転送しておく

• 後述します

Page 42: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 42

④RDS のメリット・デメリット

⑥ 今後の取組み

① ランサーズ ( 株 ) のご紹介

⑤RDS 移行のポイント

②AWS 移行の背景

③RDS→EC2→RDS に移行した経緯

Page 43: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 43

RDS採用時の注意点

• 1マスターにつきリードレプリカは 5 台まで• それ以上作成したい場合は多層構成にする

• バージョン 5.6 以上で可能

Page 44: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 44

RDS採用時の注意点

• RDS の日付型はデフォルトで UTC (世界標準)• コネクション時に JPN 時間に設定する処理を追加しておく

mysql> SELECT now+---------------------+| 2013-11-28 06:43:58 |+---------------------+1 row in set (0.08 sec)

mysql> SET time_zone="+9:00";Query OK, 0 rows affected (0.05 sec)

mysql> SELECT now();+---------------------+| now() |+---------------------+| 2013-11-28 15:44:16 |+---------------------+1 row in set (0.00 sec)

Page 45: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

Multi AZ にリードレプリカを配置

RDS Master RDS Read Replica

App

ap-northeast-1a

EC2instance

ELB

App

EC2instance

App

EC2instance

RDS Multi AZ RDS Read Replica

App

ap-northeast-1c

EC2instance

ELB

App

EC2instance

App

EC2instance

AZ 間の通信遅延は数ミリ〜数十ミリ

sec レベル

• リードレプリカを複数の AZ に均等に配置する• AZ レベルの障害を想定

Page 46: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

RDS Multi AZ

Multi AZ にリードレプリカを配置

RDS MasterRDS Read Replica

App

ap-northeast-1a

EC2instance

ELB

App

EC2instance

App

EC2instance

RDS Read Replica

App

ap-northeast-1c

EC2instance

ELB

App

EC2instance

App

EC2instance

• リードレプリカを複数の AZ に均等に配置する• AZ レベルの障害を想定

Page 47: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 47

スナップショット取得期間の設定

• 最大 35 日まで設定可能• 1 日以上に設定するとバイナリログが出力されるようになる

バイナリログの保持期間は別途設定が必要

Page 48: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 48

パラメーターの設定

• Parameter Group で設定

設定できないパラメータ

空欄はデフォルト値

Page 49: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 49

パラメーターの設定

• 設定後は必ず再起動する• 不適切な設定があると以下のエラーが表示される

• 例: t1.micro で query_cache_size を 32MB 以上に設定

Page 50: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 50

パラメーターの設定

• 設定値を SHOW VARIABLES で確認

• デフォルト値を確認しておく• 特に query_cache_typeが ONか確認しておく

• ON でないとクエリキャッシュが効かない

mysql> SHOW VARIABLES;+-----------------------------------------+------------------+| Variable_name | Value |+-----------------------------------------+------------------+| auto_increment_increment | 1 || auto_increment_offset | 1 || autocommit | ON || automatic_sp_privileges | ON || back_log | 56 || basedir | /rdsdbbin/mysql/ || big_tables | OFF || bind_address | * || binlog_cache_size | 32768 || binlog_checksum | CRC32 || binlog_direct_non_transactional_updates | OFF || binlog_format | MIXED || binlog_max_flush_queue_time | 0 || binlog_order_commits | ON || binlog_row_image | FULL || binlog_rows_query_log_events | OFF || binlog_stmt_cache_size | 32768 || bulk_insert_buffer_size | 8388608 || character_set_client | utf8mb4 |

Page 51: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 51

クライアントを MySQL5.6 にする

• MySQL5.1→5.6 に接続時の不具合• mysqlbinlog の転送ができない( raw オプションも使えない)

• mysqldump でエクスポートができない

• MySQL5.6へのバージョンアップ方法( yum での例)

• MySQL5.6→5.1 に接続時も不具合がある( EC2戻しテスト時に発覚)

• old_passwords=1 のユーザーで importができない• old_password=0 のユーザーを作って対処

$ sudo yum remove mysql*$ sudo yum -y install http://repo.mysql.com/mysql-community-release-el6-4.noarch.rpm$ sudo yum -y install mysql-community-server

$ mysqldump -h db-master.xxx.ap-northeast-1.rds.amazonaws.com -u mysqluser -p testdb > testdb.sqlmysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1

$ mysqlbinlog -h db-master.xxx.ap-northeast-1.rds.amazonaws.com -u mysqluser -p --read-from-remote-server --raw mysql-bin-changelog.002375mysqlbinlog: unknown option '--raw'

Page 52: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 52

バイナリログの保持期間設定

• デフォルトの保持期間は 5 分• expire_logs_days パラメータは設定できない

• 専用のストアドで設定する(以下は 100 時間の例)

• 設定の確認

• 正しく設定されれば、 Binary Log Disk Usageが増加し始める

• 最長で 7 日間( 168 時間)までしか設定できないので注意• それ以上設定しても効果なし

mysql> call mysql.rds_show_configuration;

mysql> call mysql.rds_set_configuration('binlog retention hours', 100);

増加しない場合はスナップショット取得期間が 1 日以上になっているか

確認

Page 53: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 53

バイナリログの確認( 5.6 のみ)

mysql> SHOW BINLOG EVENTS LIMIT 5; +----------------------------+-----+-------------+-----------+-------------+--------------------------------| Log_name | Pos | Event_type | Server_id | End_log_pos | Info +----------------------------+-----+-------------+-----------+-------------+--------------------------------| mysql-bin-changelog.002375 | 4 | Format_desc | 970914784 | 120 | Server ver: 5.6.13-log, Binlog | mysql-bin-changelog.002375 | 120 | Query | 970914784 | 201 | BEGIN | mysql-bin-changelog.002375 | 201 | Query | 970914784 | 391 | use `mysql`; INSERT INTO mysql.| mysql-bin-changelog.002375 | 391 | Xid | 970914784 | 422 | COMMIT /* xid=129138 */ | mysql-bin-changelog.002375 | 422 | Rotate | 970914784 | 479 | mysql-bin-changelog.002376;pos=+----------------------------+-----+-------------+-----------+-------------+--------------------------------5 rows in set (0.00 sec) 5 rows in set (0.00 sec)

mysql> SHOW BINARY LOGS;+----------------------------+-----------+| Log_name | File_size |+----------------------------+-----------+| mysql-bin-changelog.002375 | 479 || mysql-bin-changelog.002376 | 479 || mysql-bin-changelog.002377 | 1351 || mysql-bin-changelog.002378 | 143 || mysql-bin-changelog.002379 | 825 || mysql-bin-changelog.002380 | 177 |

• EC2 に転送する場合は一番古いバイナリログを確認しておく

• SHOW BIN LOG EVENTS で確認可能

Page 54: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 54

バイナリログの転送( 5.6 のみ)

1.mysql-bin-changelog.002375 を取得$ mysqlbinlog –u root –p -h db-master.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw mysql-bin-changelog.002375

$ mysqlbinlog -u root -p -h db-master.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw mysql-bin-changelog.002375 mysql-bin-changelog.002380

$ mysqlbinlog –u root -p -h db-master.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw --to-last-log mysql-bin-changelog.02375

$ mysqlbinlog -u root –p -h db-master.xxx.ap-northeast-1.rds.amazonaws.com --read-from-remote-server --raw --stop-never mysql-bin-changelog.002735

• →7 日間以上保持したい場合は 4. で EC2 にリアルタイム転送させる• マスターが reboot(failover) すると切れるのが悩み…

2.mysql-bin-changelog.002375〜 002380 を取得

3.mysql-bin-changelog.002375から最新まで取得

4.mysql-bin-changelog.002375から最新まで取得+最新を常時取得し続ける

Page 55: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 55

バイナリログ転送専用ユーザーの作成

• バイナリログの転送には以下の権限が必要• REPLICATION SLAVE• REPLICATION CLIENT

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON testdb.* TO [email protected] IDENTIFIED BY 'XXXXXXXX';ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO [email protected] IDENTIFIED BY 'XXXXXXXX';

• ※必ず GLOBAL権限を付与する• データベース単位で与えると以下のエラーに加え…

全スレーブのレプリケーションが停止し

てしまうので注意!!

Page 56: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 56

バイナリログ転送バッチの作成

#!/bin/sh

MYSQL=/usr/bin/mysqlMYSQLBINLOG=/usr/bin/mysqlbinlogLOGDIR=/var/log/mysql-bin-changelog

HOST="db-master.xxx.ap-northeast-1.rds.amazonaws.com" USER="getbinlog" PASS="XXXXXX"

echo "mysql user="$USER

OLDEST_LOG=`$MYSQL -h $HOST -u $USER --password=$PASS --execute="SHOW BINARY LOGS;" | sed -n '4p' | sed -e "s/ *[0-9]*$//g"`

echo "oldest binlog="$OLDEST_LOG

echo "Start get binlog."

cd $LOGDIR

$MYSQLBINLOG -h $HOST -u $USER --password=$PASS --read-from-remote-server --raw --stop-never $OLDEST_LOG &

get_mysql-bin-changelog.sh

Page 57: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 57

バイナリログ転送起動スクリプト

#!/bin/sh## description: Get MySQL Binary Log# chkconfig: 2345 98 20# processname: mysqlbinlog

SERVICE=GetMySQLBinaryLogUSER=rootCOMMAND=/home/mysqluser/bin/get_mysql-bin-changelog.sh

start() { su -l $USER -c "$COMMAND" echo "service $SERVICE started." }stop() { PID=`pgrep -f mysqlbinlog` kill -TERM $PID echo "service $SERVICE stopped." }

case $1 instart) start ;;stop) stop ;;restart) stop start ;;*) echo "Usage: $SERVICE [start|stop|restart]" ;;esacexit

/etc/init.d/getmysqlbinlog

Page 58: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 58

⑥ ランサーズの RDS 運用

②AWS 移行の背景

③RDS→EC2→RDS に移行した経緯

④RDS のメリット・デメリット

⑤RDS 移行のポイント

① ランサーズ ( 株 ) のご紹介

Page 59: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 59

運用専用のリードレプリカ

• ロードバランサ( HAProxy )に設定しないリードレプリカを用意• 制限ユーザーアカウントで参照

S3 Bucket

ElasticLoad Balancer

EC2WebServer

ap-northeast-1a

RDSMaster

RDS Read Replica

RDS Multi AZ

ap-northeast-1c

Page 60: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 60

スローログの取得

• スローログを取得する設定

• 何秒以上のクエリを記録するかの設定

• スローログの取得

• スローログのローテート

mysql> SELECT * FROM mysql.slow_log;

mysql> CALL mysql.rds_rotate_slow_log;

mysql> SHOW GLOBAL VARIABLES LIKE 'slow_query_log';+----------------+-------+| Variable_name | Value |+----------------+-------+| slow_query_log | ON |+----------------+-------+1 row in set (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';+-----------------+-----------+| Variable_name | Value |+-----------------+-----------+| long_query_time | 3.000000 |+-----------------+-----------+1 row in set (0.01 sec)

Page 61: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 61

スローログの取得

• Management Consoleからも取得可能

Page 62: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 62

Visual Explain

• MySQL5.6 の新機能• MySQL WorkBench で利用可能

アカウント名が日本語だと動作しないので注意!

Page 63: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 63

SSH Tunneling で RDS接続

EC2

RDS

・ MySQL WorkBench ・接続先: localhost ・接続ポート: 8025 (任意に設定)・ Poderosa 、 putty等の Portforwarding

ツール ・転送元ホスト: localhost ・転送元ポート: 8025 (任意に設定) ・転送先ホスト: RDS のエンドポイント ・転送元ポート: 3306 ( MySQL のポート)

EC2

RDS

社内サーバー

• Portforwardingツールを使う場合(接続中は常に起動)

• SSH Tunneling サーバーを立てる場合・ MySQL WorkBench ・接続先:社内サーバー ・接続ポート: 8025 (任意に設定)

$ ssh -N -f -p 22 -i /home/mysqluser/.ssh/ec2.id_rsa ec2-user@EC2 の IP アドレス -g -L 8025:db-slave.xxx.ap-northeast-1.rds.amazonaws.com:3306

Page 64: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 64

SSH Tunneling の起動スクリプト

#!/bin/sh## Startup script for the SSH-Tunnel## chkconfig: 345 56 26

# How to regist# # chmod +x /etc/init.d/ssh-tunnel# # chkconfig --level 345 --add ssh-tunnel# # /etc/init.d/ssh-tunnel start

DESC=ssh-tunnelDAEMON=/usr/bin/sshNAME=ssh

# LOCAL SettingLOCAL_PORT=8025

# INTER SettingINTER_SERVER=ec2 の IP アドレスINTER_PORT=22INTER_USER=ec2_userINTER_KEY=/home/mysqluser/.ssh/ec2.id_rsa

# REMOTE SettingREMOTE_SERVER=db-slave.xxx.ap-northeast-1.rds.amazonaws.comREMOTE_PORT=3306

case "$1" in start) echo -n "Starting $DESC: " $DAEMON -N -f -4 -L ${LOCAL_PORT}:${REMOTE_SERVER}:${REMOTE_PORT} \ ${INTER_USER}@${INTER_SERVER} -p ${INTER_PORT} -i ${INTER_KEY} \ -g -o ServerAliveInterval=15 > /var/log/ssh-tunnel.log 2>&1 echo "$NAME Start OK." ;; stop) echo -n "Stopping $DESC: " killall $NAME echo "$NAME Stop OK." echo "How to stop ssh-tunneling:" echo "# ps auxww | grep ssh" echo "# kill xxxx" ;; esac

/etc/init.d/ssh-tunnel

Page 65: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved 65

最後に、今後やりたいこと

• RDS のオートスケーリング• EC2 と同様のオートスケーリング機能を実現したい• CPU利用率での 判 定は難しそう

• App と違い、パルス的な負荷が多い

• →夜間帯、土日にリードレプリカの台数を減らす方向で検討中

• 台数変更前後に haproxy.conf の設定を変更• fablic で複数台の App サーバーに一括設定

EC2 App RDS

Page 66: 【JAWS DAYS 2014】ランサーズを支えるRDS

© 2014 for LANCERS, inc All Rights Reserved

エンジニア積極採用中

66

• 働き方を変えたい方• 最新の技術が好きな方• 世界に打って出たい方

お気軽にご連絡下さい![email protected]

Page 67: 【JAWS DAYS 2014】ランサーズを支えるRDS

RDS 最高!!ご清聴ありがとうございました

[2014/03/15 JAWS DAYS 2014 ]

ランサーズ株式会社インフラエンジニア金澤 裕毅  [Kanazawa Yuki]  

「時間と場所に囚われない新しい働き方の創出」