3

Azure には 4 つのシャードがあり、そのうちの 2 つが不要になったため削除したいと考えています。データは、他の 2 つのシャードにマージする必要があります。

シャードを識別するためのキーとして GUID を持つ Listmap を使用します (このアプリケーションでは、これは UserId です)。チュートリアルでは、Shards を Range タイプとマージするためのサンプルしか見つかりませんでした。これらのタイプのシャードをより高速にマージする方法はありますか、それとも独自のツールを作成する必要がありますか?

マージが自動的に実行される場合、たとえば次のような場合に何が起こるか: シャードを識別する GUID は UserId であり、このデータはシャード A からシャード B に移動されます。ForeignKey として UserId を持つ Comments と呼ばれる別のテーブルがあります。 . このテーブルの PrimaryKey は、従来の数値自動インクリメント値です。これらの値をシャード A からシャード B に移動するとどうなりますか? それらは挿入され、新しい ID が割り当てられますか、それともまったく機能しませんか?

また、パスでIDを使用するローカルFileStorage invlovedがいくつかあるので、とにかく自分のツールを作成する必要があると思います。

そのために、私は ShardMapManager を調べましたが、それがどのように機能するかを完全には理解していませんでした。ShardMappingsGlobal テーブルには、MappingId という列があります。ただし、これはシャード データベースに格納されている Guid/UserId ではありません。シャードを識別するために使用される実際の G​​uid (私の場合は UserId) を取得するにはどうすればよいですか? また、シャード間でデータを移動する方法も見つかりませんでした。私が今行うことは、自分でツールを使用してシャード間でデータを転送し、ListShardMap.UpdateMapping メソッドを使用して値に新しいシャードを設定することです。操作の最後に ListShardMap.DeleteShard を使用しますか、これを行うためのより良い方法はありますか?

編集:

シャードをマージする独自のツールを作成しましたが、奇妙な例外が発生します。ここにいくつかのコード:

        Guid userKey = Guid.Parse(userId);
        ListShardMap<Guid> map = GetUserShardMap<Guid>();

        try
        {
            PointMapping<Guid> currentMapping = map.GetMappingForKey(userKey);

            PointMapping<Guid> mappingOffline = map.UpdateMapping(currentMapping, new PointMappingUpdate()
            {
                Status = MappingStatus.Offline
            });  
         }

UpdateMapping により、次の例外が発生します。

ストア エラー: エラー 515、レベル 16、状態 2、プロシージャ __ShardManagement.spBulkOperationShardMappingsLocal、行 98、メッセージ: 列 'LockOwnerId'、テーブル __ShardManagement.ShardMappingsLocal に値 NULL を挿入できません

なぜインサートがあるのか​​ わかりませんか?ローカルおよびグローバルの Shardmapping テーブルで mappingId を確認しましたが、マッピングが存在するため、私の意見では挿入は必要ありません。また、前述のストアド プロシージャ spBulkOperationShardMappingsLocal のコードも確認しました。 2.sql Insert ステートメントでは、LockOwnerId がパラメーターとして渡されないため、失敗するだけです。もちろん、生産的なシステムでプレイしたくないので、現在、テストセットアップで作業しています。多分私はそこで間違いを犯しましたが、私にはすべてがうまく見えます. このエラーに関するヒントをいただければ幸いです。

4

1 に答える 1

1

チュートリアルでは、Shards を Range タイプとマージするためのサンプルしか見つかりませんでした。これらのタイプのシャードをより高速にマージする方法はありますか、それとも独自のツールを作成する必要がありますか?

はい。Split-Merge ツールは、範囲シャード マップとリスト シャード マップの両方からデータを移動できます。リスト シャード マップの場合、キーごとにシャードレット移動リクエストを発行できます。残念ながら、Split-Merge ツールには複雑な設定があり、前回は設定に約 1 時間かかりました。これが良くないことは承知しています。独自のカスタム バージョンを作成するのにかかる時間が長いか短いかを判断するのは、皆さんにお任せします。

UserId を ForeignKey とする Comments という別のテーブルがあります。このテーブルの PrimaryKey は、古典的な数値の自動インクリメント値です。これらの値をシャード A からシャード B に移動するとどうなりますか? それらは挿入され、新しい ID が割り当てられますか、それともまったく機能しませんか?

自動インクリメント列の値はコピーされず、コピー先で再生成されます。したがって、新しい ID がこれらの行に割り当てられます。

そのために、私は ShardMapManager を調べましたが、それがどのように機能するかを完全には理解していませんでした。ShardMappingsGlobal テーブルには、MappingId という列があります。ただし、これはシャード データベースに格納されている Guid/UserId ではありません。シャードを識別するために使用される実際の G​​uid (私の場合は UserId) を取得するにはどうすればよいですか?

自分で ShardMapManager テーブルを編集しようとしないことを強くお勧めします。台無しにするのは非常に簡単です。ShardMapManager テーブルの編集は、まさにエラスティック データベース ツール ライブラリがその目的で設計されたものです。

メソッドを使用して、マッピングのメタデータを更新できます。明確にするために、これは ShardMapManager テーブルのデータがキーのどこにあるべきかという知識を更新するだけです。実際にマッピングを移動するには、上位レイヤーで行う必要があります。ListShardMap.UpdatePointMapping

以下は、Split-Merge サービスの機能の概要です。

  1. マッピングをロックして、別のシャード マップ管理操作からの同時更新を防止します
  2. でマッピングをオフラインとしてマークしListShardMap.UpdatePointMappingます。これにより、データ指向ルーティングがOpenConnectionForKeyそのキーを使用してデータにアクセスできなくなります。また、シャード上の現在のすべてのセッションを強制終了して再接続を強制します。これにより、現在オフラインのキーを使用してデータで動作しているアクティブな接続がないことが保証されます。
  3. シャード マップを使用して基になるデータを移動し、SchemaInfoどのテーブルを移動する必要があるかを判断します。
  4. マッピングを更新し、オンラインでマークしますListShardMap.UpdatePointMapping
  5. マッピングのロックを解除
于 2016-09-21T19:42:02.357 に答える