ABP 多租户 对应多数据库 租户启动报错

 

什么是多租户?

         “软件多租户是指一个软件体系结构,其中一个软件实例在一个服务器上运行,并为多个租户提供服务*租户是一组共享具备软件实例特定权限的公共访问权限的用户。 架构中,软件应用程序旨在为每一个租户提供一个包含其数据*,配置,用户管理,租户我的功能和非功能属性的实例共享*多租户与多实例架构造成鲜明对比,其中独立的软件实例运行 表明不一样的租户“(维基百科),简而言之,多租户是一种用于建立SaaS(软件即服务)应用程序的技术。数据库

数据库和部署体系结构

有一些不一样的多租户数据库和部署方法:安全

一、多个部署 - 多个数据库

      实际上这不是多租户,可是若是咱们为每一个客户(租户)运行一个具备独立数据库的应用程序实例,则能够在一台服务器上为多个租户提供服务。咱们只需确保应用程序的多个实例在相同的服务器环境中不会相互冲突。服务器

对于不是被设计为多租户的现有应用来讲,这也是可能的。因为应用程序不知道多租户,建立这样的应用程序更容易。然而,这种方法存在设置,使用和维护问题。网络

二、单一部署 - 多个数据库

      在这种方法中,咱们在服务器上运行应用程序的单个实例。咱们有一个主(主机)数据库来存储租户元数据(如租户名和子域)和每一个租户的单独数据库。一旦咱们肯定了当前的租户(例如,从子域或从用户登陆表单),那么咱们能够切换到该租户的数据库来执行操做。在这种方法中,应用程序应该在必定程度上被设计为多租户,但大部分应用程序能够保持独立。咱们为每一个租户建立和维护一个单独的数据库,这包括数据库迁移。若是咱们有许多专用数据库的客户,则在应用程序更新期间迁移数据库模式可能须要很长时间。因为每一个租户都有独立的数据库,咱们能够将数据库与其余租户分开备份。若是租户须要,咱们也能够将租户数据库迁移到更强大的服务器上。架构

三、单一部署 - 单个数据库

      这是最理想的多租户体系结构:咱们只将具备单个数据库的应用程序的单个实例部署到单个服务器上。咱们在每一个表(对于RDBMS)中都有一个TenantId(或相似的)字段,用于隔离租户的数据。
这种类型的应用程序易于安装和维护,但难于建立。这是由于咱们必须防止租户读取或写入其余租户的数据。咱们能够为每一个数据库读取(选择)操做添加一个TenantId过滤器。咱们也能够在每次写入时检查它,看看这个实体是否与当前的租户有关。这是乏味和容易出错的。可是,ASP.NET Boilerplate经过使用自动数据过滤来帮助咱们。若是咱们有许多拥有大量数据集的租户,这种方法可能会有性能问题。咱们可使用表分区或其余数据库功能来克服这个问题。

四、单一部署 - 混合数据库

      咱们可能但愿将租户正常存储在单个数据库中,但可能但愿为所需租户建立单独的数据库。例如,咱们能够将拥有大数据的租户存储在本身的数据库中,但将全部其余租户存储在单个数据库中。

五、多部署 - 单/多/混合数据库

     最后,咱们可能但愿将咱们的应用程序部署到多个服务器(如Web场)以得到更好的应用程序性能,高可用性和/或可伸缩性。这与数据库方法无关。
 
 我所采用的是单部署多数据库的形式,主要是为了数据隔离,我也好维护。可是在多数据库的时候总是抛出错误 (图1)。最后发现网上说开启MSDTC服务。

   图1 报错工具

   系统开启MSDTC 服务后、而后使用租户登陆、发现仍是有问题!性能

  最后问了搞.NET 朋友,说是配置 DTC 安全配置。大数据

  1.   展开-> "应用程序服务器” -> “工具” ->  “组件服务”->右键“本地DTC”
  2.   选择“本地DTC”的“安全选项卡”,作以下设置:

        

 

      (1)选中“网络DTC访问”
           (2)在客户端管理中选中“容许远程客户端”“容许远程管理”
           (3)在事务管理通信中选“容许入站”“容许出站”“不要求进行验证”
           (4)保证DTC登录帐户为:NT Authority\NetworkService 
           (5)单击"肯定"。这样将会提示您"MS DTC 将会中止并从新启动。   全部的依赖服务将被中止。请按'是'继续"。单击"是"继续。 
       3.关闭网络防火墙(或者开放相应的端口135或用services.msc打开服务启动TCP/IP NetBIOS Helper服务)spa