Mongodb学习及三种方式集群搭建文档


目 录




   (一):   Mongodb概述




   (二):   Mongodb特性




   (三):   安装Mongodb


 


   (四):   Mongodb的启动和停止




   (五):   Mongodb一般操作


  


   (六):   Mongodb备份及恢复




   (七):   Mongodb导出导入




   (八):   Mongodb部分参数说明




   (九):   Mongodb集群概述




   (十):   Replica Set(双机模式)




   (十一): Sharding(分片)


 


   (十二): Relica Set + Sharding(分片)




  




(一)   Mongodb 概述:


    MongoDB 可运行在 unix、Windows 和 OSX 平台上,支持 32 位和64 位应用,并且提供了 java、php、c、c++、c#、javaScript 多种语言的驱动程序。MongoDB 是一个开源的、面向文档存储的数据库,属于 Nosql 数据库的一种。


    文档是Mongodb的核心概念,多个键及其关联的值有序的放置在一起便是文档。多个文档一起就组成一个集合。多个集合组成一个数据库。多个数据库可以共存一个Mongodb实例下。


     关于Mongodb其他详解,请参考其官方文档:




(二)   MONGODB特性及使用范围:


     MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。


   它的特点是高性能、易部署、易使用,存储数据非常方便,主要特性有:


     1、 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。 


    2、缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。 


    3、大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。 


    4、高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。 


5、用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。 


6、模式自由,支持动态查询、完全索引,可轻易查询文档中内嵌的对象及数组。高效的数据存储,支持二进制数据及大型对象(如照片和视频)。


     7、支持复制和故障恢复; 提供了主-从、 主-主模式的数据复制及服务器之间的数据复制。自动分片以支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器。  


  


   MongoDB的使用也会有一些限制,它不适合:


     1、高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。 


     2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。


     3、需要SQL的问题及复杂的跨文档(表)级联查询





(三):   安装Mongodb


    MongoDB 是一个免安装的数据库,将它解压后生成一个 bin 目录,其中包含 11 个工具命令,除此之外不再需要任何其它的二进制依赖文件。通常情况下启动数据库只需要关注其中的两个命令:mongod 和mongo。前者是 MongoDB 数据库进程本身,是核心数据库服务器,后者是命令行 Shell 客户端,


MongoDB 的官网:http://www.mongodb.org 


MongoDB 的下载地址:http://www.mongodb.org/downloads 


  1, 创建mongodb 用户,及相关目录和授权.


   这里为了方便管理,系统创建一个Mongodb用户,并对/data 目录下拥有操作775权限。



# useradd -g mongodb          --创建mongodb用户 

  #password mongodb            --设置密码 

  #mkdir -pv /data/db             --数据存储目录 

  #mkdir -pv /mongodb           --mongodb解压目录 

  #mkdir -pv /data/log 
  --创建日志目录  

  #mkdir -pv /data/config 
 --创建配置目录 



  #mkdir -pv /data/arbiter          --创建仲裁节点存储目录 

  #tar -xvf  mongodb-linux-x86_64-2.4.10.tgz  -C /mongodb 

  #chmod -R 775 /data   /mongodb


(四):   Mongodb的启动和停止


1、 单机Mongodb启动


  # su - mongodb


切入bin目录下:


  $ ./mongod


  $ ./mongo


 通过 $netstat -ntlp |grep mongod  查看是否启动监听



[root@dominic5 bin]$ ./mongo


MongoDB shell version: 2.4.10


connecting to: test


> show dbs


local

0.078125GB


test

0.203125GB


2、停止mongodb 


直接使用Control+C来中断


在connect连接状态下,可以切换到admin数据,后直接在库中发送db.shutdownServer()指令终止MongoDB实例。


Unix下发送Kill -2 PID 或者 Kill -15 PID来终止进程 ,通过ps -ef |grep mongodb




(五):   Mongodb一般操作


1、Help查看命令提示


 help


  db.help();


  db.yourColl.help();


  db.youColl.find().help();


  rs.help();


2、切换/创建数据库


 use yourDB;  当创建一个集合(table)的时候会自动创建当前数据库


3、查询所有数据库


 show dbs;


4、删除当前使用数据库


 db.dropDatabase();


5、从指定主机上克隆数据库


 db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库


