服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - MariaDB之Spider存储引擎实践详解

MariaDB之Spider存储引擎实践详解

2023-05-07 02:04未知服务器之家 MongoDB

本文探讨使用MySQL/MariaDB的Spider存储引擎通过使用单个表链接到多台服务器的实例。 Spider是MariaDB提供的一个新存储引擎,可以让一个标准配置的MariaDB成为一个分布式数据。 虽然实现起来还是会有点复杂,但技术并不太难。本文就

 本文探讨使用MySQL/MariaDB的Spider存储引擎通过使用单个表链接到多台服务器的实例。

Spider是MariaDB提供的一个新存储引擎,可以让一个标准配置的MariaDB成为一个分布式数据。

虽然实现起来还是会有点复杂,但技术并不太难。本文就来给各位介绍Spider存储引擎的工作与技术原理,并会提供一些实用案例。

[[318892]]

MariaDB存储引擎

存储引擎是用于管理低级别数据访问的代码级别实现,它处理写入和读取数据,行锁定,多版本控制以及事务处理等。

从MySQL版本开始,存储引擎不断发展,由表的基础开始,定义一张表使用指定的存储引擎(ENGINE Table),创建后数据库管理系统开始处理,比如表之间的连接,从一张表中选择数据等。在MySQL和MariaDB中,创建完表后,仍然可以更改表的存储引擎。

高能Spider

Spider,一款名为蜘蛛的存储引擎,它提供的是从一台MariaDB服务器访问另一台MariaDB服务器的方法,保存实际表数据的MariaDB服务器可以没有任何Spider处理代码,一台普通的MySQL/MariaDB服务器即可。

可以在一台MariaDB上配置Spider,通过使用Spider存储引擎访问常规的MySQL API通信协议就可以正常访问另一台MariaDB上的数据。

MariaDB之Spider存储引擎实践详解

 

上图中,我们看到,Spider仅在引用节点上安装激活,目标节点并不需要安装Spider。即创建一个Spider表,这意味着我们定义了一张表,这张表包括目标表中的相同一列或此列的子集以及引用的服务器。

安装Spider存储引擎

Spider已经包含在MariaDB服务器中,并提供了一个安装Spider的脚本,我们使用它来安装。

如果将MariaDB以RPM方式安装,Spider将安装在/usr/share/mysql中,脚本名字是install_spider.sql。我们使用MariaDB的命令行source执行即可:

  1. $ mysql -u root 
  2. Welcome to the MariaDB monitor. Commands end with ; or \g. 
  3. Your MariaDB connection id is 2835 
  4. Server version: 10.4.6-MariaDB-log MariaDB Server 
  5. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
  6. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
  7.  
  8. MariaDB> source /usr/share/mysql/install_spider.sql 

脚本运行完成,使用SHOW ENGINES命令来查看所有安装的存储引擎:

  1. MariaDB> SHOW ENGINES; 
  2. +--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+ 
  3.  
  4. | Engine | Support | Comment | Transactions | XA | Savepoints | 
  5.  
  6. +--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+ 
  7.  
  8. | SPIDER | YES | Spider storage engine | YES | YES | NO | 
  9.  
  10. | MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | 
  11.  
  12. | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | 
  13.  
  14. | Aria | YES | Crash-safe tables with MyISAM heritage. Used for internal temporary tables and privilege tables | NO | NO | NO | 
  15.  
  16. | MyISAM | YES | Non-transactional engine with good performance and small data footprint | NO | NO | NO | 
  17.  
  18. SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES | 
  19.  
  20. | InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES | 
  21.  
  22. | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | 
  23.  
  24. | CSV | YES | Stores tables as CSV files | NO | NO | NO | 
  25.  
  26. +--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+ 
  27.  
  28. rows in set (0.001 sec) 

可以看到Spider引擎已经就绪,已经可以开始使用。

Spider单表连接

