如何用MariaDB管理NoSQL數據
譯文【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】