page_adsence

2015年1月23日金曜日

MySQLからMongoDBへのデータ移行 まとめ

MySQLからMongoへのデータ移行手法に関してはほぼFixしたのでメモ。
過去記事に関しては以下を参照。

MySQLからMongoDBへのデータ移行
MySQLからMongoDBへのデータ移行 その2
MySQLからMongoDBへのデータ移行 その3

今回移行対象のデータ件数は4000万件程度。
件数としてはビックデータとは言えない微妙な件数・・・。

まず結論から。
  • MySQLからデータを抽出する方法に関してはeオプションを使って、標準出力をファイルにリダイレクトさせる。BSON形式っぽいTSVファイルにして出力する。
  • ちゃんとしたBSON形式に変換する。ダブルクォーテーションのエスケープとか、改行コードをCRLFに変換とか、変な文字列の削除とか諸々必要
  • mongoimportは決して早くない。と思う。(チューニングしてないので。)
  • BSON形式以外のインポートはお勧めできない。型変換に異常に時間がかかるため。
  • mongoimport中に重複があったとしてもエラーメッセージは出てこない。すでに重複するデータがmongoに入っていた場合はエラーが出る。

mongoimportの速度に関して

これに関してはあまり書くことはないが、とりあえず4000万件のデータを入れるのに7.5時間位掛かりました。
2.1系から2.6.5にバージョンアップしたら倍位遅くなりました。原因はまだ不明です。
上の時間はバージョンアップ後の時間です。
ちなみにサーバ構成はこんな感じです。
mongos×3台、mongod×6台(うちマスター3台、スレーブ3台)

mongoimportのファイル形式に関して

結果的にはファイル形式に関してはBSON形式一択でした。
CSVやTSV形式だと、データ型を定義することが出来ないため、
純粋な数値以外は全てテキスト型になってしまうので、日付のデータやNULLに関しては書き換えが必要になる。
データ量が多くなるとその書き換えに非常に時間がかかる。

mongoimportのエラーに関して

これに関しては色々調べたんですけど、結局良くわからず・・・。
エラーが出たらインポート止めるっていうオプションもあるらしいのですが、そのオプションをつけても重複エラーに関しては止まらないらしいです。