Spider 使用简单示例:
準备工作
有三个设备安装 MariaDB
简单的架构一个 spider server,两个后端 server:backend1 和 backend2;
在我的例子里,对应的主机名和 IP 分别是:
spider server(ubt18) :主机名:sanotsu
,ip:192.168.28.93;
backend1(ubt18):主机名:david
,,ip:192.168.28.72;
backend2(win7):主机名:davidsu
,,ip:192.168.28.80。
1、spider server 安装 Spider
MariaDB package 并无相关套件,需要终端安装
sudo apt install mariadb-plugin-spider
确认是否安装成功
使用任一指令:
show plugins;
,show engines;
或show tables from mysql like '%spider%';
.
有看到 spider 相关值或变量就说明成功。
2、backend MariaDB 建立 spider 使用的账户
分别在两个 backend 创建 spider server 可访问的账户:
grant all on test.* to spider@'192.168.28.93' identified by 'spider';
创建完之后,在 spider server 测试能否连接到两个 backend:
只用终端输入指令:mysql -uspider -p -h 192.168.28.72
,或者直接用工具 dbeaver 通过 spider 帐号连接到 backend。
![](https://img.haomeiwen.com/i3998574/2d6a3b1b9b39346e.png)
![](https://img.haomeiwen.com/i3998574/7c4bad6ce75b86f8.png)
3、在 backend 创建示例表
在 backend1 和 backend2 设备的 MariaDB 创建 test 数据库(如果没有的话),再创建一个示例表,如下:
create table opportunities (
id int,
accountName varchar(20),
name varchar(128),
owner varchar(7),
amount decimal(10,2),
closeDate date,
stageName varchar(11),
primary key (id),
key (accountName)
) engine=InnoDB;
4、在 spider server 上创建服务器条目(server entries)
虽然连接信息也可以在注释中内联指定,但是定义一个代表每个远程后端服务器连接的服务器对象更简洁。语句如下:
create server backend1 foreign data wrapper mysql options
(host '192.168.28.72', database 'test', user 'spider', password 'spider', port 3306);
create server backend2 foreign data wrapper mysql options
(host '192.168.28.80', database 'test', user 'spider', password 'spider', port 3307);
flush tables;
端口不同是因为 win7 主机上有安装 mysql 和 MariaDB,区分了端口,注意远端 MariaDB server 主机的 IP 地址正确。
注意:
请记住,如果出于任何原因需要删除、重新创建或以其他方式修改服务器定义,则还需要执行FLUSH TABLES语句
。 否则,Spider 会继续使用旧的服务器定义,这可能导致查询引发错误:Error 1429: Unable to connect to foreign data source
5、spider 用例:
5.1 处理远端表
在这种情况下,将创建一个 spider 表,以允许远程访问 backend1 上托管的机会表。 然后,这将允许从 spider server 向 backend1 服务器执行查询和远程 DML 操作.
在 spider server 创建一个 spider table,连接到远端主机 backend1:
create table test.opportunities (
id int,
accountName varchar(20),
name varchar(128),
owner varchar(7),
amount decimal(10,2),
closeDate date,
stageName varchar(11),
primary key (id),
key (accountName)
) engine=spider comment='wrapper "mysql", srv "backend1" , table "opportunities"';
此时,在 spider server 的 test 数据库中,建立了一个直接关联到了 backend 主机上的 test.opportunities 表。
在 spider server 对该表做 DML 都会对 backend1 中关联表生效,执行查询也是对该表数据的查询。
演示:在 backend1 中 test.opportunities 插入一条数据
INSERT INTO test.opportunities (id, accountName, name, owner, amount, closeDate, stageName) VALUES(1, 'backend1', 'backend1', 'back1', 30, '2020-02-28', 'halo');
![](https://img.haomeiwen.com/i3998574/e6c1c826259441c4.png)
再在 spider server 中查询该表,可以得到该数据:
SELECT id, accountName, name, owner, amount, closeDate, stageName FROM test.opportunities;
因为有设定 id 为主键,所以在 spider server 对该表新加一条已存在值的 id,会报错:
INSERT INTO test.opportunities
(id, accountName, name, owner, amount, closeDate, stageName)
VALUES(1, 'spiderserver', 'spiderserver', 'test', 30, '2020-02-28', 'hall');
不过正确插入值之后,执行成功,然后可以查询到新增的值
![](https://img.haomeiwen.com/i3998574/aa228430c65b3375.png)
再回到 backend1,查看该 test.opportunities 表,虽然未在 backend1 中新增,但已有新增的值:
![](https://img.haomeiwen.com/i3998574/647971181e3b8ff2.png)
5.2 数据分片(sharding)
按 hash 分区
在本例中,通过对 id 进行散列(hashing)处理,创建了一个 spider 表,以便在 backend1 和 backend2 之间分布(distribute )数据。
如果 id 是一个自增的值,散列处理将可以确保值在 2 个节点之间均匀分布。
create table test.opportunitiesByHash (
id int,
accountName varchar(20),
name varchar(128),
owner varchar(7),
amount decimal(10,2),
closeDate date,
stageName varchar(11),
primary key (id),
key (accountName)
) engine=spider COMMENT='wrapper "mysql", table "opportunities"'
PARTITION BY HASH (id)
(
PARTITION pt1 COMMENT = 'srv "backend1"',
PARTITION pt2 COMMENT = 'srv "backend2"'
) ;
按 range 分区
示例使用 accountName 来进行 range 分区,那么依照 MariaDB 的规范,需要将 accountName 栏位加入到主键中去。具体分区条件见示例:
create table test.opportunitiesByRange (
id int,
accountName varchar(20),
name varchar(128),
owner varchar(7),
amount decimal(10,2),
closeDate date,
stageName varchar(11),
primary key (id, accountName),
key(accountName)
) engine=spider COMMENT='wrapper "mysql", table "opportunities"'
PARTITION BY range columns (accountName)
(
PARTITION pt1 values less than ('M') COMMENT = 'srv "backend1"',
PARTITION pt2 values less than (maxvalue) COMMENT = 'srv "backend2"'
) ;
按 list 分区
示例使用 owner 来进行 list 分区,那么依照 MariaDB 的规范,需要将 owner 栏位加入到主键中去。具体分区条件见示例:
create table test.opportunitiesByList (
id int,
accountName varchar(20),
name varchar(128),
owner varchar(7),
amount decimal(10,2),
closeDate date,
stageName varchar(11),
primary key (id, owner),
key(accountName)
) engine=spider COMMENT='wrapper "mysql", table "opportunities"'
PARTITION BY list columns (owner)
(
PARTITION pt1 values in ('Bill', 'Bob', 'Chris') COMMENT = 'srv "backend1"',
PARTITION pt2 values in ('Maria', 'Olivier') COMMENT = 'srv "backend2"'
) ;
根据之前的说明,list 分区还可以加DEFAULT
收纳所有不满足的值。
网友评论