狠狠撸

狠狠撸Share a Scribd company logo
Rails複数DBシステム
MySQLからPostgreSQL
移?行行物語
シナジーマーケティング株式会社
三苫 ?亮亮
2015/04/17
Riding ?Rails勉強会(Railsを乗りこなせ) ?発表资料料
?自?己紹介
?? 三苫 ?亮亮(みとま ?りょう)
https://github.com/mitoma
?? 今までやってきたこと
–? マルチテナントシステム
–? 複数データベースシステム
–? スキーマ不不定データ ?on ?RDBMS
?目次
?? 本?日お話しすること
?? Rails複数DBシステム
?? データベース移?行行
?? 無停?止移?行行の流流れ
?? まとめ
本?日お話しすること
?? Railsで構築されたマルチテナントシステムを
MySQLからPostgreSQLへ
無停?止で移?行行するというお話
?? ただし
?? データベースは複数あり
スキーマ定義はそれぞれ微妙に異異なり
移?行行期間は数か?月に及ぶ
おそらく
ここにいる皆様が
–? 「今すぐ使えるお役?立立ち情報だ!」
–? 「ヘーシャもまさにいま、
? その問題に困っていたのだよ!」
と、思うような発表内容ではないかもしれません。
できれば
Railsを実務でバリバリ使っている皆様が
いつか似たような困難に直?面したときに
–? 「そういえば類似の事例例がある」
–? 「この部分の考え?方は応?用できる」
と、考える引き出しを増やすことに繋がれば幸いです。
マルチテナントって?
?? ?一つのシステム内で複数のテナントの
データを同居させる?方式のシステム
–? 実現?方法はデータや処理理の
分離離レベルによってさまざま
?? アプリケーションの実装で分離離(Salesforce)
?? データストアの機能で分離離
?? アプリケーション?ミドルウェアのプロセスで分離離
?? インスタンスで分離離(Amazon ?Web ?Service)
?目次
?? 本?日お話しすること
?? Rails複数DBシステム
?? データベース移?行行
?? 無停?止移?行行の流流れ
?? まとめ
Rails複数DBシステム
?? システム概要
–? 管理理DBが1つ
?? メタ情報
?? DB接続先
–? テナントDBが多数
?? テナント毎に
データベースが独?立立
?? スキーマはテナント毎
で異異なる
移?行行する
?? 無停?止でMySQLからPostgreSQLに
数か?月かけて移?行行していく
どうやって?
むずかしい???
?目次
?? 本?日お話しすること
?? Rails複数DBシステム
?? データベース移?行行
?? 無停?止移?行行の流流れ
?? まとめ
検討したこと
?? データの移?行行?方法
–?スキーマの定義情報、データ
?? 移?行行データの検証
?? MySQL?PostgreSQL互換性
?? 移?行行期間中のシステムの動き
データの移?行行?方法1
?? 論論理理ダンプ?変換?投?入
–? 出?力力されたDDL, ?DMLを正規表現で
PostgreSQLで投?入可能なように変換
データの移?行行?方法1
?? 論論理理ダンプ?変換?投?入
–? 出?力力されたDDL, ?DMLを正規表現で
PostgreSQLで投?入可能なように変換
荒業っぽいが意外と問題ない!
荒業そのものという気もする
データの移?行行?方法2
型の変換
変換後はPgSanityを使ってクエリが構?文レベルで
壊れていないことをチェック
MySQL PostgreSQL 注意点
tinyint(1) boolean 数値→true/false
varchar citext 検索索時の?大?文字?小?文字の挙動
auto_?increment serial シーケンスの初期値をsetvalすること。
(現在値はDDLに吐き出される)
blob bytea バイナリも正規表現で置換可能!
line.gsub!(/0x([0-‐??9,A-‐??F]+)/, ?
 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"decode('1','hex')")
