Blog

ZabbixのDBをMySQL⇨TimscaleDBにマイグレーションしてみた

 はじめに

こんにちは、新卒1年目のmoriです。

私が現在 OJTで所属している部署では、ネットワーク機器やサーバーの監視にZabbixを用いています。

しかし、登録機器が増えすぎた結果、情報の記録に用いているMySQLサーバーへの書き込みが増え、ディスクの書き込みも増加。
ディスクIO過多によってCPU使用率も100%に張り付いてしまいました。

そこで、Zabbixで使用しているDBを、TimescaleDBへの変更し、解決を図りました。

TimescaleDBとはPostgreSQLの拡張機能で、大量にある時系列データをhyper tableに分割することによって効率的に管理することが可能になります。

実行前にここだけは読んでほしい

私が苦労した原因のほとんどはリソース不足によるものです。 こちらは、「もっと早く言ってよ!」となりかねない情報なので最初に書いておきます。

  1. DBマイグレーションをするだけではCPU使用率の削減には繋がらない場合も
    1. 今回の場合は純粋にZabbixの処理不可によるものだったので解決しなかった
  2. マイグレーション実行環境のマシンスペックは強めに取った方がいい
  3. メモリを多めに積んでください
    1. 16GBで足りず、32GBにしました。
  4. ディスクの容量は移行するデータサイズの4倍程度は欲しい
    1. 各移行段階のデータを保持したいならそのくらい必要です

マイグレーションの流れ

今回は以下のような手順に沿って既存データをMySQLからPostgreSQLにマイグレーションしました。

  1. 既存DBからmydumperを用いてデータをダンプ
  2. myloaderを用いて、マイグレーション用環境のMySQLにデータを取り込み
  3. pgloaderを用いて、MySQL→PostgreSQLにデータ移行
    1. pg_dumpを用いて通常PostgreSQL状態のダンプを実行
  4. 通常のPostgreSQLからTimescaleDB環境に変換するためのスクリプトを実行

1. mydumper

はじめにmydumperを用いて、既存のZabbixのログデータをダンプします。

本番環境を長時間停止して、同環境で直接作業できるならスキップ可能です。

ここでの詰まりポイントは、--events --triggers オプションとrootユーザーでの実行になります。これらのオプションを付けないとevent~tiggers~ といったテーブルのダンプが取れません。

また、triggers~ 系のテーブルはrootユーザーでないとダンプすることができませんでした。

2. myloader

続いてmydumperでダンプしたデータをマイグレーション作業環境のMySQLに取り込みなおす工程です。ダンプしたデータはsftpなりで移してください。

普通に実行すると、eventsよりもevent-XXXX テーブルが先に取り込まれてしまい、外部キー制約関係のエラーが出るので、適当にディレクトリを作ってそこにeventsテーブルのダンプデータを移動して先に取り込む必要がありました。

その後events以外要素を取り込むことでうまく取り込めます。

また、取り込み時でもtrigger-XXXX テーブルが通常ユーザーでは取り込めなかったためrootユーザーで取り込みを実行する必要が有りました。

3. pgloader

作業環境MySQLにデータを取り込めたのでいよいよ、MySQL→ PostgreSQLマイグレーションを実行します。

pgloaderは接続情報やオプションをファイルに記述できるので書いておきます。

こちらでlocalhostでDBを指定するとsocketにつなぎにいくため、dockerでDBを動かす場合はループバックアドレスを使用する必要があります。

以下をmy.loadとして保存

pgloaderを用いたマイグレーション作業は、かなり色々なエラーが発生したので、ログを交えつつ説明していきます。

エラーの数が多すぎて正確な順番を覚えていないため、順番が前後しているかもしれません。ご了承くださいください。

3.1 文字コード変換エラー

ubuntuのaptからインストールできるpgloader 3.6.7~develは文字コード変換エラーが発生して動作しないので最新版の3.6.9のソースコードをダウンロード&ビルドしてそれを使用することで解決しました。

