現在、現在のデータベースサーバーから3ノードクラスターへの移行を評価しています。
現在のサーバーは、パフォーマンスに影響を与えることなくデータベースのバックアップを実行するために、別のサーバーへの非同期レプリケーションを備えたMariaDB 10.1を実行しているVMです。
読み取りと書き込みの比率は約70/30であり、統合されてエンドユーザーに提示される前にデータベースに書き込まれる生データを送信する多くのセンサーを備えたIoTプラットフォームを実行しています。
読み取りと書き込みの比率が高いため、移行前に、クラスターが少なくとも現在のサーバーと同様に書き込みを実行できることを確認したいと思います。
このテストでは、16個のvCPU、60GBのVM、および10,000読み取りIOPSと15,000書き込みIOPSのSSDローカルストレージを使用して、Google Compute EngineでRAMを開始しました。
Debian 8.3を実行するこのVMに、Sysbench 0.5でいくつかのベンチマークを実行するために、MariaDB 10.1(Galeraクラスターを含む)をインストールしました。
これらは、デフォルトのmysql.cnfファイルから変更したMySQLパラメータです。
[mysqld]
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_log_file_size=2G
innodb_buffer_pool_size=4G
sync_binlog=0
Sysbenchから更新テストを実行すると、現在展開している単一のノードでwsrepを有効にすると、大きなオーバーヘッドが発生します。
これは、ベンチマークを実行するために使用しているコマンドです。
sysbench --db-driver = mysql --num-threads = 32 --max-time = 30 --max-requests = 0 --oltp-tables-count = 32 --oltp-table-size = 100000 --oltp -test-mode = complex --test =/root/sysbench/sysbench/tests/db/update_index.lua --mysql-db = sbtest --oltp-skip-trx = on run
Wsrep_on = OFFを使用すると、ベンチマークで毎秒約54000回の更新が行われます。
Wsrep_onをONに設定すると、1秒あたり約19000回の更新が行われます。
同期レプリケーションを有効にするとパフォーマンスが低下することを期待していましたが、それほど大きくなることはありませんでした。
CPUやIOからのボトルネックはないように見えますが、wsrepを有効にするとパフォーマンスが低下するのはなぜですか?
データウェアハウジング(アプリ)とOLTP=は多少異なります。そのため、ベンチマークの関連性に疑問を投げかけています。OLTPは、私が誤っていない場合、非常に短い「トランザクション」を伴います。 GaleraのwsrepによってCOMMIT
で行われるクロスノード同期。一方、新しいデータポイントの挿入は、たとえば1000のバッチで行うことができ、コミットのオーバーヘッドを心配する必要はありません。
60 GBの場合、innodb_buffer_pool_size
は45Gに近いはずです。そしてinnodb_buffer_pool_instances=16
。
表面的には、19K /秒(ノードあたり?)はより高速に見えます-19K * 3> 54K。しかし、おそらく私は物事を誤解している。
SHOW CREATE TABLE
ファクトテーブル。アプリケーションのタイプに重大なパフォーマンスの問題を引き起こす可能性のあるミスがいくつかあります。
「統合」はいつ行うのですか?そしてどうやって?要約表(あなたが話していると私が思う)は効率の鍵です。場合によっては、サマリーデータを保存した方がよい場合がありますが、生データは破棄されます。
高速取り込み および サマリーテーブル についての私の議論を確認してください。それらの私のポイントは、基礎となる構造(ハードウェア、ガレラなど)とは別にできる(そしてすべき)大幅なスピードアップがあるということです。
Galeraの設定は正しい方向です。 Galera に追加のヒントがあるかもしれません。
より多くの質問(これはより多くの議論につながります):いくつのクライアントがデータをテーブルに送り込んでいますか?一度にいくつの行が挿入されますか?行を収集してバッチ挿入するのはどれほど簡単でしょうか。挿入中に正規化は発生しますか?挿入と並行して要約を行うことは意味がありますか?クライアントに3つのノードすべてに書き込みを行わせるつもりでしたか?クライアントとノードの間に何らかの形式のプロキシがありますか?