什么是Spider?

当您的数据库不断增长时,您绝对需要考虑其他技术,如数据库分片。Spider是MariaDB内置的一个可插拔用于MariaDB/MySQL数据库分片的存储引擎,充当应用服务器和远程后端DB之间的代理(中间件),它可以轻松实现MySQL的横向和纵向扩展,突破单台MySQL的限制,支持范围分区、列表分区、哈希分区,支持XA分布式事务,支持跨库join。

通过Spider,您可以跨多个数据库后端有效访问数据,让您的应用程序一行代码不改,即可轻松实现分库分表!

分库分表架构图:

应用程序连接Spider,Spider充当中间件代理,将客户端查询的请求,按照事先定义好的分片规则,分发给后端数据库,之后返回的数据汇总在Spider内存里做聚合,最终返回客户端请求,对于应用程序而言是透明的。

分片字段的选取:

一定要针对业务上查询最频繁的字段做片键,查询时会直接路由到后端DB 上,否则会轮训遍历后端所有DB,跨多个网络性能就会下降。

1、范围分片的优点是无限扩容,但缺点是冷热数据不均匀。

2、HASH分片解决了冷热数据不均匀的问题,但今后扩容比较麻烦,比如之前对表取模了128张,今后变更为256张,数据要重新导入。

典型案例---腾讯游戏

腾讯游戏的生产环境数据量达到了100TB,用了396个Spider节点做数据拆分,分片后的数据用了2800个MySQL节点存储。

使用场景介绍

下面我介绍一下我负责的一个项目,通过Spider实现了历史表的垂直拆分的经验分享。随着业务的增长,单台服务器磁盘空间有限,有些业务上的历史数据,DBA用工具pt-archiver归档后,历史表就没有用了,通常我们会把他单独迁移到备份机,主库上就删除了。

但有的时候,BI统计部门来了一个需求,需要临时关联查询这些历史表,那么DBA需要从备份机上myloader导入到从库上去,为了降低导数据引起的从库CPU升高、磁盘IO的瞬间增大,可能造成主从复制的延迟,为了减少这种重复性的体力工作,为了更快速的缩短可用时间,我们可以通过Spider引擎解决,通过它你可以将远程服务器上的表做一个映射,做一个软连接,相当于你操作本地的表一样,简单而便捷,省去了那么多麻烦,临时提供给业务方用,你也不用考虑啥性能问题。

架构图如下:

实施这个方案,选择Spider引擎是有优势的:SQL解析和查询优化是个非常复杂而且很难做好的工作,其他替代产品都是自己实现,由于复杂性,这些产品都带来了一些限,比如不支持存储过程、函数、视图等,给使用和实施带来了困难。

而作为一个存储引擎,这些工作都由MariaDB自身完成了,可以方便的将大表做分布式拆分,和Fabric 相比,它的好处是对业务方使用是透明的,SQL语法没有任何限制,在不改变现有DB架构的方案中,侵入性最小。

内部原理架构图如下:

我们在一台从库上,安装上Spider引擎,只需两条命令做一个表的“超链接”,分分钟就解决了问题。

注:前提是你的从库使用的是 MariaDB 10

下面是官方的垂直拆分压测报告:

而在我的压测结果上,分库分表的性能会降低70%,而垂直拆分性能会降低40%,性能损耗的原因是在分布式场景下,要保证2pc的一致性和可用性,读写的表现就差,另外就是跨多个网络传输这两方面引起的。

目前为RC公测版本V3.2.37,固在主库上实现该功能要慎重!

Spider引擎安装

# mysql -uroot -p < /usr/local/mysql/share/install_spider.sql

mysql > SELECT engine, support, transactions, xa FROM

information_schema.engines;

Spider引擎使用

垂直拆分

1、定义后端服务器和数据库名字

CREATE SERVER backend1

FOREIGN DATA WRAPPER mysql

OPTIONS(

HOST '192.168.143.205',

DATABASE 'test',

USER 'user_readonly',

PASSWORD '123456',

PORT 3306

);

这里后端服务器的名字为backend1,数据库名字为test,主机IP地址为192.168.143.205,用户名为user_readonly,密码为123456,端口为3306

注:如配置错误,可直接DROPSERVER backend1; 重新创建即可。

2、创建表的“超链接”

CREATE TABLE `sbtest` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`k` int(10) unsigned NOT NULL DEFAULT '0',

`c` char(120) NOT NULL DEFAULT '',

`pad` char(60) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),

KEY `k` (`k`)

) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "sbtest",srv "backend1"';

这里通过设置COMMENT注释来调用后端的表,然后你就可以查看sbtest表了,是不是很简单?

分库分表CREATE TABLE `sbtest` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`k` int(10) unsigned NOT NULL DEFAULT '0',

`c` char(120) NOT NULL DEFAULT '',

`pad` char(60) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),

KEY `k` (`k`)

) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "sbtest"'

PARTITION BY LIST (mod(id,2))

(PARTITION p0 VALUES IN (0) COMMENT = 'srv "backend1"' ENGINE = SPIDER,

PARTITION p1 VALUES IN (1) COMMENT = 'srv "backend2"' ENGINE = SPIDER);

同上,但区别是分库分表是采用了类似表分区的概念实现。

可调优参数

spider_conn_recycle_mode = 1

