如何用MariaDB管理NoSQL數(shù)據(jù)
譯文【51CTO.com快譯】不知您是否已注意到,MariaDB MaxScale 6的新功能中,已包含了針對NoSQL偵聽器(listeners)功能的技術(shù)預(yù)覽。而作為MaxScale的關(guān)鍵部分,偵聽器可用于定義接受客戶端連接服務(wù)所用到的端口和協(xié)議對。
NoSQL協(xié)議模塊
作為新的NoSQL協(xié)議模塊,偵聽器使得MariaDB服務(wù)器或集群,能夠成為那些使用MongoDB客戶端庫的應(yīng)用的后端。也就是說,您可以將由MongoDB驅(qū)動程序提供的NoSQL文檔數(shù)據(jù),直接存儲到MariaDB數(shù)據(jù)庫中。在其內(nèi)部,所有文檔都存儲在一個(gè)包含了兩個(gè)列的表中。
如下圖所示,從高級別來看,當(dāng)MongoDB客戶端應(yīng)用程序直接或間接地通過客戶端庫,發(fā)出MongoDB協(xié)議命令時(shí),它們會被透明地轉(zhuǎn)換為等效的SQL,并會在MariaDB后端被執(zhí)行。同樣,MariaDB的響應(yīng)也會依次轉(zhuǎn)換為MongoDB客戶端庫,以及應(yīng)用程序所需的格式。下面,我將向您展示其具體過程。
在開始之前,您需要在機(jī)器上事先安裝Git和Docker。
我們可以通過多種方式,開始使用MaxScale、及其新的NoSQL偵聽器功能。在本次展示中,我創(chuàng)建了一個(gè)存儲庫。它可以通過Docker(https://www.docker.com/),在數(shù)分鐘之內(nèi)啟動、運(yùn)行和測試新的功能。
具體而言,我將使用位于https://github.com/mariadb-corporation/dev-example-nosql-listener的GitHub存儲庫,來設(shè)置一個(gè)新的環(huán)境。該環(huán)境允許我們使用MaxScale、MariaDB Community服務(wù)器、以及一個(gè)示例應(yīng)用,來實(shí)現(xiàn)如何在MariaDB中管理NoSQL文檔數(shù)據(jù)。
下面,我將依次進(jìn)行環(huán)境設(shè)置,配置MaxScale,以及使用簡單的Web應(yīng)用,通過MongoDB的Node.js驅(qū)動,去管理NoSQL文檔數(shù)據(jù)。
環(huán)境設(shè)置
通過創(chuàng)建和使用Docker容器,開發(fā)人員將能夠在任何環(huán)境下,輕松地運(yùn)行可移植、輕量級和獨(dú)立(self-sufficient)的應(yīng)用程序,而無需擔(dān)心設(shè)置環(huán)境的依賴項(xiàng)。具體而言,我們可以使用Docker Compose,來定義和運(yùn)行多的Docker容器應(yīng)用。當(dāng)然,您首先需要將存儲庫引入主機(jī)。
- $ git clone https://github.com/mariadb-corporation/dev-example-nosql-listener
請?jiān)谛庐a(chǎn)生的根目錄下,打開一個(gè)dev-example-nosql-listener終端窗口,然后執(zhí)行如下命令:
- $ docker-compose up
docker-compose up將使用名為docker-compose.yml的文件,來構(gòu)建、創(chuàng)建、啟動和加載容器。簡單而言,它將設(shè)置一組如下表所示的容器,并建立鏈接。
容器名稱描述
您可以通過執(zhí)行如下命令,來檢查系統(tǒng)上、當(dāng)前正在運(yùn)行的活動容器是否有效:
- $ docker ps
其輸出結(jié)果會顯示mxs、mdb、todo_client和todo_api容器的相關(guān)信息。
添加MaxScale數(shù)據(jù)庫用戶
為了讓MaxScale能夠訪問MariaDB Community服務(wù)器,您可以通過下面兩種方法,添加一個(gè)新的用戶。
1. 通過使用容器:
請連接到被包含在mdb容器中的MariaDB Community服務(wù)器實(shí)例上,并通過使用包含在Docker容器中的MariaDB命令行客戶端,來執(zhí)行add_maxscale_user.sql腳本。
- $ docker exec -i mdb mariadb --user root -pPassword123! < configuration/add_maxscale_user.sql
2. 通過執(zhí)行本地系統(tǒng):
請連接到被包含在mdb容器中的MariaDB Community服務(wù)器實(shí)例上,并使用主機(jī)上的MariaDB命令行客戶端,來執(zhí)行add_maxscale_user.sql腳本。
- $ mariadb --host 127.0.0.1 --port 3307 --user root -pPassword123! < configuration/add_maxscale_user.sql
配置MariaDB MaxScale
完成新用戶的添加后,我們便可以配置MaxScale與MariaDB數(shù)據(jù)庫服務(wù)器實(shí)例,以實(shí)現(xiàn)通信了。除了在MaxScale和MariaDB Community服務(wù)器之間設(shè)置典型的讀/寫通信,您還可以在MaxScale的配置文件中添加一塊代碼,利用新的nosqlprotocol直通端口17017,來設(shè)置NoSQL偵聽器。
- [MongoDB-Listener] type=listener service=Read-Write-Service protocol=nosqlprotocol nosqlprotocol.user=maxscale nosqlprotocol.password=Password123!port=17017
對此,您同樣有兩個(gè)選擇:
1. 替換配置文件:
請?zhí)鎿QMaxScale配置文件并重啟MaxScale服務(wù)。
A. 將MaxScale默認(rèn)配置文件替換為dev-example-nosql-listener存儲庫中包含的配置文件。
- $ docker cp configuration/maxscale.cnf mxs:etc/maxscale.cnf
B. 重新啟動mxs容器內(nèi)的MaxScale服務(wù)。
- $ docker exec -it mxs maxscale-restart
2. 使用MaxScale GUI進(jìn)行配置:
我們可以通過打開瀏覽器窗口,導(dǎo)航到http://localhost:8989,來訪問MaxScale的GUI界面。請使用默認(rèn)用戶名admin和密碼maxscale,登錄到GUI的儀表板中。在儀表板的右上角有一個(gè)名為“新建”的按鈕。
單擊“新建”按鈕后,MaxScale會通過模式提示,允許您創(chuàng)建新的服務(wù)器、服務(wù)、監(jiān)視器、過濾器、以及偵聽器。
您輸入到界面中的數(shù)據(jù),將會被保存到MaxScale的配置文件中。同時(shí),您也可以將存儲庫中的配置文件作為設(shè)置各個(gè)必要組件的指南。
在MariaDB中使用MongoDB驅(qū)動程序
完成了將MaxScale配置為通過端口17017接收NoSQL通信之后,我們便可以使用兩個(gè)剩余的容器todo_client和todo_app,進(jìn)行測試了。
首先,請打開一個(gè)瀏覽器窗口,并導(dǎo)航至http://localhost:3000。它將加載一個(gè)方便您管理任務(wù)列表(即:待辦事項(xiàng)列表)的Web應(yīng)用。
在該應(yīng)用的Web界面上,您可以對數(shù)據(jù)執(zhí)行創(chuàng)建、讀取、更新和刪除(即CRUD)操作。在其后臺,這是由一個(gè)帶有React.js Web應(yīng)用的todo_client容器,與帶有todo_api容器的后端應(yīng)用程序編程接口(API)通過通信實(shí)現(xiàn)的。
具體而言,托管在todo_api容器中的Node.js應(yīng)用程序公開了四個(gè)端點(diǎn),客戶端應(yīng)用和解決方案可以使用這些端點(diǎn),來執(zhí)行CRUD四項(xiàng)操作。Node.js應(yīng)用使用MongoDB的Node.js驅(qū)動程序,與底層數(shù)據(jù)庫(在本例中為MariaDB)進(jìn)行通信。這些都發(fā)生在app/api/db.js文件中。如下代碼段展示了其具體內(nèi)容。
- // 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應(yīng)用程序源,都被包含在存儲庫中的app文件夾內(nèi)。如果您有興趣在自己的主機(jī)上直接從源代碼運(yùn)行客戶端和API應(yīng)用程序的話,請參考存儲庫的README里的操作說明。
發(fā)現(xiàn)數(shù)據(jù)
一旦您設(shè)置好了環(huán)境,并使用TODO應(yīng)用添加了幾項(xiàng)任務(wù),那么就可以發(fā)現(xiàn)那些被添加到MariaDB中的數(shù)據(jù)了。實(shí)際上,auto_create_databases和auto_create_tables設(shè)置是默認(rèn)開啟的,因此通過TODO應(yīng)用程序,不僅系統(tǒng)添加了任務(wù)數(shù)據(jù),而且還自動在數(shù)據(jù)庫中創(chuàng)建了一個(gè)新的數(shù)據(jù)庫todo和表tasks。
使用SQL
您可以使用MariaDB命令行客戶端,在本地計(jì)算機(jī)上通過執(zhí)行如下命令,直接連接到包含在mdb容器中的MariaDB Community服務(wù)器實(shí)例上:
- $ mariadb --host 127.0.0.1 --port 3307 --user root -pPassword123!
值得注意的是,為了簡單起見,我在此只介紹MariaDB命令行客戶端的流程。您可以使用各種第三方工具或客戶端,去連接到MariaDB上。您可以在官方文檔中找到通過MariaDB測試的第三方客戶端和工具列表。
當(dāng)然,如果您的主機(jī)上沒有MariaDB命令行客戶端的話,則可以通過執(zhí)行如下命令,通過Docker去訪問包含在mdb容器中的MariaDB命令行客戶端:
- $ docker exec -it mdb mariadb --user root -pPassword123!
在成功連接上MariaDB后,您便可以執(zhí)行SQL命令了。首先,您可以羅列出服務(wù)器上的數(shù)據(jù)庫,以確認(rèn)已創(chuàng)建好了名為todo的數(shù)據(jù)庫。
- MariaDB [(none)]> show databases;
- +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | |TODO | +--------------------+
然后進(jìn)入todo數(shù)據(jù)庫,您可以看到已被創(chuàng)建的、用于存儲文檔數(shù)據(jù)的數(shù)據(jù)表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表包含了兩個(gè)列:
- id: 用于保存文檔數(shù)據(jù)對象的id
- doc: 用于保存文檔數(shù)據(jù)本身
事實(shí)上,id和doc列都包含有可以使用MariaDB的預(yù)定義函數(shù),訪問到的JSON數(shù)據(jù)。
- 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)提供了發(fā)現(xiàn)數(shù)據(jù)的方式。
- 登錄:首先根據(jù)MaxScale的配置,請打開瀏覽器窗口并導(dǎo)航到http://localhost:8989。系統(tǒng)會提示您輸入登錄信息(默認(rèn)用戶名為admin,密碼是maxscale)。
- 儀表板:完成登錄后,您將看到一個(gè)儀表板,上面提供了有關(guān)MaxScale的各種信息,其中包括服務(wù)和偵聽器配置等信息。
- 查詢編輯器:在左側(cè)導(dǎo)航中,您可以選擇“查詢編輯器”的菜單選項(xiàng)。
- 然后系統(tǒng)會提示您輸入連接信息。據(jù)此,您可以直接連接到MariaDB中的服務(wù)器和/或架構(gòu)上。您也可以在后期隨時(shí)更新或修改這些信息。
- 完成連接后,您便可以使用查詢編輯器,來執(zhí)行SQL查詢、顯示數(shù)據(jù)集,甚至通過圖形或圖表來可視化數(shù)據(jù)。
Mongo Shell
Mongo Shell是一個(gè)針對MongoDB的互動式JavaScript接口。您可以通過鏈接https://www.mongodb.com/try/download/shell,下載 mongo shell。類似MariaDB的命令行客戶端,您可以使用mongo shell,來查詢和更新數(shù)據(jù),以及執(zhí)行各項(xiàng)管理操作。
- 連接MariaDB
您可以使用如下命令,讓mongo shell連接上MariaDB:
- $ mongo --host 127.0.0.1 --port 17017
再通過命令:> use todo進(jìn)入TODO數(shù)據(jù)庫。
而命令:> show collections能夠?yàn)槟@示當(dāng)前目標(biāo)數(shù)據(jù)庫中的集合,或是MariaDB中的數(shù)據(jù)表。當(dāng)然,在本例中,我們只能夠看到tasks表。
- 基本查詢
您可以通過執(zhí)行如下命令,來選擇所有已完成的任務(wù),或查詢tasks表內(nèi)的數(shù)據(jù):
- > 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偵聽器有一項(xiàng)巧妙的功能,可以為處理命令提供診斷的能力。例如,mxsDiagnose能夠輸出MariaDB用于選擇數(shù)據(jù)的所有等效SQL,以及前面我們提到的所有已完成任務(wù)的命令。
- > 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的部分功能。您可以通過查看官方文檔,以了解更多有關(guān)如何使用帶有NoSQL偵聽器功能的mongo shell的知識。
展望
綜上所述,MariaDB的NoSQL偵聽器功能在很大程度上提供了,與NoSQL數(shù)據(jù)庫的更多互操作性。當(dāng)然,上面為您展示的只是其冰山的一角,您既可以去查看MariaDB的NoSQL偵聽器的官方文檔,也可以通過我們的新手開發(fā)者中心,了解有關(guān)如何使用MariaDB開發(fā)現(xiàn)代化方案和應(yīng)用程序的更多信息。
原文標(biāo)題:How to Manage NoSQL Data With MariaDB,作者:Rob Hedgpeth
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】





































