目前我们有一个 Azure SQL Server,每次创建新的 Web 应用程序时,我们都会使用 EF Core Code First 来生成数据库。但是,在创建数据库后,我们手动转到 Azure 门户并将新创建的数据库添加到 Azure SQL Server 内的弹性池中。是否有可能以某种方式自动化该过程,以便通过门户或使用 EF 或其他方式生成的每个新创建的数据库都会自动添加到池中?
2 回答
可以使用 Transact-SQL 以编程方式将现有 Azure SQL 数据库移动到弹性池中。
ALTER DATABASE db1
MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = pool1 ) ) ;
您必须使用 Elastic 数据库客户端库来管理数据库的创建,以便 ShardMapManager 可以注册数据库。请注意,我说的是数据库(或 Elastic DB 术语中的分片)不是租户(或 Elastic DB 术语中的 Shardlet)。
整个Elastic DB 组件如下,用于 SQL 服务器,分片是通过 Elastic Database SDK 添加的,涉及以下组件(其中一些仅在 Azure 中可用): • Elastic Database Client Library 管理数据分布并将租户映射到数据库. • 弹性数据库池(仅限 Azure)分配可在多个数据库之间共享的资源池。允许数据库以自己的速率使用资源,而不是每个数据库都有特定数量的可用资源。
• 弹性数据库查询 跨多租户数据库中的所有租户进行查询的能力。
• 弹性数据库作业将数据库维护操作或数据库架构更改打包并可靠地部署到多个数据库。
• 弹性事务以原子和隔离的方式处理对多个数据库的更改。
• 弹性数据库拆分合并工具允许在参与分片框架的数据库之间移动分片
使用这个库的重要概念是,一个 Shard 可以有一个或映射来保存 Shardlet(或来自 ShardMapManager 的映射)。实际上 ShardMapManager 维护了两个集合:Shards (getShards) 和 Mapping (GetMappings)。映射是 ShardKeys 映射到分片...
您可以有两种类型的 Shard Key 定义:RangeMapShard 和 ListMapShard——它们都继承了 ShardMap(其中包含一个属性 ShardMapType 来定义实例化 ShardMap 的子类型)。
RangeMapShard - 为 ONE 映射保存一系列键.. 例如客户 100-200(200 的值比该范围内允许的值高一个(我认为定义它的糟糕方式......但那是 MS 文档)所以它们的意思是 100-199,200-299 是使用 100-200 和 200-300 的范围定义的。
ListMapShard - 为每个 Shardlet 保存一个 Shard Key。所以 ShardKey 的 1 个值等于 1 个 ShardMap(一个 Shard 可以保存一个或多个 Shardlet - 所以一个 Shard 可以保存映射...)...
所以你必须将你的分片键映射到一个分片映射,然后将分片映射关联到一个分片,并且分片必须与一个数据库相关联....记住,你可以创建一个不在其中定义了一个分片(或模式)。
我发现我想换一种方式思考这个问题,从数据库开始,然后将数据粘贴到那个数据库中。IMO,Elastic DB SDK 以另一种方式工作,您定义 Shardlet(租户),将其映射到 shard(schema),然后将 Shard(schema)粘贴到数据库中。
HTH。