MongoDB与MySQL:如何选择

MongoDB与MySQL:如何选择,第1张

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序?

在1990年代的互联网泡沫时期,用于Web应用程序的一种通用软件堆栈是LAMP,它最初代表Linux(OS),Apache(Web服务器),MySQL(关系数据库)和PHP(服务器编程语言)。MySQL是首选的数据库,主要是因为它是免费的开源代码,并且具有良好的读取性能,非常适合从数据库动态生成网站的“ Web 2.0”应用程序。

之后,代表MongoDB(文档数据库),Express(Web服务器),AngularJS(前端框架)和Node.js(后端JavaScript运行时)的MEAN堆栈开始流行。除其他原因外,MEAN堆栈很有吸引力,因为您需要了解的唯一语言是JavaScript。与等效的LAMP堆栈相比,它还需要更少的RAM。

MySQL AB的Monty Widenius和David Axmark最初于1994年开始开发MySQL。产品名称中的“ My”是指Widenius的女儿,而不是英语单词“ my”。MySQL旨在与mSQL(又名Mini)兼容。 SQL),并添加了SQL查询层和开放源代码许可(实际上是专有和GPL双重许可)。MySQL的公共发行版于1996年底开始,并且每年或每两年持续发行一次。MySQL是当前最受欢迎的关系数据库。

Sun Microsystems于2008年以10亿美元的价格收购了MySQL AB,Oracle于2010年收购了Sun。在Oracle收购MySQL的广泛关注中,Widenius在收购Oracle之前就将MySQL 5.5合并到了MariaDB中。MariaDB努力维护与Oracle MySQL版本的兼容性。

与功能更强大的商业关系数据库(例如Oracle数据库,IBM DB / 2和Microsoft SQL Server)相比,MySQL最初是一个相当低端的关系数据库,尽管它足以成为动态网站的后备存储。多年来,它增加了您希望从关系数据库获得的大多数功能,包括事务,参照完整性约束,存储过程,游标,全文索引和搜索,地理索引和搜索以及群集。

尽管MySQL现在支持“大数据库”功能,例如主从部署,与Memcached一起使用以及水平分片,但它仍通常用于中小型部署。将MySQL扩展到多个从属服务器可以提高读取性能,但是只有主服务器才能接受写请求。

AWS提供了两种形式的MySQL即服务,即Amazon RDS和Amazon Aurora。后者具有更高的性能,可以处理TB级的数据,更新副本的延迟时间更短,并且可以直接与Oracle数据库和SQL Server竞争。

MongoDB是高度可伸缩的 *** 作文档数据库,可在开源版本和商业企业版本中使用,它可以在本地运行或作为托管云服务运行。托管云服务称为MongoDB Atlas。

MongoDB无疑是NoSQL数据库中最受欢迎的数据库。它的文档数据模型为开发人员提供了极大的灵活性,而其分布式体系结构则提供了很好的可伸缩性。因此,通常选择MongoDB用于必须管理大量数据,得益于水平可伸缩性并处理不适合关系模型的数据结构的应用程序。

MongoDB是一个基于文档的存储,在其之上还具有一个基于图形的存储。MongoDB实际上并不存储JSON:它存储BSON(二进制JSON),该扩展了JSON表示(字符串)以包括其他类型,例如int,long,date,浮点,decimal128和地理空间坐标。

MongoDB可以使用数据的类型生成正确的索引类型,从而在数据的单个副本上生成多模式图形,地理空间,B树和全文本索引。MongoDB使您可以在任何文档字段上创建索引。MongoDB 4具有多文档事务,这意味着即使必须标准化数据设计,您仍然可以获得ACID属性。

默认情况下,MongoDB使用动态模式,有时称为无模式。单个集合中的文档不需要具有相同的字段集,并且字段的数据类型可以在集合中的不同文档之间有所不同。您可以随时使用动态模式更改文档结构。

