問題タブ [azure-elastic-scale]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
azure - Elastic Scale Split/Merge ツールが予期せず失敗する
Azure Elastic Scale Split Merge ツールを使用して、あるシャードレットを別のシャードに移動しています。すべてが計画どおりに進んでいるように見えますが、最終的には理由を説明せずに失敗します。
これはログの完全な出力です
なぜうまくいかないのかを知るために、より詳細な情報を求める方法はありますか?
powershell - ShardManagement Binary ShardingKey の最大値
現在、ここで提供されているスクリプトを使用して、shardmap
マネージャー、シャード マップをセットアップしています。PowerShell
この例では int をShardingKey
型として使用していますが、私は binary(16) を持っていShardingKey
ますが、 max binary(16) の高いキーを決定して渡す方法を知っている人はいAdd-RangeMapping
ますか?
c# - Azure Elastic Database Merge GUI キー シャード
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 ではありません。シャードを識別するために使用される実際の Guid (私の場合は UserId) を取得するにはどうすればよいですか? また、シャード間でデータを移動する方法も見つかりませんでした。私が今行うことは、自分でツールを使用してシャード間でデータを転送し、ListShardMap.UpdateMapping メソッドを使用して値に新しいシャードを設定することです。操作の最後に ListShardMap.DeleteShard を使用しますか、これを行うためのより良い方法はありますか?
編集:
シャードをマージする独自のツールを作成しましたが、奇妙な例外が発生します。ここにいくつかのコード:
UpdateMapping により、次の例外が発生します。
ストア エラー: エラー 515、レベル 16、状態 2、プロシージャ __ShardManagement.spBulkOperationShardMappingsLocal、行 98、メッセージ: 列 'LockOwnerId'、テーブル __ShardManagement.ShardMappingsLocal に値 NULL を挿入できません
なぜインサートがあるのか わかりませんか?ローカルおよびグローバルの Shardmapping テーブルで mappingId を確認しましたが、マッピングが存在するため、私の意見では挿入は必要ありません。また、前述のストアド プロシージャ spBulkOperationShardMappingsLocal のコードも確認しました。 2.sql Insert ステートメントでは、LockOwnerId がパラメーターとして渡されないため、失敗するだけです。もちろん、生産的なシステムでプレイしたくないので、現在、テストセットアップで作業しています。多分私はそこで間違いを犯しましたが、私にはすべてがうまく見えます. このエラーに関するヒントをいただければ幸いです。
c# - ストアド プロシージャ '__ShardManagement.spBulkOperationShardMappingsLocal' が見つかりませんでした
Entity Framework Code First で Azure Elastic データベース パターンを使用しています。
新しいシャード データベースを作成すると、PointShard
マップを作成しようとすると次の例外がスローされます。
ストアド プロシージャ '__ShardManagement.spBulkOperationShardMappingsLocal' が見つかりませんでした
EF スキーマは作成されていますが、シャーディング スキーマとストアド プロシージャは生成されていません。
私のシャーディングコンポーネントが確実にDbContext
生成されるようにするにはどうすればよいですか?
c# - ElasticContext EF を使用した接続プールの管理
Microsoft のいくつかの例に従った後、現在のユーザーのテナント (または顧客) ID に依存する Elastic ShardMapManager から接続文字列を取得する DbContext の Elastic バージョンを実装しました。
これは技術的に機能し、Azure アカウントにデプロイしました。デフォルトのコンテキスト接続作成メカニズムをオーバーライドしたので、接続プールの管理に関心があります。また、リクエストごとに呼び出されるたびに接続がどのように管理されるのかわかりませんshardMap.OpenConnectionForKey
(以下のninject設定を参照)。
昨日、簡単なテストを行った後、Web アプリが次のメッセージで失敗しました。
タイムアウトになりました。プールから接続を取得する前に、タイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。
今日は再現できないため、これは 1 回限りの可能性がありますが、接続プールが効率的に使用されていることを確認したいと考えています。
失敗したコードは、私の ElasticScaleContext の完全なコードで以下にコメントされています。
シングルトンとして注入されている ShardMapManager で Ninject を使用しています。
Context はリクエストごとに作成されます。
いくつか質問があります:
コンテキスト内で作成している接続は、通常どおり破棄する必要がありますか?
ShardMapManger
接続がどのように管理されているか知っている人はいますか?以下のコード ( Model First EF アプローチのために必要) は、接続を開いてから閉じませんか?
更新- @Evk からのアドバイスの後 (コメントを参照)、EntityConnection へのコンストラクター呼び出しを変更して true を渡しentityConnectionOwnsStoreConnection
、使用後にストア接続を適切に閉じることができるようにしました。以下を参照してください。これが何らかの影響を与えるかどうかを確認するために、接続プールを監視する方法が本当に必要です。
最後に、Azure Elastic SQL プールの接続の現在の状態を監視および表示する方法はありますか?
たくさんの質問があることは承知していますが、私はこの分野に関するあらゆる情報を求めています。実際、Web 上にはそれほど多くの既存の情報はありません。
追加情報: このソリューションでは、EF6、SQL Server 2014、MVC 5.0 を使用しています
entity-framework - EF を使用したエラスティック スケール クエリ: Null 許容オブジェクトには値が必要です
Azure では、複数のシャード データベースと、シャード上のテーブルをミラーリングする外部テーブルを含むエラスティック クエリ データベースをセットアップしています。私が使用する2つの主なテーブルは次のとおりです。
- チャネル:
- [名前] nvarchar NOT NULL,
- [ID] [一意の識別子] NOT NULL、
- [外部参照] nvarchar NULL
- ユーザー:
- [メール] nvarchar NOT NULL,
- [FirstName] nvarchar NOT NULL,
- [姓] nvarchar NOT NULL,
- [ChannelId] [一意の識別子] NOT NULL、
- [ステータス] [int] NOT NULL,
- [アバター ID] [一意の識別子] NULL、
- [ID] [一意の識別子] NOT NULL
EF と linq を介してこれをクエリすると、次のようになります。
var user = db.Users.Include("Channel").FirstOrDefault(u => u.Email == "tony@soprano.com");
エラーが発生します:
GlobalQuery 操作の実行中にエラーが発生しました: null 許容オブジェクトには値が必要です。
User クラスは次のようになります。
T-SQL を介して直接クエリを実行する:
SELECT * FROM Users INNER JOIN Channels ON Users.ChannelId = Channels.Id
同じエラーが発生します。
さらに調査すると、Id を uniqueidentifiers にキャストすると (既に存在しています)、問題が解決することがわかります。
SELECT * FROM Users INNER JOIN Channels ON CAST(Users.ChannelId as uniqueidentifier) = CAST(Channels.Id as uniqueidentifier)
ChannelId および Id 列は、既に null 非許容の uniqueidentifiers です。シャード内のデータも有効で null ではないので、ここでの問題は正確には何ですか?
別の質問: linq で「uniqueidentifier へのキャスト」を強制するにはどうすればよいですか?