エキサイト株式会社の中尾です。
JJUG CCC 2023 Spring に登壇してきました。
エキサイトブログのリビルドの詳細はブログに記載されている通りです。
JJUG では リビルドの話を中心にしましたが、質問でデータ移行の話が多かったので、ブログに記載します。
データ移行にはembulkを使いました。
データ移行
embulkとは
データ転送を支援するオープンソースの並列バルクデータローダーです。
SQL ServerからPostgreSQLに移行するときに使用しました。 AWS DMSを検討しましたが、AWSの人にやめろといわれたのでやめました。 CSVは、絵文字や空白、null判定など手動で変更する必要があるデータが多いのでやめました。 EmbulkはJavaがそれぞれのDBに対してよしなに調整してくれるので使いました。
データ移行のツールはEmbulkを使いました。手法は2通りあります。
データ移行方法(全件更新)
全件更新は以下の通り、データの取得元を SQL Server、データの移行先をPostgreSQLに設定するだけです。特に加工していません。
in: type: sqlserver host: localhost user: myuser password: "" instance: MSSQLSERVER database: my_database table: my_table out: type: postgresql host: localhost user: pg password: "" database: my_database table: my_table mode: insert
データ移行方法(差分更新)
エキサイトブログのサービスは長いため、記事データが大量にあります。 記事データの移行に1時間以上を要したため、移行方法を工夫して移行時間を短くしました。
まず、最初に全件のデータを挿入し、次の日からは差分のあったデータだけに絞ってデータを更新しました。
しかし、このままでは削除されたデータの同期ができません。
削除されたデータ用の履歴テーブルを用意し、
- SQL Serverでは、削除されるたびにデータを登録します。
- PostgreSQLでは、削除テーブルにあるレコードを基準に、元のテーブルのレコードを削除します。
差分のあるレコードは、outのmodeをmergeにすることで自動的に上書きされます。
in: type: sqlserver host: localhost user: myuser password: "" instance: MSSQLSERVER database: my_database table: my_table where: date >= 'バッチ実行時間' out: type: postgresql host: localhost user: pg password: "" database: my_database table: my_table mode: merge
まとめ
事前投入には1時間以上を要しますが、次の日からは差分のあったデータのみに絞られるため、1分程度で終わるようになりました。
データ移行に時間をかけると、メンテナンス時間が必然的に伸びます。
ユーザに迷惑をかけないように、メンテナンス時間を短くする工夫も大事だと思いますので、参考になればと思います。