Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure sql database 跨区域扩展标识服务器4_Azure Sql Database_Identityserver4_Distributed Computing - Fatal编程技术网

Azure sql database 跨区域扩展标识服务器4

Azure sql database 跨区域扩展标识服务器4,azure-sql-database,identityserver4,distributed-computing,Azure Sql Database,Identityserver4,Distributed Computing,我目前正在一个区域(用于配置和操作存储的单个数据库)中作为单个实例运行IDS4。我现在必须将安装分布到两个区域,以便区域A中的服务/用户访问区域A中的ID,区域B中的服务/用户访问区域B中的ID 两个实例都应该访问相同的数据存储,但区域B中的ID不必对区域A中的数据库进行跨区域读取查询 我们使用Azure SQL Server和地理复制功能,该功能提供一个可写实例(区域a或区域B)和多个可读实例。我们将区域B中的ID指向同一区域中的只读实例,但这不起作用,因为ID必须像持久授权一样写入操作数据

我目前正在一个区域(用于配置和操作存储的单个数据库)中作为单个实例运行IDS4。我现在必须将安装分布到两个区域,以便区域A中的服务/用户访问区域A中的ID,区域B中的服务/用户访问区域B中的ID

两个实例都应该访问相同的数据存储,但区域B中的ID不必对区域A中的数据库进行跨区域读取查询

我们使用Azure SQL Server和地理复制功能,该功能提供一个可写实例(区域a或区域B)和多个可读实例。我们将区域B中的ID指向同一区域中的只读实例,但这不起作用,因为ID必须像持久授权一样写入操作数据


是否有一个推荐的体系结构来实现这一点,或者您是否有实施多区域和负载平衡IDS部署的经验?是否可以将IDS配置为使用不同的数据库执行写操作,并使用同一区域中的数据库执行读操作?

您不太可能找到针对此类场景的推荐体系结构,因为此问题的大部分在您的业务域中。此外,Identity Server 4库或其支持库中没有任何现成的东西可以满足您的标准

话虽如此,我有一个类似的需求(与Identity Server 4无关,但简而言之是相同的功能需求),应该可以在您的案例中采用相同的想法

首先,您所说的唯一问题是,使用Identity Server 4 EF软件包,
PersistedGrantStore
使用一个
IPersistedGrantDbContext
,它可以从数据库中写入和读取数据。因此,为了解决这个问题,您基本上需要创建自己的
IPersistedGrantStore
实现,在这个自定义实现中,您可以在技术上使用两种不同的
DbContext
类型,其中一个将使用到数据库的单个可写实例的连接字符串创建,并且仅用于实现执行写操作的接口方法;另一个将仅用于读取方法,并将连接字符串用于数据库的只读实例

以上总结的基本思路如下:

public class MyCustomPersistedGrantStore : IPersistedGrantStore
{
    private readonly WriteOnlyPersistedGrantDbContext _writeContext;
    private readonly ReadOnlyPersistedGrantDbContext _readContext;  

    public PersistedGrantStore(WriteOnlyPersistedGrantDbContext writeContext, ReadOnlyPersistedGrantDbContext readContext)
    {
        _writeContext = writeContext;
        _readContext = readContext;
    }

    public Task StoreAsync(PersistedGrant token)
    {
        //Use _writeContext to implement storage logic
    }

    public Task<PersistedGrant> GetAsync(string key)
    {
        //Use _readContext to implement read logic
    }

    ...other interface methods
}
public class MyCustomPersistedGrantStore:IPersistdGrantStore
{
private readonly WriteOnly PersistedGrandDBContext\u writeContext;
私有只读只读类型RSistedGrandDBContext\u readContext;
公共PersistedGrantStore(WriteOnly PersistedGrantDBContext writeContext,ReadOnlyTypersistedGrantDBContext readContext)
{
_writeContext=writeContext;
_readContext=readContext;
}
公共任务StoreAsync(PersistedGrant令牌)
{
//使用_writeContext实现存储逻辑
}
公共任务GetAsync(字符串键)
{
//使用_readContext实现读取逻辑
}
…其他接口方法
}
实现自定义版本后,只需将
IPersistedGrantStore
的实现以及
DbContext
添加到DI系统中


最后,值得注意的是,如果您停止使用
.AddOperationalStore(…config)
,那么您也将放弃使用
TokenCleanupHostService
,因此您也需要实现这一点。

您可以使用Azure SQL数据同步来拥有Azure SQL数据库的可写副本,而不是地理复制,将其中一个定义为中心数据库,将其他定义为成员数据库。所有数据库之间的同步可以双向配置,因此所有数据库都是可更新的。您可以开始在文档上配置Azure SQL数据同步。

我正在努力解决我自己的私有分支中的问题。如果您查看一下(非常未完成的atm)源代码,您将大致了解如何实现自己的DB提供程序,以优雅地处理此类需求。事实上,您可能想假设使用一个用于IDServer的NoSQL数据存储,因为我相信与SQL Server相比,它对多区域读/写进行了“优化”。

欢迎使用。请花一分钟阅读我们成功地在两个数据库之间设置了数据同步,并且工作正常。与Azure SQL geo replication的近实时数据复制不同,数据同步仅每5分钟复制一次。我想知道这是否会导致出现问题的情况。在正常操作中,用户总是访问相同的区域,从而访问相同的数据库。在故障转移的情况下,最坏的情况是用户必须重新验证,因为持久授权未同步。任何其他数据(如配置数据)将在区域重新可用后同步。在同步频率上,您可以选择秒。“如果选择打开,请输入一个数字,然后在“同步频率”部分中选择秒、分钟、小时或天。”阅读此处有关“自动同步”设置的详细信息。我已经查过文档了,上面写着:同步之间的最短持续时间是5分钟。@lunzi您将此标记为已接受的答案,但对Alberto Morillo的答案进行了评论,您使用了他的建议。因为我们有同样的问题,我想知道你最后做了什么。