6、从指定的机器上复制指定数据库数据到某个数据库


 db.copyDatabase("mydb", "temp", "127.0.0.1");将本机的mydb的数据复制到temp数据库中


7、修复当前数据库


 db.repairDatabase();


8、查看当前使用的数据库


 db.getName();


 db; db和getName方法是一样的效果,都可以查询当前使用的数据库


9、显示当前db状态


 db.stats();


10、当前db版本


 db.version();


11、查看当前db的链接机器地址


 db.getMongo();


12、查询指定列name、age数据, age > 25


db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});


13、按照年龄排序


升序:db.userInfo.find().sort({age: 1});


降序:db.userInfo.find().sort({age: -1});


14、查询name = zhangsan, age = 22的数据


db.userInfo.find({name: 'zhangsan', age: 22});


15、查询前5条数据


db.userInfo.find().limit(5);


16、查询10条以后的数据


db.userInfo.find().skip(10); 


17、查询在5-10之间的数据


db.userInfo.find().limit(10).skip(5);


可用于分页,limit是pageSize,skip是第几页*pageSize


18、or与 查询


db.userInfo.find({$or: [{age: 22}, {age: 25}]});


19、查询第一条数据


db.userInfo.findOne();


20、查询某个结果集的记录条数


db.userInfo.find({age: {$gte: 25}}).count();


21、按照某列进行排序


db.userInfo.find({sex: {$exists: true}}).count();




 (六):   Mongodb备份及恢复




备份:


#./mongodump --help


#./mongodump -d test -c test_collection_2 -o /opt/mongodb_backup/ //备份test 库中的 test_collection_2




恢复:


#./mongorestore --help 

 #./mongorestore -d test -c test_collection_2 --drop /opt/mongodb_backup/test/test_collection_2.bson  

 //恢复test_collection_2





(七):   Mongodb导出导入




导出:



#./mongoexport --help 

 #./mongoimport -d test -c test_collection_2 -o /opt/mongodb_backup/test/test_collection_2.json //导出


导入:


#./mongoimport --help 

 #./mongoimport -d test -c test_collection_2 --drop --file /opt/mongodb_backup/test/test_collection_2.json //导入





(八):   Mongodb部分参数说明




–quiet                   #安静输出


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


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


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


–logpath              #日志文件路径,注意是指定文件不是目录


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


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


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


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


–dbpath                         #指定数据库路径


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


–journal                           #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里(恢复使用,类似归档)


–journalOptions             #启用日志诊断选项


–ipv6                               #启用IPv6选项


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


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


–noauth                           # 不启用验证


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


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


–noscripting                   # 禁用脚本引擎


–notablescan                 # 不允许表扫描


–nounixsocket                # 禁用Unix套接字监听


–nssize arg (=16)           # 设置信数据库.ns文件大小(MB)     --括号内为默认


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


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


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


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


–rest                               # 开启简单的rest API


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


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


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


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


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


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


–upgrade                        # 如果需要升级数据库





(九):   Mongodb集群概述


     MongoDB集群包括一定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。


     其常见为3种集群方式的搭建:Replica Set / Sharding / Master-Slaver


Replica Set: 


其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。如下图:


 


其中,M节点为主,S节点为备, A为仲裁节点,主备节点存储数据,类似mysql 或者oracle 主-备模式,备节点可以提供业务的读操作。


  仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后主动提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。




Sharding: 


和Replica Set类似,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。就三种集群搭建方式来说,这种最复杂,如图:


 




Master-Slaver:


    类似同步复制,只有主服务器允许写入,其它从服务器只能读取,从服务器启动的时候马上就会和主服务器进行数据同步,所以不要担心后起的从服务器不会和主服务器同步之前的数据,也不要我们自己手动操作(官方不推荐此种模式)。


./mongod --master --dbpath /data/masterdb/      #主节点  


./mongod --slave --source <masterip:masterport> --dbpath /data/slavedb/     备节点 


    以上三种集群搭建方式首选Replica Set,只有真的是大数据,Sharding才能显现威力,毕竟备节点同步数据是需要时间的。Sharding可以将多片数据集中到路由节点上进行一些对比,然后将数据返回给客户端,但是效率还是比较低的说    






(十):   Replica Set(双机模式)  待续。。。




(十一): Sharding(分片)  待续。。。




 


(十二): Relica Set + Sharding(分片) 待续。。。