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

ref:(沒用到,后續可以用來補充)
https://mariadb.com/resources/blog/uses-for-mariadb-and-the-spider-storage-engine/