Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
段階的なシステムリプレースを実現するデータ同期技術
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
s2terminal
September 13, 2019
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
段階的なシステムリプレースを実現するデータ同期技術
s2terminal
September 13, 2019
More Decks by s2terminal
See All by s2terminal
TypeScriptでJupyter
s2terminal
0
120
AIをWebアプリに実装するための便利なPythonライブラリ
s2terminal
0
640
NiceGUI is Nice
s2terminal
0
840
1年でモダンなフロントエンドに追いついた話 2019-08-22 Mix Leap Joint #26
s2terminal
0
50
20190706 BCU30 事業を変えるシステムリプレース
s2terminal
0
70
Cognitive Complexity でコードの複雑さを定量的に計測しよう
s2terminal
2
190
MySQLオンラインマイグレーションツールgh-ostで深夜メンテナンスを無くした話
s2terminal
0
74
Microsoft Azureで 女子力を生成する
s2terminal
0
69
かんたん機械学習はじめの1歩AzureMachineLearningでTweetをレコメンド
s2terminal
0
60
Other Decks in Technology
See All in Technology
運用を見据えたAIエージェント設計実践
amacbee
1
2.9k
Agentic Web
dynamis
1
130
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development
yoshidashingo
1
370
DevOps Agentで始めるAWS運用 〜フロンティアエージェントが変える運用の現場〜
nyankotaro
1
230
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
190
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.5k
React、まだ楽しくて草
uhyo
7
4.1k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
6
3.8k
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
2
150
AIを「創る」と「使う」の循環 — HRテックが実践するリアルなAI組織実装
taketo957
0
1.5k
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
4
1.1k
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How to build a perfect <img>
jonoalderson
1
5.6k
Side Projects
sachag
455
43k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Facilitating Awesome Meetings
lara
57
6.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
We Have a Design System, Now What?
morganepeng
55
8.2k
Visualization
eitanlees
152
17k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
580
Transcript
段階的なシステムリプレースを実現するデータ同期技術 Ateam Tech Meetup Vol.9 株式会社エイチームフィナジー テクニカルソリューション部 R&Dチーム 鈴⽊就⽃ GitHub
@s2terminal Twitter @suzukiterminal Qiita @suzuki_sh
© 2018 Ateam Inc. 今回お話する対象サービス ◧ ⾦融メディア事業の中のいちWebメディア ◧ 2013年12⽉(約 5
年半前)ローンチ ◧ グループ最⼤規模の売上に成⻑ 図: エイチームグループ ライフスタイルサポート事業の売上規模推移
© 2018 Ateam Inc. 3 画像の出典: https://unsplash.com/photos/O2MdroNurVw 運⽤を続けるうちに、システムが肥⼤化・複雑化 Webサイト上のコンテンツの ”正確な”
管理・更新が 問題となっていった
© 2018 Ateam Inc. 4 画像の出典: https://pixabay.com/images/id-1743963/ 複雑化した旧システムを刷新し 新しいシステムへ段階的な リプレースを実現したい
社内向け管理画⾯とお客様向けのページでは 失敗時のリスクの重さが異なる ページによっても広告出稿の 影響度の⼤⼩がある
© 2018 Ateam Inc. 5 システムリプレースの前提条件 新システムを機能毎に⼤きく3つのTier(段階)に分け Tier内でもURL毎に影響度の⼤⼩で分割し、段階的にリプレースした。 旧システムはPHPで動いているが、新システムには 社内に技術的な資産の多いRuby
on Railsへのリプレースを選択。 当然、RubyとPHPでは技術的に互換性は無いが、同時に稼働させる必要がある。 影響度の低い箇所から、段階的に移⾏したい そのため、移⾏期間中は 新旧の両システムを同時に稼働させたい
© 2018 Ateam Inc. 6 リプレースの構成概要と データ同期 画像の出典: https://pixabay.com/images/id-3246116/
© 2018 Ateam Inc. 7 データを同期させる必要 ユーザ向け ページ 社員向け 管理画⾯
旧システム MySQL データベース リプレース前の状態
© 2018 Ateam Inc. 8 データを同期させる必要 ユーザ向け ページ 社員向け 管理画⾯
MySQL データベース 旧システム ユーザ向け ページ 社員向け 管理画⾯ 新システム データ同期 MySQL データベース
© 2018 Ateam Inc. 9 新システムへのリプレース後の各データの扱い マスタデータ トランザクションデータ 旧システム Readのみ
Read/Write両⽅可能 新システム Read/Write両⽅可能 扱わない 今回のタイミングではマスタデータのみをリプレースし、 顧客申込情報などのトランザクションデータは まだ新システムでは取り扱わない事にした。 ■今回のプロジェクトの⽬的はマスタデータの取り扱いの課題からであり、 トランザクションデータを扱うシステムのリプレースは必須ではなかった ■移⾏先のシステムの仕様上、両者はシステム的に分離可能だった
© 2018 Ateam Inc. 10 データを同期させる必要 マスタデータのみを新システムに持っていくと決めたが 依然として、新システムと旧システムとを同時に稼働させ、 段階的にリプレースする必要がある。 新旧システム間のDBスキーマの形式は、似ているものの
完全⼀致するわけではない。 段階的なリプレースを実現するには、新旧の異なるシステムで 同⼀のマスタデータを参照できるようにする必要がある。
© 2018 Ateam Inc. 11 データ同期を実現した 3つの技術 画像の出典: https://pixta.jp/photo/46119614
© 2018 Ateam Inc. 12 データ同期の技術 ユーザ向け ページ 社員向け 管理画⾯
データベース 旧システム ユーザ向け ページ 社員向け 管理画⾯ データベース 新システム ②継続的な変更反映 ①初期移⾏ ③変換
© 2018 Ateam Inc. 13 1: 旧システム→新システムへの初期データの移⾏ 旧システムのデータを新システム⽤に変換する スクリプトを開発 •
新システムをリリースする時に、1度だけ実⾏。 • 新システム側のモデルクラスとして扱うため、 新システム側にRubyプログラムとして実装。 • プログラムの中⾝は、旧システムのデータをSQLで取得し 新システム側のデータモデルとして保存するもの。
© 2018 Ateam Inc. 14 2: 新システム→旧システムへと継続的にデータの変更を反映 • MySQL Replicationを使って
新システムから旧システムにデータを複製。 • Replicationは枯れた仕組みであり、運⽤も⽐較的低コスト • 今回発⽣する変更は社員向け管理画⾯のマスタデータ操作のみのため、 データ同期の反映は⾮同期でOK。 数秒のレプリケーション遅延は許容範囲だった。 • 別途データの変換を⾏う必要がある 開発当初の案としては、EmbulkやRubyのスクリプトを書いて 定期的にバッチ処理を動かすことで、新システムから旧システムへ データを変換しながら転送することを考えていた。 運⽤におけるコストの⾼さ(整合性の保証やリトライなど)が懸念で、やめた。
© 2018 Ateam Inc. 15 3: 旧システムで利⽤できるスキーマに変換 • MySQL Viewを使い、新システムのデータを
旧システムのスキーマに沿うように変換した。 • MySQL Replicationは同⼀データをそのまま複製するだけなので、 そのままのデータを旧システム上では使えない。 • 基本的に、新システムの機能は旧システムの上位互換となっていたため 旧システムのデータは新システムのデータのみを使って表現できた。 • 不⾜した部分は専⽤のテーブルを作るか、簡単なCASE⽂で対処 • Replicationで作られたテーブルを参照するViewを作り、 RENAME TABLEで新旧のテーブル名を差し替える事で 旧システムの参照データを新システムの物にリプレース。
© 2018 Ateam Inc. 16 データ同期の技術 データベース 旧システム データベース 新システム
②継続的な変更反映 ①初期移⾏ ③変換 新旧システム間でのデータ同期が実現
© 2018 Ateam Inc. 17 Amazon Aurora MySQLでの レプリケーションを利⽤した データ同期
画像の出典: https://pixta.jp/illustration/50017474
© 2018 Ateam Inc. 18 Amazon Aurora MySQLにおけるレプリケーションの利⽤ 今回のサービスは、DBにAmazon Aurora
MySQLを利⽤ Auroraにbinlogベースのレプリケーションを⼿動で構築 AWS側にもフルマネージドのレプリケーション機能は存在しているが、 インスタンス毎の完全なレプリカ作成しかできない。 今回は、旧システムのデータベースインスタンス内に 新システムのテーブルを共存させる必要があったため、binlogで⼿動構築。 Amazon Aurora MySQL とは AWSで提供されている、MySQLと互換性のあるマネージドのRDBMS パフォーマンス、セキュリティ、可⽤性の⾼さが特徴
© 2018 Ateam Inc. 19 Amazon Aurora MySQLにおけるレプリケーションの利⽤ Amazon Aurora
MySQLは、binlogを利⽤した ⼿動でのレプリケーション構築にも対応している。 外部のMySQLデータベースへデータを複製するための⼿段として、 AWS公式ドキュメントにも⼿順が紹介されている。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aur oraMySQL.Replication.MySQL.html 通常のMySQLでは「CHANGE MASTER TO」などのコマンドを使うところが AWS専⽤のコマンドに置き換えられている箇所があるため、要確認。
© 2018 Ateam Inc. 20 Amazon Aurora MySQLにおけるレプリケーションの利⽤ AWS CloudWatchでのレプリケーション遅延の監視
CloudWatchの「AuroraBinlogReplicaLag」というメトリクスで レプリケーション遅延 (いわゆる Seconds_Behind_Master) が、 CloudWatch上で計測できる。 似た名称の「AuroraReplicaLag」というメトリクスがあるが これはAWSのフルマネージド機能で作られたレプリカの話であり、 binlogベースのレプリケーション遅延ではない点に注意。
© 2018 Ateam Inc. 21 初期移⾏スクリプトと、MySQLのReplication・Viewを使い 新システムのマスタデータを、旧システムでも利⽤可能に。 このデータ同期により、同⼀のマスタデータを取り扱う 新システムへの段階的な移⾏が実現した。 管理画⾯やユーザ向けページを影響度毎に切り分け
部分的に旧システムを稼働させたまま、 新システムに移⾏できた。 まとめ 画像の出典: https://unsplash.com/photos/ckfkPwCEMNs
© 2018 Ateam Inc. 22 Links • 事業を変えるシステムリプレース • https://logmi.jp/tech/articles/321808
• 今回のリプレースについての、別の場所での発表資料です。 • 「なぜリプレースをしたか」「なぜRubyを選んだか」等についてはこちらを参照ください。 • 画像の出典 • https://unsplash.com/photos/O2MdroNurVw • https://unsplash.com/photos/ckfkPwCEMNs • https://pixabay.com/images/id-1743963/ • https://pixabay.com/images/id-3246116/ • https://pixta.jp/photo/46119614 • https://pixta.jp/illustration/50017474
「みんなで幸せになれる会社にすること」 「今から100年続く会社にすること」