Babelfish简介

 

 

 

Babelfish是在PostgreSQL的基础之上实现了类似Microsoft SQL Server部分功能。为了实现这个目标,PostgreSQL核心内部的几个部分必须被修改。PostgreSQL 没有提供这种开箱即用的功能,因此必须提供附加组件才能实现这一点。

      Babelfish实现Microsoft SQL Server功能的方式是使用hooks(我们一般称之为钩子),主要做这意味着 PostgreSQL可以呈现为不同的数据库状态,比如Oracle、MS SQL SERVER。而事实上在同一时间可以同时支持多个协议,会使数据库的设置更加灵活和易于处理。

Babelfish for PostgreSQL架构图

Babelfish架构图
架构说明:
  • Babelfish for PostgreSQL实例具备两个TCP端口,分别监听来自SQL Server和PostgreSQL客户端的SQL请求。
    • TDS Listener:接收SQL Server协议端口(TDS)的SQL请求,默认端口号为1433。
       
      说明 Babelfish支持TDS协议7.1及更高版本,即支持Microsoft SQL Server 2000及以上版本。
    • PostgreSQL Listener:接收PostgreSQL协议端口的SQL请求,默认端口号为5432。
       
      说明 当前支持RDS PostgreSQL 13和14。
  • Babelfish for PostgreSQL实例接收来自TDS Listener端口的SQL请求时,该请求被转发到T-SQL解析器,将SQL Server的T-SQL转换为PostgreSQL可识别的执行计划。
  • Babelfish for PostgreSQL实例接收来自PostgreSQL Listener端口的SQL请求时,该请求被转发到PostgreSQL解析器,生成执行计划。
  • PostgreSQL内部的SQL执行器统一处理,执行所有计划。

开启了Babelfish功能的PostgreSQL实例,使您同时具备了两个数据库引擎(PostgreSQL和SQL Server)的能力,既可以处理来自SQL Server的请求,又可以处理来自PostgreSQL的请求,在降低成本的同时获得更多的能力支持。

迁移模式简介

Babelfish for RDS PostgreSQL实例会预置一个名为babelfish_db的PostgreSQL数据库,所有迁移的SQL Server对象和结构都会放置在该数据库下。

 
说明 如果您通过TDS端口连接实例,babelfish_db数据库不可见。

您可以选择Single-DB模式(单数据库模式)或Multi-DB模式(多数据库模式)。不同模式下,babelfish_db内的SQL Server数据库模式及名称不同。

Single-DB模式

  • 架构图:single-db
  • 说明:该模式下,babelfish_db数据库中用户数据库的Schema名称与SQL Server中的相同。
    例如:通过TDS端口创建数据库DB_A,然后在DB_A下创建schema_A。
    • 在PostgreSQL的babelfish_db数据库中,Schema名称为:dbo和schema_A。
    • 在SQL Server的DB_A数据库中,Schema名称为:dbo和schema_A。

Multi-DB模式

  • 架构图:Multi-DB
  • 说明:该模式下,在PostgreSQL中,用户数据库的schema名称为dbname_schemaname。在SQL Server中,Schema名称保持不变。
    例如:通过TDS端口创建数据库DB_A,然后在DB_A下创建schema_A。
    • 在PostgreSQL的babelfish_db数据库中,Schema名称为:DB_A_dbo和DB_A_schema_A。
    • 在SQL Server的DB_A数据库中,Schema名称为:dbo和schema_A。

其他

Babelfish模仿 Microsoft SQL Server的特定数据类型。以下是这些类型的完整列表:

sys.BBF_BINARY: 二进制数据的数据类型。

sys.BIT: 将1或0转换为t或f。

sys.BPCHAR和sys.VARCHAR:Microsoft SQL Server特定varchar实现

sys.DATETIME: 时间和日期的简单数据类型。为了更精确地使用DATETIME2。

sys.DATETIME2:DATETIME具有更高精度和功能的扩展。

sys.DATETIMEOFFSET:很像DATETIME2,但具有时区概念。

sys.SMALLDATETIME:定义与一天中的时间相结合的日期。时间基于24小时制,秒数始终为零 (:00),没有小数秒。

sys.SQL_VARIANT:使这些数据库对象能够支持其他数据类型。

sys.UNIQUEIDENTIFIER:16字节GUID(例如6F9619FF-8B86-D011-B42D-00C04FC964FF)

lbabelfishpg_money: 固定精度数字类型

还有一种数据类型出于许可原因打包到单独的扩展中:fixeddecimal.

lbabelfishpg_tds: TDS 协议扩展

此扩展处理TDS客户端-服务器协议。它必须在服务器启动时使用加载shared_preload_libraries,以便它可以开始在TDS端口上侦听传入连接。

lbabelfishpg_tsql: T-SQL 扩展

此扩展的目的是提供T-SQL处理所需的所有代码。如果没有可能无法编写存储过程代码。包含实现 Microsoft SQL Server 功能所需的大量函数、系统视图和其他基础结构。

Compass作为Babelfish的迁移评估工具,可以对源端的多个SQL脚本进行迁移评估,并给出评估报告;

WebSite是文档相关内容,与官网是一致的,包括介绍Babelfish的架构、兼容性、安全等等;

Tools主要是可以访问Babelfish的客户端工具,包括psql、tsql以及MS SQL SERVER自带的smss;

最后一部分是Client,这部分主要是客户端编程,除了支持不同编程语言,如C、C#、Python、Java以外,还支持不同的驱动,如下:

lOLEDB Provider/MSOLEDBSQL

lOLEDB Driver/SQLOLEDB (deprecated by Microsoft)

l.NET Data Provider for SQL Server

l SQL Server Native Client 11.0 (deprecated by Microsoft)

l Microsoft SqlClient Data Provider for SQL Server

l Open Database Connectivity (ODBC)

l Java Database Connectivity (JDBC)

也就是说我们可以像使用MS SQL SERVER一样来使用Babelfish,当时具体兼容性会有很多差异。

 

开源

PostgreSQL SQL Server 兼容插件 babelfish开源

AWS babelfish 开源了, 瞄准了SQL Server的存量数据库市场.

https://github.com/babelfish-for-postgresql/

https://babelfishpg.org/getstarted/

但是目前的使用方法比较复杂, PG内核还没有接收proxy protocol的patch, 所以要用babelfish必须使用aws开源的这个postgresql版本:

https://github.com/babelfish-for-postgresql/postgresql_modified_for_babelfish

《PostgreSQL devel preview - PROXY protocol support (支持代理协议解包, 源头client ip filter pg_hba.conf, 例如haproxy, balancer)》

《PostgreSQL 兼容 SQL Server - Babelfish - SQL Server 业务 无感使用PostgreSQL - 一份数据, 同时兼容SQL Server和PostgreSQL》

posted @ 2022-11-16 17:38  古道轻风  阅读(292)  评论(0编辑  收藏  举报