巨杉Tech | 使用 SequoiaDB + Docker + Nodejs 搭建 Web 服務器

容器化技術的出現大大簡化了應用開發人員在構建底層基礎設施的工做。SequoiaDB 巨杉數據庫於3.2.1版本正式推出了 Docker 容器化部署方案,本文將會基於 SequoiaDB 巨杉數據庫與Nodejs的 Docker 鏡像搭建一個簡易的 Web 服務器。node

一、規劃部署

咱們將會搭建一個三分區三副本的高可用 SequoiaDB 巨杉數據庫。同時,咱們將會建立一個 SequoiaDB 巨杉數據庫的 MySQL 實例,用以提供 Nodejs 做爲數據源。mysql

容器角色linux

容器名/IP:端口sql

分區組docker

鏡像版本數據庫

數據庫協調節點express

coord_catalog/172.17.0.2:11810npm

SYSCoordjson

sequoiadb/sequoiadb:v3.2.1ubuntu

數據庫編目節點

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:latest

二、安裝 Docker 環境

對於已經安裝了 Docker 環境的讀者能夠跳過本章節。對於以前沒有使用過 Docker 的讀者能夠經過本章節安裝本地 Docker 環境。

Docker 能夠運行在絕大部分主流操做系統上,包括經常使用的 Windows、Mac 以及 Linux 的多個版本都可支持。

對於 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/

對於 Linux 用戶則能夠直接使用 yum 或 apt-get 進行安裝:

https://docs.docker.com/install/linux/docker-ce/centos/

https://docs.docker.com/install/linux/docker-ce/ubuntu/

三、搭建 SequoiaDB 巨杉數據庫集羣

3.一、將 SequoiaDB 引擎與 SequoiaSQL-MySQL 數據庫實例下載至本地

docker pull sequoiadb/sequoiadb:v3.2.1

docker pull sequoiadb/sequoiasql-mysql:v3.2.1

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

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 應用。靈活將分佈式數據庫結合容器使用,可以使用戶快速構建開發測試環境,大幅度下降開發過程當中的基礎設施維護成本。

相關文章
相關標籤/搜索