検討したこと
?? データの移?行行?方法
–?スキーマの定義情報、データ
?? 移?行行データの検証
?? MySQL?PostgreSQL互換性
?? 移?行行期間中のシステムの動き
データの検証?方法1
?? 移?行行したデータの検証は?
–? レコード件数の?比較?
–? データの内容のチェック?
?? MySQLとPostgreSQLが型が違うのに
どうすれば同?一といえる?
–? はたまた?目grep?
?? そんな?馬?鹿鹿な
データの検証?方法2
?? ActiveRecordとMD5でやる
–? 全テーブルに対応するモデルを動的?生成し、
各レコードのattributeを?足し合わせてMD5を計算する
–? その?二つのリストをdi?を取ることで少なくとも
ActiveRecordのレイヤでは同?一であることを保証する
検討したこと
?? データの移?行行?方法
–?スキーマの定義情報、データ
?? 移?行行データの検証
?? MySQL?PostgreSQL互換性
?? 移?行行期間中のシステムの動き
挙動の違いの埋め?方1
?? MySQLとPostgreSQLで
挙動の違うクエリをどうやって埋めるか
–? case ?insensitiveな?文字列列検索索
–? キャストの挙動の違い
–? order ?by時のnullの扱い
–? 曖昧なgroup ?by
–? トランザクション分離離レベルの違い
–? Etc…
挙動の違いの埋め?方2
?? PostgreSQLの豊富な機能を使う
–? 演算?子の独?自定義
–? citextなどの独?自型
?? 検討のけっか、どうしても回避できないところは
クエリ書き換えで対応するしかない
–? 泥泥臭くてもそれしか答えがないときは
受け?入れるしかない
–? 検討して?方法がないなら仕?方がない
検討したこと
?? データの移?行行?方法
–?スキーマの定義情報、データ
?? 移?行行データの検証
?? MySQL?PostgreSQL互換性
?? 移?行行期間中のシステムの動き
移?行行期間中
?? システムはMySQLとPostgreSQLを両?方参照し
ながら稼働する必要がある
アダプタタイプを?見見て
接続先で発?行行すべきクエリを決定する。
ただのif?文かつActiveRecordなら
コネクションのアダプタタイプを
取れるので簡単に実現可能
?目次
?? 本?日お話しすること
?? Rails複数DBシステム
?? データベース移?行行
?? 無停?止移?行行の流流れ
?? まとめ
無停?止移?行行の流流れ1
①まずはPostgreSQL側に、管理理DBとテナント?用のDBを?用意する
無停?止移?行行の流流れ2
②管理理DBの更更新を停?止し、移?行行する
③移?行行された管理理DBを参照する両対応アプリをリリースする
無停?止移?行行の流流れ3
④テナントを?一件?一件、データを移?行行していく
? (移?行行時間中は対象テナントはシステム停?止、他は稼働し続ける)
無停?止移?行行の流流れ4
⑤最後までやりきる
簡単でしたか?
?? わずか5ステップで無停?止移?行行が完了了!
?? 簡単に?見見えるのは、簡単にかいつまんだから
?? 問題を整理理して課題を洗い出してそのそれぞれに
ついてどう対処するか決定していく段取りが必要
–? 準備?八割??行行動?二割
?目次
?? 本?日お話しすること
?? Rails複数DBシステム
?? データベース移?行行
?? 無停?止移?行行の流流れ
?? まとめ
まとめ
?? すぐに役?立立つ事例例ではないが考え?方などは
役?立立つと思うので参考になれば
?? RDBMS間でデータ移?行行の時は、
論論理理ダンプをコンバートするとよい
?? データの検証は、OR ?Mapperなど上位のレイヤで
同?一性を確認できると楽
?? 解決策を探ったうえでシンプルな解決策が無い場合は
腹をくくって泥泥臭くやる
?? 無停?止移?行行は、準備?八割??行行動?二割
以上です
?? 勉強会で出た質問
–? 規模は?
→ざっくりギガです。1~~1000のオーダーはご想像にお任せします。
–? テナントの停?止が?一晩で終わらないとかなかった?時間の?見見積もりは?
→事前にデータの規模ベースでベンチマークを?行行い、予測を?立立てた
→移?行行が?立立て込んでる?日は並列列ダンプ&並列列リストアで?高速化を図った
–? 無停?止と?言っているが、移?行行中は対象テナントは停?止しているのでは?
→その通りです。システム全体として無停?止という話なので、ちょっと誤解しやすい説明でした。
?? 回答を拒否した質問
–? 移?行行を決断するに?至った理理由は?
–? 寿司とビール、区別つきますか?
–? いつの話ですか?
?? 本?日の内容は以下のブログでもまとまっています
–? http://www.techscore.com/blog/2014/12/05/rails_?db_?migration/

More Related Content

#riding_rails Rails複数DBシステム MySQLからPostgreSQL移行物語