如何在 Ubuntu 12.04 VPS 上使用 MongoDB 创建分片集群
简介
MongoDB 是一个 NoSQL 文档数据库系统,可以在水平方向上很好地扩展,并通过键值系统实现数据存储。作为 Web 应用程序和网站的热门选择,MongoDB 易于实现并可以通过编程方式访问。
MongoDB 通过一种称为“分片”的技术实现扩展。分片是将数据写入不同的服务器以分发读取和写入负载以及数据存储需求的过程。
在之前的教程中,我们介绍了如何在 Ubuntu 12.04 VPS 上安装 MongoDB。我们将以此为起点,讨论如何在多个不同节点上实现分片。
MongoDB 分片拓扑结构
分片通过三个单独的组件实现。每个部分执行特定的功能:
-
配置服务器:每个生产分片实现必须包含确切的三个配置服务器。这是为了确保冗余和高可用性。
配置服务器用于存储将请求的数据与包含该数据的分片相关联的元数据。它组织数据,以便可以可靠和一致地检索信息。
-
查询路由器:查询路由器是您的应用程序实际连接的机器。这些机器负责与配置服务器通信,以确定请求的数据存储在何处。然后从适当的分片中访问和返回数据。
每个查询路由器运行“mongos”命令。
-
分片服务器:分片负责实际的数据存储操作。在生产环境中,一个单独的分片通常由一个副本集而不是单个机器组成。这是为了确保在主分片服务器下线时数据仍然可以访问。
实现副本集超出了本教程的范围,因此我们将配置我们的分片为单个机器而不是副本集。如果您希望为自己的配置配置副本集,可以轻松修改此设置。
初始设置
如果您在上面注意到,您可能已经注意到此配置需要相当多的机器。在本教程中,我们将配置一个示例分片集群,其中包含:
- 3 个配置服务器(生产环境中必需)
- 2 个查询路由器(至少需要 1 个)
- 4 个分片服务器(至少需要 2 个)
这意味着您需要九个 VPS 实例才能完全跟随。实际上,一些功能可以重叠(例如,您可以在用作配置服务器的同一 VPS 上运行查询路由器),并且您只需要一个查询路由器和至少 2 个分片服务器。
我们将超过此最小值,以演示每种类型的组件的多个组件。为了清晰和简单起见,我们还将把所有这些组件视为独立的机器。
设置初始基础镜像
要开始,使用此指南在 Ubuntu 上安装和配置初始 MongoDB 服务器。我们将使用此服务器来引导我们的其他分片组件。
完成第一个服务器的教程后,使用以下命令关闭实例:
sudo shutdown -h now
现在,我们将对此配置的 droplet 进行快照,并使用它来启动我们的其他 VPS 实例。虽然可能对运行中的系统进行快照,但关闭可以确保文件系统处于一致状态。快照费用为每月每 GB 0.05 美元,基于文件系统中使用的空间量,因此最好在完成后删除快照。
在您的 DigitalOcean 控制面板中,选择 droplet。单击“快照”选项卡。输入快照名称,然后单击“拍摄快照”:
!DigitalOcean take snapshot
将拍摄快照,并重新启动初始服务器。
基于快照启动 VPS 实例
现在我们通过快照过程保存了一个镜像,我们可以将其用作其他 MongoDB 组件的基础。
从控制面板中,单击“创建”按钮。输入描述 droplet 在分片配置中将具有的目的的名称:
!DigitalOcean name droplet
选择 droplet 大小和区域。最好为所有组件选择相同的区域。
在“选择镜像”部分,单击“我的镜像”选项卡,然后选择刚刚创建的 MongoDB 快照。
!DigitalOcean select image
添加所需的任何 SSH 密钥,并选择要使用的设置。单击“创建 Droplet”以启动新的 VPS 实例。
对每个分片组件重复此步骤。请记住,要完全按照本教程进行(不是必需的,但具有示范性),您需要 3 个配置服务器,2 个查询服务器和 4 个分片服务器。
为每个组件配置 DNS 子域条目(可选)
MongoDB 文档建议您通过可解析的 DNS 名称引用所有组件,而不是通过特定的 IP 地址。这很重要,因为它允许您更改服务器或重新部署某些组件,而无需重新启动与之关联的每个服务器。
为了方便起见,我建议您为希望使用的域名上的每个服务器都分配一个子域。您可以使用此指南学习如何使用 DigitalOcean 的控制面板设置 DNS 子域。
在本教程中,我们将把组件称为可以在以下子域访问:
-
配置服务器
- config0.example.com
- config1.example.com
- config2.example.com
-
查询路由器
- query0.example.com
- query1.example.com
-
分片服务器
- shard0.example.com
- shard1.example.com
- shard2.example.com
- shard3.example.com
如果您不设置子域,您仍然可以跟随操作,但您的配置将不会那么健壮。如果您选择这种方式,请简单地用您的 droplet IP 地址替换子域规范。
初始化配置服务器
首先必须设置的组件是配置服务器。在配置查询路由器或分片之前,这些服务器必须在线并运行。
以 root 用户登录到您的第一个配置服务器。
我们需要做的第一件事是创建一个数据目录,这是配置服务器将存储关联位置和内容的元数据的地方:
mkdir /mongo-metadata
现在,我们只需使用适当的参数启动配置服务器。提供配置服务器的服务称为 mongod
。此组件的默认端口号为 27019
。
我们可以使用以下命令启动配置服务器:
mongod --configsvr --dbpath /mongo-metadata --port 27019
服务器将开始输出信息,并开始监听来自其他组件的连接。
在其他两个配置服务器上重复此过程。端口号应在所有三个服务器上保持一致。
配置查询路由器实例
此时,您应该已经有了所有三个配置服务器正在运行并监听连接。在继续之前,它们必须是可操作的。
以 root 用户登录到您的第一个查询路由器。
我们需要做的第一件事是停止此实例上的 mongodb
进程(如果已经运行)。查询路由器使用与主 MongoDB 进程冲突的数据锁:
service mongodb stop
接下来,我们需要使用特定的配置字符串启动查询路由器服务。配置字符串必须对每个配置的查询路由器完全相同(包括参数的顺序)。它由每个配置服务器的地址和它正在运行的端口号组成,用逗号分隔。
查询路由器服务称为 mongos
。此进程的默认端口号为 27017
(但配置中的端口号指的是配置服务器的端口号,默认为 27019
)。
最终结果是查询路由器服务以以下形式启动:
mongos --configdb config0.example.com:27019,config1.example.com:27019,config2.example.com:27019
您的第一个查询路由器应开始连接到三个配置服务器。在其他查询路由器上重复这些步骤。请记住,在输入命令之前必须停止 mongodb
服务。
还要记住,必须使用完全相同的命令来启动每个查询路由器。否则将导致错误。
将分片添加到集群
现在我们已经配置了配置服务器和查询路由器,我们可以开始向集群添加实际的分片服务器。这些分片将分别保存总数据的一部分。
以 root 用户登录到您的一个分片服务器。
正如我们在开头提到的,在本指南中,我们将只使用单机分片,而不是副本集。这是为了简洁和演示的简单性。在生产环境中,强烈建议使用副本集,以确保数据的完整性和可用性。要在 MongoDB 中配置副本集,请参考此指南。
要实际将分片添加到集群,我们需要通过现在配置为与集群进行交互的查询路由器进行操作。我们可以通过连接到任何查询路由器来实现这一点,如下所示:
mongo --host query0.example.com --port 27017
这将连接到适当的查询路由器并打开一个 mongo 提示符。我们将从此提示符中添加所有分片服务器。
要添加第一个分片,请键入:
sh.addShard( "shard0.example.com:27017" )
然后在此界面中添加剩余的分片 droplet。您不需要单独登录到每个分片服务器。
sh.addShard( "shard1.example.com:27017" ) sh.addShard( "shard2.example.com:27017" ) sh.addShard( "shard3.example.com:27017" )
如果您正在配置生产集群,并配备有副本集,您必须指定副本集名称和副本集成员,以将每个集合设置为独立的分片。语法看起来会像这样:
sh.addShard( "rep_set_name/rep_set_member:27017" )
如何为数据库集合启用分片
MongoDB 将信息组织成数据库。在每个数据库内,数据通过“集合”进一步分隔。集合类似于传统关系数据库模型中的表。
在本节中,我们将再次使用查询路由器进行操作。如果您仍未连接到查询路由器,可以使用与上一节中相同的 mongo 命令再次访问它:
mongo --host <span class="highlight">config0.example.com</span> --port 27017
在数据库级别启用分片
我们将首先在数据库级别启用分片。为此,我们将创建一个名为(恰当地)test_db
的测试数据库。
要创建此数据库,我们只需要切换到它。当我们首次输入数据时,它将被标记为我们当前的数据库并动态创建:
use test_db
我们可以通过输入以下命令来检查我们当前使用的数据库是否刚刚创建的数据库:
db
test_db
我们可以通过输入以下命令来查看所有可用的数据库:
show dbs
您可能会注意到我们刚刚创建的数据库没有显示出来。这是因为它还没有数据,所以它还不够真实。
我们可以通过发出以下命令在此数据库上启用分片:
sh.enableSharding("test_db")
同样,如果我们输入 show dbs
命令,我们将看不到我们的新数据库。但是,如果我们切换到自动生成的 config
数据库并发出 find()
命令,我们的新数据库将被返回:
use config
db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test_db", "partitioned" : true, "primary" : "shard0003" }
当 MongoDB 向新数据库添加了一些数据后,您的数据库将显示在 show dbs
命令中。
在集合级别启用分片
现在,我们的数据库被标记为可用于分片,我们可以在特定集合上启用分片。
此时,我们需要决定分片策略。分片通过根据指定为文档中的“分片键”的特定字段将数据组织成不同的类别来工作。它将具有匹配的分片键的所有文档放在同一个分片上。
例如,如果您的数据库存储公司的员工,并且您的分片键基于最喜欢的颜色,MongoDB 将把所有最喜欢颜色字段中为 blue
的员工放在一个分片上。这可能会导致不均匀的存储,如果每个人都喜欢几种颜色。
更好的选择是选择一个保证更均匀分布的分片键。例如,在一个大公司中,生日(月和日)字段可能会相当均匀分布。
在您不确定事物将如何分布或没有合适的字段的情况下,您可以基于现有字段创建一个“散列”分片键。这就是我们将为我们的数据所做的。
我们可以创建一个名为 test_collection
的集合,并对其 “_id” 字段进行散列。确保我们正在使用我们的 test_db
数据库,然后发出以下命令:
use test_db
db.test_collection.ensureIndex( { _id : "hashed" } )
然后,我们可以通过发出以下命令对集合进行分片:
sh.shardCollection("test_db.test_collection", { "_id": "hashed" } )
这将在所有可用的分片之间对集合进行分片。
向集合插入测试数据
我们可以使用循环创建一些对象来查看我们的分片是否起作用。这个循环直接来自 MongoDB 网站用于生成测试数据。
我们可以使用以下简单的循环将数据插入集合中:
use test_db
for (var i = 1; i <= 500; i++) db.test_collection.insert( { x : i } )
这将创建 500 个简单的文档(只有一个 ID 字段和一个包含数字的 “x” 字段)并将它们分布在不同的分片之间。您可以通过输入以下命令来查看结果:
db.test_collection.find()
{ "_id" : ObjectId("529d082c488a806798cc30d3"), "x" : 6 }
{ "_id" : ObjectId("529d082c488a806798cc30d0"), "x" : 3 }
{ "_id" : ObjectId("529d082c488a806798cc30d2"), "x" : 5 }
{ "_id" : ObjectId("529d082c488a806798cc30ce"), "x" : 1 }
{ "_id" : ObjectId("529d082c488a806798cc30d6"), "x" : 9 }
{ "_id" : ObjectId("529d082c488a806798cc30d1"), "x" : 4 }
{ "_id" : ObjectId("529d082c488a806798cc30d8"), "x" : 11 }
. . .
要获取更多值,请输入:
it
{ "_id" : ObjectId("529d082c488a806798cc30cf"), "x" : 2 }
{ "_id" : ObjectId("529d082c488a806798cc30dd"), "x" : 16 }
{ "_id" : ObjectId("529d082c488a806798cc30d4"), "x" : 7 }
{ "_id" : ObjectId("529d082c488a806798cc30da"), "x" : 13 }
{ "_id" : ObjectId("529d082c488a806798cc30d5"), "x" : 8 }
{ "_id" : ObjectId("529d082c488a806798cc30de"), "x" : 17 }
{ "_id" : ObjectId("529d082c488a806798cc30db"), "x" : 14 }
{ "_id" : ObjectId("529d082c488a806798cc30e1"), "x" : 20 }
. . .
要获取有关特定分片的信息,您可以输入:
sh.status()
--- Sharding Status --- sharding version: {"_id" : 1,"version" : 3,"minCompatibleVersion" : 3,"currentVersion" : 4,"clusterId" : ObjectId("529cae0691365bef9308cd75")
}shards:{ "_id" : "shard0000", "host" : "162.243.243.156:27017" }{ "_id" : "shard0001", "host" : "162.243.243.155:27017" }
. . .
这将提供有关 MongoDB 在分片之间分布的块的信息。
结论
通过本指南的学习,您应该能够实现自己的 MongoDB 分片配置。服务器的具体配置和您为每个集合选择的分片键将对集群的性能产生重大影响。
选择具有最佳分布特性并且最能代表将在数据库查询中反映的逻辑分组的字段。如果 MongoDB 只需访问单个分片来检索数据,它将返回得更快。
相关文章:
如何在 Ubuntu 12.04 VPS 上使用 MongoDB 创建分片集群
简介 MongoDB 是一个 NoSQL 文档数据库系统,可以在水平方向上很好地扩展,并通过键值系统实现数据存储。作为 Web 应用程序和网站的热门选择,MongoDB 易于实现并可以通过编程方式访问。 MongoDB 通过一种称为“分片”的技术实现扩展。分片是将…...
阿里云VOD视频点播流程(1)
一、开通阿里云VOD 视频点播(ApsaraVideo VoD,简称VOD)是集视频采集、编辑、上传、媒体资源管理、自动化转码处理、视频审核分析、分发加速于一体的一站式音视频点播解决方案。登录阿里云,在产品找到视频点播VOD ,点击…...
Python爬虫获取豆瓣电影Top100
大家好,我是秋意零。 今天分析一篇,Python爬虫获取豆瓣电影Top100。 在此之前,我没有学习过爬虫,只有一丢丢的Python基础。下面效果的实现源码几乎没经过我,而是AI百老师。我主要负责了对应的调试以及根据我想要的功…...
动态规划专训8——背包问题
动态规划题目中,常出现背包的相关问题,这里单独挑出来训练 A.01背包 1.01背包模板题 【模板】01背包_牛客题霸_牛客网 (nowcoder.com) 你有一个背包,最多能容纳的体积是V。 现在有n个物品,第i个物品的体积为𝑣&am…...
软件杯 深度学习花卉识别 - python 机器视觉 opencv
文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &a…...
学习笔记:【QC】Android Q - IMS 模块
一、IMS init 流程图 高清的流程图参考:【高清图,保存后可以放大看】 二、IMS turnon 流程图 高清的流程图参考:【高清图,保存后可以放大看】 三、分析说明 1、nv702870 不创建ims apn pdp 2、nv702811 nv702811的时候才创建…...
NodeMCU ESP8266 操作 SSD1306 OLED显示屏详解(图文并茂)
文章目录 1 模块介绍2 接线介绍3 安装SSD1306驱动库4 源码分析4.1 硬件兼容性4.2 可能存在的问题总结1 模块介绍 我们将在本教程中使用的OLED显示屏是SSD1306型号:单色0.96英寸显示屏,像素为12864,如下图所示。 OLED显示屏不需要背光,这在黑暗环境中会产生非常好的对比度。…...
不抽象:Increase API 设计原则
原文:Increase - 2024.04.26 (注:Increase 是一家提供金融技术服务的公司。) API 资源是 API 的实体或对象。决定如何为这些实体命名和建模可以说是设计 API 最难也是最重要的部分。您所公开的资源组织了用户对您的产品如何工作…...
mybatis调用数据库存储过程
mybatis调用数据库存储过程及常见属性详解 调用mapper String visitCode mapper.getVisitCode(objectMap);Dao层,xml文件代码编写 <select id"getVisitCode" parameterType"map" resultType"string" statementType"CALLAB…...
【git】发生冲突后回滚提交
gerrit 冲突, 无法合并到主干 那么先回滚 参考这里的 reset 操作: 回滚 到上一个提交 $ git reset --soft HEAD~1 # 數字表示移動到 HEAD後面第幾個刚提交的会撤回, stash 刚刚提交的 然后去pull 最新的 修改冲突: 最后再…...
ISO14229 -1 UDS诊断服务记录-001:0x34\0x36\0x37\0x31\0x19\0x14服务报文格式介绍
目录 1、34服务-请求下载 1.1、诊断请求格式 1.2、正响应格式 1.3、负响应格式 1.4、工程应用分析 2、36服务-传输数据 2.1、请求报文格式 2.2、正响应格式 2.3、负响应NRC 3、37服务-退出传输 3.1、报文格式 3.2、正响应格式 3.3、负响应NRC 4、31服务-例程控制 …...
使用 MediaMTX 和 FFmpeg 推拉 RTSP 流媒体
实时流传输协议 RTSP(Real-Time Streaming Protocol)是 TCP/IP 协议体系中的一个应用层协议,由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP 在体系…...
Mac 电脑安装 Raptor 流程图软件的方法
0. 安装逻辑 (1)运行 raptor,本质上需要 mac 能够运行 windows 程序,因此需要安装 .NET Runtime 7.0,这是微软程序运行必须的文件。 (2)运行 raptor 还需要安装依赖文件 mono-libgdiplus。 &am…...
W801学习笔记二十:宋词学习应用
前三章完成了唐诗的应用,本章将实现宋词的学习应用。 宋词与唐诗的区别不大,马上开始。 1、我们需要参考前面唐诗的方式,把宋词文本下载下来,并进行格式整理。 W801学习笔记十七:古诗学习应用——上 2、在菜单中添加…...
EPAI手绘建模APP转换模型和坐标系
(11) 模型转换 图 273 转换工具栏 ① 实体转成曲面,先选择需要转成曲面的实体模型,再点击该按钮。将选择的实体模型转成多个曲面。 ② 曲线转成NURBS样条曲线,先选择需要转成NURBS样条曲线的边模型,修改转换参数,将选…...
STM32快速入门(串口传输之USART)
STM32快速入门(串口传输之USART) 前言 USART串口传输能实现信息在设备之间的点对点传输,支持单工、半双工、全全双工,一般是有三个引脚:TX、RX、SW_RX(共地)。不需要一根线来同步时钟。最大优…...
什么是网络安全和网络隐私?
什么是网络安全?这个是我最感兴趣的话题,网络安全说白了就是在网络上的安全,跟现实中一样,现实中为了家里的安全,我们会给家门上锁,会装监控,农村的话可能还会养一条狗,只有我们让别人进我们家,别人才能进来,对于计算机来说也是一样的,我们会设置账户的密码,会设置防火墙,会安…...
树莓派变小路由器放出热点wifi
环境 树莓派4Bubuntu20 作用 树莓派放出wifi后,笔记本电脑连接树莓派的wifi,并且ip配置在一个网段,就可以互相通信(笔记本放出wifi,树莓派连接效果一样),这样的好处是树莓派只要一上电就会自…...
数据猎手:使用Java和Apache HttpComponents库下载Facebook图像
引言 在信息驱动的时代,互联网上的数据成为了无可比拟的宝藏。本文旨在探讨如何通过利用Java和Apache HttpComponents库,从全球最大的社交网络平台Facebook上获取图像数据。 作为全球最大的社交网络平台,Facebook聚集了数以亿计的用户&#…...
uniapp——阻止冒泡
点击事件阻止冒泡 click.stop"onSubmit"其他类型,比如视频: 最后加了一个 click.stop <view class"videoBox" v-if"item.video_url"><video :src"i.image(item.video_url)" :controls"true&quo…...
Jmeter性能测试(四)
一、遇到问题解决思路 1、检查请求头是否正确 2、检查请求参数是否正确 3、检查鉴权信息是否正确 4、检查变量作用域 5、检查数据提取是否正确(正则/json提取器) 二、请求头检查 1、在Http信息头管理器查看 2、注意这里的变量作用域是全局的 三、请求参数检查 1、在查看结…...
从零开始精通RTSP之传输ADPCM等音频流
概述 在上一篇文章中,我们详细介绍了使用RTP传输AAC音频流的打包方法。除了AAC编码算法外,常用的音频编码算法还有ADPCM、G711A、G711U、G726等。接下来,我们继续介绍RTP传输ADPCM等音频流的打包方法。 封装方法 RTP封装ADPCM等音频数据时&am…...
box-decoration-break 使用介绍
box-decoration-break属性的使用 一、定义 box-decoration-break是CSS片段模块(CSS Fragmentation Module Level 3)中的一个属性,主要用于指定背景(background)、内边距(padding)、边框&#…...
技术分享 | 京东商品API接口|京东零售数据可视化平台产品实践与思考
导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分: 1.京东API接口介绍 2. 平台产品能力介绍 3. 业务赋能案例分享 01 京东API接口介绍 02 平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用数据分析和可视化技术&…...
OpenHarmony鸿蒙蓝牙BLE调试app
OpenHarmony蓝牙模块提供了ble的功能,本篇提供一个简单的app供测试时使用。代码使用API10,对应4.0Release版本固件。 1.开启BLE 开启BLE前,先在设置界面中打开蓝牙开关。 openBle()函数负责打开ble扫描,并打印扫描结果。主要代…...
HackMyVM-VivifyTech
目录 信息收集 arp nmap nikto whatweb WEB web信息收集 wpscan feroxbuster hydra 提权 系统信息收集 横向渗透 git提权 get root 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:9d:6d:7b, …...
将unity中相机位置保存为json 文件或者 发送给后端
将unity中相机位置保存保存到服务器 ///相机的位置public Transform cameraTransform;void Start(){// SaveCameraPosition("sd");// ("{\"name\":\"sd\",\"position\":\"(0.00, 5.00, -12.00)\",\"rotation\&qu…...
vue2-表单组件封装
创建组件 components/test/index.vue <template><el-form :model"formData">// <!-- 具名插槽 --><slot name"header" /><el-form-itemv-for"(item, index) in formItem":key"index":label"item.la…...
智能家居4 -- 添加接收消息的初步处理
这一模块的思路和前面的语言控制模块很相似,差别只是调用TCP 去控制 废话少说,放码过来 增添/修改代码 receive_interface.c #include <pthread.h> #include <mqueue.h> #include <string.h> #include <errno.h> #include <…...
Python selenium
1.搭建环境 1.安装: pip install msedge-selenium-tools 不要使用pip install selenium,我的电脑上没法运行 2.下载驱动 Microsoft Edge WebDriver |Microsoft Edge 开发人员 edge浏览器点设置---关于即可找到版本号,一定要下载对应版…...
国外色情网站app/谷歌关键词查询工具
更快的优化器 动量优化 梯度下降通过直接减去权重的成本函数J(θ)J(\theta)J(θ)的梯度乘以学习率(ΔθJ(θ)\Delta _{\theta}J(\theta)ΔθJ(θ))来更新权重 θ\thetaθ。它不关系较早的梯度是什么。动量优化:在每次迭代时,它…...
织梦的手机端网站模板下载地址/seo结算系统
到目前为止,我们前面已经介绍了如何开发程序、调试程序以及测试程序,正如人们常说的:开发最后的10%需要花费90%的时间,所以这一章我们将强调这最后的10%部分,要真正成为让人信任并使用的优秀应用,需要考虑到…...
要建设一个网站需要什么手续/2022社会热点事件及看法
注:本篇文章很多并没有给出具体答案,因为每一个问题点都可以摊开讲许多相关联内容,其实最终还是需要我们自已去理解和实践,只有理解了其中本质才不会去做一个重复工作的程序员。写代码的时候时候都需要多问自已为什么要这种方式&a…...
软件开发费用预算表/网址seo关键词
1\在koa2中增加对Mysql的支持,进入项目文件夹下: 在项目路径输入npm install mysql --save下载mysql 2 配置mysql连接池 项目根目录新建文件夹controllers并创建mysqlConfig.js文件。 //mysqlConfig.js var mysql require(mysql)const config {// 数据库配置database: {DA…...
只做正品的购物网站/品牌营销经典案例
安装nodejs环境这个直接搜索安装即可,安装完成之后,通过如下命令检测环境变量是否安装成功:λ node -v# 输出版本号v12.13.1正确输入版本号即可。安装cnpmcnpm是淘宝镜像,可以加快依赖的安装速度npm install cnpm -g --registryht…...
苏州网站建立公司/seo知识总结
博客主页:Passerby_Wang的博客_CSDN博客-系统运维,云计算,Git学习笔记领域博主 🌐所属专栏:『Linux基础』 📰如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀! 关注、点赞、收藏、评论。 目录…...