自分の環境ではビルドするのにopenssl-develとsbclが足りなかったので追加でインストールしました。

3.2 MySQLの認証方法変更

pgloaderがMySQLの新しい認証方式に対応してない関係でMySQLに接続できないので、設定を変更する必要があります。 (デフォルトの認証プラグインがcaching_sha2_password に変わっているため)

3.3 GCのメモリ不足

オプションでの指定なしで実行すると、データが大きすぎるため作業メモリが足りず、GCのエラーを吐いて停止してしまうのでメモリの割当を増やして対応します。

また、オプションでメモリ割当を増やしても、マシンに搭載されているメモリが不足すると、「MySQLのタイムアウトが発生した」旨のエラーが発生して停止してしまいます。

一応設定でタイムアウトまでの時間を延長し、それでも同じエラーが出るようでしたら、メモリが多い環境で実行するようにしてください。

GCエラー

MySQLのタイムアウト

 

3.4 ようやくの成功

成功すると以下のような結果が出力される

 

3.5. pgdump

pgloaderでMySQLからデータを移行しただけでは、通常のPostgreSQLのテーブル構造になっているため、TimescaleDB用の構造に変換する必要があります。

万が一変換に失敗した時のために、この段階でバックアップを作成することをオススメします。

pg_dumpを用いたダンプの出力はいくつか種類がありますが、今回はdocker環境での取り回しが良く、比較的サイズが小さい、plainのgzip圧縮を使用しました。

 

4. TimescaleDB

先程述べた通り、PostgreSQLに移行したテーブルをTimescaleDBのhypertableに変換する必要があります。 変換スクリプトが用意されているのでそちらを実行します。私の場合は、コンテナ内から取り出して使用しました。

PostgreSQLの状態でデータ保存用のボリュームを作っていた場合、TimescaleDBの拡張の認識設定がされていないので設定を書き換える必要があります。 (最初からTimescaleDBのimageでやってたら不要)

スクリプト実行時のエラーにかかれている通り設定にshared_preload_libraries = 'timescaledb' を追記する必要があります

TimecaleDB拡張が認識されていない状態で有効化しようとして失敗したログ

この工程での詰まりポイントは、ディスクの空き容量不足です。 変換スクリプトの実行中通常のテーブルとhypertable両方の情報が同居する関係なのか、データサイズがかなり肥大化します。 私が実行した環境では1.5~2倍程度にまで肥大化していたと思います。

Zabbixサーバーのコンテナがいきなり登場してますが、今回は説明を割愛します。
記事の最後に私が検証に用いたDocker ComposeでのZabbixの最小限の構成をおまけで付けているので、そちらを参照してください。

実行ログ

 

まとめ

残念ながら、当初の目的であったCPU使用率の削減にはつながりませんでした。

しかし、ディスクへの書き込み頻度と書き込みデータ量が大幅に減りました。

また、MySQLには大量のbinlogが溜まっていたというのもありますが、TimescaleDBの圧縮機能によってディスク消費量も大幅に減らすことができました。

 

おまけ

MySQLの最小構成のDocker Composeファイル

DBが初期化されるまで2,3分かかる(その前にアクセスすると異常な設定、みたいなエラーがでるのでしばらく待ち)

TimescaleDB(PostgreSQL)の最小構成Docker Compose ファイル

今回の使用法におていは、テーブル変換をしない場合は普通のPostgreSQLと同じ動きをするので、通常版は割愛

参考資料

  1. https://www.tigerdata.com/docs/use-timescale/latest/hypertables
  2. https://www.zabbix.com/documentation/current/jp/manual/appendix/install/timescaledb
  3. https://pgloader.readthedocs.io/en/latest/ref/mysql.html
  4. https://github.com/dimitri/pgloader/issues/1211
  5. https://qiita.com/11ohina017/items/4a808e4fc03e1ac890ba
  6. https://assets.zabbix.com/files/events/meetup_20200702/meetup_20200702_MySQL2PgSQL-ENG.pdf

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!