如何用MariaDB管理NoSQL数据 译文
其他数据库 MariaDB
MariaDB的NoSQL侦听器功能提供了与NoSQL数据库的更多互操作性。本文将依次介绍如何进行环境设置,配置MaxScale,以及如何使用简单的Web应用,去管理NoSQL文档数据。

【51CTO.com快译】不知您是否已注意到,MariaDB MaxScale 6的新功能中,已包含了针对NoSQL侦听器(listeners)功能的技术预览。而作为MaxScale的关键部分,侦听器可用于定义接受客户端连接服务所用到的端口协议对。

NoSQL协议模块

作为新的NoSQL协议模块,侦听器使得MariaDB服务器或集群,能够成为那些使用MongoDB客户端库的应用的后端。也就是说,您可以将由MongoDB驱动程序提供的NoSQL文档数据,直接存储到MariaDB数据库中。在其内部,所有文档都存储在一个包含了两个列的表中。

如下图所示,从高级别来看,当MongoDB客户端应用程序直接或间接地通过客户端库,发出MongoDB协议命令时,它们会被透明地转换为等效的SQL,并会在MariaDB后端被执行。同样,MariaDB的响应也会依次转换为MongoDB客户端库,以及应用程序所需的格式。下面,我将向您展示其具体过程。

在开始之前,您需要在机器上事先安装GitDocker

我们可以通过多种方式,开始使用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容器应用。当然,您首先需要将存储库引入主机。 

  1. $ git clone https://github.com/mariadb-corporation/dev-example-nosql-listener  

请在新产生的根目录下,打开一个dev-example-nosql-listener终端窗口,然后执行如下命令:

  1. $ docker-compose up 

docker-compose up将使用名为docker-compose.yml的文件,来构建、创建、启动和加载容器。简单而言,它将设置一组如下表所示的容器,并建立链接。

容器名称描述

您可以通过执行如下命令,来检查系统上、当前正在运行的活动容器是否有效:

  1. $ docker ps 

其输出结果会显示mxs、mdb、todo_client和todo_api容器的相关信息。

添加MaxScale数据库用户

为了让MaxScale能够访问MariaDB Community服务器,您可以通过下面两种方法,添加一个新的用户。

1. 通过使用容器:

请连接到被包含在mdb容器中的MariaDB Community服务器实例上,并通过使用包含在Docker容器中的MariaDB命令行客户端,来执行add_maxscale_user.sql脚本。

  1. $ docker exec -i mdb mariadb --user root -pPassword123! < configuration/add_maxscale_user.sql 

2. 通过执行本地系统:

请连接到被包含在mdb容器中的MariaDB Community服务器实例上,并使用主机上的MariaDB命令行客户端,来执行add_maxscale_user.sql脚本。

  1. $ 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侦听器。

  1. [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存储库中包含的配置文件

  1. $ docker cp configuration/maxscale.cnf mxs:etc/maxscale.cnf 

B. 重新启动mxs容器内的MaxScale服务。

  1. $ 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文件中。如下代码段展示了其具体内容。

  1. // Import the MongoDB Node driver module const { MongoClient } = require('MongoDB');  
  2. // MongoDB connection string const connectionUrl = 'mongodb://mxs:17017';  
  3. let db;  
  4. // 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;   } } 
  5.  module.exports = getDatabaseInstance; 

注意:TODO客户端和API应用程序源,都被包含在存储库中的app文件夹内。如果您有兴趣在自己的主机上直接从源代码运行客户端和API应用程序的话,请参考存储库的README里的操作说明。

发现数据

一旦您设置好了环境,并使用TODO应用添加了几项任务,那么就可以发现那些被添加到MariaDB中的数据了。实际上,auto_create_databasesauto_create_tables设置是默认开启的,因此通过TODO应用程序,不仅系统添加了任务数据,而且还自动在数据库中创建了一个新的数据库todo和表tasks。

使用SQL

您可以使用MariaDB命令行客户端,在本地计算机上通过执行如下命令,直接连接到包含在mdb容器中的MariaDB Community服务器实例上:

  1. $ mariadb --host 127.0.0.1 --port 3307 --user root -pPassword123! 

值得注意的是,为了简单起见,我在此只介绍MariaDB命令行客户端的流程。您可以使用各种第三方工具或客户端,去连接到MariaDB上。您可以在官方文档中找到通过MariaDB测试的第三方客户端和工具列表。

当然,如果您的主机上没有MariaDB命令行客户端的话,则可以通过执行如下命令,通过Docker去访问包含在mdb容器中的MariaDB命令行客户端:

  1. $ docker exec -it mdb mariadb --user root -pPassword123! 

在成功连接上MariaDB后,您便可以执行SQL命令了。首先,您可以罗列出服务器上的数据库,以确认已创建好了名为todo的数据库。

  1. MariaDB [(none)]> show databases;  
  2. +--------------------+ | Database           | +--------------------+ | information_schema | | mysql              | | performance_schema | | sys                | |TODO              | +--------------------+ 

然后进入todo数据库,您可以看到已被创建的、用于存储文档数据的数据表tasks。

  1. 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数据。

  1. MariaDB [todo]> select json_value(doc, '$.description')description, json_value(doc, '$.completed')completed from tasks;  
  2. +-------+------------------+ | 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:

  1. $ mongo --host 127.0.0.1 --port 17017 

再通过命令:> use todo进入TODO数据库。

而命令:> show collections能够为您显示当前目标数据库中的集合,或是MariaDB中的数据表。当然,在本例中,我们只能够看到tasks表。

  • 基本查询

您可以通过执行如下命令,来选择所有已完成的任务,或查询tasks表内的数据:

  1. > 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,以及前面我们提到的所有已完成任务的命令。

  1. > 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】

 

责任编辑:华轩 来源: 51CTO

编辑推荐

几款开源的图形化Redis客户端管理软件推荐NoSQL数据库概览及其与SQL语法的比较一文看懂分布式数据库原理和 PostgreSQL 分布式架构目前好用的五大PostgreSQL GUI一文揭秘单线程的Redis为什么这么快?
我收藏的内容
点赞
收藏