mariadb数据库分布式存储引擎spider的运用

mariadb是mysql数据库的开源分支,在不细究差别的情况下,你完全可以当成mysql来看。

spider引擎是一个内置的支持数据分片特性的存储引擎,支持分区和XA事务,该引擎可以在服务器上建立和远程服务器表之间的链接,操作起来就像操作本地的表一样。并且后端可以是任何的存储引擎。spider引擎根据表的设置的规则以及server表的规则自动进行智能路由,实现对后端数据库不通的表或者数据分片的访问和修改。因此该引擎对业务是完全透明的。目前spider引擎已经集成到了MariaDB中,安装使用非常方面。

总结:
优点:
1.spider引擎对业务层不干涉,这意味着如果你要做数据分布式存储,完全可以做到不改动一行代码。
2.spider从mariadb10开始被集成到了mariadb安装包中,作为mariadb默认的分布式存储引擎,且安装简便。
3.方便横向扩展,能解决单台mysql得性能和存储瓶颈问题
4.对后端的存储引擎没有限制
缺点:
1.spider的容灾机制不完善。需要自己想办法做容灾机制,具体体现在:1):spider的server端不储存实际数据,如果后端数据库的一台宕机了,spider的server端也使用不了了。 2):由于spider不实际存储数据,所以数据备份要到实际存储数据的后端服务器上备份.
2.spider的表本身不支持查询缓存和全文索引,不过可以将全文索引添加在后端数据库中。

左:通常情况下;右:spider情况下
如图,图的左侧是没没有部署spider的场景,通常我们的项目直接连接数据库。右侧为部署了spider的场景,项目直连的变成了spider server ,再由spider server 去转发到 实际存储数据的 mariadb ,所以这就是前文说的spider 是不实际存储数据的,这里有点类似nginx web 转发的场景。对于代码层面来说,甚至连接数据库的连接串都不用改变。

1、spider的部署

spider的安装文件在mariadb安装目录下的share文件夹中(我这里的安装方式是使用mariadb源码编译后安装,mariadb的版本是10.2.8)
在这里插入图片描述
登录数据库后执行

source /xxx/xxx/xxx/install_spider.sql;

在这里插入图片描述
在这里插入图片描述
query ok 没有错误就说明spider已经安装好了
如果不放心的话,可以使用下列sql语句查看spider是否安装成功

select engine , support , transactions , xa from information_schema.engines;

在这里插入图片描述
查询结构如上图所示,表示spider已开启
注意:只需要在充当spider server的mariadb上开启spider就行了,实际存储数据的mariadb可以不用开启spider。

2、实战演示

我这里有三台mariadb的数据库服务器。
192.168.31.104 作为 spider server ,项目需要连接的就是它。

192.168.31.224 作为后端数据库,这里称它为db1。实际存储数据的就是它

192.168.31.226 作为后端数据库,这里称它为db2。实际存储数据的就是它

场景一:垂直拆分

1.table1表的数据存到 db1(192.168.31.224) 的test1 库中,
2.table2表的数据存到db2(192.168.31.226)中的test1库中

在spider server(192.168.31.104)上建立后端db的连接,实际就是在mysql.servers表中插入记录

create server 'db1-test1-table1' foreign data wrapper mysql options (host '192.168.31.224', database 'test1', user 'root', password 'xxxxxx', port 3316);
create server 'db2-test1-table2' foreign data wrapper mysql options (host '192.168.31.226', database 'test1', user 'root', password 'xxxxxx', port 3316);

在这里插入图片描述

server 'test1-table1' 
后端db的server名字,可以随便取,我这里为了好区分用的是db名-库名-表名(db1-test1-table1),你可以直接叫db1或db2或zhangsan什么的

host '192.168.31.224'	
后端数据库的IP

database 'test1'				
后端数据库对应的库

user 'root', password 'xxxxxx'  
后端数据库对应的账号密码,我这里直接用了root,也可以在db上专门建一个用户用于spider server 的访问,当然别忘了给用户授权

port 3316   
后端数据库的端口号

查询:

select * from mysql.servers;

在这里插入图片描述

1.在后端db1中test1库中建立table1的表,这个表是实际存储数据的表,然后在spider server上的test1库中建立table1的关联表,通过建表语句中的注释指定此表会连接db1上的表

1.在后端db1上建立table1表

create table table1 (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) engine=InnoDB default charset=utf8 comment 'i am table1';

在这里插入图片描述
2.在spider server上建立关联表

create table table1 (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='server "db1-test1-table1"';

在这里插入图片描述
3.测试
在这里插入图片描述
在这里插入图片描述

2.在后端db2中test1库中建立table2的表,这个表是实际存储数据的表,然后在spider server上的test1库中建立table2的关联表,通过建表语句中的注释指定此表会连接db2上的表

这个操作是一样的就不继续了…

场景二:水平拆分

水平拆分可以按hash、range、list等方式进行数据分片。

spider server和db分别需要使用的库和表:
spider server 使用test2库 tableHash表
db1 使用test2库 tableHash表
db2 使用test2库 tableHash表

1.第一步先查询mysql.servers表,如果已经存在后端db对应库的连接串,那么就不需要创建新的连接串,否则则要创建
在这里插入图片描述

2.分别在后端db创建表
在这里插入图片描述
在这里插入图片描述3.在spider server中创建关联表

create table tableHash (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "tableHash"'
PARTITION BY HASH(id)
( PARTITION pt1 COMMENT = 'server "db1"',
PARTITION pt2 COMMENT = 'server "db2"') ;

在这里插入图片描述
说明:上方建表语句的作用是,建立一张名为tableHash的表,使用了spider引擎,关联远程db1,db2上的test2库中的tableHash表。表中的数据会按hash分片。

测试
spider server写10条数据
在这里插入图片描述
db1查看
在这里插入图片描述
db2查看
在这里插入图片描述
每个db分别存了5条数据

下面是range、list 分区的建表语句
range: 表名是tableRange ,db上得先建,下面的是spider server需要建的

create table tableRange (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "tableRange "'
PARTITION BY range columns (id)
( PARTITION pt1 values less than (100000) COMMENT = 'server "db1"',
PARTITION pt2 values less than (200000) COMMENT = 'server "db2"') ;

list: 表名是tableList ,db上得先建,下面的是spider server需要建的

create table tableList  (
id int,
username varchar(20),
address varchar(128),
primary key (id),
key (username)
) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "tableList "'
PARTITION BY list columns (id)
( PARTITION pt1 values in (1,3,5,7,9) COMMENT = 'server "db1"',
PARTITION pt2 values in (2,4,6,8,10) COMMENT = 'server "db2"') ;

综上,使用spider垂直拆分和横向拆分就完成了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值