本文讨论了使用MySQL/MariaDB的Spider存储引擎,通过单表链接多个服务器。Spider是MariaDB提供的一种新的存储引擎,可以使MariaDB的标准配置成为分布式数据。虽然实现起来还是会有点复杂,但技术上并不算太难。本文将介绍Spider存储引擎的工作原理和技术原理,并提供一些实际案例。MariaDB存储引擎是用于管理低级数据访问的代码级实现。它处理写入和读取数据、行锁定、多版本控制和事务处理。从MySQL版本开始,存储引擎不断发展。从表的基础出发,定义一个使用指定存储引擎的表(ENGINETable)。创建完成后,数据库管理系统开始处理,如表与表之间的连接、从表中选择数据等。在MySQL和MariaDB中,表的存储引擎在创建后仍然可以更改。高能SpiderSpider,一个名为Spider的存储引擎,提供了一种从一个MariaDB服务器访问另一个MariaDB服务器的方法。保存实际表数据的MariaDB服务器不需要任何Spider处理代码。一个普通的MySQL/MariaDB服务器就可以了。可以在一个MariaDB上配置Spider,使用Spider存储引擎访问常规的MySQLAPI通信协议,就可以正常访问另一个MariaDB上的数据。在上图中,我们可以看到Spider只在参考节点上安装激活,目标节点不需要安装Spider。即创建一个Spider表,也就是说我们定义一个表,在目标表和被引用的服务器中包含相同的列或者该列的子集。安装Spider存储引擎Spider已经包含在MariaDB服务器中,并提供了安装Spider的脚本,我们使用它来安装。如果MariaDB以RPM方式安装,Spider会安装在/usr/share/mysql,脚本名为install_spider.sql。我们可以使用MariaDB的命令行源执行:$mysql-urootWelcometotheMariaDBmonitor.Commandsendwith;or\g.YourMariaDBconnectionidis2835Serverversion:10.4.6-MariaDB-logMariaDBServerCopyright(c)2000,2018,Oracle,MariaDBCorporationAbandothers.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.MariaDB>source/usr/share/mysql/install_spider.sql脚本运行运行,使用SHOWENGINES命令查看所有安装的存储引擎:MariaDB>SHOWENGINES;+-------------------+--------+------------------------------------------------------------------------------------------+------------+-----+-----------+|引擎|支持|评论|交易|XA|保存点|+--------------------+-------+----------------------------------------------------------------------------------------------+--------------+------+------------+|SPIDER|YES|Spiderstorageengine|YES|YES|NO||MRG_MyISAM|YES|CollectionofidenticalMyISAMtables|NO|NO|NO||MEMORY|YES|基于哈希,存储在内存中,对临时表有用|NO|NO|NO||Aria|YES|C具有MyISAM继承的鲁莽安全表。用于内部临时表和特权表|NO|NO|NO||MyISAM|YES|具有良好性能和小数据足迹的非事务引擎|NO|NO|NO||SEQUENCE|YES|生成的表填充有顺序值|YES|NO|YES-锁级别转换|DEFAULT,外键和表加密|YES|YES|YES||PERFORMANCE_SCHEMA|YES|PerformanceSchema|NO|NO|NO||CSV|YES|StorestablesasCSVfiles|NO|NO|NO|+-----------------+--------+-----------------------------------------------------------------------------------------+------------+------+------------+9rowsinset(0.001sec)你可以看到Spider引擎准备好了,可以开始使用Spider单表连接了,看一个基本的例子:在目标服务器上创建表。同样,目标服务器不需要蜘蛛,只需要访问远程数据的服务器。现在我们在目标服务器上创建一个新表,我们称之为Sever2:$mysql-uroot-S/tmp/mariadb2.sock-urootWelcometotheMariaDBmonitor.Commandsendwith;or\g.YourMariaDBconnectionidis11Serverversion:10.4.8-MariaDBMariaDBServerCopyright(c)2000,2018,Oracle,MariaDBCorporationAbandothers.Type'help;'or'\h'寻求帮助。Type'\c'清除当前输入语句。MariaDB[(none)]>CREATEDATABASEspidertest;QueryOK,1rowaffected(0.001sec)MariaDB[(none)]>usespidertest;DatabasechangedMariaDB[spidertest]>CREATETABLEcustomer(idINTNOTNULLPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(200)NOTNULL,addressVARCHAR(255)NOTNULL);QueryOK,0rowsaffected(0.539sec)接下来向表中插入一些测试数据:MariaDB[spidertest]>INSERTINTOcustomerVALUES(Do'NULL','1MainStreet');QueryOK,1rowaffected(0.309sec)MariaDB[spidertest]>INSERTINTOcustomerVALUES(NULL,'BobSmith','45ElmStreet');QueryOK,1rowaffected(0.092sec)MariaDB[spidertest]>INSERTINTOcustomerVALUES(NULLesL,'简','18SecondStreet');QueryOK,1rowaffected(0.094sec)我承认这和居里夫人发明镭的惊喜不一样嗨实验,不过可以看到数据也已经成功插入到刚才的新表中了。我们现在需要做的是从MariaDB服务器的另一个实例访问该表。当Spider以普通用户连接远程服务器时,需要在同一个MariaDBServer上创建一个用户账号,并授予其创建数据表的权限。MariaDB[spidertest]>CREATEUSER'spider'@'192.168.0.11'IDENTIFIEDBY'spider';QueryOK,0rowsaffected(0.236sec)MariaDB[spidertest]>GRANTALLONspidertest.*TO'spider'@'192.168.0.11';QueryOK,0rowsaffected(0.238sec)MariaDB[spidertest]>GRANTALLONmysql.*TO'spider'@'192.168.0.11';QueryOK,0rowsaffected(0.238sec)下一步是创建服务器。如果您以前没有使用过Spider,则不会使用此命令。它用于连接到MariaDBServer实例和相关参数。服务器在MariaDB服务器实例上定义。这里是访问我们上面创建的表(称为Server1)$mysql-uroot-S/tmp/mariadb1.sock-urootWelcometotheMariaDBmonitor.Commandsendwith;or\g.YourMariaDBconnectionidis12Serverversion:10.4.8-MariaDBMariaDBServerCopyright(c)2000,2018,Oracle,MariaDBCorporationAbandothers.Type'help;'or'\h'寻求帮助。Type'\c'清除当前输入语句。MariaDB[none]>CREATESERVERServer2FOREIGNDATAWRAPPERmysqlOPTIONS(HOST'192.168.0.11',DATABASE'spidertest',PORT10482,USER'蜘蛛',蜘蛛');QueryOK,0rowsaffected(0.233sec)好的,现在您可以使用Spider创建从Server1到Server2的链接(我们不必使用目标表中的所有字段)。$mysql-uroot-S/tmp/mariadb1.sock-urootWelcometotheMariaDBmonitor.Commandsendwith;or\g.YourMariaDBconnectionidis33Serverversion:10.4.8-MariaDBMariaDBServerCopyright(c)2000,2018,Oracle,MariaDBCorporationAbandothers.Type'help;'or'\h'forhelp.Type'\c'清除当前输入语句MariaDB[(none)]>DROPDATABASEIFEXISTSspidertest;QueryOK,0rowsaffected,1warning(0.000sec)MariaDB[(none)]>CREATEDATABASEspidertest;QueryOK,1rowaffected(0.001sec)MariaDB[(none)]>usespidertest;DatabasechangedMariaDB[spidertest]>CREATETABLEcustomer(idINTNOTNULLPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(200)NOTNULL)ENGINE=SpiderCOMMENT='wrapper"mysql",srv"Server2"';QueryOK,0rowsaffected(0.132sec)OK,no发生了错误。然后我们使用SELECT来获取数据。MariaDB[spidertest]>SELECT*FROMcustomer;+----+------------+|id|name|+----+-------------+|1|JohnDoe||2|BobSmith||3|JaneJones|+----+------------+3rowsinset(0.006sec)我们看到命令运行成功了.居里夫人鼓励我继续下一步,我们正在一步步接近目标。用于单表链接即使是单表链接,也有很多用途,比如上面提到的表的链接。在某些情况下,它只用于复制单个表,它可以用来代替复制。例如,你有一个维护数据库实例的表,比如客户数据信息,你想从另一个MariaDBServer应用程序中引用该库的CustomerID。这种配置有一些缺点。例如,性能是一个大问题,对于每个使用Spider表的语句,都必须建立到服务器的连接,本地表和Spider表之间的连接也可能很慢。总的来说,Spider存储引擎的性能还是不错的,不是瓶颈,还有很大的调整空间。第三种选择是当我们只有一个表时,例如日志表,我不想将它与任何其他表混合。那么,Spider表是实现此目标的一种选择。在多台服务器上使用Spider的状态比如你正在运行的MariaDB集群是由一个主库和多个辅助数据组成的。我们可以把这个集群中的所有服务器看成一个单元。然后派Spider上场。当前场景下,需要监控的服务器有两台,一台叫moe,一台叫homer,moe是主服务器。我们还想查看两台服务器的全局状态。在homer服务器上,我们创建一个基于infomation_schema.GLOBALSTATUS的视图,添加一个字段保存服务器名称,并保存到数据库中。在moe服务器上做相同的事情:CREATEORREPLACEVIEWglobal_status_moeASSElECT'moe'host,gs.variable_name,gs.variable_valueFROMinformation_schema.global_statusgs;接下来,创建主服务器moe的链接到另一个服务器homer。在教育部我们创建以下命令:CREATEORREPLACESERVERhomerFOREIGNDATAWRAPPERmysqlOPTIONS(HOST'192.168.0.11',DATABASE'mysql',PORT10482,USER'spider',PASSWORD'spider');于是在moe上创建了一个新的视图来查看homer服务器的状态。CREATEORREPLACETABLEglobal_status_homer(hostvarchar(2048),variable_nameVARCHAR(64),variable_valueVARCHAR(64))ENGINE=SpiderCOMMENT='wrapper"mysql",srv"homer"';在homer服务器上,有一个现有的表和一个视图。每个服务器都有一个视图,具有相似的模式,反映了整个集群的状态。接下来,将两个表组合成一个视图。CREATEORREPLACEVIEWglobal_status_allASSELECThost,variable_name,variable_valueFROMglobal_status_homerUNIONSELECThost,variable_name,variable_valueFROMglobal_status_moe;然后,视图会显示整个集群的状态。CREATEORREPLACEVIEWglobal_status_totalASSELECTvariable_name,SUM(variable_value)sum,MAX(variable_value)max,MIN(variable_value)minFROMglobal_status_allGROUPBYvariable_name;测试是否可以正常运行:MariaDB[mysql]>SELECT*FROMglobal_status_totalWHEREvariable_name;%LIKE'------------------+------+------+------+|variable_name|sum|max|min|+------------------------+------+-----+-----+|OPENED_FILES|629|477|152||OPENED_PLUGIN_LIBRARIES|1|1|0||OPENED_TABLES|112|75|37||OPENED_TABLE_DEFINITIONS|125|95|30||OPENED_VIEWS|85|43|42||OPEN_FILES|132|76|56||OPEN_STREAMS|0|0|0||OPEN_TABLES|77|46|31||OPEN_TABLE_DEFINITIONS|83|49|34|+--------------------------+------+------+------+9rowsinset(0.029sec)好吧,虽然这是一个简单的例子,但它很有用。当有两个以上的服务器时更有价值。合并多个服务器表在上面的例子中,我们研究了如何使用Spider表将内容相似、结构相同的表合并到一个视图中,这在实际情况中是一个有价值的应用,比如一个多实例应用程序,例如多个部门使用的ERP应用程序,如果要从报表服务器制作跨部门的报表,可以使用该模型访问应用程序的所有实例。Spider的另一种解决方案是使用多源复制,但需要在报表服务器中存储更多的冗余数据,这是Spider方案的优势所在。Spider分表分片(也称分表)是Spider最常见的用例。前面我把一台服务器的表映射到另一台服务器的表。Spider也可以用于服务器上的分区表。每个分区都在单独的服务器上。在实践中没有别的。区别。虽然Spiders可以用分区的用例做更多有趣的事情,但对于这些特定用例,Spiders有一些性能增强。让我们举一个简单的例子。让我们展示如何使用两个分片来设置分区。为了演示原理,我们将使用客户表。在这个实例中总共有三台服务器,两台“数据服务器”包含两个数据分片和一台服务器,而“蜘蛛”服务器没有任何正在使用的表的实际数据,而是指向一个驻留在服务器上的其他两个是服务器上的数据。从基础开始,创建在MariaDBServer2和Server3中使用的表(类似于Customer表,但不完全相同)。两台服务器都以root身份运行。CREATEDATABASEIFNOTEXISTSspidertest;CREATETABLEspidertest.customer(idINTNOTNULLPRIMARYKEY,nameVARCHAR(200)NOTNULL,addressVARCHAR(255)NOTNULL);现在已经创建了两个子表,然后创建链接并从MariaDBServer1访问它们。我们在Server1上执行类似下面的SQL语句,端口、主机名和账号可以根据情况替换。CREATEORREPLACESERVERServer2FOREIGNDATAWRAPPERmysqlOPTIONS(HOST'192.168.0.11',DATABASE'spidertest',PORT10482,USER'spider',PASSWORD'spider');CREATEORREPLACESERVERServer3FOREIGNDATAWRAPPERmysqlOPTIONS(HOST'192.168.0.11',DATABASE'spidertest',PORT10483,USER'spider',PASSWORD'蜘蛛');接下来,我们将其绑定到一个分区表上,注意,您可以在这里使用任何合理的分区方案,我们只选择一个简单的来说明这一点。CREATETABLEspidertest.customer(idINTNOTNULLPRIMARYKEY,nameVARCHAR(200)NOTNULL,addressVARCHAR(255)NOTNULL)ENGINE=SpiderCOMMENT'wrapper"mysql",table"customer"'PARTITIONBYRANGE(id)(PARTITIONp0VALUESLESTHAN"(1000)COMMENT=PARTITIONp1VALUESLESSTHAN(2000)COMMENT='srv"Server3Now,wecaninsertsomedataonServer1andseetheirdisplayonServer2andServer3.INSERTITIONp1VALUESLESTHAN(2000)COMMENT='srv"Server3Now,wecaninsertsomedatainServer1andseetheirdisplayonServer2和Server3.INSERTITOcustomerVALUES(2,'Ed','MainStreet1');INSERTITOcustomerVALUES(3,'Bob','MainStreet1');INSERTITOcustomerVALUES(1001,'Monty','MainStreet1')');INSERTITOcustomerVALUES(1002,'David','MainStreet1');INSERTITOcustomerVALUES(1003,'Allan','MainStreet1');根据分区设置,1-3行进入Server2,最后3行进入Server3,本节结束前会提到,分区分表是MariaDB常用的现实中,没有Spider存储引擎,所以可以通过连接Server2或者Server3来一个一个访问。分片对于Spider来说一个明显的优势就是在处理大数据集的时候可以有效的提升性能??。除了以上功能,Spider存储引擎还有其他优点,比如每个分片可以单独访问普通的MariaDBServer,即可以按分片查看数据集,没有任何瓶颈,也可以把它当作一个整个同时使用蜘蛛。总结本文介绍了Spider存储引擎的一些基本用法。这些用法对开发人员非常有用。相关文档请参考Spider的分片用例文档:https://mariadb.com/docs/usage/sharding/,你会发现前两种用法让一些人感到惊讶和鼓舞。