但是,可以使用架构治理。从MongoDB 3.6开始,MongoDB支持JSON模式验证,您可以在验证器表达式中将其打开。

在LAMP和MEAN堆栈上存在很多变化。例如,您可以在Windows(WAMP)或MacOS(MAMP)上运行而不是Linux OS。您可以运行IIS(WIMP),而不是Windows上的Apache Web服务器。

您可以运行PostgreSQL或SQL Server,而不是LAMP堆栈中的MySQL关系数据库。如果您需要全球分布,则可以运行CockroachDB或Google Cloud Spanner。可以使用Perl或Python代替PHP语言。如果要使用Java或C#进行编码,则需要考虑单独的堆栈系列。

您可以运行Couchbase或Azure Cosmos DB以获得更好的全局分布,而不是MEAN堆栈中的MongoDB文档数据库。可以使用十二个Node.js Web服务器框架中的任何一个来代替Express 。除了AngularJS前端框架,您还可以运行Angular 2或React。

选择数据库时要问的最重要的问题是:

这些问题中的几个会趋于缩小数据库的选择范围,但是与制定LAMP堆栈时相比,我们有更多选择。如果您要构建一个应用程序,并且该应用程序必须在99.999%的时间内对全世界的用户都具有高度的一致性,那么只有少数几个数据库适合您。如果您的应用程序将在工作日的上午9点至下午6点在一个国家/地区使用,并且可以容忍最终的一致性,那么几乎所有数据库都可以使用,尽管某些数据库对于开发人员和 *** 作员而言更容易,而某些数据库则可以为您的主要使用场景提供更好的性能。

虽然LAMP和MEAN堆栈一次是Web应用程序的良好解决方案,但现在都不是最佳选择。而不是盲目采用任何一种,您应该仔细考虑用例,并找到一种可在可预见的将来为您的应用程序服务的体系结构。

您什么时候需要关系数据库(例如MySQL)用于新应用程序?除了对标准SQL的明显支持外,关系数据库本身将数据强制为具有一致的强类型字段的表格模式,并且只要您利用规范化就可以帮助您避免数据重复。

另一方面,如果您还需要偶尔的自由格式文档,则MySQL和许多其他关系数据库也支持RFC 7159定义的JSON数据。如果您还想使用XML文档和XPath或XSLT,则大多数关系数据库都可以提供这种能力。

您何时需要像MongoDB这样的文档数据库?如果您的主要用例需要允许使用自由格式的数据,在文档之间更改类型的字段,随时间变化的架构或嵌套的文档,则NoSQL数据库将满足要求。另外,如果您的应用程序是用JavaScript编写的,那么文档数据库的JSON格式将很自然。

作者: Martin Heller是InfoWorld的特约编辑和审稿人。他曾担任Web和Windows编程顾问,从1986年至2010年开发数据库,​​软件和网站。最近,他担任Alpha Software技术和教育副总裁以及Tubifi董事长兼首席执行官。

解压缩即可执行

tar zxvf mongodb-linux-x86_64-2.0.2.tgz

cd /usr/mongodb-linux-x86_64-2.0.2/bin

但是在运行前,需要创建mongodb需要的存放数据和日志的目录:

sudo mkdir -p /data/db/journal

sudo chmod -R 777 /data/db/

启动mongodb server

./mongod -journal -maxConns=2400 -rest

-journal 代表要写日志,-maxConns=2400代表mongodb 可以接受2400个tcp连接,-rest代表可以允许客户端通过rest API访问mongdb server.

还可以使用参数—quiet启动可以指定安静模式减少记录的项目数,注意使用该参数必须要同时指定日志路径,比如:

—quiet —logpath /data/db/journal/mongdb.log

修改系统允许的最大连接数

上面的最大连接数目的限制原因是Linux系统默认一个进程最大文件打开数目为1024,用ulimit -a 命令检查,可以看到下面这行:

open files (-n) 1024