来看一个基础的例子:在目标服务器上创建一张表。再次提示,目标服务器不需要Spider,仅访问远端数据的服务器是必需的。现在我们在目标服务器上创建一张新表,不妨称它为Sever2:

  1. $ mysql -u root -S /tmp/mariadb2.sock -u root 
  2.  
  3. Welcome to the MariaDB monitor. Commands end with ; or \g. 
  4.  
  5. Your MariaDB connection id is 11 
  6.  
  7. Server version: 10.4.8-MariaDB MariaDB Server 
  8.  
  9. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
  10.  
  11.  
  12.  
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
  14.  
  15.  
  16.  
  17.  
  18.  
  19. MariaDB [(none)]> CREATE DATABASE spidertest; 
  20.  
  21. Query OK, 1 row affected (0.001 sec) 
  22.  
  23. MariaDB [(none)]> use spidertest; 
  24.  
  25. Database changed 
  26.  
  27. MariaDB [spidertest]> CREATE TABLE customer( 
  28.  
  29. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
  30.  
  31. name VARCHAR(200) NOT NULL
  32.  
  33. address VARCHAR(255) NOT NULL); 
  34.  
  35. Query OK, 0 rows affected (0.539 sec) 

接下来向该表中插入一些测试数据:

  1. MariaDB [spidertest]> INSERT INTO customer VALUES(NULL'John Doe''1 Main Street'); 
  2.  
  3. Query OK, 1 row affected (0.309 sec) 
  4.  
  5. MariaDB [spidertest]> INSERT INTO customer VALUES(NULL'Bob Smith''45 Elm Street'); 
  6.  
  7. Query OK, 1 row affected (0.092 sec) 
  8.  
  9. MariaDB [spidertest]> INSERT INTO customer VALUES(NULL'Jane Jones'
  10.  
  11. '18 Second Street'); 
  12.  
  13. Query OK, 1 row affected (0.094 sec) 

我承认这个不是玛丽.居里夫人发明镭一样的惊喜实验,但可以看到数据也已经成功插入到刚才的新表中。现在要做的事是从MariaDB服务器的另一个实例来访问该表。当Spider以普通用户身份连接到远程服务器,需要在同一台MariaDB Server上创建一个用户帐户,并为它授予创建数据表的权限。

  1. MariaDB [spidertest]> CREATE USER 'spider'@'192.168.0.11' IDENTIFIED BY 'spider'
  2.  
  3. Query OK, 0 rows affected (0.236 sec) 
  4.  
  5. MariaDB [spidertest]> GRANT ALL ON spidertest.* TO 'spider'@'192.168.0.11'
  6.  
  7. Query OK, 0 rows affected (0.238 sec) 
  8.  
  9.  
  10.  
  11. MariaDB [spidertest]> GRANT ALL ON mysql.* TO 'spider'@'192.168.0.11'
  12.  
  13. Query OK, 0 rows affected (0.238 sec) 

下一步创建一个Server。如果之前你没有用过Spider,也不会用到这个命令,它是用来连接MariaDB Server实例以及相关参数,该服务器是在MariaDB Server实例上定义的。

下面是访问我们在上面创建的表(称为Server1)

  1. $ mysql -u root -S /tmp/mariadb1.sock -u root 
  2.  
  3. Welcome to the MariaDB monitor. Commands end with ; or \g. 
  4.  
  5. Your MariaDB connection id is 12 
  6.  
  7. Server version: 10.4.8-MariaDB MariaDB Server 
  8.  
  9. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
  10.  
  11. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
  12.  
  13.  
  14.  
  15. MariaDB [none]> CREATE SERVER Server2 FOREIGN DATA WRAPPER mysql 
  16.  
  17. OPTIONS(HOST '192.168.0.11'DATABASE 'spidertest', PORT 10482, 
  18.  
  19. USER 'spider'PASSWORD 'spider'); 
  20.  
  21. Query OK, 0 rows affected (0.233 sec) 

好的,下面就可以用Spider创建从Server1到Server2的链接了(我们也不必使用目标表中的所有字段)。

  1. $ mysql -u root -S /tmp/mariadb1.sock -u root 
  2.  
  3. Welcome to the MariaDB monitor. Commands end with ; or \g. 
  4.  
  5. Your MariaDB connection id is 33 
  6.  
  7. Server version: 10.4.8-MariaDB MariaDB Server 
  8.  
  9. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. 
  10.  
  11. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
  12.  
  13.  
  14.  
  15. MariaDB [(none)]> DROP DATABASE IF EXISTS spidertest; 
  16.  
  17. Query OK, 0 rows affected, 1 warning (0.000 sec) 
  18.  
  19. MariaDB [(none)]> CREATE DATABASE spidertest; 
  20.  
  21. Query OK, 1 row affected (0.001 sec) 
  22.  
  23. MariaDB [(none)]> use spidertest; 
  24.  
  25. Database changed 
  26.  
  27. MariaDB [spidertest]> CREATE TABLE customer( 
  28.  
  29. id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
  30.  
  31. name VARCHAR(200) NOT NULL) ENGINE=Spider 
  32.  
  33. COMMENT = 'wrapper "mysql", srv "Server2"'
  34.  
  35. Query OK, 0 rows affected (0.132 sec) 

