容器化技術的出現大大簡化了應用開發人員在構建底層基礎設施的工做。SequoiaDB 巨杉數據庫於3.2.1版本正式推出了 Docker 容器化部署方案,本文將會基於 SequoiaDB 巨杉數據庫與Nodejs的 Docker 鏡像搭建一個簡易的 Web 服務器。node
一、規劃部署
咱們將會搭建一個三分區三副本的高可用 SequoiaDB 巨杉數據庫。同時,咱們將會建立一個 SequoiaDB 巨杉數據庫的 MySQL 實例,用以提供 Nodejs 做爲數據源。mysql
容器角色 容器名/IP:端口 分區組 鏡像版本
數據庫協調節點 coord_catalog/172.17.0.2:11810 SYSCoord sequoiadb/sequoiadb:v3.2.1
數據庫編目節點 coord_catalog/172.17.0.2:11800 SYSCatalog sequoiadb/sequoiadb:v3.2.1
數據分區1副本1 sdb_data1/172.17.0.3:11820 group1 sequoiadb/sequoiadb:v3.2.1
數據分區1副本2 sdb_data2/172.17.0.4:11820 group1 sequoiadb/sequoiadb:v3.2.1
數據分區1副本3 sdb_data3/172.17.0.5:11820 group1 sequoiadb/sequoiadb:v3.2.1
數據分區2副本1 sdb_data2/172.17.0.4:11830 group2 sequoiadb/sequoiadb:v3.2.1
數據分區2副本2 sdb_data3/172.17.0.5:11830 group2 sequoiadb/sequoiadb:v3.2.1
數據分區2副本3 sdb_data1/172.17.0.3:11830 group2 sequoiadb/sequoiadb:v3.2.1
數據分區3副本1 sdb_data3/172.17.0.5:11840 group3 sequoiadb/sequoiadb:v3.2.1
數據分區3副本2 sdb_data1/172.17.0.3:11840 group3 sequoiadb/sequoiadb:v3.2.1
數據分區3副本3 sdb_data2/172.17.0.4:11840 group3 sequoiadb/sequoiadb:v3.2.1
數據庫 MySQL實例 mysql/172.17.0.6:3306 - sequoiadb/sequoiasql-mysql:v3.2.1
Nodejs Web 服務器 nodetest/172.17.0.7:3000 - node:latestlinux
二、安裝 Docker 環境
對於已經安裝了 Docker 環境的讀者能夠跳過本章節。對於以前沒有使用過 Docker 的讀者能夠經過本章節安裝本地 Docker 環境。sql
Docker 能夠運行在絕大部分主流操做系統上,包括經常使用的 Windows、Mac 以及 Linux 的多個版本都可支持。docker
對於 Mac 用戶能夠安裝 Docker Desktop for Mac,下載地址在:
https://hub.docker.com/editions/community/docker-ce-desktop-mac數據庫
對於 Windows 用戶能夠安裝 Docker Deskop for Windows,下載地址在:
https://docs.docker.com/docker-for-windows/install/express
對於 Linux 用戶則能夠直接使用 yum 或 apt-get 進行安裝:
https://docs.docker.com/install/linux/docker-ce/centos/
https://docs.docker.com/install/linux/docker-ce/ubuntu/npm
三、搭建 SequoiaDB 巨杉數據庫集羣
3.一、將 SequoiaDB 引擎與 SequoiaSQL-MySQL 數據庫實例下載至本地
docker pull sequoiadb/sequoiadb:v3.2.1
docker pull sequoiadb/sequoiasql-mysql:v3.2.1json
3.二、啓動數據庫引擎容器
docker run -it -d --name coord_catalog sequoiadb/sequoiadb:v3.2.1
docker run -it -d --name sdb_data1 sequoiadb/sequoiadb:v3.2.1
docker run -it -d --name sdb_data2 sequoiadb/sequoiadb:v3.2.1
docker run -it -d --name sdb_data3 sequoiadb/sequoiadb:v3.2.1ubuntu
3.三、驗證各個容器的 IP 地址
docker inspect --format '{{ .NetworkSettings.IPAddress}}' coord_catalog
docker inspect --format '{{ .NetworkSettings.IPAddress}}' sdb_data1
docker inspect --format '{{ .NetworkSettings.IPAddress}}' sdb_data2
docker inspect --format '{{ .NetworkSettings.IPAddress}}' sdb_data3
預期輸出結果爲:
172.17.0.2
172.17.0.3
172.17.0.4
172.17.0.5
3.四、部署 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 file
Finish generating SequoiaDB conf file
Restarting sdbcm process, it will take 10 seconds
Deploy...
Execute command: /opt/sequoiadb/tools/deploy/../../bin/sdb -f /opt/sequoiadb/tools/deploy/quickDeploy.js -e ''
**** Deploy SequoiaDB ****
Create catalog: 172.17.0.2:11800
Create coord: 172.17.0.2:11810
Create data: 172.17.0.3:11820
Create data: 172.17.0.4:11820
Create data: 172.17.0.5:11820
Create data: 172.17.0.4:11830
Create data: 172.17.0.5:11830
Create data: 172.17.0.3:11830
Create data: 172.17.0.5:11840
Create data: 172.17.0.3:11840
Create data: 172.17.0.4:11840
3.五、啓動 MySQL 實例容器
docker run -it -d -p 3306:3306 --name mysql sequoiadb/sequoiasql-mysql:v3.2.1
3.六、驗證 IP 地址
docker inspect --format '{{ .NetworkSettings.IPAddress}}' mysql
預期輸出結果爲:
172.17.0.6
3.七、建立 MySQL 實例
docker exec mysql "/init.sh" --port=3306 --coord='172.17.0.2:11810'
其中 coord 參數填寫協調節點所在的 IP 地址與監聽端口。
預期輸出結果爲:
Creating SequoiaSQL instance: MySQLInstance
Modify configuration file and restart the instance: MySQLInstance
Restarting instance: MySQLInstance
Opening remote access to user root
Restarting instance: MySQLInstance
Instance MySQLInstance is created on port 3306, default user is root
四、登陸 MySQL 並建立一個測試表
4.一、獲得 MySQL 實例的容器 ID
docker ps --filter name=mysql --format {{.ID}}
預期結果爲 MySQL 實例容器所在的 Container ID:
cc17df22a908
4.二、登陸 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 4
Server 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 its
affiliates. Other names may be trademarks of their respective
owners.
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>
4.三、建立數據庫與表,並建立一條測試數據
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)
五、建立 Nodejs 服務
5.一、建立 app.js 文件
var express = require('express'); //引入express模塊
var mysql = require('mysql'); //引入mysql模塊
var app = express(); //建立express的實例
var connection = mysql.createConnection({ //建立mysql實例
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 () { ////監聽3000端口
console.log('Server running at 3000 port');
});
代碼中的 host 使用 MySQL 實例的 IP 地址。
5.二、建立 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"
}
}
5.三、建立 Dockerfile 文件
FROM node:latest
RUN mkdir -p /usr/src/
COPY package.json /usr/src/
COPY app.js /usr/src/
WORKDIR /usr/src/
RUN npm install
#定義程序默認端口
EXPOSE 3000
#運行程序命令
CMD ["node","app.js"]
5.四、當前目錄中應僅包含三個文件
$ ls -la
total 24
drwxr-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
5.五、建立 Nodejs 服務鏡像
docker build -t nodetest .
5.六、運行 Nodejs 服務容器
docker run -d -p 3000:3000 nodetest
5.七、打開瀏覽器,鏈接本地的 3000 端口
5.八、更改數據庫中的記錄,能夠看到瀏覽器顯示的內容隨之發生調整
$ docker exec -it cc17df22a908 "/opt/sequoiasql/mysql/bin/mysql" -h 127.0.0.1 -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server 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 its
affiliates. Other names may be trademarks of their respective
owners.
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 names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> 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 應用。靈活將分佈式數據庫結合容器使用,可以使用戶快速構建開發測試環境,大幅度下降開發過程當中的基礎設施維護成本。