容器化技术的出现大大简化了应用开发人员在构建底层基础设施的工作。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 服务器的更多相关文章

  1. nodejs搭建web服务器初级

    nodejs搭建简单的web服务器 1.1简介 Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快 ...

  2. 巨杉Tech | 使用 SequoiaDB 分布式数据库搭建JIRA流程管理系统

    介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域.很多企业与互联网公司都在使用Jira作为内部 ...

  3. nodejs搭建web服务器

    一.代码结构 //1.引入相关模块 var http=require("http") var url=require("url") var fs=require ...

  4. 基于Docker和Golang搭建Web服务器

    1 场景描述 基于centos7的docker镜像搭建golang开发环境 在docker容器内,使用golang实现一个Web服务器 启动docker容器,并在容器内启动Web服务器 我购买了一个最 ...

  5. nodejs搭建web服务教程

    nodejs搭建web服务教程 先安装nodejs 然后 命令node js文件 即可开启服务了 输出如下 Magic happens on port 9011 你查看端口可以看到tcp 0 0 :: ...

  6. 记录一些服务端术语和搭建web服务器

    菜单快捷导航 服务端常用术语 搭建web服务器和配置虚拟主机 记录一些服务端方面的常用术语 1.CS架构和BS架构 1.1 CS架构 CS(Client/Server),基于安装包类型的桌面或手机软件 ...

  7. NodeJS搭建HTTPS服务器

    [NodeJS搭建HTTPS服务器] http://cnodejs.org/topic/54745ac22804a0997d38b32d

  8. 在Win7系统中搭建Web服务器

    局 域网Web服务器的主要功能是实现资源共享,同时借助于局域网服务器访问页面可有效的实现信息的同步.利用Web服务器,我们随时随地都可以将自己的信息 上传到服务器端,让其它关注你的用户能在第一时间内了 ...

  9. 轻松使用Nginx搭建web服务器

    如果读者以前做过web开发的话,就应该知道如何去搭建一个web服务器来跑你的web站点,在windows下你可能会选择去用IIS,十分的快捷,在linux下,你可能首先会想到apache,“一哥”( ...

随机推荐

  1. 多柱汉诺塔问题“通解”——c++

    多柱汉诺塔问题 绪言 有位同学看到了我的初赛模拟卷上有一道关于汉诺塔的数学题.大概就是要求4柱20盘的最小移动次数. 他的数学很不错,找到了应该怎样推. 如果要把n个盘子移到另一个柱子上,步骤如下: ...

  2. C语言 putchar

    C语言 putchar putchar主要功能是输出一个char.可以根据ASLL号码输出对应字符 案例 #define _CRT_SECURE_NO_WARNINGS #include <st ...

  3. vue添加swiper的正确方式亲测---切图网

    在vue项目中,我们在做图片轮播的方式和传统切图不同,传统切图中我们一般采用非常强大的swiper来完成,而在vue中一般依赖vue-awesome-swiper组件来完成(vue-awesome-s ...

  4. java script 内置对象

    java script 内置对象 Date 日期对象 字符串对象 定义字符串的方法就是直接赋值 使用 String 对象的 toUpperCase() 方法来将字符串小写字母转换为大写,反之 toLo ...

  5. CVE-2020-1938/CNVD-2020-10487 幽灵猫漏洞

    漏洞描述(后期跟进漏洞分析) Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和Java ...

  6. cf1276B

    题意简述:给出无向图,会有重边,然后给你两个点a,b,让你计算有多少点对(x,y)满足从x到y的所有路径都经过a和b 题解:先从a,b两点出发进行dfs,dfs的过程中不能经过a,b两点(除了开始) ...

  7. Intel 8086 标志寄存器及JCC指令表

    汇编 JCC指令表 JCC指条件跳转指令,CC就是指条件码. JCC指令 中文含义 英文原意 检查符号位 典型C应用 JZ/JE 若为0则跳转:若相等则跳转 jump if zero;jump if ...

  8. C++文件读写demo

    一.常用文件打开方式 二.读写文件步骤(文本文件) 1.写文件步骤 1)#include <fstream> //包含头文件 2)ofstream ofs; //创建流对象 3)ofs.o ...

  9. 如何开发自己的第一个 Serverless Component

    前言 上一篇 基于 Serverless Component 的全栈解决方案 介绍 Serverless Component 是什么和如何使用 Serverless Component 开发一个全栈应 ...

  10. Winform中怎样对窗体进行隐藏,再次打开时仍然保留上次的窗体

    场景 点击按钮后打开窗口,点击窗口的确定按钮后即使窗体返回了Ok,此时不关闭窗体,将窗体隐藏. 再次点击按钮后,仍然打开上次的窗体. 注: 博客主页: https://blog.csdn.net/ba ...