OK,没有出现任何错误。接着我们来用SELECT获取数据。

  1. MariaDB [spidertest]> SELECT * FROM customer; 
  2.  
  3. +----+------------+ 
  4.  
  5. | id | name | 
  6.  
  7. +----+------------+ 
  8.  
  9. | 1 | John Doe | 
  10.  
  11. | 2 | Bob Smith | 
  12.  
  13. | 3 | Jane Jones | 
  14.  
  15. +----+------------+ 
  16.  
  17. rows in set (0.006 sec) 

我们看到了,命令运行也已经成功。居里夫人鼓励我继续下一步,我们正在一步步接近目标。

用于单表链接

即使是单表链接,也有不少用途,比如上述表的链接。在某些情况下,它只是用来复制单张表,可以用它来替换复制。

比如你有一张表,它在维护着一个数据库实例,比如客户数据信息,你希望从另一个MariaDB Server中的应用程序可以引用该库的CustomerID。

这种配置存在一些缺点。比如,性能是一个大问题,对于使用Spider表的每个语句,都要建立与服务器的连接,本地表与Spider表之间的联接也可能很慢。总体来说,Spider存储引擎性能很出色,本身并不瓶颈,还存在很大的调整空间。

第三个选择是当我们只有一张表时,比如日志表,我并不想与任何其它表混在一起用。那么,Spider表是实现此目标的一种选择。

使用Spider在多台服务器上的状态

比如你运行的MariaDB集群是一个主数据库和多个辅助数据组成,我们可以将此集群的所有服务器视为一个单元。接着派Spider出场,在当前场景下,有两个要监视的服务器,一个叫moe,另一个叫homer,moe是主服务器,我们还希望在此中看到两个服务器的全局状态。

在homer服务器上,我们基于infomation_schema.GLOBAL STATUS创建一个视图,添加一个用来保存服务器名字的字段再保存到数据库中。如下:

  1. CREATE OR REPLACE VIEW global_status_homer 
  2.  
  3. AS SElECT 'homer' host, gs.variable_name, gs.variable_value 
  4.  
  5. FROM information_schema.global_status gs; 

我们在moe服务器上做相同的事情:

  1. CREATE OR REPLACE VIEW global_status_moe 
  2.  
  3. AS SElECT 'moe' host, gs.variable_name, gs.variable_value 
  4.  
  5. FROM information_schema.global_status gs; 

接下来,创建主服务器moe到另一台服务器homer的链接。在moe上我们创建如下命令:

  1. CREATE OR REPLACE SERVER homer FOREIGN DATA WRAPPER mysql 
  2.  
  3. OPTIONS(HOST '192.168.0.11'DATABASE 'mysql', PORT 10482, USER 'spider'
  4.  
  5. PASSWORD 'spider'); 

如此就在moe上创建了一个新视图,用来查看homer服务器的状态。

  1. CREATE OR REPLACE TABLE global_status_homer(host varchar(2048), variable_name VARCHAR(64), variable_value VARCHAR(64)) ENGINE=Spider COMMENT='wrapper "mysql", srv "homer"'

在homer服务器上,现有一张表和一张视图。每台服务器都有一个视图,具有相似的架构,它们反映着整个集群的状态。接下来把两张表结合成一个视图。

  1. CREATE OR REPLACE VIEW global_status_all AS 
  2.  
  3. SELECT host, variable_name, variable_value 
  4.  
  5. FROM global_status_homer 
  6.  
  7. UNION 
  8.  
  9. SELECT host, variable_name, variable_value 
  10.  
  11. FROM global_status_moe; 

然后,视图会显示整个集群的状态。

  1. CREATE OR REPLACE VIEW global_status_total AS 
  2.  
  3. SELECT variable_name, SUM(variable_value) sumMAX(variable_value) max
  4.  
  5. MIN(variable_value) min 
  6.  
  7. FROM global_status_all 
  8.  
  9. GROUP BY variable_name; 

