Slide 1

Slide 1 text

Data migration from As400 to MySQL using Node part.1 naoki matsuzaki

Slide 2

Slide 2 text

Part.1?

Slide 3

Slide 3 text

ここからはレガシーな基幹システムが直面するデータマ イグレーションの問題にフォーカスしてます。 Web系業界では、遭遇することはない (はず...) こんなことやってるぐらいのものが得られたと。 前書き

Slide 4

Slide 4 text

初期システム構成図 社内NW AS400 Client PC CSBridge ECサイト(ECCUBE) 在庫情報CSV アップロード レンタルサーバー 不可逆データ

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

AS400(IBM i)とは? IBM社が1988年に発表 中規模コンピュータ(ミッドレンジサーバー)の統合型システム 以前まではAS400と呼んでいたが、2008年からIBM iに名称変更 うちのシステムは何回かリプレイスを重ね、今のは2010年から利用 変遷 AS400→iSeries→System i→IBM i

Slide 7

Slide 7 text

システム構成での課題 ● 在庫がリアルタイムではない ○ 手作業で在庫アップロード ○ 欠品状態での購入が起こり得る ■ 70%在庫表示でカバー ● ECサイトのデータは基幹に戻せない ○ ECサイト経由の受注は、再度基幹で受注入力する必要がある 人の作業が多すぎる

Slide 8

Slide 8 text

そもそも概念が違う ● テーブル(AS400ではライブラリと呼ぶ)の連結でデータを取得する想定なし ● カラム(AS400ではフィールドと呼ぶ)が全て固定長 ○ 品名1は「”TM-96-12 ”」など ○ 品名1はユニークキー的もの ● テーブル名やカラム名が全て推測しにくい情報 ○ 商品マスターは「FXMVJB00」 ○ 品名1は、「HIN1CD」 データ連携 & マイグレーションの課題 MySQLと構造が異なるため、データマイグレーションの対応が必要

Slide 9

Slide 9 text

第一Phase システム構成図(ECサイトリプレイス) 社内NW Client PC CSBridge ECサイト(Rails) MacMini (サーバー) AS400 MacMiniを使い、Cronで在庫情報をUpdate 在庫情報 その他マスターデータ

Slide 10

Slide 10 text

第二Phase システム構成図(基幹システム段階的移行) AS400 Client PC CSBridge 社内NW MacMini (サーバー) ・ECサイト ・基幹システム (/admin) 請求・支払明細・原価締周りを AWSで生成

Slide 11

Slide 11 text

第三Phase システム構成図(完全移行) ・基幹システム(/admin) ・ECサイト 社内システムとして AWSが稼働する 全ての受注は、 Rails経由とする

Slide 12

Slide 12 text

もう時間足りない?ここからが本番です〜〜

Slide 13

Slide 13 text

MacMiniの仕組み 社内NW Client PC CSBridge ECサイト(Rails) MacMini (サーバー) AS400

Slide 14

Slide 14 text

MacMiniの仕組み(改善前) AS400 Docker endpoint用意 image pull 以下を利用 ・ActiveStorage ・ActiveJob jsonファイル

Slide 15

Slide 15 text

● NodeでODBCを使いAS400にアクセス ○ SQLを使い、データ取得 ● Nodeで取得したJSONデータをActiveStorageに保存 ● 上記をテーブル毎に繰り返し ● 全てのデータ取得完了後、NodeからActiveJobをキック ● ActiveJobでJSONデータを解析 ○ フィールドのマッピングや変換 ● 対象テーブルにデータ登録 ○ データ登録は、Activerecord-importを利用(upsert) JSONファイル作成&利用

Slide 16

Slide 16 text

大量データ処理なので時間がかかる (24時間かけても処理が終わらない )

Slide 17

Slide 17 text

どうしよ...🤔

Slide 18

Slide 18 text

MacMiniの仕組み(改善版) AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx ● JSONファイルをCSVファイル生成に変更 ● CSVファイルをnode-mysql2を使い、LOAD DATA INFILE構文でimport ○ そのままのデータを投入するテーブルを用意 ● テーブルごとに上記を繰り返し実行 products transform

Slide 19

Slide 19 text

https://dev.mysql.com/doc/refman/8.0/ja/load-data.html

Slide 20

Slide 20 text

まだ遅い...🤦

Slide 21

Slide 21 text

MacMiniの仕組み(改善版) AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx 要はここのCSV作成までが時間かかる

Slide 22

Slide 22 text

AS400 Docker node-mysql2 image pull CSVファイル as400_table_xxx ここ差分でいいのでは? MacMiniの仕組み(改善版) ここ差分でいいのでは?

Slide 23

Slide 23 text

MacMiniの仕組み(改善版) AS400 Docker node-mysql2 CSVファイル as400_table_xxx 最新日時取得 最新日時よりも後データを取得 as400_latest_created_at as400_latest_updated_at

Slide 24

Slide 24 text

LOAD DATA INFILE importの差分 & 全件import ● Railsに対象テーブルの最新作成日時と最新更新日時を取得 ○ いつ最後に処理を実行したかを判断可能 ● 次回importはその日時より後に作成されたレコードを取得する SQLとする ● 作成日時と更新日時が正常に更新されないテーブル ● 物理削除されるテーブル(削除レコードが追えない) 上記は、件数次第では毎回全件 importとする

Slide 25

Slide 25 text

解決解決!!とはまだまだいかず ...

Slide 26

Slide 26 text

興味あればPart.2も (割とギークな話)

Slide 27

Slide 27 text

MacMiniのimport改善の続き ● Node非同期処理の順次処理化 ● 管理画面からMacMiniのimportがいつでも実行できるように変更した話 ○ cronを管理画面で登録して呼び出す方法 ● ODBCで投げるSQLを自動生成した話 ● Railsのmigration作成をcsvファイルのテーブル定義で自動生成する話

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

● Markdownファイルを指定ディレクトリに設置したら、管理画面で閲覧できるようにし た話 ● リソース不足を乗り切るため、技術スタックを変更した結果 ● 最新 Rails ver.8を使い、Rails wayに乗っかってみる(Node、Redisを消去) ● Copilotのカスタム指示を利用し、育ててみる ● PRレビューで見るべき視点をまとめてみた その他

Slide 30

Slide 30 text

● データ移行は可能だが、めちゃくちゃ大変 ● データマイグレーションは、プログラムを書くよりも大 変かつ重要な部分 ○ 引き続き最適な方法を模索する ● プロダクト改善に長期的目線で対応していくのは自社 開発の醍醐味 総括

Slide 31

Slide 31 text

Continue…