修改/etc/security/limits.conf 配置文件。

使用命令:sudo gedit /etc/security/limits.conf

在文件中增加

* soft nofile 3000

* hard nofile 20000

root soft nofile 3000

root hard nofile 20000

* 表示该配置对所有用户均有效,root用户要特别加两行。

硬限制通常是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量,软限制是在这个基础上进一步的限制。因此软限制数目要低于硬限制。

nofile表示 max number of open files

重新启动计算机,然后再用ulimit -a 命令查看:

open files (-n) 3000

已经生效了。现在再启动mongodb server,问题解决

设置开机启动

在/etc/init.d/目录下新建脚本文件mongodb

#!/bin/sh

### BEGIN INIT INFO

# Provides: mongodb

# Required-Start:

# Required-Stop:

# Default-Start:2 3 4 5

# Default-Stop: 0 1 6

# Short-Description: mongodb

# Description: mongo db server

### END INIT INFO

. /lib/lsb/init-functions

PROGRAM=/usr/mongodb-linux-x86_64-2.0.2/bin/mongod

MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in

start)

ulimit -n 3000

log_begin_msg "Starting MongoDB server"

$PROGRAM --fork --quiet -journal -maxConns=2400 -rest --logpath /data/db/journal/mongdb.log

log_end_msg 0

stop)

log_begin_msg "Stopping MongoDB server"

if [ ! -z "$MONGOPID" ]then

kill -15 $MONGOPID

fi

log_end_msg 0

status)

*)

log_success_msg "Usage: /etc/init.d/mongodb {start|stop|status}"

exit 1

esac

exit 0

请注意,用sudo chmod +x /etc/init.d/mongodb 命令允许该脚本可被执行

接着运行下面的命令注册开机脚本:

update-rc.d mongodb defaults

Adding system startup for /etc/init.d/mongodb ...

/etc/rc0.d/K20mongodb ->../init.d/mongodb

/etc/rc1.d/K20mongodb ->../init.d/mongodb

/etc/rc6.d/K20mongodb ->../init.d/mongodb

/etc/rc2.d/S20mongodb ->../init.d/mongodb

/etc/rc3.d/S20mongodb ->../init.d/mongodb

/etc/rc4.d/S20mongodb ->../init.d/mongodb

/etc/rc5.d/S20mongodb ->../init.d/mongodb

你也可以通过update-rc.d -f mongodb remove 删除

重新启动,通过ps -def | grep mongod 可以查看到自启动的服务进程,然后可以通过下面的命令关闭/启动服务

sudo service mongodb stop

sudo service mongodb start

客户端登录服务器

启动日志如上,服务端启动如上,现在我们在另外一个终端测试服务器是否正常。

进入/usr/local/mongodb-linux-x86_64-2.0.2/bin,执行./mongo

出现

MongoDB shell version: 2.0.2

connecting to: test

执行

db.foo.save({1 : “Hello world”})

然后查找

db.foo.find()

看到

{ "_id" : ObjectId("4e4b395986738efa2d0718b9"), "1" : "hello world" }

执行到这里恭喜你,成功安装好了mongodb

也可以通过下面这种方式连接远程的mongodb server,默认端口为27017,比如

./mongo 192.168.30.25

创建数据库

如果没有mydb数据库的话,在客户端中使用命令:

use mydb

将创建mydb数据库,而且当前数据库切换为mydb.

此时show dbs不显示该数据库名称。使用db.stats()命令检查当前数据库状态。

标准检查流程

1.首先检查 ulimit -a

查看open files (-n) 是否为设置的值

2.

ps -def | grep mongod

查看该服务是否启动

3.

cd /data/db/journal/

cat mongdb.log

查看服务器是否正确

4.进入http://192.168.1.199:28017

看服务器是否启动正常

5.进入/usr/mongodb-linux-x86_64-2.0.2/bin,执行./mongo

看看是否能够登录