来测试下,它能不能正常工作:

  1. MariaDB [mysql]> SELECT * FROM global_status_total WHERE variable_name LIKE 'open%'
  2.  
  3. +--------------------------+------+------+------+ 
  4.  
  5. | variable_name | sum | max | min | 
  6.  
  7. +--------------------------+------+------+------+ 
  8.  
  9. | OPENED_FILES | 629 | 477 | 152 | 
  10.  
  11. | OPENED_PLUGIN_LIBRARIES | 1 | 1 | 0 | 
  12.  
  13. | OPENED_TABLES | 112 | 75 | 37 | 
  14.  
  15. | OPENED_TABLE_DEFINITIONS | 125 | 95 | 30 | 
  16.  
  17. | OPENED_VIEWS | 85 | 43 | 42 | 
  18.  
  19. | OPEN_FILES | 132 | 76 | 56 | 
  20.  
  21. | OPEN_STREAMS | 0 | 0 | 0 | 
  22.  
  23. | OPEN_TABLES | 77 | 46 | 31 | 
  24.  
  25. | OPEN_TABLE_DEFINITIONS | 83 | 49 | 34 | 
  26.  
  27. +--------------------------+------+------+------+ 
  28.  
  29. rows in set (0.029 sec) 

嗯,尽管这是一个简单实例,但它却很有用。如果服务器多于两台时,它会更有价值。

合并多个服务器表

在上面的例子中,我们研究了如何使用Spider表将具有相似内容和相同结构的表合并到一个视图中,这在实际场合中有价值的应用,比如有一个多实例的应用程序,如某个由多个部门使用的ERP应用,如果要从报表服务器做跨部门报告,则可以使用此模型访问该应用程序的全部实例。

Spider的替代解决方案是使用多源复制,但它需要在报表服务器中存储更多冗余的数据,这便是Spider解决方案的优势。

Spider分表

分片(也可称为分表)是Spider最常见的用例了。在前面我将一台服务器的表映射到另外一台服务器的表,也可以将Spider用于服务器上的分区表,每个分区都在单独的服务器上,除此之外在实践上并没有什么区别。

尽管Spider可以在分区用例上做更多有趣的事情,对于这些特定用例Spider还有一些性能增强能力。

来举一个简单的示例,我们来展示使用两个分片来设置分区,为了展示其原理,我们将使用customer表。在此实例中总共有三台服务器,两台“数据服务器”,其中包含两个分片数据和一台服务器,而“Spider”服务器中没有任何正在使用表的实际数据,而指向的是驻留在其它两以服务器上的数据。

MariaDB之Spider存储引擎实践详解

 

从最基础开始,先创建在MariaDB Server2和Server3中使用的表(与Customer表相似,但也不完全相同)。这两台服务器均以root用户身份运行。

  1. CREATE DATABASE IF NOT EXISTS spidertest; 
  2.  
  3. CREATE TABLE spidertest.customer( 
  4.  
  5. id INT NOT NULL PRIMARY KEY
  6.  
  7. name VARCHAR(200) NOT NULL
  8.  
  9. address VARCHAR(255) NOT NULL); 

现在已经创建两个分表,接着来创建链接,从MariaDB Server1来访问它们,我们在Server1上执行类似于以下SQL语句,里面的端口、主机名以及帐号根据情况可以自己更换。

  1. CREATE OR REPLACE SERVER Server2 FOREIGN DATA WRAPPER mysql 
  2.  
  3. OPTIONS(HOST '192.168.0.11'DATABASE 'spidertest', PORT 10482, 
  4.  
  5. USER 'spider'PASSWORD 'spider'); 
  6.  
  7. CREATE OR REPLACE SERVER Server3 FOREIGN DATA WRAPPER mysql 
  8.  
  9. OPTIONS(HOST '192.168.0.11'DATABASE 'spidertest', PORT 10483, 
  10.  
  11. USER 'spider'PASSWORD 'spider'); 

