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

2021-12-25 巨杉資料庫

容器化技術的出現大大簡化了應用開發人員在構建底層基礎設施的工作。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 應用。靈活將分布式資料庫結合容器使用,能夠使用戶快速構建開發測試環境,大幅度降低開發過程中的基礎設施維護成本。

點擊閱讀原文,獲取更多精彩內容

相關焦點

  • 巨杉Tech | 十分鐘快速搭建 Wordpress 博客系統
    而全球使用最廣的Wordpress常常被用戶用來快速搭建個人博客網站。默認情況下,Wordpress一般在後臺使用MySQL關係型資料庫存儲所有的博文及回復。本文將展示如何使用 SequoiaDB 巨杉分布式資料庫替換MySQL,成為Wordpress博客系統的後臺關係型資料庫。
  • Docker最全教程之使用Node.js搭建團隊技術文檔站(二十四)
    各種程式語言均有其優勢和生態,有興趣的朋友完全可以涉獵多門語言。我們團隊文檔站即使用Hexo來構建,並且基於容器配置了完整的代碼流水線:docs.xin-lai.com如果對站點配置、主題、插件存在疑問,可以加群溝通。1.
  • 使用 Docker 搭建第一個 Node 項目到伺服器
    除該方式外還有一個容器連接(linking)系統也可以達到容器交互。(本文中 Node 連接 MongoDB 使用的是埠映射的方式)項目地址:https://github.com/koala-coding/dockerstudy首先在項目根目錄下創建 .dockerignore 文件,把不需要打包進 Docker Image 裡的文件進行過濾:# /usr/src/nodejs/dockerstudy/.dockerignore.gitnode_modules在項目的根目錄中創建
  • 巨杉Tech | SequoiaS3 原理及最佳實踐
    SequoiaS3是基於巨杉資料庫實現的一種對象存儲服務,具備可擴展、數據高可用、安全、高性能等特性。
  • 用 Docker 搭建你的第一個 Node 項目到伺服器
    Docker 最初實現是基於 LXC.Docker 能夠自動執行重複性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專注在真正重要的事情上,構建傑出的軟體。用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改,就像管理普通的代碼一樣。Docker 的基本組成架構看一張 Docker 架構圖
  • 巨杉Tech | SequoiaDB高可用原理詳解
    首先,傳統資料庫橫向擴展能力有限一般2-3臺伺服器,無法應對現在的大數據場景;其次,貴啊。花幾百萬用2臺小型機加高端磁碟陣列加ORACLE RAC搭建一個核心資料庫,為了穩定性也就罷了,但是需要處理幾百TB數據,需要幾十上百臺伺服器的資料庫系統怎麼搞?「巨杉資料庫:」該我登場了。
  • 使用 Node, Sequelize, Postgres 和 Docker 搭建 CURD API【譯】
    和 Docker 搭建 CURD API。原文地址:https://francescociulla.com/crud-api-using-node-sequelize-postgres-and-dockerGitHub Repository: github.com/FrancescoXX/docker-nsp[1]NODE
  • 從零開始Docker化你的Node.js應用
    ,使用scp命令,把zip包傳輸至伺服器的示例如下:rsync -avzP .    https:sudo yum makecache fastsudo yum install docker-ce使用Docker的時候,需要經常從官方獲取鏡像,但是由於顯而易見的網絡原因,拉取鏡像的過程非常耗時,嚴重影響使用Docker的體驗,推薦使用https://0x9.me/ragf2。
  • Docker搭建部署Node項目
    其中在centos上搭建環境和部署都挺費周折,部署測試伺服器,接著上線的時候又部署生產環境伺服器。這中間就有很多既無聊又費精力,吃力不討好的"體力活"。所以就開始思考怎麼自動化這部分搭建部署的工作,也就引出了Docker。什麼是DockerDocker 是比虛擬機還要輕量級的虛擬化技術,它虛擬化的實體就叫做容器。
  • 如何使用 Node.js 和 Docker 構建高質量的微服務
    Here we will use the latest LTS (long term support) version argon of node available from the Docker Hub —https://nodejs.org/en/docs/guides/nodejs-docker-webapp/我們事先寫好了兩個文件package.json, app.js:
  • Node.js Web 模塊
    Web伺服器一般指網站伺服器,是指駐留於網際網路上某種類型計算機的程序,Web伺服器的基本功能就是提供Web信息瀏覽服務。它只需支持HTTP協議、HTML文檔格式及URL,與客戶端的網絡瀏覽器配合。大多數 web 伺服器都支持服務端的腳本語言(php、python、ruby)等,並通過腳本語言從資料庫獲取數據,將結果返回給客戶端瀏覽器。
  • 如何使用HTTP模塊在Node.js中創建Web伺服器(下)
    當我們在瀏覽器中訪問我們的伺服器時,我們將看到一個帶有一個標頭標籤的HTML頁面,其中包含「This is HTML」。讓我們保存並退出按CTRL+X,現在,讓我們用node命令運行伺服器:這種方法在許多web開發設置中都很常見,所以最好知道如何在Node.js中加載HTML文件來支持它。為了提供HTML文件,我們使用fs模塊加載HTML文件,並在編寫HTTP響應時使用其數據。首先,我們將創建web伺服器將返回的HTML文件,創建一個新的HTML文件:
  • 巨杉Tech | 磁碟故障後SequoiaDB如何實現在線恢復
    磁碟壞道通常都可以將損壞的磁碟進行隔離不使用後繼續使用,但建議儘快更換硬碟,因為壞道會擴散,以免出現嚴重的數據問題。在Linux 環境中,磁碟壞道可以通過 badblocks 或 Smartmontools 工具進行檢測,這兩個工具的使用說法,已超過了本教程的範圍,大家可自行搜索了解。磁碟扇區損壞可以分為兩種:一種是無法修復的物理損壞,另一種是可以修復的軟體錯誤。
  • Node.js搭建一個簡單的伺服器
    Node.js的安裝了解Node.js模塊系統
  • docker + webhook 從零實現前端自動化部署
    既然是前端自動化部署,雲伺服器上相關處理邏輯用 js 編寫,所以需要安裝 node 環境,這裡用 nvm 來管理 node 版本curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
  • 10個適合web前端開發的node.js框架
    NodeJS 可以幫助你只使用 JavaScript 就可以建立大規模、實時性、可擴展的移動和 Web 應用程式。 有不少的Node.js 框架,允許你構建實時的端到端網絡應用,而無需任何其他第三方 Web 伺服器、應用伺服器、工具和技術。
  • 如何使用HTTP模塊在Node.js中創建Web伺服器(上)
    Node.js允許開發人員使用JavaScript編寫後端代碼,儘管傳統上它是在瀏覽器中用於編寫前端代碼的。這樣將前端和後端結合在一起可以減少製作Web伺服器的工作量,這是Node.js成為編寫後端代碼的流行選擇的主要原因。在本文中,你將學習如何使用Node.js中包含的http模塊構建web伺服器。你將構建可返回JSON數據、CSV文件和HTML網頁的Web伺服器。
  • Windows下構建Node.js的Docker Nano Server基礎鏡像
    q, /i, node.msi -Wait ; \Remove-Item -Path node.msiCMD [ "node.exe" ]接下來構建Node.js的Docker鏡像:docker build -t node:4.4.5 .
  • 【實戰】基於Nginx、Node.js和Redis的Docker工作流
    從自定義鏡像中創建一個Node容器並連接Redis容器:docker run -d --name node -p 8080 --link redis:redis msanand/node由於我計劃在3個node伺服器之間做負載均衡,我會創建3個容器 - node1、node2和node3。
  • 前端開發者應該知道的 Centos/Docker/Nginx/Node/Jenkins 操作
    nginx-logoNginx 是一個高性能的 HTTP 和反向代理 web 伺服器,使用 nginx 網站有:百度、京東、新浪、網易、騰訊、淘寶...。Centos 下安裝 Nginx 伺服器這裡我們使用 yum 安裝 Nginx 伺服器。