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
Data migration from As400 to MySQL using Node
Search
Nao
January 21, 2025
1
28
Data migration from As400 to MySQL using Node
基幹システムのData migration
Nao
January 21, 2025
Tweet
Share
More Decks by Nao
See All by Nao
React→Hotwireへ 技術スタック変更した話
nao_072
7
3.5k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Speed Design
sergeychernyshev
25
750
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Code Review Best Practice
trishagee
65
17k
The Power of CSS Pseudo Elements
geoffreycrofte
74
5.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
590
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
RailsConf 2023
tenderlove
29
980
Designing Experiences People Love
moore
139
23k
Transcript
Data migration from As400 to MySQL using Node part.1 naoki
matsuzaki
Part.1?
ここからはレガシーな基幹システムが直面するデータマ イグレーションの問題にフォーカスしてます。 Web系業界では、遭遇することはない (はず...) こんなことやってるぐらいのものが得られたと。 前書き
初期システム構成図 社内NW AS400 Client PC CSBridge ECサイト(ECCUBE) 在庫情報CSV アップロード レンタルサーバー
不可逆データ
None
AS400(IBM i)とは? IBM社が1988年に発表 中規模コンピュータ(ミッドレンジサーバー)の統合型システム 以前まではAS400と呼んでいたが、2008年からIBM iに名称変更 うちのシステムは何回かリプレイスを重ね、今のは2010年から利用 変遷 AS400→iSeries→System i→IBM
i
システム構成での課題 • 在庫がリアルタイムではない ◦ 手作業で在庫アップロード ◦ 欠品状態での購入が起こり得る ▪ 70%在庫表示でカバー •
ECサイトのデータは基幹に戻せない ◦ ECサイト経由の受注は、再度基幹で受注入力する必要がある 人の作業が多すぎる
そもそも概念が違う • テーブル(AS400ではライブラリと呼ぶ)の連結でデータを取得する想定なし • カラム(AS400ではフィールドと呼ぶ)が全て固定長 ◦ 品名1は「”TM-96-12 ”」など ◦ 品名1はユニークキー的もの
• テーブル名やカラム名が全て推測しにくい情報 ◦ 商品マスターは「FXMVJB00」 ◦ 品名1は、「HIN1CD」 データ連携 & マイグレーションの課題 MySQLと構造が異なるため、データマイグレーションの対応が必要
第一Phase システム構成図(ECサイトリプレイス) 社内NW Client PC CSBridge ECサイト(Rails) MacMini (サーバー) AS400
MacMiniを使い、Cronで在庫情報をUpdate 在庫情報 その他マスターデータ
第二Phase システム構成図(基幹システム段階的移行) AS400 Client PC CSBridge 社内NW MacMini (サーバー) ・ECサイト
・基幹システム (/admin) 請求・支払明細・原価締周りを AWSで生成
第三Phase システム構成図(完全移行) ・基幹システム(/admin) ・ECサイト 社内システムとして AWSが稼働する 全ての受注は、 Rails経由とする
もう時間足りない?ここからが本番です〜〜
MacMiniの仕組み 社内NW Client PC CSBridge ECサイト(Rails) MacMini (サーバー) AS400
MacMiniの仕組み(改善前) AS400 Docker endpoint用意 image pull 以下を利用 ・ActiveStorage ・ActiveJob jsonファイル
• NodeでODBCを使いAS400にアクセス ◦ SQLを使い、データ取得 • Nodeで取得したJSONデータをActiveStorageに保存 • 上記をテーブル毎に繰り返し • 全てのデータ取得完了後、NodeからActiveJobをキック
• ActiveJobでJSONデータを解析 ◦ フィールドのマッピングや変換 • 対象テーブルにデータ登録 ◦ データ登録は、Activerecord-importを利用(upsert) JSONファイル作成&利用
大量データ処理なので時間がかかる (24時間かけても処理が終わらない )
どうしよ...🤔
MacMiniの仕組み(改善版) AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx • JSONファイルをCSVファイル生成に変更
• CSVファイルをnode-mysql2を使い、LOAD DATA INFILE構文でimport ◦ そのままのデータを投入するテーブルを用意 • テーブルごとに上記を繰り返し実行 products transform
https://dev.mysql.com/doc/refman/8.0/ja/load-data.html
まだ遅い...🤦
MacMiniの仕組み(改善版) AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx 要はここのCSV作成までが時間かかる
AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx ここ差分でいいのでは? MacMiniの仕組み(改善版) ここ差分でいいのでは?
MacMiniの仕組み(改善版) AS400 Docker node-mysql2 CSVファイル as400_table_xxx 最新日時取得 最新日時よりも後データを取得 as400_latest_created_at as400_latest_updated_at
LOAD DATA INFILE importの差分 & 全件import • Railsに対象テーブルの最新作成日時と最新更新日時を取得 ◦ いつ最後に処理を実行したかを判断可能
• 次回importはその日時より後に作成されたレコードを取得する SQLとする • 作成日時と更新日時が正常に更新されないテーブル • 物理削除されるテーブル(削除レコードが追えない) 上記は、件数次第では毎回全件 importとする
解決解決!!とはまだまだいかず ...
興味あればPart.2も (割とギークな話)
MacMiniのimport改善の続き • Node非同期処理の順次処理化 • 管理画面からMacMiniのimportがいつでも実行できるように変更した話 ◦ cronを管理画面で登録して呼び出す方法 • ODBCで投げるSQLを自動生成した話 •
Railsのmigration作成をcsvファイルのテーブル定義で自動生成する話
None
• Markdownファイルを指定ディレクトリに設置したら、管理画面で閲覧できるようにし た話 • リソース不足を乗り切るため、技術スタックを変更した結果 • 最新 Rails ver.8を使い、Rails wayに乗っかってみる(Node、Redisを消去)
• Copilotのカスタム指示を利用し、育ててみる • PRレビューで見るべき視点をまとめてみた その他
• データ移行は可能だが、めちゃくちゃ大変 • データマイグレーションは、プログラムを書くよりも大 変かつ重要な部分 ◦ 引き続き最適な方法を模索する • プロダクト改善に長期的目線で対応していくのは自社 開発の醍醐味
総括
Continue…