/// <summary> /// Tries to get the ShardMapManager that is stored in the specified database. /// </summary> public static ShardMapManager TryGetShardMapManager(string shardMapManagerServerName, string shardMapManagerDatabaseName) { string shardMapManagerConnectionString = Configuration.GetConnectionString( Configuration.ShardMapManagerServerName, Configuration.ShardMapManagerDatabaseName); if (!SqlDatabaseUtils.DatabaseExists(shardMapManagerServerName, shardMapManagerDatabaseName)) { // Shard Map Manager database has not yet been created return(null); } ShardMapManager shardMapManager; bool smmExists = ShardMapManagerFactory.TryGetSqlShardMapManager( shardMapManagerConnectionString, ShardMapManagerLoadPolicy.Lazy, out shardMapManager); if (!smmExists) { // Shard Map Manager database exists, but Shard Map Manager has not been created return(null); } return(shardMapManager); }
// Enter a new shard - i.e. an empty database - to the shard map, allocate a first tenant to it // and kick off EF intialization of the database to deploy schema // public void RegisterNewShard(string server, string database, string user, string pwd, string appname, int key) public void RegisterNewShard(string server, string database, string connstr, int key) { Shard shard; //shard = FindEmptyShard(shardMap); string databaseName = string.Format("Company{0}", key); if (!SqlDatabaseUtils.DatabaseExists(Configuration.ShardMapManagerServerName, databaseName)) { SqlDatabaseUtils.CreateDatabase(Configuration.ShardMapManagerServerName, databaseName); } ShardLocation shardLocation = new ShardLocation(server, database); if (!this.ShardMap.TryGetShard(shardLocation, out shard)) { shard = this.ShardMap.CreateShard(shardLocation); } SqlConnectionStringBuilder connStrBldr = new SqlConnectionStringBuilder(connstr); connStrBldr.DataSource = server; connStrBldr.InitialCatalog = database; // Go into a DbContext to trigger migrations and schema deployment for the new shard. // This requires an un-opened connection. using (var db = new ElasticScaleContext <int>(connStrBldr.ConnectionString)) { // Run a query to engage EF migrations (from b in db.Blogs select b).Count(); } // Register the mapping of the tenant to the shard in the shard map. // After this step, DDR on the shard map can be used PointMapping <int> mapping; if (!this.ShardMap.TryGetMappingForKey(key, out mapping)) { this.ShardMap.CreatePointMapping(key, shard); } }
private static void CreateShardMapManagerAndShard() { SqlConnectionStringBuilder connStrBldr = new SqlConnectionStringBuilder { UserID = s_userName, Password = s_password, ApplicationName = s_applicationName }; Console.WriteLine("Checking for existing shard map and creating new shard map if necessary."); // Create shard map manager database if (!SqlDatabaseUtils.DatabaseExists(Configuration.ShardMapManagerServerName, Configuration.ShardMapManagerDatabaseName)) { SqlDatabaseUtils.CreateDatabase(Configuration.ShardMapManagerServerName, Configuration.ShardMapManagerDatabaseName); } // Create shard map manager //string shardMapManagerConnectionString = // Configuration.GetConnectionString( // Configuration.ShardMapManagerServerName, // Configuration.ShardMapManagerDatabaseName); //s_shardMapManager = ShardManagementUtils.CreateOrGetShardMapManager(shardMapManagerConnectionString); Sharding sharding = new Sharding(s_server, Configuration.ShardMapManagerDatabaseName, connStrBldr.ConnectionString); sharding.RegisterNewShard(s_server, s_shard1, connStrBldr.ConnectionString, s_tenantId1); sharding.RegisterNewShard(s_server, s_shard2, connStrBldr.ConnectionString, s_tenantId2); //// Create shard map //RangeShardMap<int> shardMap = ShardManagementUtils.CreateOrGetRangeShardMap<int>( // s_shardMapManager, Configuration.ShardMapName); //// Create schema info so that the split-merge service can be used to move data in sharded tables //// and reference tables. ////CreateSchemaInfo(shardMap.Name); //// If there are no shards, add two shards: one for [0,100) and one for [100,+inf) //if (!shardMap.GetShards().Any()) //{ // CreateShardSample.CreateShard(shardMap, new Range<int>(0, 100)); // CreateShardSample.CreateShard(shardMap, new Range<int>(100, 200)); //} Console.Write("Enter a name for a new Blog for CMS DB: "); var name5 = Console.ReadLine(); SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var CMSDB = new ElasticScaleContext <int>()) { var blog = new Blog { Name = name5 }; CMSDB.Blogs.Add(blog); CMSDB.SaveChanges(); } }); SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var db = new ElasticScaleContext <int>()) { // Display all Blogs for tenant 1 var query = from b in db.Blogs orderby b.Name select b; Console.WriteLine("All blogs for CMS DB"); foreach (var item in query) { Console.WriteLine(item.Name); } } }); Console.Write("Enter a name for a new Blog: "); var name = Console.ReadLine(); SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var db = new ElasticScaleContext <int>(sharding.ShardMap, s_tenantId1, connStrBldr.ConnectionString)) { var blog = new Blog { Name = name }; db.Blogs.Add(blog); db.SaveChanges(); } }); SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var db = new ElasticScaleContext <int>(sharding.ShardMap, s_tenantId1, connStrBldr.ConnectionString)) { // Display all Blogs for tenant 1 var query = from b in db.Blogs orderby b.Name select b; Console.WriteLine("All blogs for tenant id {0}:", s_tenantId1); foreach (var item in query) { Console.WriteLine(item.Name); } } }); // Do work for tenant 2 :-) SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var db = new ElasticScaleContext <int>(sharding.ShardMap, s_tenantId2, connStrBldr.ConnectionString)) { // Display all Blogs from the database var query = from b in db.Blogs orderby b.Name select b; Console.WriteLine("All blogs for tenant id {0}:", s_tenantId2); foreach (var item in query) { Console.WriteLine(item.Name); } } }); // Create and save a new Blog Console.Write("Enter a name for a new Blog: "); var name2 = Console.ReadLine(); SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var db = new ElasticScaleContext <int>(sharding.ShardMap, s_tenantId2, connStrBldr.ConnectionString)) { var blog = new Blog { Name = name2 }; db.Blogs.Add(blog); db.SaveChanges(); } }); SqlDatabaseUtils.SqlRetryPolicy.ExecuteAction(() => { using (var db = new ElasticScaleContext <int>(sharding.ShardMap, s_tenantId2, connStrBldr.ConnectionString)) { // Display all Blogs from the database var query = from b in db.Blogs orderby b.Name select b; Console.WriteLine("All blogs for tenant id {0}:", s_tenantId2); foreach (var item in query) { Console.WriteLine(item.Name); } } }); }