MariaDB-federated


原文链接: MariaDB-federated

开启 federated 方式

  1. 安装插件 mysql> install plugin federated soname 'ha_federated.so';
  2. mysql> show engines;
  3. 启动 FEDERATED 存储引擎,修改 / etc/my.cnf 参数,
    在 [mysqld] 下面添加:federated,重启 mysql

      ```
      [mysqld]
      federated
      # federated=1
      ```
    
  4. 在服务器 A [真实数据存储] 数据库 test 下面创建表 john

mysql>CREATE TABLE IF NOT EXISTS user ( id varchar(32) DEFAULT NULL,UNIQUE KEY index-123 (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

mysql> insert into user values(1),(2),(3);
Query OK, 3 rows affected (0.11 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from john;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+

  1. 在服务器 B [映射存储] federated
    GRANT ALL PRIVILEGES ON sources.s TO dex IDENTIFIED BY 'federated';
    GRANT ALL PRIVILEGES ON test.* TO federated@'%' IDENTIFIED BY 'federated';
    SHOW GRANTS FOR dex;

数据库 test 下面创建相应的表 federated_user

mysql> CREATE TABLE IF NOT EXISTS federated_user ( id varchar(32) DEFAULT NULL, UNIQUE KEY index-123 (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ENGINE=FEDERATED CONNECTION='mysql://federated:federated@10.114.0.14:3306/test/user';

DROP TABLE IF EXISTS sbtest1;
CREATE TABLE sbtest2 (
id int(11) NOT NULL AUTO_INCREMENT,
k int(11) NOT NULL DEFAULT 0,
c char(120) NOT NULL DEFAULT '',
pad char(60) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY k_1 (k)
) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1 ENGINE=FEDERATED CONNECTION='mysql://federated:federated@10.114.0.14:3306/test/sbtest1';

insert into sbtest1 values (1000005,486130,"47513645709-35092521244-74964471417-72326288909-23344110303-47569023971-79820853098-08050066800-93542686704-72275113768","03868057333-47146290482-37804645000-22378876760-56591265036");
mysql> select * from federated_user;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.37 sec) #请注意执行时间

mysql> insert into federated_user values(4),(5),(6); #可以通过 federated_user 修改数据
Query OK, 3 rows affected (0.16 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from federated_user;
在服务器 A 下面查询

mysql> select * from john;
6 rows in set (0.00 sec) #数据同样被修改;

在服务器 B 下面查看存储数据,只有表结构并没有相应的数据
image

【3】连接脚本注意事项,federated 连接字符串的格式说明

mysql> CREATE TABLE federated_user (
-> id varchar(32) DEFAULT NULL,
-> UNIQUE KEY index-123 (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8
-> ENGINE=FEDERATED CONNECTION='mysql://root:123456@192.168.47.167:3306/test/john';

其中 CONNECTION 的格式如下:

mysql://user_name[:password]@host_name[:port_num]/db_name/tbl_name

【总结】利用 federated 存储引擎构建表的时候,可以快速实现跨数据库的访问和修改,为一些特殊场景的应用提供了良好的解决办法;

由于是跨主机的访问,所以当表数量级别达到十万以上的时候,整个访问的速度相对本机有很明显的效率问题。

`