美文网首页半栈工程师
(十四)Spider使用示例

(十四)Spider使用示例

作者: 紫狐挽诗 | 来源:发表于2020-07-06 19:56 被阅读0次

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。

测试连接到backend
测试连接到backend

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');

在backend1中test.opportunities插入一条数据

再在 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');

不过正确插入值之后,执行成功,然后可以查询到新增的值

在 spider server 中查询该表已有数据,并再插入一条数据

再回到 backend1,查看该 test.opportunities 表,虽然未在 backend1 中新增,但已有新增的值:

backend1中对应表可见server新插入的数据

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收纳所有不满足的值。

相关文章

网友评论

    本文标题:(十四)Spider使用示例

    本文链接:https://www.haomeiwen.com/subject/wbmgxktx.html