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

2023-10-28,,

容器化技术的出现大大简化了应用开发人员在构建底层基础设施的工作。SequoiaDB 巨杉数据库于3.2.1版本正式推出了 Docker 容器化部署方案,本文将会基于 SequoiaDB 巨杉数据库与Nodejs的 Docker 镜像搭建一个简易的 Web 服务器。

 

1、规划部署

我们将会搭建一个三分区三副本的高可用 SequoiaDB 巨杉数据库。同时,我们将会创建一个 SequoiaDB 巨杉数据库的 MySQL 实例,用以提供 Nodejs 作为数据源。

 



容器角色



容器名/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:latest

 

2、安装 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/

3、搭建 SequoiaDB 巨杉数据库集群

3.1、将 SequoiaDB 引擎与 SequoiaSQL-MySQL 数据库实例下载至本地



docker   pull sequoiadb/sequoiadb

:v3.2.1




docker pull sequoiadb/sequoiasql-mysql:v3.2.1

 

3.2、启动数据库引擎容器



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.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.4、部署 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.5、启动 MySQL 实例容器



docker   run -it -d -p 3306:3306 --name mysql sequoiadb/sequoiasql-mysql:v3.2.1

 

3.6、验证 IP 地址



docker   inspect --format '{{ .NetworkSettings.IPAddress}}'

mysql


预期输出结果为:



172.17.0.

6


 

3.7、创建 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


4

、登录 MySQL 并创建一个测试表

4.1、得到 MySQL 实例的容器 ID



docker ps   --filter name=mysql --format {{.ID}}

预期结果为 MySQL 实例容器所在的 Container ID:



cc17df22a908

 

4.2、登录 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.3、创建数据库与表,并创建一条测试数据



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)

5、创建 Nodejs 服务

5.1、创建

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.2、创建

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.3、创建

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.4、当前目录中应仅包含三个文件



$ 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.5、创建 Nodejs 服务镜像



docker   build -t nodetest .

 

5.6、运行 Nodejs 服务容器



docker   run -d -p 3000:3000 nodetest

 

5.7、打开浏览器,连接本地的 3000 端口

 

5.8、更改数据库中的记录,可以看到浏览器显示的内容随之发生调整



$ 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

刷新浏览器后显示:

6、小结

本文展示了如何通过 SequoiaDB 巨杉数据库的 Docker 容器,结合 Nodejs 快速搭建一个 Web 应用。灵活将分布式数据库结合容器使用,能够使用户快速构建开发测试环境,大幅度降低开发过程中的基础设施维护成本。

《巨杉Tech | 使用 SequoiaDB + Docker + Nodejs 搭建 Web 服务器.doc》

下载本文的Word格式文档,以方便收藏与打印。