您的位置:首页 > 数据库 > MariaDB

MariaDB FederatedX引擎

2016-09-20 09:44 169 查看
FederatedX引擎

官方参考:https://mariadb.com/kb/en/mariadb/about-federatedx/

概述

FederatedX引擎是Federrated引擎另一种表达方式,Oracle公司不再维护Federrated引擎。MariaDB继续开发和维护FederratedX引擎。

 

从MariaDB10.0开始,MariaDB支持connect引擎。Connect引擎也可以读取remote数据库通过mysql或者ODBC。然而现在的架构还是有一些限制的。

 

其他引擎都是设计成低级别的以文件作为数据源。FederatedX使用libmysql可以跟其他mysql进行通信。目前因为FederatedX只能使用libmysql,所以只能访问其他的mysql RDBMS。当然设计的目标是FederatedX也可以访问其他RDBMS,将其作为数据源。有一个项目FederatedX ODBC可以讲postgre作为远端数据源,这个将来也会作为一个功能,加入到下面的版本中。

 

历史

FederatedX的历史源于Federated的历史。思科像在自己的路由设备上存储远端的表,以便于路由设备跟远端表进行互动,但是这些表又不能存储在路由设备上,因为路由设备上的存储空间很小。The first prototype of the Federated Storage Engine was developed byJD (need to check on this- Brian Aker can verify) using the HANDLER interface

Brian handed the code to Patrick Galbraithand explained how it needed to work, and with Brian and Monty's tutelage andPatrick had a working Federated Storage Engine with MySQL 5.0. Eventually,Federated was released to the public in a MySQL 5.0 release.

 

When MySQL 5.1 became theproduction release of MySQL, Federated had more features and enhancements addedto it, namely:

New Federated SERVER added to the parser. This was something Cisco needed that madeit possible to change the connection parameters for numerous Federated tables at once without having to alter or re-create the
Federated tables.
Basic Transactional support-- for supporting remote transactional tables
Various bugs that needed to be fixed from MySQL 5.0
Plugin capability
In MariaDB 10.0.2 FederatedX
got support forassisted table discovery.

 

安装:

INSTALL PLUGIN federatedSONAME 'ha_federatedx.so';

 

 

工作原理

 

每个mysql引擎都会根据标准协议来实现。但是federatedx不是这样。最大的区别是federatedx在生成SQL结构的方式,需要能在远端服务器运行。将得到的结果按照内部格式整理,最终返回给用户。

 

内部工作:

 

一般的数据库引擎都会将文件放在本地,例如:创建了user表,本地会有一个user.MYD的文件。控制控制这个文件的写入,读取,更新和删除。数据以特定的格式存贮,便于读取。那些数据文件呗解析成fileds.读写都以这种格式进行。

    对于federatedx引擎,本地没有类似name.MYD的数据文件。远端的数据库服务器会回存储这些数据。这只能使用mysql clientAPI去读取,删除,更新,插入这些数据。数据会通过一个SQL 调用‘select * from user’来获取。

    之后,想要读取数据,需要通过mysql_fecht_row来进行检索。

基本工作流程如下:

1.  用户发起一个SQL,操作对象是federatedx引擎的表。SQL会被解析成项目树

2.  federatedx使用mysql控制器实现引擎必须的各种方法。需要进入SQL生成的项目树,还有表对象,每一个列。

3.  通过以上信息,federatedx生成一个SQL语句

4.  使用mysql client API通过libmysql将生产的SQL发送到远端数据源

5.  远端数据源根据接收的SQL去的数据,将数据发送回去。

6.  如果执行的SQL有返回结果(select),federatedx将结果迭代返回的每一行数据。以特定格式将数据展示出来。

7.  如果执行的SQL只有影响的行数(affaced_rows).这个数字会加到table status中,让用户看到影响了几行。

 

Federatedx 表创建

方式一

建表语句只会创建一个.frm的文件。将以下类型语句加入到建表语句即可,有几个类型:

 

connection=scheme://username:password@hostname:port/database/tablename

connection=scheme://username@hostname/database/tablename

connection=scheme://username:password@hostname/database/tablename

connection=scheme://username:password@hostname/database/tablename

方式二

或者也可使用mysql 5.1引进的语法格式:

connection="connection_one"

connection="connection_one/table_foo"


 

一个在connections中指定所有参数的例子:

connection=mysql://username:password@hostname:port/database/tablename


方式三

 

也可以创建一个federated服务器:

create server 'server_one' foreigndata wrapper 'mysql' options

  (HOST '127.0.0.1',

  DATABASE 'db1',

  USER 'root',

  PASSWORD '',

  PORT 3306,

  SOCKET '',

  OWNER 'root');


使用新创建的federatedx服务器创建一个federatedx表:

CREATETABLE federatedx.t1 (

  `id`int(20)NOTNULL,

  `name`varchar(64)NOTNULLdefault ''

  )

ENGINE="FEDERATED"DEFAULT CHARSET=latin1

CONNECTION='server_one';


 

注意:在mairaDB中,为了向后兼容federatedx引擎的名字还是显示为‘federated’。并没有‘X’。

 

 

The equivalent of above, if donespecifying all the connection parameters

CONNECTION="mysql://root@127.0.0.1:3306/db1/t1"


You can also change the serverto point to a new schema:

ALTER SERVER 'server_one' options(DATABASE 'db2');


 

查看创建的server

select * from mysql.servers;

 

注意:

       创建FEDERATED引擎表时使用的账户必须对表有相应权限。

主从结构中需要注意的地方:

1. 创建server的语句不会记录到mysql的binlog中,所以如果有从库还需要在从库手动执行创建server的语句。

2. 主库二进制日志一定要设置成row格式。不明白为什么,留言。

 例子:

server 3307:

1. create server 'mysql_3306' foreign data wrapper 'mysql' options (host '192.168.56.20', database 'test', user 'root', password 'mysql', port 3306, owner 'root');

2. CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(30) NOT NULL DEFAULT '',   PRIMARY KEY (`id`) )ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 CONNECTION='mysql_3306';  #这个会记录到binlog中

3. CREATE TABLE `test1` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(30) NOT NULL DEFAULT '',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB ;

运行以下语句,不同事务隔离级别产生的二进制日志。

insert into test1 select * from test;

事务隔离级别                 binlog_format             binlog

REPEATABLE-READ     mixed                        行格式 或者语句格式   # 这个取决于需要插入的数据量,如果需要插入的数据量少的话就记录成行格式,如果需要插入的数据量很多的话,就会记录成语句格式。但是,我还是不知道这个阀值到底是多少。 我测试30万时候,记录的是语句格式

REPEATABLE-READ     statement                  语句格式

READ-COMMITTED      mixed                         行格式

READ-COMMITTED      statement (不允许)

如果从库上没有手动创建server: mysql_3306 那么创建表test就会报错;

如果从库上创建了server mysql_3306,但是由于各种原因没有创建test, 同时binlog中记录的是语句格式,而不是row格式,那么从库执行insert into test1 select * from test;也会报错,因为没有这个表。

如果从库记录的是row格式,即便没有表test也不会报错,但是这样也是不科学的。主从数据实际上是不一致的。

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  maria db Federated