安装PHP MongoDB扩展

sudo apt-get install php5-dev php5-cli php-pear

sudo pecl install mongo

在php.ini中加入

extension=mongo.so

Mongodb启动命令mongod参数说明

mongod的主要参数有:

--quiet # 安静输出

--port arg # 指定服务端口号,默认端口27017

--bind_ip arg # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP

--logpath arg # 指定MongoDB日志文件,注意是指定文件不是目录

--logappend # 使用追加的方式写日志

--pidfilepath arg # PID File 的完整路径,如果没有设置,则没有PID文件

--keyFile arg # 集群的私钥的完整路径,只对于Replica Set 架构有效

--unixSocketPrefix arg # UNIX域套接字替代目录,(默认为 /tmp)

--fork # 以守护进程的方式运行MongoDB,创建服务器进程

--auth # 启用验证

--cpu # 定期显示CPU的CPU利用率和iowait

--dbpath arg # 指定数据库路径

--diaglog arg # diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads

--directoryperdb # 设置每个数据库将被保存在一个单独的目录

--journal # 启用日志选项,MongoDB的数据 *** 作将会写入到journal文件夹的文件里

--journalOptions arg # 启用日志诊断选项

--ipv6 # 启用IPv6选项

--jsonp # 允许JSONP形式通过HTTP访问(有安全影响)

--maxConns arg # 最大同时连接数 默认2000

--noauth # 不启用验证

--nohttpinterface # 关闭http接口,默认关闭27018端口访问

--noprealloc # 禁用数据文件预分配(往往影响性能)

--noscripting # 禁用脚本引擎

--notablescan # 不允许表扫描

--nounixsocket # 禁用Unix套接字监听

--nssize arg (=16) # 设置信数据库.ns文件大小(MB)

--objcheck # 在收到客户数据,检查的有效性,

--profile arg # 档案参数 0=off 1=slow, 2=all

--quota # 限制每个数据库的文件数,设置默认为8

--quotaFiles arg # number of files allower per db, requires --quota

--rest # 开启简单的rest API

--repair # 修复所有数据库run repair on all dbs

--repairpath arg # 修复库生成的文件的目录,默认为目录名称dbpath

--slowms arg (=100) # value of slow for profile and console log

--smallfiles # 使用较小的默认文件

--syncdelay arg (=60) # 数据写入磁盘的时间秒数(0=never,不推荐)

--sysinfo # 打印一些诊断系统信息

--upgrade # 如果需要升级数据库 * Replicaton 参数

--fastsync # 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步

--autoresync # 如果从库与主库同步数据差得多,自动重新同步,

--oplogSize arg # 设置oplog的大小(MB) * 主/从参数

--master # 主库模式

--slave # 从库模式

--source arg # 从库 端口号

--only arg # 指定单一的数据库复制

--slavedelay arg # 设置从库同步主库的延迟时间 * Replica set(副本集)选项:

--replSet arg # 设置副本集名称 * Sharding(分片)选项

--configsvr # 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb

--shardsvr # 声明这是一个集群的分片,默认端口27018

--noMoveParanoia # 关闭偏执为moveChunk数据保存

# 上述参数都可以写入 mongod.conf 配置文档里例如:

dbpath = /data/mongodb

logpath = /data/mongodb/mongodb.log

logappend = true

port = 27017

fork = true

auth = true

e.g:

代码如下:

./mongod -shardsvr -replSet shard1 -port 16161 -dbpath /data/mongodb/data/shard1a -oplogSize 100 -logpath /data/mongodb/logs/shard1a.log -logappend -fork -rest

这不是mongodb无法启动,是你还没有启动mongodb就来连接使用它了,肯定是不成功的。

先去mongodb的bin目录下运行mongod --dbpath XXXX/data 来启动mongodb,然后再来连接mongodb。

简介:

Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。

应用:

MongoDB服务端可运行在Linux、Windows或mac os x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9880821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存