🚀

TiFlash と MPP (大規模並列処理)

2024/07/22に公開

https://zenn.dev/kameping/articles/cf351f5a6d715f
前回集計クエリにおける列指向ストレージのTiFlashと行指向ストレージのTiKVの違いを実際のダミーデータを使いながらSQLベースでみていきました。

TiFlashにはもう一つMPPというモードがありますのでそちらを試していきます。
というよりデフォルトでオンになっているので優先的にオプティマイザはこちらを選択しているはずです。PingCAPでは、TiFlashを利用する際にMPPモードの利用を推奨しています。したがって前回の記事でもすでにMPPとなっていますが、復習のためにまとめておきます。

MPP とは

MPP(Massively Parallel Processing)= 大規模並列処理の略です。
https://speakerdeck.com/pingcap0315/tiflashnoshao-jie?slide=20
PingCAP社本多さんのこちらの資料が視覚的に理解しやすいです。前回の記事で、TiFlashはTiKVのレプリカとして作成されるということに触れました。TiDB Serverlessでは作成可能なレプリカは2固定となっていますが、Dedicated型ではより多くのTiFlashレプリカを作成させることが可能です。SQL実行時に複数のTiFlashからデータを並列的に読み込むことでTiDBでのデータ実行速度を速めることが出きます。
データが複雑になればなるほどデータ読み込みの時間は課題となるのでレプリカでを増やしてデータ読み込みを高速化させることが期待できます。

TiDB Serverless 環境ではReplica数が2で固定されているため、大きなパフォーマンス向上は見込めないかもしれませんが、DedicatedとSQLなどは共通ですので備忘録を兼ねてやってみます。

やってみる

まず前回のおさらいとして以下のSQLを実行します。

use test;
desc select avg(Age) from OLAPTEST;

デフォルトではオプティマイザがTiKVを選択しています。

次にTiFlashのReplicaを作成した後、TiFlashがMPPモードで動作するよう明示的に指定します。

use test;
set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=0;
set @@session.tidb_isolation_read_engines = "tiflash";
explain select avg(Age) from test.OLAPTEST;


mpp[tiflash]となっていることがわかります。(恐らく何もしなくてもtiflashを指定すればそうなるはずですが念のため。)

つまり、
- TiKVが利用されるケース = cop[tikv]
- TiFlash(非MPP)が利用されるケース = cop[tiflash]
- TiFlash(MPP)が利用されるケース = mpp[tiflash]
の3種類が実行計画で表示されます。通常はオプティマイザが切り替えてくれますので、特に意識する必要はありません。

tidb_allow_mpp と tidb_enforce_mpp

この二つのパラメータでMPPの利用を制御します。
- tidb_allow_mpp:0 or 1, MPPの利用を制御します。デフォルトではオンになっており、オプティマイザが最適な組み合わせを選択します。
- tidb_enforce_mpp:0 or 1, 0の場合オプティマイザの判断に任せますが、1の場合MPPの利用を強制化します。

引っかかった点

TiDB Serverless でTiflashのレプリカを作成した場合、cop[tiflash]ではなくmpp[tiflash]が優先的に選ばれるケースがあります。この場合例えば以下のクエリーは失敗します。

use test;
set @@session.tidb_isolation_read_engines = "tiflash";
set @@session.tidb_allow_mpp=0;
set @@session.tidb_enforce_mpp=0;
explain select avg(Age) from test.OLAPTEST;

以下のエラーが戻ります。
Internal : Can't find a proper physical plan for this query
クエリーはtiflashのMPPモードで動作しようとしている一方で、MPPの利用を強制的に禁止されてエラーになっているようです。

set @@tidb_allow_tiflash_cop=1;

とセットすることでcop[tiflash]の利用を強制できるようですが、バージョン7.3以降の機能でTiDB Serverless はバージョンが7.1.3ではまだ使えないようです。とはいえオプティマイザが優秀なので通常はあまり意識する必要はありません。またMPPなしのTiFlash利用は推奨されていないとのことです!
https://docs.pingcap.com/tidb/stable/system-variables#tidb_allow_tiflash_cop-new-in-v730

Discussion