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。
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');
再在 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');
不過正確插入值之後,執行成功,然后可以查詢到新增的值
再回到 backend1,查看該 test.opportunities 表,雖然未在 backend1 中新增,但已有新增的值:
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/