接下来,我们将它和一个分区表绑定在一起,注意你可以在此使用任何合理的分区方案,我们只是选择一个简单的方案来说明这一点。

  1. CREATE TABLE spidertest.customer(id INT NOT NULL PRIMARY KEY
  2.  
  3. name VARCHAR(200) NOT NULL
  4.  
  5. address VARCHAR(255) NOT NULL) ENGINE=Spider 
  6.  
  7. COMMENT 'wrapper "mysql", table "customer"' 
  8.  
  9. PARTITION BY RANGE(id) ( 
  10.  
  11. PARTITION p0 VALUES LESS THAN (1000) COMMENT = 'srv "Server2"'
  12.  
  13. PARTITION p1 VALUES LESS THAN (2000) COMMENT = 'srv "Server3 

现在,我们在Server1上可以插入一些数据,并在Server2和Server3看到它们的显示。

  1. INSERT INTO customer VALUES(1, 'Larry''Main Street 1'); 
  2.  
  3. INSERT INTO customer VALUES(2, 'Ed''Main Street 1'); 
  4.  
  5. INSERT INTO customer VALUES(3, 'Bob''Main Street 1'); 
  6.  
  7. INSERT INTO customer VALUES(1001, 'Monty''Main Street 1'); 
  8.  
  9. INSERT INTO customer VALUES(1002, 'David''Main Street 1'); 
  10.  
  11. INSERT INTO customer VALUES(1003, 'Allan''Main Street 1'); 

根据分区设置,1-3行将进入Server2,最后3行将进入Server3。我们会在本节完成之前提出来,分区分表是常见的MariaDB实景,没有Spider存储引擎,因此可以通过连接到Server2或Server3,逐个分表来访问。

用于Spider的分片

分片的明显优势是在处理大型数据集合时可以有效提高性能。除了以上功能外,Spider存储引擎还有其它优点,比如每个分片都可以单独访问普通的MariaDB Server,即可以按分片查看数据集,而不存在任何瓶颈,亦可以将其视为整体,同时使用Spider。

小结

本文介绍了Spider存储引擎的一些基本用法,这些用法对开发者都是很有用的,相关文档还可参考Spider的分片用例文档:https://mariadb.com/docs/usage/sharding/,你会发现前两种用法对于一些人会惊讶加启发。

延伸 · 阅读

精彩推荐
  • MongoDBMongoDB的索引

    MongoDB的索引

    数据库中的索引就是用来提高查询操作的性能,但是会影响插入、更新和删除的效率,因为数据库不仅要执行这些操作,还要负责索引的更新 ...

    MongoDB教程网2532020-05-12
  • MongoDBmongodb数据库基础知识之连表查询

    mongodb数据库基础知识之连表查询

    这篇文章主要给大家介绍了关于mongodb数据库基础知识之连表查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参...

    ZJW02155642020-05-22
  • MongoDBMongoDB系列教程(五):mongo语法和mysql语法对比学习

    MongoDB系列教程(五):mongo语法和mysql语法对比学习

    这篇文章主要介绍了MongoDB系列教程(五):mongo语法和mysql语法对比学习,本文对熟悉Mysql数据库的同学来说帮助很大,用对比的方式可以快速学习到MongoDB的命...

    MongoDB教程网3252020-05-01
  • MongoDBMongoDB多条件模糊查询示例代码

    MongoDB多条件模糊查询示例代码

    这篇文章主要给大家介绍了关于MongoDB多条件模糊查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值...

    浅夏晴空5902020-05-25
  • MongoDBWindows下MongoDB配置用户权限实例

    Windows下MongoDB配置用户权限实例

    这篇文章主要介绍了Windows下MongoDB配置用户权限实例,本文实现需要输入用户名、密码才可以访问MongoDB数据库,需要的朋友可以参考下 ...

    MongoDB教程网3082020-04-29
  • MongoDBMongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    这篇文章主要给大家介绍了关于MongoDB查询之高级操作(多条件查询、正则匹配查询等)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者...

    w田翔3872020-12-19
  • MongoDBMongodb索引的优化

    Mongodb索引的优化

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。接下来通过本文给大家介绍Mongodb索引的优化,本文介绍的非常详细,具有参考借鉴价值,感...

    MRR3252020-05-05
  • MongoDB在mac系统下安装与配置mongoDB数据库

    在mac系统下安装与配置mongoDB数据库

    这篇文章主要介绍了在mac系统下安装与配置mongoDB数据库的操作步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    CXYhh1219312021-11-14