Spider引擎分布式数据库解决方案(最全的spider教程) |
您所在的位置:网站首页 › 什么叫分布式数据库 › Spider引擎分布式数据库解决方案(最全的spider教程) |
最近开始负责财付通的数据库的相关维护工作,其中有几套系统使用的spider引擎,为了以后能更好地对这套系统进行维护,对spider做了一些功课,将spider引擎的功能、使用场景、部署、实战测试等做个简单的总结,希望不了解spider引擎的同学看到这篇文章能对spider引擎有个更深入的了解。 先来说两个我们DBA经常遇到的场景: 场景1:有两个分布在不通实例上的多张不通的表,想要通过某个字段关联,做一个统计,或者想将分布在不同实例的表,合并到一个实例中来做一些查询。 场景2:由于数据库容量的瓶颈或者是由于数据库访问性能的瓶颈,将一某一个大库、大表或者访问量非常大的表进行拆分,然后分布到不通的实例中。 这两种场景覆盖了我们DBA经常接触的垂直拆分和水平拆分,在这种场景下往往面临着如下几个窘境: 1、这些表的访问和存取需要额外的路由规则,复杂度很高 2、需要做数据汇总或者统计的时候,非常麻烦 我们想到的解决办法可能有如下几种: 1、使用数据库中间件(Mysql fabric/TDDL/cobar/Atlas/Heisenberg/Vitess) 这个似乎是大公司的专用的,由于存在各种各样的限制,小公司往往使用起来非常不方便,对于里面存在的各种坑也没办法很好的进行规避。 2、使用mysql分区表 无法解决磁盘空间瓶颈以及服务器性能瓶颈。 3、使用Galera Cluster for MySQL 支持数据库的高可用以及能实现读请求的扩展,但是对于写请求无法实现性能上的突破。 4、使用mysql的多源复制 仅仅适合将多个实例的数据聚合到一起,用来做数据统计,但还是存在磁盘空间的瓶颈。 5、使用federated 可以实现将数据聚合,对于水平分割的场景并不适用,并且性能方面也存在比较大的问题。 6、MySQL Sharding和spider mysql cluter是mysql sharding的一种,对于这种需求是个比较好的解决方案,不过使用于生产环境的案例比较少。还有一个spider分布式引擎方案,非常适合前面我们讨论的两个场景,下来将会做深入的介绍,该引擎目前已经集成到了MariaDB中,目前最新的版本是Spider 3.2.37。腾讯互娱DBA团队基于Spider3.1基础上进行开发,提高了性能和稳定性以及修复了大量的bug,形成了非常靠谱的TSpider,目前已经在腾讯游戏、支付等领域广泛使用。 本文就是基于spider的分布式数据库解决方案,下面就来详细介绍: 一、Spider引擎简介 1、spider引擎是什么spider引擎是一个内置的支持数据分片特性的存储引擎,支持分区和XA事务,该引擎可以在服务器上建立和远程服务器表之间的链接,操作起来就像操作本地的表一样。并且后端可以是任何的存储引擎。spider引擎根据表的设置的规则以及server表的规则自动进行智能路由,实现对后端数据库不通的表或者数据分片的访问和修改。因此该引擎对业务是完全透明的。目前spider引擎已经集成到了MariaDB中,安装使用非常方面,目前最新的版本是Spider 3.2.37。更多信息可以访问:https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/,具体的版本历史如下图所示: 2、spider架构图 3、Spider的优势a、对业务完全透明,业务不需要做任何的修改 对于分库分表的逻辑业务不需要关心,只需要通过spider作为代理入口,访问数据对应在后端哪台server上spider自动帮你处理。 b、方便横向扩展,能解决单台mysql得性能和存储瓶颈问题 c、对后端的存储引擎没有限制 d、间接实现垂直拆分和水平拆分功能 通过spider和后端的数据库连接,可以是独立的表,也可以是基于分区表,分区表支持哈希、范围、列表等算法。 e、完全兼容mysql协议 由于MySQL特殊的插件式存储引擎架构,server层负责SQL解析、SQL优化、数据库对象(视图、存储过程等)管理;存储引擎层负责数据存储、索引支持、事务、buffer等,两者之间通过约定好的handler接口进行交互。SQL解析、优化与执行交给server层处理,几乎支持执行任意类型SQL访问。 4、Spider的劣势a、spider的表本身不支持查询缓存和全文索引,不过可以将全文索引添加在后端数据库中; b、如果采用物理备份,spider无法备份后端的数据,因为数据本身是存放在后端。可以对后端的mysql一一做物理备份 c、spider本身是单点,需要自己做容灾机器,比如通过VIP的方式 d、多了一层网络,性能上会有一些损耗,尤其是跨分区、跨表查询性能会差一些 5、Tspider介绍腾讯互娱DBA团队在spider 3.1的基础上进行深入优化和定制开发,形成了Tspider,极大地提高了spider性能、稳定性和兼容性,在性能上比spider至少提升30%,目前Tspider已经发展到了Tspider 1.9版本,Tspider经过了腾讯游戏海量访问以及高数据安全性的考验,整体解决方案已经非常成熟,目前财付通也有部分服务器使用了互娱的Tspider,腾讯互娱DBA团队修复的部分优化点如下: 二、Spider的使用场景解析 1、垂直分表的场景和解析a、垂直分表场景图 b、垂直分表场景解析 从上图可以看出,spider后面接4台DB server,可以将不通功能的表分布到后端不通的DB server中,比如user_info的表专门存放在HostA中,user_msg表存放在了HostB中,user_detail表存放在了HostC中,user_log表存放在了HostD中。在图中的红色部分,当我们执行红色部分的SQL的时候,spider会通过user_info表的映射关系以及HostA的IP映射关系,将查询user_info表的请求都转发到HostA上,HostA查询完成后再将结果发给spider服务器,spider再转发给客户端。 2、采用水平分表的场景a、水平分表场景图 b、水平分表场景解析 spider支持多种水平分表的模式,目前支持hash分表(hash)、范围分表(range)、列表分表(list),我这里用range来说明水平分表的工作原理。从上图中可以看出spider对user_info表针对id进行了分区,将0~100000的记录存储在了HostA,100000~200000的记录存储在了HostB,200000~300000的记录存储在了HostC,300000~400000的记录存储在了HostD。当用户访问user_info的某条或者多条记录的时候,spider会根据分区的情况,对相关的记录落在某台或者多台DB server上,再进行转发。比如select * from user_info where id=1这个SQL,spider在收到这个请求后,会跟进分区情况选择对应的DB server进行转发。这里会将该请求转发到HostA中。HostA处理完成后,再将结果返回给spider server,spider再将结果转发给发起请求的客户端。 三、Spider引擎实战 (一)、spider的安装部署从spider 10.0.0.4版本开始,spider引擎就集成到了MariaDB中,集成后安装就非常的简单,安装步骤如下: 1、安装mariaDB到spider server以及后端多台DB server上; 安装方法非常简单,这里不在赘述,具体可以参考:https://mariadb.com/kb/en/mariadb/getting-installing-and-upgrading-mariadb/ 2、安装spider引擎到spider server上(后端的DB server不需要安装spider引擎) mysql -uroot -p < install_spider.sql 或者登录mysql后执行 source /path/install_spider.sql 备注:install_spider.sql在share目录下面 这个命令所做的事情如下: 创建spider相关的系统表 spider_link_failed_log spider_link_mon_servers spider_tables spider_xa spider_xa_failed_log spider_xa_member 创建spider相关的表结构 加载spider引擎 3、检查spider引擎是否安装成功 如果出现上图所示的结果就说明已经支持了spider引擎了 (二)、spider的使用实战备注:本实践环境基于tspider-1.8.5环境全部验证通过 1、spider实战拓扑图 在实战部分,我使用了2台DB server,部署图如下: 2、实战前准备 a、创建spider server访问后端DB server的权限(后面配置中需要用到) grant all on *.* tospider_db_all@'10.128.128.91' identified by 'tospider_db_all'; b、创建spider后端DB server的配置 可以通过执行如下SQL的形式直接创建 create server backend1 foreign data wrapper mysql options (host '10.128.128.60', database 'test', user 'spider_db_all', password 'spider_db_all', port 3306); create server backend2 foreign data wrapper mysql options (host '10.128.128.88', database 'test', user 'spider_db_all', password 'spider_db_all', port 3306); 也可以通过直接给mysql.servers表中直接插入相关的记录,不过后面执行flush hosts才能生效 insert into mysql.servers(Server_name,Host,Db,Username,Password,Port,Socket,Wrapper,Owner)values ('backend1','10.128.128.60','test','spider_db_all','spider_db_all',3306,'','mysql',''); insert into mysql.servers(Server_name,Host,Db,Username,Password,Port,Socket,Wrapper,Owner)values ('backend2','10.128.128.88','test','spider_db_all','spider_db_all',3306,'','mysql',''); 创建完成后可以直接查询mysql.servers表,确认是否添加成功,如下截图所示: b、创建基础测试表 在后端两台DB server上创建基础测试表(在60和88上执行) create table test_spider ( id int, username varchar(20), address varchar(128), primary key (id), key (username) ) engine=InnoDB default comment 'spider test base table'; 3、spider引擎实战 a、建立垂直表(远程表进行测试) create table test_spider ( id int, username varchar(20), address varchar(128), primary key (id), key (username) ) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='server "backend1"'; 创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1对应的DB server上? 测试完成后,删除掉spider 服务器上的test_spider表,你会发现drop掉spider上的表,不会导致后端DB server上的表被删除。 b、建立hash分区表 create table test_spider ( id int, username varchar(20), address varchar(128), primary key (id), key (username) ) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "test_spider"' PARTITION BY HASH (id) ( PARTITION pt1 COMMENT = 'srv "backend1"', PARTITION pt2 COMMENT = 'srv "backend2"') ; 创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1和backend2对应的DB server上? 测试完成后,删除掉spider 服务器上的test_spider表,你会发现drop掉spider上的表,不会导致后端DB server上的表被删除。 c、建立range分区表 create table test_spider ( id int, username varchar(20), address varchar(128), primary key (id), key (username) ) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "test_spider"' PARTITION BY range columns (id) ( PARTITION pt1 values less than (100000) COMMENT = 'srv "backend1"', PARTITION pt2 values less than (200000) COMMENT = 'srv "backend2"') ; 创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1和backend2对应的DB server上? 测试完成后,删除掉spider 服务器上的test_spider表,你会发现drop掉spider上的表,不会导致后端DB server上的表被删除。 d、建立list分区表测试 create table test_spider ( id int, username varchar(20), address varchar(128), primary key (id), key (username) ) ENGINE=SPIDER DEFAULT CHARSET=utf8 COMMENT='wrapper "mysql", table "test_spider"' PARTITION BY list columns (id) ( PARTITION pt1 values in (1,3,5,7,9) COMMENT = 'srv "backend1"', PARTITION pt2 values in (2,4,6,8,10) COMMENT = 'srv "backend2"') ; 创建之后,执行对应增删改查,看看是否对应的操作都发生在了backend1和backend2对应的DB server上? 测试完成后,删除掉spider 服务器上的test_spider表,你会发现drop掉spider上的表,不会导致后端DB server上的表被删除。 四、性能测试性能测试可以采用sysbench来测试,和mysql单台以及后端挂多台DB的场景进行对比,确认spider引擎的性能和优势,由于手头没有合适的设备这部分等以后有时间再进行测试,maria'DB的官网已经有对应的测试方法和结果,有兴趣的可以去https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/查阅。 五、参考资料为了撰写本文,翻阅了不少资料,感谢前辈们的贡献,罗列如下: https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/ https://mariadb.com/kb/en/mariadb/spider/ https://mysqlstepbystep.com/2015/04/03/spider-for-mysql-overview/ http://km.oa.com/group/18974/articles/show/143399?kmref=search&from_page=1&no=2 http://km.oa.com/group/17613/articles/show/217681?kmref=search&from_page=1&no=1 http://www.chriscalender.com/getting-started-with-the-spider-storage-engine/ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |