【51CTO.com快译】不知您是否已注意到,MariaDB MaxScale 6的新功能中,已包含了针对NoSQL侦听器(listeners)功能的技术预览。而作为MaxScale的关键部分,侦听器可用于定义接受客户端连接服务所用到的端口和协议对。
NoSQL协议模块
作为新的NoSQL协议模块,侦听器使得MariaDB服务器或集群,能够成为那些使用MongoDB客户端库的应用的后端。也就是说,您可以将由MongoDB驱动程序提供的NoSQL文档数据,直接存储到MariaDB数据库中。在其内部,所有文档都存储在一个包含了两个列的表中。
如下图所示,从高级别来看,当MongoDB客户端应用程序直接或间接地通过客户端库,发出MongoDB协议命令时,它们会被透明地转换为等效的SQL,并会在MariaDB后端被执行。同样,MariaDB的响应也会依次转换为MongoDB客户端库,以及应用程序所需的格式。下面,我将向您展示其具体过程。
我们可以通过多种方式,开始使用MaxScale、及其新的NoSQL侦听器功能。在本次展示中,我创建了一个存储库。它可以通过Docker(https://www.docker.com/),在数分钟之内启动、运行和测试新的功能。
具体而言,我将使用位于https://github.com/mariadb-corporation/dev-example-nosql-listener的GitHub存储库,来设置一个新的环境。该环境允许我们使用MaxScale、MariaDB Community服务器、以及一个示例应用,来实现如何在MariaDB中管理NoSQL文档数据。
下面,我将依次进行环境设置,配置MaxScale,以及使用简单的Web应用,通过MongoDB的Node.js驱动,去管理NoSQL文档数据。
环境设置
通过创建和使用Docker容器,开发人员将能够在任何环境下,轻松地运行可移植、轻量级和独立(self-sufficient)的应用程序,而无需担心设置环境的依赖项。具体而言,我们可以使用Docker Compose,来定义和运行多的Docker容器应用。当然,您首先需要将存储库引入主机。
- $ git clone https://github.com/mariadb-corporation/dev-example-nosql-listener
请在新产生的根目录下,打开一个dev-example-nosql-listener终端窗口,然后执行如下命令:
- $ docker-compose up
docker-compose up将使用名为docker-compose.yml的文件,来构建、创建、启动和加载容器。简单而言,它将设置一组如下表所示的容器,并建立链接。
容器名称描述
您可以通过执行如下命令,来检查系统上、当前正在运行的活动容器是否有效:
- $ docker ps
其输出结果会显示mxs、mdb、todo_client和todo_api容器的相关信息。
添加MaxScale数据库用户
为了让MaxScale能够访问MariaDB Community服务器,您可以通过下面两种方法,添加一个新的用户。
1. 通过使用容器:
请连接到被包含在mdb容器中的MariaDB Community服务器实例上,并通过使用包含在Docker容器中的MariaDB命令行客户端,来执行add_maxscale_user.sql脚本。
- $ docker exec -i mdb mariadb --user root -pPassword123! < configuration/add_maxscale_user.sql
2. 通过执行本地系统:
请连接到被包含在mdb容器中的MariaDB Community服务器实例上,并使用主机上的MariaDB命令行客户端,来执行add_maxscale_user.sql脚本。
- $ mariadb --host 127.0.0.1 --port 3307 --user root -pPassword123! < configuration/add_maxscale_user.sql
配置MariaDB MaxScale
完成新用户的添加后,我们便可以配置MaxScale与MariaDB数据库服务器实例,以实现通信了。除了在MaxScale和MariaDB Community服务器之间设置典型的读/写通信,您还可以在MaxScale的配置文件中添加一块代码,利用新的nosqlprotocol直通端口17017,来设置NoSQL侦听器。
- [MongoDB-Listener] type=listener service=Read-Write-Service protocol=nosqlprotocol nosqlprotocol.user=maxscale nosqlprotocol.password=Password123!port=17017
对此,您同样有两个选择:
1. 替换配置文件:
请替换MaxScale配置文件并重启MaxScale服务。
A. 将MaxScale默认配置文件替换为dev-example-nosql-listener存储库中包含的配置文件。
- $ docker cp configuration/maxscale.cnf mxs:etc/maxscale.cnf
B. 重新启动mxs容器内的MaxScale服务。
- $ docker exec -it mxs maxscale-restart
2. 使用MaxScale GUI进行配置:
我们可以通过打开浏览器窗口,导航到http://localhost:8989,来访问MaxScale的GUI界面。请使用默认用户名admin和密码maxscale,登录到GUI的仪表板中。在仪表板的右上角有一个名为“新建”的按钮。
单击“新建”按钮后,MaxScale会通过模式提示,允许您创建新的服务器、服务、监视器、过滤器、以及侦听器。
您输入到界面中的数据,将会被保存到MaxScale的配置文件中。同时,您也可以将存储库中的配置文件作为设置各个必要组件的指南。
在MariaDB中使用MongoDB驱动程序
完成了将MaxScale配置为通过端口17017接收NoSQL通信之后,我们便可以使用两个剩余的容器todo_client和todo_app,进行测试了。
首先,请打开一个浏览器窗口,并导航至http://localhost:3000。它将加载一个方便您管理任务列表(即:待办事项列表)的Web应用。
在该应用的Web界面上,您可以对数据执行创建、读取、更新和删除(即CRUD)操作。在其后台,这是由一个带有React.js Web应用的todo_client容器,与带有todo_api容器的后端应用程序编程接口(API)通过通信实现的。
具体而言,托管在todo_api容器中的Node.js应用程序公开了四个端点,客户端应用和解决方案可以使用这些端点,来执行CRUD四项操作。Node.js应用使用MongoDB的Node.js驱动程序,与底层数据库(在本例中为MariaDB)进行通信。这些都发生在app/api/db.js文件中。如下代码段展示了其具体内容。
- // Import the MongoDB Node driver module const { MongoClient } = require('MongoDB');
- // MongoDB connection string const connectionUrl = 'mongodb://mxs:17017';
- let db;
- // Connect to the database and return a MongoClient object const getDatabaseInstance = async(name)=> { if(db){ return db; } try { const client = await MongoClient.connect(connectionUrl); db = client.db(name); } catch(err){ throw err; } finally { return db; } }
- module.exports = getDatabaseInstance;
注意:TODO客户端和API应用程序源,都被包含在存储库中的app文件夹内。如果您有兴趣在自己的主机上直接从源代码运行客户端和API应用程序的话,请参考存储库的README里的操作说明。
发现数据
一旦您设置好了环境,并使用TODO应用添加了几项任务,那么就可以发现那些被添加到MariaDB中的数据了。实际上,auto_create_databases和auto_create_tables设置是默认开启的,因此通过TODO应用程序,不仅系统添加了任务数据,而且还自动在数据库中创建了一个新的数据库todo和表tasks。
使用SQL
您可以使用MariaDB命令行客户端,在本地计算机上通过执行如下命令,直接连接到包含在mdb容器中的MariaDB Community服务器实例上:
- $ mariadb --host 127.0.0.1 --port 3307 --user root -pPassword123!
值得注意的是,为了简单起见,我在此只介绍MariaDB命令行客户端的流程。您可以使用各种第三方工具或客户端,去连接到MariaDB上。您可以在官方文档中找到通过MariaDB测试的第三方客户端和工具列表。
当然,如果您的主机上没有MariaDB命令行客户端的话,则可以通过执行如下命令,通过Docker去访问包含在mdb容器中的MariaDB命令行客户端:
- $ docker exec -it mdb mariadb --user root -pPassword123!
在成功连接上MariaDB后,您便可以执行SQL命令了。首先,您可以罗列出服务器上的数据库,以确认已创建好了名为todo的数据库。
- MariaDB [(none)]> show databases;
- +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | |TODO | +--------------------+
然后进入todo数据库,您可以看到已被创建的、用于存储文档数据的数据表tasks。
- MariaDB [(none)]> use todo; MariaDB [todo]> show create table tasks; +-------+--------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------+ | tasks | CREATE TABLE `tasks`( `id` varchar(35)GENERATED ALWAYS AS (json_compact(json_extract(`doc`,'$._id')))VIRTUAL, `doc` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK(json_valid(`doc`)), UNIQUE KEY `id`(`id`), CONSTRAINT `id_not_null` CHECK(`id` is not null) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+--------------------------------------------------------------------+
请注意,tasks表包含了两个列:
- id: 用于保存文档数据对象的id
- doc: 用于保存文档数据本身
事实上,id和doc列都包含有可以使用MariaDB的预定义函数,访问到的JSON数据。
- MariaDB [todo]> select json_value(doc, '$.description')description, json_value(doc, '$.completed')completed from tasks;
- +-------+------------------+ | description | completed | +-------+------------------+ | Task 1 | 0 | | Task 2 | 1 | | Task 3 | 0 | | Task 4 | 1 | +-------+------------------+
MaxScale GUI
MaxScale的图形用户界面(GUI)提供了发现数据的方式。
- 登录:首先根据MaxScale的配置,请打开浏览器窗口并导航到http://localhost:8989。系统会提示您输入登录信息(默认用户名为admin,密码是maxscale)。
- 仪表板:完成登录后,您将看到一个仪表板,上面提供了有关MaxScale的各种信息,其中包括服务和侦听器配置等信息。
- 查询编辑器:在左侧导航中,您可以选择“查询编辑器”的菜单选项。
- 然后系统会提示您输入连接信息。据此,您可以直接连接到MariaDB中的服务器和/或架构上。您也可以在后期随时更新或修改这些信息。
- 完成连接后,您便可以使用查询编辑器,来执行SQL查询、显示数据集,甚至通过图形或图表来可视化数据。
Mongo Shell
Mongo Shell是一个针对MongoDB的互动式JavaScript接口。您可以通过链接https://www.mongodb.com/try/download/shell,下载 mongo shell。类似MariaDB的命令行客户端,您可以使用mongo shell,来查询和更新数据,以及执行各项管理操作。
- 连接MariaDB
您可以使用如下命令,让mongo shell连接上MariaDB:
- $ mongo --host 127.0.0.1 --port 17017
再通过命令:> use todo进入TODO数据库。
而命令:> show collections能够为您显示当前目标数据库中的集合,或是MariaDB中的数据表。当然,在本例中,我们只能够看到tasks表。
- 基本查询
您可以通过执行如下命令,来选择所有已完成的任务,或查询tasks表内的数据:
- > db.runCommand({ find:"tasks", filter: { completed: 1 }); { "cursor" : { "firstBatch" : [ { "description" : "Task 1", "_id" : ObjectId("612ad5859c58d2b2b46ca6fa"), "id" : "612ad5859c58d2b2b46ca6fa", "completed" : 1 }, { "description" : "Task 4", "_id" : ObjectId("612aec4b923b0597463743f0"), "id" : "612aec4b923b0597463743f0", "completed" : 1 } ], "id" : NumberLong(0), "ns" : "todo.tasks" }, "ok" : 1 }
- mxsDiagnose
MariaDB的NoSQL侦听器有一项巧妙的功能,可以为处理命令提供诊断的能力。例如,mxsDiagnose能够输出MariaDB用于选择数据的所有等效SQL,以及前面我们提到的所有已完成任务的命令。
- > db.runCommand({mxsDiagnose: {find:"tasks", filter: {completed: 1}}}); { "kind" : "single", "sql" : "SELECT doc FROM `todo`.`tasks` WHERE( JSON_EXTRACT(doc, '$.completed')= 1)", "ok" : 1 }
在此,我只是介绍了mongo shell和MariaDB的部分功能。您可以通过查看官方文档,以了解更多有关如何使用带有NoSQL侦听器功能的mongo shell的知识。
展望
综上所述,MariaDB的NoSQL侦听器功能在很大程度上提供了,与NoSQL数据库的更多互操作性。当然,上面为您展示的只是其冰山的一角,您既可以去查看MariaDB的NoSQL侦听器的官方文档,也可以通过我们的新手开发者中心,了解有关如何使用MariaDB开发现代化方案和应用程序的更多信息。
原文How to Manage NoSQL Data With MariaDB,作者:Rob Hedgpeth
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】