Java平台数据层的多租户浅谈

在上一篇“浅析多租户在 Java 平台和某些 ">PaaS 上的实现”中我们谈到了应用层面的多租户架构,涉及到 PaaS、JVM、OS 等,与之相应的是数据层也有多租户的支持。

数据层的多租户综述

多租户(Multi Tenancy/Tenant)是一种软件架构,其定义是:

在一台服务器上运行单个应用实例,它为多个租户提供服务。

在SaaS实施过程中,有一个显著的考量点,就是如何对应用数据进行设计,以支持多租户,而这种设计的思路,是要在数据的共享、安全隔离和性能间取得平衡。

传 统的应用,仅仅服务于单个租户,数据库多部署在企业内部网络环境,对于数据拥有者来说,这些数据是自己“私有”的,它符合自己所定义的全部安全标准。而在 云计算时代,随着应用本身被放到云端,导致数据层也经常被公开化,但租户对数据安全性的要求,并不因之下降。同时,多租户应用在租户数量增多的情况下,会 比单租户应用面临更多的性能压力。本文即对这个主题进行探讨:多租户在数据层的框架如何在共享、安全与性能间进行取舍,同时了解一下市面上一些常见的数据 厂商怎样实现这部分内容。

常见的三种模式

在 MSDN 的这篇文章 Multi-Tenant Data Architecture 中,系统的总结了数据层的三种多租户架构:

独立数据库 共享数据库、独立 Schema 共享数据库、共享 Schema、共享数据表

独立数据库是一个租户独享一个数据库实例,它提供了最强的分离度,租户的数据彼此物理不可见,备份与恢复都很灵活;共享数据库、独立 Schema 将每个租户关联到同一个数据库的不同 Schema,租户间数据彼此逻辑不可见,上层应用程序的实现和独立数据库一样简单,但备份恢复稍显复杂; 最后一种模式则是租户数据在数据表级别实现共享,它提供了最低的成本,但引入了额外的编程复杂性(程序的数据访问需要用 tenantId 来区分不同租户),备份与恢复也更复杂。这三种模式的特点可以用一张图来概括:

图 1. 三种部署模式的异同

上图所总结的是一般性的结论,而在常规场景下需要综合考虑才能决定那种方式是合适的。例如,在占用成本上,认为独立数据库会高,共享模式较低。但如果考虑到大租户潜在的数据扩展需求,有时也许会有相反的成本耗用结论。

而多租户采用的选择,主要是成本原因,对于多数场景而言,共享度越高,软硬件资源的利用效率更好,成本也更低。但同时也要解决好租户资源共享和隔离带来的安全与性能、扩展性等问题。毕竟,也有客户无法满意于将数据与其他租户放在共享资源中。

目前市面上各类数据厂商在多租户的支持上,大抵都是遵循上文所述的这几类模式,或者混合了几种策略,这部分内容将在下面介绍。

JPA Provider

JSR 338 定义了 JPA 规范 2.1,但如我们已经了解到的,Oracle 把多租户的多数特性推迟到了 Java EE 8 中。尽管这些曾经在 JavaOne 大会中有过演示,但无论是在 JPA 2.0(JSR 317)还是 2.1 规范中,都依然没有明文提及多租户。不过这并不妨碍一些 JPA provider 在这部分领域的实现,Hibernate 和 EclipseLink 已提供了全部或部分的多租户数据层的解决方案。

Hibernate 是当今最为流行的开源的对象关系映射(ORM)实现,并能很好地和 Spring 等框架集成,目前 Hibernate 支持多租户的独立数据库和独立 Schema 模式。EclipseLink 也是企业级数据持久层JPA标准的参考实现,对最新 JPA2.1 完整支持,在目前 JPA 标准尚未引入多租户概念之际,已对多租户支持完好,其前身是诞生已久、功能丰富的对象关系映射工具 Oracle TopLink。因此本文采用 Hibernate 和 EclipseLink 对多租户数据层进行分析。

Hibernate

Hibernate 是一个开放源代码的对象/关系映射框架和查询服务。它对 JDBC 进行了轻量级的对象封装,负责从 Java 类映射到数据库表,并从 Java 数据类型映射到 SQL 数据类型。在 4.0 版本 Hibenate 开始支持多租户架构——对不同租户使用独立数据库或独立 Sechma,并计划在 5.0 中支持共享数据表模式。

在 Hibernate 4.0 中的多租户模式有三种,通过 hibernate.multiTenancy 属性有下面几种配置:

NONE:非多租户,为默认值。 SCHEMA:一个租户一个 Schema。 DATABASE:一个租户一个 database。 DISCRIMINATOR:租户共享数据表。计划在 Hibernate5 中实现。

模式1:独立数据库

