JJUG CCC 2023 Spring に登壇してきました!

エキサイト株式会社の中尾です。

JJUG CCC 2023 Spring に登壇してきました。

エキサイトブログのリビルドの詳細はブログに記載されている通りです。

tech.excite.co.jp

JJUG では リビルドの話を中心にしましたが、質問でデータ移行の話が多かったので、ブログに記載します。

データ移行にはembulkを使いました。

データ移行

embulkとは

データ転送を支援するオープンソースの並列バルクデータローダーです。

www.embulk.org

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分程度で終わるようになりました。

データ移行に時間をかけると、メンテナンス時間が必然的に伸びます。

ユーザに迷惑をかけないように、メンテナンス時間を短くする工夫も大事だと思いますので、参考になればと思います。