容器化技術的出現大大簡化了應用開發人員在構建底層基礎設施的工作。SequoiaDB 巨杉資料庫於3.2.1版本正式推出了 Docker 容器化部署方案,本文將會基於 SequoiaDB 巨杉資料庫與 Nodejs 的 Docker 鏡像搭建一個簡易的 Web 伺服器。
我們將會搭建一個三分區三副本的高可用 SequoiaDB 巨杉資料庫。同時,我們將會創建一個SequoiaDB 巨杉資料庫的 MySQL 實例,用以提供 Nodejs 作為數據源。
對於已經安裝了 Docker 環境的讀者可以跳過本章節。
對於之前沒有使用過Docker 的讀者可以通過本章節安裝本地 Docker 環境。
Docker 可以運行在絕大部分主流作業系統上,包括常用的 Windows、Mac 以及 Linux的多個版本均可支持。
對於 Mac 用戶可以安裝 DockerDesktop for Mac,下載地址在:
https://hub.docker.com/editions/community/docker-ce-desktop-mac對於 Windows 用戶可以安裝 DockerDeskop for Windows,下載地址在:
https://docs.docker.com/docker-for-windows/install/對於 Linux 用戶則可以直接使用 yum或 apt-get 進行安裝:
https://docs.docker.com/install/linux/docker-ce/centos/https://docs.docker.com/install/linux/docker-ce/ubuntu/將 SequoiaDB 引擎與SequoiaSQL-MySQL 資料庫實例下載至本地
docker pull sequoiadb/sequoiadb:v3.2.1docker pull sequoiadb/sequoiasql-mysql:v3.2.1啟動資料庫引擎容器
docker run -it -d --name coord_catalog sequoiadb/sequoiadb:v3.2.1docker run -it -d --name sdb_data1 sequoiadb/sequoiadb:v3.2.1docker run -it -d --name sdb_data2 sequoiadb/sequoiadb:v3.2.1docker run -it -d --name sdb_data3 sequoiadb/sequoiadb:v3.2.1驗證各個容器的 IP 地址
docker inspect --format '{{ .NetworkSettings.IPAddress}}' coord_catalogdocker inspect --format '{{ .NetworkSettings.IPAddress}}' sdb_data1docker inspect --format '{{ .NetworkSettings.IPAddress}}' sdb_data2docker inspect --format '{{ .NetworkSettings.IPAddress}}' sdb_data3預期輸出結果為:
172.17.0.2172.17.0.3172.17.0.4172.17.0.5部署 SequoiaDB 巨杉資料庫引擎集群
docker exec coord_catalog "/init.sh" \ --coord='172.17.0.2:11810' \ --catalog='172.17.0.2:11800' \ --data='group1=172.17.0.3:11820,172.17.0.4:11820,172.17.0.5:11820;group2=172.17.0.4:11830,172.17.0.5:11830,172.17.0.3:11830;group3=172.17.0.5:11840,172.17.0.3:11840,172.17.0.4:11840'預期輸出結果為:
Begin generating SequoiaDB conf fileFinish generating SequoiaDB conf fileRestarting sdbcm process, it will take 10 secondsDeploy...Execute command: /opt/sequoiadb/tools/deploy/../../bin/sdb -f /opt/sequoiadb/tools/deploy/quickDeploy.js -e ''
************ Deploy SequoiaDB ************************Create catalog: 172.17.0.2:11800Create coord: 172.17.0.2:11810Create data: 172.17.0.3:11820Create data: 172.17.0.4:11820Create data: 172.17.0.5:11820Create data: 172.17.0.4:11830Create data: 172.17.0.5:11830Create data: 172.17.0.3:11830Create data: 172.17.0.5:11840Create data: 172.17.0.3:11840Create data: 172.17.0.4:11840啟動 MySQL 實例容器
docker run -it -d -p 3306:3306 --name mysql sequoiadb/sequoiasql-mysql:v3.2.1驗證 IP 地址
docker inspect --format '{{ .NetworkSettings.IPAddress}}' mysql預期輸出結果為:
創建 MySQL 實例
docker exec mysql "/init.sh" --port=3306 --coord='172.17.0.2:11810'其中 coord 參數填寫協調節點所在的 IP 地址與監聽埠。
預期輸出結果為:
Creating SequoiaSQL instance: MySQLInstanceModify configuration file and restart the instance: MySQLInstanceRestarting instance: MySQLInstanceOpening remote access to user rootRestarting instance: MySQLInstanceInstance MySQLInstance is created on port 3306, default user is root得到 MySQL 實例的容器 ID
docker ps --filter name=mysql --format {{.ID}}
預期結果為 MySQL 實例容器所在的 Container ID:
登錄 MySQL 實例命令行
docker exec -it cc17df22a908 "/opt/sequoiasql/mysql/bin/mysql" -h 127.0.0.1 -u root其中 -it 參數為 MySQL 實例的容器ID,預期結果為:
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 4Server version: 5.7.25 Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.
No entry for terminal type "xterm";using dumb terminal settings.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>創建資料庫與表,並創建一條測試數據
create database sample;use sample;create table t1 ( c1 varchar(100));insert into t1 values ("SequoiaDB");select * from t1;預期輸出結果為:
+| c1 |+| SequoiaDB |+1 row in set (0.02 sec)創建 app.js文件
var express = require('express'); var mysql = require('mysql'); var app = express(); var connection = mysql.createConnection({ host:'172.17.0.6', port:'3306', user:'root', password:'', database:'sample'});var sql = 'SELECT * FROM t1';connection.connect();
app.get('/',function (req,res) { connection.query(sql, function (err,result) { if(err){ console.log('[SELECT ERROR]:',err.message); } res.send('Hello: ' + result[0].c1 ) ; });});app.listen(3000,function () { console.log('Server running at 3000 port');});代碼中的 host 使用 MySQL 實例的IP 地址。
創建 package.json文件
{ "name": "nodetest", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "express": "^4.17.1", "mysql": "^2.17.1" }}創建 Dockerfile文件
FROM node:latestRUN mkdir -p /usr/src/
COPY package.json /usr/src/COPY app.js /usr/src/WORKDIR /usr/src/
RUN npm installEXPOSE 3000CMD ["node","app.js"]當前目錄中應僅包含三個文件
$ ls -latotal 24drwxr-xr-x 5 sequoiadb staff 160 7 16 15:22 .drwxr-xr-x 94 sequoiadb staff 3008 7 16 10:50 ..-rw-r--r-- 1 sequoiadb staff 206 7 16 12:24 Dockerfile-rw-r--r-- 1 sequoiadb staff 766 7 16 12:27 app.js-rw-r--r-- 1 sequoiadb staff 278 7 16 12:03 package.json
創建 Nodejs 服務鏡像
docker build -t nodetest .運行 Nodejs 服務容器
docker run -d -p 3000:3000 nodetest打開瀏覽器,連接本地的 3000 埠
更改資料庫中的記錄,可以看到瀏覽器顯示的內容隨之發生調整
$ docker exec -it cc17df22a908 "/opt/sequoiasql/mysql/bin/mysql" -h 127.0.0.1 -u rootWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 7Server version: 5.7.25 Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.
No entry for terminal type "xterm";using dumb terminal settings.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use sample;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A
Database changedmysql> update t1 set c1="Node" where c1="SequoiaDB";Query OK, 1 row affected (0.04 sec)Rows matched: 1 Changed: 1 Warnings: 0刷新瀏覽器後顯示:
本文展示了如何通過 SequoiaDB 巨杉資料庫的 Docker 容器,結合 Nodejs 快速搭建一個 Web 應用。靈活將分布式資料庫結合容器使用,能夠使用戶快速構建開發測試環境,大幅度降低開發過程中的基礎設施維護成本。
點擊閱讀原文,獲取更多精彩內容