如果是独立数据库,每个租户的数据保存在物理上独立的数据库实例。JDBC 连接将指向具体的每个数据库,一个租户对应一个数据库实例。在 Hibernate 中,这种模式可以通过实现 MultiTenantConnectionProvider 接口或继承 AbstractMultiTenantConnectionProvider 类等方式来实现。三种模式中它的共享性最低,因此本文重点讨论以下两种模式。

时间: 2024-11-08 22:00:51

Java平台数据层的多租户浅谈的相关文章

[转载]数据层的多租户浅谈

原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html   在上一篇"浅析多租户在 Java 平台和某些 PaaS 上的实现"中我们谈到了应用层面的多租户架构,涉及到 PaaS.JVM.OS 等,与之相应的是数据层也有多租户的支持. 数据层的多租户综述 多租户(Multi Tenancy/Tenant)是一种软件架构,其定义是: 在一台服务器上运行单个应用实例,它为多个租户提供服务. 在S

关于企业报表平台数据层设计

问题描述 想问问有相关经验的大家,企业报表开发中使用的数据,是从数据库源表直接sql取数,还是按报表业务进行整合定时转存到一个数据仓库中专门为报表服务.还是又其他好的方案么?有几个前提条件:1,存在一些中国式复杂报表,一张报表从很多数据表取数.2,有个别报表存在填报的需求.3,个别报表所取数据表数据的数据量比较大4,目前我们公司使用的乾润报表设计器. 解决方案 解决方案二:刚参加工作的时候,做过报表的开发.当时的报表数据都是直接通过sql从数据库中取出来的,但是数据量都不大当时有几个方案1直接从

java中equals和等号(==)的区别浅谈_java

java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个eq

java中extends与implements的区别浅谈_java

1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用2.extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口 来实现,这样就要用到implements,继承只能继承一个

浅析多租户在Java平台和某些PaaS上的实现

多租户综述 多租户(Multi Tenancy/Tenant)是一种软件架构,其定义是: 在一台服务器上运行单个应 用实例,它为多个租户提供服务. 在这种架构上,应用程序被设计成能将自己的数据.配置进行虚拟的分区,以便 每个租户都感觉到自己是在一个私有的.可定制化的应用实例上工作. 这背后代表的是资源的伸缩能力.即在同样 硬件配置,不同租户在数据分离的情况下,共享同样的应用程序,还随着租户数量的提升,应用程序的水平扩展,并维持着 类似的性能指标(一致响应时间等).这同时意味着资源使用效率的提升,

《大规模Java平台虚拟化与调优》——第2章 现代化可扩展的数据平台

第2章 现代化可扩展的数据平台 尽管你可以采用多种方式现代化应用的架构,但是核心的趋势如下:-围绕Spring框架所提供的灵活性现代化应用架构:-现代化数据. 就数据现代化来说,现在有很多不同的方式.本章主要关注的是日渐流行的一种趋势,那就是使用可水平扩展的内存数据库来提升扩展性和响应时间.在这里使用VMware vFabric SQLFire来阐述内存数据管理系统的功能,你可以使用它来构建可水平扩展且支持硬盘持久化的数据fabric.讨论这种工作负载也会帮助Java平台的工程师强化其Java平

浅谈开源大数据平台的演变

浅谈开源大数据平台的演变 2015-04-16 腾讯大数据一说到开源大数据处理平台,就不得不说此领域的开山鼻祖Hadoop,它是GFS和MapReduce的开源实现.虽然在此之前有很多类似的分布式存储和计算平台,但真正能实现工业级应用.降低使用门槛.带动业界大规模部署的就是Hadoop.得益于MapReduce框架的易用性和容错性,以及同时包含存储系统和计算系统,使得Hadoop成为大数据处理平台的基石之一.Hadoop能够满足大部分的离线存储和离线计算需求,且性能表现不俗:小部分离线存储和计算

mvc使用jquery post数据到java平台处理

问题描述 两个平台一个.net,一个java.现需求在asp.netmvc中点击某个操作,需要打开java平台一个页面,并且同时post数据给java平台处理.不知道如何搞了.帮帮忙吧兄弟们 解决方案 解决方案二:按java那边的接受标准post啊,当然前提是那边支持直接的js进行post,及支持CORS,否则的话只能先Post到Action,然后Action内再模拟Post,最终将返回值返回给前台解决方案三:引用1楼starfd的回复: 按java那边的接受标准post啊,当然前提是那边支持直

【J2EE十三个规范】数据层之JDBC

[学习概要]     在上篇博客中,介绍了两个Web层的规范,本篇博客,继续J2EE十三个规范的学习,下面要介绍的便是数据层的JDBC. [学习笔记]     一.什么是JDBC     JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.     二.JDBC的优势     1.有了JDBC API,就不必为Sybase数据库专门写一个程序,