美文网首页半栈工程师
(十四)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