MongoDB【第一篇】MongodDB初识
本文内容纲要:
-NoSQL介绍
-初识MongoDB
-MongoDB部署与维护入门
NoSQL介绍
一、NoSQL简介
NoSQL,全称是”NotOnlySql”,指的是非关系型的数据库。
非关系型数据库主要有这些特点:非关系型的、分布式的、开源的、水平可扩展的。
原始的目的是为了大规模web应用,这场全新的数据库革命运动早期就有人提出,发展至2009年趋势越发高涨。
NoSQL的拥护者们提倡运用非关系型的数据存储,通常的应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。
NoSQL被我们用得最多的当数key-value存储(如Redis),当然还有其他的文档型的、列存储、图型数据库、xml数据库等。
二、引入一个问题为什么会有NoSQL
通用关系数据库功能强大,遵循SQL标准,而且性能卓越而且稳定为什么会出现NoSQL呢?
上面也说过了NoSQL的初识是随着WEB应用的飞速发展中出现的,在期间遇到了一些关系型数据库难以克服的问题,例如:
1、Highperformance-对数据库高并发读写的需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。
关系型数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了,其实对于普通的BBS网站,往往也存在对高并发写请求的需求。
2、HugeStorage-对海量数据的高效率存储和访问的需求
对于大型的SNS网站,每天用户产生海量的用户动态信息,以国外的Friendfeed为例,一个月就达到了2.5亿条用户动态,
对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。
再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
3、HighScalability&&HighAvailability-对数据库的高可扩展性和高可用性的需求
随着数据库的不断增加,你的数据库没有办法向webserver或app那样简单的通过增加硬件来提升性能和负载能力。
并且mysql没有提供水平拆分的和扩容的方案,这是非常头疼的一件事情。
对于上面的三高要求来说很多关系型数据库就遇到了难以克服的问题,并且在WEB2.0的网站和应用来说关系型数据库很多主要特性却无用武之地!!!
1、数据库事务一致性需求
很多web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。
2、数据库的写实时性和读实时性需求
对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多web应用来说,并不要求这么高的实时性。
3、对复杂的SQL查询,特是多表关联查询的需求
任何大数据量的web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL查询,特是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。
往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
因此,关系数据库在这些越来越多的应用场景下显得不那么合适了
为了解决如上问题NoSQL就诞生了~
三、NoSQL特点
1、它可以处理超大量的数据
2、它运行在便宜的服务器集群上集群扩充起来非常方便并且成本很低。
3、它击碎了性能瓶颈
NoSQL的支持者称,通过NoSQL架构可以省去将Web或Java应用和数据转换成SQL格式的时间,执行速度变得更快。
“SQL并非适用于所有的程序代码”,对于那些繁重的重复操作的数据,SQL值得花钱。但是当数据库结构非常简单时,SQL可能没有太大用处。
4、它没有过多的操作
虽然NoSQL的支持者也承认关系型数据库提供了无可比拟的功能集合,而且在数据完整性上也发挥绝对稳定,他们同时也表示,企业的具体需求可能没有那么复杂。
5、它的支持者源于社区
因为NoSQL项目都是开源的,因此它们缺乏供应商提供的正式支持。这一点它们与大多数开源项目一样,不得不从社区中寻求支持。
NoSQL发展至今,出现了好几种非关系性数据库,比如我正在学习的MongoDB
初识MongoDB
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。
MongoDB最大的特点:它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
1、面向集合(Collenction-Orented)
意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。
2、模式自由(schema-free)
意味着对于存储在MongoDB数据库中的文件,我们不需要知道它的任何结构定义。提了这么多次"无模式"或"模式自由",它到是个什么概念呢?例如,下面两个记录可以存在于同一个集合里面:
{"welcome":"Beijing"}
{"age":28}
3、文档型意思是我们存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,
包括数组和文档.我们把这个数据格式称作“BSON”即“BinarySerializeddOcumentNotation.”
二、MongoDB特点
- 面向集合存储,易于存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包内部对象
- 支持查询
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl更多请看社区
- 文件存储格式为BSON(一种JSON的扩展)
- 可通过网络访问
三、MongoDB功能
- 面向集合的存储:适合存储对象及JSON形式的数据
- 动态查询:MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
- 完整的索引支持:包括文档内嵌对象及数组。MongoDB的查询优化器会分析查询表达式,并生成一个高效的查询计划
- 查询监视:MongoDB包一系列监视工具用于分析数据库操作的性能
- 复制及自动故障转移:MongoDB数据库支持服务器之间的数据复制,支持主-从模式及
- 服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移
- 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
- 自动分片以支持云级的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
四、适用场景
- 网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
- 缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载
- 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储
- 高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库。MongoDB的路线图中已经包对MapReduce引擎的内置支持
- 用于对象及JSON数据的存储:MongoDB的BSON数据格式非常适合文档化格式的存储及查询
MongoDB部署与维护入门
一、安装MongoDB
MongoDB维护者还事相当的人性化的给我们提供了YUM源安装就相当的方便了,当然也可以通过源码去安装!
1、创建一个/etc/yum.repos.d/mongodb-enterprise.repo配置文件
内容如下
3.2版本
[mongodb-enterprise]
name=MongoDBEnterpriseRepository
baseurl=https://repo.mongodb.com/yum/redhat/$releasever/mongodb-enterprise/stable/$basearch/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
2.6版本
[mongodb-org-2.6]
name=MongoDB2.6Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
2、执行安装命令
yuminstall-ymongodb-enterprise
如果你想安装特殊的指定版本可以按照如下命令操作
yuminstall-ymongodb-enterprise-3.2.1mongodb-enterprise-server-3.2.1mongodb-enterprise-shell-3.2.1mongodb-enterprise-mongos-3.2.1mongodb-enterprise-tools-3.2.1
3、卸载MongoDB
停止服务
sudoservicemongodstop
删除包
sudoyumerase$(rpm-qa|grepmongodb-enterprise)
删除库文件
sudorm-r/var/log/mongodb
sudorm-r/var/lib/mongo
二、源码安装MongoDB
通过MongoDB官网就可以打开下载地址:https://www.mongodb.com/download-center?jmp=nav&_ga=1.114046535.1911966133.1464573239#community从里面获取到下载地址之后直接在服务器上下载即可!
1、下载源码
wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.6.tgz
2、解压
tar-zxvfmongodb-linux-x86_64-rhel62-3.2.6.tgz
解压后的目录:
GNU-AGPL-3.0#GNU协议文件
MPL-2#MPL协议文件
README#README软件提供类似于软件须知
THIRD-PARTY-NOTICES#第三方的提文件
bin#主程序目录
上面的几个文件,没有具体的实际作用我们可以删除掉!但是README还是建议保留下的
并且为了方便管理我把的目录名更改为:
mvmongodb-linux-x86_64-rhel62-3.2.6mongodb
3、启动Mongodb
进入到bin目录下,执行./mongod看看提示
2016-05-30T10:36:33.520+0800ISTORAGE[initandlisten]exceptionininitAndListen:29Datadirectory/data/dbnotfound.,terminating
所以在MongoDB在启动的时候默认指定的数据库目录是/data/db我们可以通过--dbpath=目录名称来指定数据库默认存储的路径
我们来创建别名和目录指定并启动它
./mongod--dbpath=/work/app/mongodb/data/
现在启动的时候是在前台启动的,如果当前终端退出后那么程序就会退出,怎么让他在后台启动呢?--fork--logpath=日志文件和路径,在使用fork参数的时候必须指定日志文件路径
./mongod--dbpath=/work/app/mongodb/data/--fork
BadValue:--forkhastobeusedwith--logpathor--syslog
try'./mongod--help'formoreinformation
所以后台启动为
./mongod--dbpath=/work/app/mongodb/data/--fork--logpath=/work/app/mongodb/data/mongodb1.log
abouttoforkchildprocess,waitinguntilserverisreadyforconnections.
forkedprocess:16975
childprocessstartedsuccessfully,parentexiting
关闭程序,在关闭的时候必须执行dbpath
./mongod--dbpath=/work/app/mongodb/data/--shutdown
4、改为配置文件启动方式
现在我们可以在后台启动了,但是有个问题,我们以后再配置管理的时候,难道每次都要去手动去设置这些参数呢?如果参数错误了造成的问题呢?
4.1、单实例如何通过配置文件启动
首先创建一个目录config目录名称随意,然后在目录里创建一个配置文件
vimmongodb1.cnf
然后在配置文件里写入参数,把咱们平时写的参数写到配置文件中
参考命令行下的命令:
./mongod--dbpath=/work/app/mongodb/data/--fork--logpath=/work/app/mongodb/data/mongodb1.log
配置文件内容如下:
vimmongodb1.cnf
#ifhaveaparametermustbewritelike:key=value
dbpath=/work/app/mongodb/data/
#ifnotparamenterandyouwantenablemustbewritelike:fork=true
fork=true
port=27017
logpath=/work/app/mongodb/data/mongodb1.log
启动命令:
./bin/mongod-fconfig/mongodb1.cnf
abouttoforkchildprocess,waitinguntilserverisreadyforconnections.
forkedprocess:17220
childprocessstartedsuccessfully,parentexiting
关闭命令:因为配置文件中已经有数据库的路径了,所以直接通过--shutdown就可以了
./bin/mongod-fconfig/mongodb1.cnf--shutdown
2016-05-30T12:10:12.295+0800ICONTROL[main]logfile"/work/app/mongodb/data/mongodb1.log"exists;movedto"/work/app/mongodb/data/mongodb1.log.2016-05-30T04-10-12".
killingprocesswithpid:17220
5、在服务器上通过配置文件启动多实例
首先创建第二个实例的数据库存储目录
mkdir/work/app/mongodb/data2
再添加配置文件
cd/work/app/mongodb/config
vimmongodb2.cnf
#ifhaveaparametermustbewritelike:key=value
dbpath=/work/app/mongodb/data2/
#ifnotparamenterandyouwantenablemustbewritelike:fork=true
fork=true
port=27018
logpath=/work/app/mongodb/data/mongodb2.log
启动实例
#第一个实例
bin/mongod-fconfig/mongodb1.cnf
#第二个实例
bin/mongod-fconfig/mongodb2.cnf
'''
以后如果还有其他实例按照上面的操作即可
'''
查看结果:
ps-ef|grep-imong
root177371315:22?00:00:00bin/mongod-fconfig/mongodb1.cnf
root177581215:22?00:00:00bin/mongod-fconfig/mongodb2.cnf
6、编写一个将MongoDBServer写成脚本来进行、启动、停止
#!/bin/bash
#---------------------------------------------------------------------
#Writtenby:luotianshuai
#Program:mongodb_server.shwillhelptocontrl:startstoprestartmongodb
#CreationDate:2016/5/30
#LastModified:2016/5/30
#---------------------------------------------------------------------
instance=$1
action=$2
case"$action"in
start)
/work/app/mongodb/bin/mongod-f/work/app/mongodb/config/"$instance".cnf
;;
'stop')
/work/app/mongodb/bin/mongod-f/work/app/mongodb/config/"$instance".cnf--shutdown
;;
'restart')
/work/app/mongodb/bin/mongod-f/work/app/mongodb/config/"$instance".cnf--shutdown
/work/app/mongodb/bin/mongod-f/work/app/mongodb/config/"$instance".cnf
;;
*)
echo-e"\033[31;40myoumustinputlike:./mongodb_server.shmongodbnameforexample:./mongodb_server.shmongodb1\033[0m"
;;
esac
下一篇:MongoDB【第二篇】MongoDB逻辑与物理存储结构
本文内容总结:NoSQL介绍,初识MongoDB,MongoDB部署与维护入门,
原文链接:https://www.cnblogs.com/luotianshuai/p/5523171.html