web-dev-qa-db-ja.com

MySQL Clusterndbの説明とパーティション

2つのデータノードとnoofreplicas = 2のmysqlクラスターがあります。ドキュメントによると、1つのノードグループ、2つのパーティション、および4つのパーツ(2つのプライマリと2つのバックアップ)が必要です。 1000000行のテーブルがあります。それらがどのように分布したか知りたい。

[root @ localhost〜] #ndb_desc users -d test_1 -np 
-users-
バージョン:10 
フラグメントタイプ:HashMapPartition 
 K値:6 
最小負荷係数:78 
最大負荷係数:80 
一時テーブル:いいえ
属性の数:2 
主キーの数:1 
 frmデータの長さ:289 
行チェックサム:1 
行GCI:1 
 SingleUserMode:0 
 ForceVarPart:1 
 FragmentCount:4 
 ExtraRowGciBits:0 
 ExtraRowAuthorBits:0 
 TableStatus:Retrieved 
 HashMap:DEFAULT-HASHMAP-3840-4 
-属性- -
 user_id Int PRIMARY KEY DISTRIBUTION KEY AT = FIXED ST = MEMORY 
 user_data Longvarchar(1024; latin1_swedish_ci)NULL AT = MEDIUM_VAR ST = MEMORY 
-インデックス-
 PRIMARY KEY(user_id)-UniqueHashIndex 
 PRIMARY(user_id)-OrderedIndex 
-パーティションごとの情報-
パーティション行数コミット数フラグメント固定メモリフラグメント可変サイズメモリExtent_spaceFree extends_spaceうなずくes 
 0 249356 249356 8028160 11304960 0 0 1,2 
 2 250249 250249 8060928 11337728 0 0 1,2 
 1 250663 250663 8060928 11370496 0 0 2,1 
 3 249732 249732 8028160 11304960 0 0 2,1 
 
 
 NDBT_ProgramExit:0-OK

〜500000行の2つのパーティションではなく、それぞれに〜250000行の4つのパーティションがあるのはなぜですか?

1
ckorzhik

_noofreplicas=2_と2つのノードを使用すると、_2/2 = 1 nodegroup_が作成されます。つまり、シャーディングがまったくありません(または、必要に応じて1つのシャードがあります)。 すべてのパーティションは両方のノードにあります。クラスターは高可用性とより良い読み取りスルーを提供します書き込みスケーリングは行いません

表示されるのはテーブルユーザーの統計です。カスタムパーティションスキーマを定義していない場合、NDBは主キーのハッシュを使用してパーティションを管理します。この場合、4つのパーティションが作成されます。これらの4つのパーティションのうち、おそらく2つが一方のノードで「プライマリ」になり、もう一方のノードで「バックアップ」になります。その逆も同様です。 独自のパーティショニングスキーマを 標準のMySQL構文で定義できます(ただし、パーティションが少ないと同時実行性が低下する可能性があります-MaxNoOfExecutionThreads-および将来のスケーリング-ノードの追加が増える痛い)。 個々の行が_EXPLAIN PARTITIONS_でどのパーティションにあるかを知ることができます。

NDBはRAID10の実装と考えてください。ただし、ノードが2つしかないため、RAID1しか取得できません。 「ブロックレベル」はパーティションです。デフォルトのパーティション選択では、KEY()パーティショニングに使用されるハッシュが使用されます。これは、PASSWORD()関数に基づいていると思います。

デフォルトでは、パーティションの数はノードの数(2)と同じである必要があると思いますが、_MAX_ROWS_を大きく設定すると、より多くのパーティションを作成できると思います。修正されていません。

追加情報のおかげで編集:パーティションをデフォルトで高く設定できるもう1つの理由は、より高い同時実行性を可能にするためです-使用している場合 ndbmtd -、数パーティションの数は、ローカルデータマネージャインスタンスで乗算されます(簡単に言えば、同時実行でデータノードに対して読み取りおよび書き込みが可能なスレッドの数)。 MaxNoOfExecutionThreadsを4に設定すると、あなたの場合のように、そのうちの2つが専用になります マルチスレッドサーバーで。

これまで考えていなかったことをお詫びする必要がありますが、バージョンごとに小さな変更がたくさんあり、シャード対応の4ノードセットアップでは通常パーティションの数は4です。

そのサイズの余分なパーティションがあったとしても(ある程度手動で強制できるので)、それほど心配する必要はありません。パーティション(またはフラグメント)は、ノードレベルで分割できない任意の単位です。以前にコメントしたように、追加のパーティションは、不要な行をプルーニングすることでパフォーマンスを向上させ(正しくパーティション化しており、主にKey-Value読み取りを使用していると想定)、追加のノードの追加を容易にします。

1
jynus