连接复用,类似连接池这种功能

optimizer_switch = 'engine_condition_pushdown=on'

引擎下推,查询推送到后端数据库,将查询结果返回给Spider做聚合

负载均衡架构设计

由于Spider自身不保存数据,只保存路由信息,是无状态的,所以可以部署多个Spider做负载均衡,架构图如下:

后端MySQL可以结合MHA实现高可用故障切换。

注:在MariaDB 10.2版本里,Spider准备GA,并且合并了腾讯的补丁。

RC最新体验版下载地址:

参考文献:

mysql数据库横向转纵向_MariaDB Spider:实现MySQL横纵向扩展的小能手相关推荐

  1. Linux下自动备份MySQL数据库及Can‘t connect to local MySQL server through socket和you need (at least one of) 解决e

    Linux下自动备份MySQL数据库及Can't connect to local MySQL server through socket和Access denied; you need (at le ...

  2. 自动驾驶横纵向耦合控制-复现Apollo横纵向控制

    自动驾驶横纵向耦合控制-复现Apollo横纵向控制 基于动力学误差模型,使用mpc算法,一个控制器同时控制横向和纵向,实现横纵向耦合控制 matlab与simulink联合仿真,纵向控制已经做好油门刹 ...

  3. MariaDB Spider:实现MySQL横纵向扩展的小能手

    什么是Spider? 当您的数据库不断增长时,您绝对需要考虑其他技术,如数据库分片.Spider 是 MariaDB 内置的一个可插拔用于 MariaDB/MySQL 数据库分片的存储引擎,充当应用服 ...

  4. mysql 数据库快照迁移_快照方式备份mysql 数据库

    关闭mysql服务 # service mysqld stop 一.创建逻辑卷 依照如下连接的文档创建一个逻辑卷 要求:物理卷20G;卷组名为vg0;逻辑卷2G,逻辑卷名为mydata 创建逻辑卷挂载 ...

  5. 手动备份MySQL数据库_8种手动和自动备份MySQL数据库的方法

    作为流行的开源数据库管理系统,MySQL的使用者众多,为了维护数据安全性,数据备份是必不可少的.本文就为大家介绍几种适用于企业的数据备份方法. 使用MySQLDump进行MySQL备份 mysqldu ...

  6. MySQL数据库https接口_第三章 mysql 数据库接口程序以及SQL语句操作

    mysql  数据库接口程序以及SQL语句操作 用于管理数据库: 命令接口自带命令 DDL:数据定义语言(create drop ) DCL: 数据控制语言(grant revoke) DML: 数据 ...

  7. php实现sql server数据导入到mysql数据库_php实现SQL Server数据导入Mysql数据库(示例)...

    php将mssql的数据导入到mysql数据库中,代码: 代码示例: //连接SQL server数据库 $conn=mssql_connect("localhost"," ...

  8. mysql数据库建设网站,网站设计与建设-MySQL数据库【松柏书屋】

    <网站设计与建设-MySQL数据库[松柏书屋]>由会员分享,可在线阅读,更多相关<网站设计与建设-MySQL数据库[松柏书屋](64页珍藏版)>请在人人文库网上搜索. 1.第2 ...

  9. matlab 连接mysql数据库_【转】matlab 连接 mysql 数据库

    首先要安装mysql驱动程序包,详细步骤如下: Step 1: 将mysql-connector-java-5.1.7-bin.jar文件拷贝到......\MATLAB\R2009a\java\ja ...

最新文章

  1. 访问者模式的java语言_Java 设计模式 之 访问者模式
  2. sqlite3常用命令以及django如何操作sqlite3数据库
  3. 文件系统中文件的最长(字符数)绝对路径 Longest Absolute File Path
  4. Python中os库的使用
  5. 属性面板 脚本_如何在组态王中实现同类型设备公用操作面板的调用---干货
  6. element ui缩小行高
  7. wxpython控件自适应窗口大小
  8. 火山安卓帧布局器的基本使用方式
  9. QTP10.0安装所遇问题-脚本调试器问题
  10. LE Coded PHY和LE Uncoded PHY
  11. base64编码和解码算法
  12. Markdown写作工具盘点
  13. IOS开发之——音乐播放器-功能封装(03)
  14. emule服务器地址列表地址
  15. 虚拟机桌面切换命令行
  16. 获取手机WiFi Ip地址
  17. guanyongyu2
  18. 决策树及决策树生成与剪枝
  19. excel隔行显示不同颜色
  20. div的display和visible的区别

热门文章

  1. VS2015如何使自己的exe文件在别人的电脑上运行(找不到MSVCP140D.dll)
  2. Python稳基修炼之计算机等级考试易错细节题1(含答案和解析)
  3. mac os android连接wifi密码,Mac使用小技巧:找回WiFi密码
  4. 微课|中学生可以这样学Python(例4.3):百钱买百鸡
  5. Python计算整数阶乘的几种方法比较
  6. h5 video 手机 显示第一帧_【图像处理二】HDMI显示(一)
  7. 基于MVC的jpetstore项目分析
  8. android中断言_我可以使用断言在Android设备上?
  9. html input 字体颜色_html 元素参考整合实用收藏!前端web工程师必备!
  10. numpy 索引多个_Numpy基础三,学习Python编程必备