用智能代理扩展数据库应用
将数据库客户端和数据库服务器之间的连接作为一个杠杆点。
顾名思义,智能数据库代理坐在数据库客户端和数据库服务器(SQL或NoSQL)之间。它可以观察和修改客户端和服务器之间的网络流量,而不需要对任何一方做任何改变,因为代理在有线协议层面工作。
代理的 "聪明 "之处在于,它可以对这种流量执行自定义逻辑,让你完全控制它。这使得代理成为所有数据库客户端的潜在控制点。
智能数据库代理一般用于三个原因。
观察流量
根据定义,代理可以看到所有进入数据库和从数据库出来的东西。通过观察这些流量可以学到很多东西。这可用于入侵检测、商业智能、性能分析等...。
还有其他观察数据库活动的方法,如监控界面和日志监控,但它们通常需要对数据库的特殊访问,而且它们会给数据库带来一些负荷。代理对数据库服务器没有影响,不需要对数据库进行特殊的访问就可以投入使用,并且可以独立扩展。
控制流量
大多数数据库系统都有某种程度的访问控制,但它们通常是在语义层面:你可以访问这个数据,但不能访问那个数据。但有时你需要有能力拒绝某些请求,因为它们是低效的,或者因为它们在一天中的错误时间出现,或者出于任何原因。
这方面的一个微不足道的应用是基本的查询控制,但它也可以包括拒绝某些连接、速率限制、重定向连接等。
修改流量
因为数据库代理对数据库客户端和数据库服务器之间的网络流量有完全的控制,它也可以修改这种流量。
例如,一个低效的查询在到达数据库之前可以被改写成更高效的查询。
同样地,一个结果集在返回数据库客户端的途中也可以被修改。这对细粒度的控制特别有用,如自定义数据屏蔽、数据分类执行等。
典型的使用案例
智能数据库代理本身不是一个解决方案:它是一个平台,使你能够创建一个解决方案。每种情况都是独特的,但大多数的使用都属于几个广泛的使用情况。
请求修改
智能数据库代理最常见的用例是当你需要改变一个应用程序与数据库的交互方式,但你不能改变该应用程序--通常是一个你不控制的第三方应用程序,或一个不再维护的应用程序。
这是最常见的使用情况,因为没有其他选择:要么这样,要么放弃这个应用程序。
在实践中,这通常是一个相当简单的事情:你在代理中设置了一个过滤器来捕捉某个请求,然后用另一个请求来替换它。在大多数情况下,替换的请求在逻辑上等同于它所替换的请求,因为它需要产生一些可以被应用程序消费的结果。例如,这可能意味着重新表述一个查询,使其更有效或有不同的行为,或改变数据库不再支持的语法或功能。
在某些情况下,你甚至可以改变一个请求,使其返回一个错误信息(例如,"此数据不可用"),一个空的结果集,甚至是一个来自不同数据源的数据集。
结果集的修改
这是请求修改的镜像。在有些情况下,你可能需要改变一些查询所返回的数据,而这种方式很难或不可能通过修改请求来实现。你可能需要在一个大的结果集中改变一个值,或者转换货币,或者以数据库不支持的方式掩盖某些值。不管是什么原因,代理都能让你在最原子的层面上灵活地改变查询结果。
细粒度的访问控制
有时,不可能用数据库的机制来表达复杂的访问控制要求。你可能需要指定某些用户在某些时候只能获得对某些非常具体的数据项的访问权,而大多数数据库在这方面根本不擅长--这被认为是数据库客户端的工作。即使是那些支持它的数据库(例如具有细粒度访问控制的Oracle)也倾向于使它变得痛苦和昂贵。
在这种情况下,代理可以为已知的查询实现极其精细的访问控制,尽管它可能无法为任意的查询做到这一点。
请求控制
大多数应用程序以一种相对可预测的方式访问他们的数据库,因此你可以记录一段时间内的请求(记录阶段),然后通过拒绝任何以前没有见过的请求(执行阶段)来锁定系统。这很容易通过一个智能的数据库代理完成,有足够的灵活性来适应任何非琐碎的IT系统中不可避免的例外情况和特异性,这是可以预期的。
商业智能
在数据库中获得一个可靠的、实时的应用程序的视图可能是令人惊讶的困难。一些数据库提供了一个界面,让你看到它的活动,但它们往往集中在监控和性能上。一个代理可以很容易地拔出任何相关的数据库活动类型,并记录它或将其发送到需要的地方。代理的卖点是,无需对数据库进行任何特殊的访问,对数据库或客户端没有任何影响,并且对所有数据库访问的一个子集都可以做到这一点。
剔除数据库访问逻辑的因素
代理的一个新用途是在应用程序中有意识地利用它们,而不是在事后。如果你有许多应用程序需要以相同的要求访问同一个数据库,而你已经有了一个代理,那么把一些数据库访问逻辑分给代理是有意义的。例如,可以对特定的查询进行标记,以便代理将以一种在所有应用程序中一致的方式识别和修改它们。
在这种情况下,你可以把代理看作是数据库的扩展:你是在明知故犯地访问一个扩展的数据库,而不是数据库本身。
智能数据库代理是一个针对数据库流量运行你的逻辑的平台,所以如果需要的话,你可以变得很有创意。例如,你可以通过将多个来源的数据啮合到一个单一的结果集来做一些轻量级的整合,或者动态生成测试数据,或者对数据进行即时加密和解密。当你给他们这种权力的时候,看看有创造力的人能够做什么总是很有趣的。
数据库代理的风险
巨大的权力伴随着巨大的责任。所有这些能力并不总是没有代价的。
数据库代理可以看到所有进入和离开数据库的东西,因此它可能是一个敏感点。谁控制了代理,谁就控制了通过它的应用程序:应该让它和使用它的最安全的应用程序一样安全。
代理的额外复杂性也是需要考虑的问题。它是一个必须被计划、安全和管理的系统。此外,任何部署在代理上的逻辑都必须被管理、测试、源控制等等。这很容易上手 -- 一个典型的查询替换过滤器通常不超过几行代码 -- 但随着代理运行越来越多的逻辑,你需要管理这些逻辑。
最后,像其他任何工具一样,数据库代理也可能被误用。
最常见的问题是,它变得太容易推迟应用程序的更新--只是让代理处理它。在许多情况下,修改请求和响应的能力是一种救命稻草,但它也可能失去控制。如果你发现自己游走在太多的过滤器中,有不合理的查询重写和结果集编辑的数量,可能是时候考虑至少更新你的一些应用程序。但是,要由你来决定这个数字何时变得不合理。
总结
一个聪明的数据库代理可以成为许多IT项目的有力补充。一旦你意识到数据库客户端和数据库服务器之间的连接可以被打开和利用,各种有趣的可能性就会出现。
大多数人开始使用数据库代理作为一个点解决方案,通常是为了解决特定应用程序中的一个特定问题,但一旦代理到位,它可以成为一个伟大的杠杆点。