您的当前位置:首页正文

MongoDB复制二:复制集的管理

2023-11-09 来源:好兔宠物网
.shutdownServer()在新的端口中启动实例
  1. mongod --port 37017 --dbpath /usr/local/mongodb-linux-x86_64-3.2.0/data
2)备份原来的oplog
  1. [root@node1 mongodb-linux-x86_64-3.2.0]# mongodump --db local --collection ‘oplog.rs‘ --port 37017 2015-12-27T02:27:40.577+0800 writing local.oplog.rs to dump/local/oplog.rs.bson 2015-12-27T02:27:40.579+0800 done dumping local.oplog.rs (4 documents)
3)复制最新的oplog条目到tmp表
  1. [root@node1 mongodb-linux-x86_64-3.2.0]# mongo --port 37017
  2. MongoDB shell version: 3.2.0
  3. connecting to: 127.0.0.1:37017/test
  4. > db.temp.save(db.oplog.rs.find({},{ts:1,h:1}).sort({$natural:-1}).limit(1).next());
  5. WriteResult({ "nInserted" : 1 })
  6. > db.temp.find();
  7. { "_id" : ObjectId("567edd9e48b1a3ebcf06049c"), "ts" : Timestamp(1451203909, 1), "h" : NumberLong("4300737341732033822") }
4)删除原来的oplog
  1. db.oplog.rs.drop()
5)重建oplog
    1. db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )
    2. (单位是字节)
    3. db.oplog.rs.save( db.temp.findOne() ) 把temp中oplog保存到新建的oplog中
    4. db.oplog.rs.find()
6)关闭实例,启动实例为replications sets的成员
  1. db.shutdownServer()
  2. mongod --replSet rs0 --dbpath /usr/local/mongodb-linux-x86_64-3.2.0/data
7)在primary中执行切换primary为secondary:
  1. rs.stepDown()
然后重复以上操作。2.执行维护任务的步骤上面介绍了如何修改oplog。对于Recplication sets来说,执行维护任务的最常用流程如下:1)关闭secondary节点use admindb.shutdownServer()2)以单实例的方式在不同端口启动该结点mongod --dbpath /usr/mongodb/data/db --port 370173)执行维护任务,比如升级数据库4)关闭单实例节点use admindb.shutdownServer()5)以replication sets的方式启动节点mongod --replSet "rs01" --dbpath /usr/local/data/db --port 27017按上面的方式把所有secondary节点处理完。在主节点上:1)执行db.stepDown()切换为secondary节点2)按照上面的1-5执行3.强制某个节点变成主节点原理就是修改节点的优先级。1)方法一:有m1,m2,m3三个节点,原来m1是主节点,优先级都是1.执行以下操作:
  1. cfg = rs.conf()
  2. cfg.members[0].priority = 0.5
  3. cfg.members[1].priority = 0.5
  4. cfg.members[2].priority = 1
  5. rs.reconfig(cfg)
此时 m3的优先级最高。如果m3和m1之间的同步进度小于10秒,m1就切换为scondary节点m3就切换为primary节点;如果m3和m1之间的同步进度大于10秒,就先不切换,直接到m3追上m1(进度差小于10秒)即使m3和m1之间的进度差大于10秒,想让m1变成secondary节点可以执行:
  1. db.adminCommand({replSetStepDown: 86400, force: 1})  24小时内让其成为主节点
此时全部节点为secondary,没有primary节点!等到m3赶上m1的进度,m3就成了primary节点。2)方法二使用命令设置primarym1,m2,m3,m1为主节点.在m2上进入mongo:
  1. mongo
  2. >rs.freeze(120);120秒内不能成为主节点
在m1上执行:
  1. mongo
  2. >rs.stepDown(120);120秒内不能成为主节点
这时打开m3发现已经成为主节点。4.节点执行resync有两种方式实现resync:a.清空--dbpath目录,自动实现resyncb.复制其它节点的--dbpath目录内容,然后启动实例,自动使用oplog同步1)自动resynca.关闭节点 db.shutdownServer()b.清空--dbpath目录里的所有内容c.以replication sets方式启动实例2)手动复制数据a.在源节点上做--dbpath的磁盘快照;复制磁盘快照或者直接复制--dbpath目录。b.替换本节点上的--dbpath目录。c.启动实例问题:由于源节点上的--dbpath目录一直在改变,可能无法复制--dbpath目录。所以要做数据快照。5.强制重新配置replication sets某些情况下(primary宕机又不能选出primary、配置错误导致大部分的节点宕机),可以使用强制措施重新配置replication sets.正常情况下不要使用。1)连接到没有宕机的节点上2)执行cfg = rs.conf() cfg.members = [cfg.members[0] , cfg.members[4] , cfg.members[7]]  去掉宕机的节点rs.reconfig(cfg, {force : true})  然后这个设置自动传播到其它节点,之后节点会选出一个primary.6.Trouble shooting1)检查replications set状态rs.status();2)检查复制间隙
  1. rs0:SECONDARY> rs.printSlaveReplicationInfo();
  2. source: 192.168.75.10:27017
  3. syncedTo: Sun Dec 27 2015 16:11:49 GMT+0800 (CST)
  4. 0 secs (0 hrs) behind the primary
  5. source: 192.168.75.11:27017
  6. syncedTo: Sun Dec 27 2015 16:11:49 GMT+0800 (CST)
  7. 0 secs (0 hrs) behind the primary
有延迟的secondary节点也可能显示落后primary节点0秒。原因:主节点的空闲时间大于从节点上的SlaveDelay值。复制间隙产生的原因:
  • 网络原因
  • 磁盘原因
  • 大量并发
  • 大量写数据
  • oplog
  • 3)测试连接性用mongo --host --port  测试各个节点4)检查oplog日志rs.printReplicationInfo() oplog的日志的大小应该满足至少24个小时的操作,一般48小时或者72小时最好5) 日志入口时间错误错误信息:replSet error fatal couldn‘t query the local local.oplog.rs collection. Terminating mongod after 30 <timestamp> [rsStart] bad replSet oplog entry?  原因:一般是由oplog最新一条的ts字段的格式错误造成的。该字段的格式是timestamp。检查字段:
    1. db = db.getSiblingDB("local")
    2. db.oplog.rs.find().sort({$natural:-1}).limit(1)
    3. db.oplog.rs.find({ts:{$type:17}}).sort({$natural:-1}).limit(1)
    如果两个查询没有返回相同的结果,说明日志有错误:
    1. 第一个查询结果
    2. { "ts" : {t: 1347982456000, i: 1},
    3. "h" : NumberLong("8191276672478122996"),
    4. "op" : "n",
    5. "ns" : "",
    6. "o" : { "msg" : "Reconfig set", "version" : 4 } }
    7. 第二个查询结果
    8. { "ts" : Timestamp(1347982454000, 1),
    9. "h" : NumberLong("6188469075153256465"),
    10. "op" : "n",
    11. "ns" : "",
    12. "o" : { "msg" : "Reconfig set", "version" : 3 } }
    更新错误的条目:
    1. db.oplog.rs.update( { ts: { t:1347982456000, i:1 } },{ $set: { ts: new Timestamp(1347982456000, 1)}})
    7.复制集相关的函数技术分享8.复制输命令技术分享来自为知笔记(Wiz)

    MongoDB复制二:复制集的管理

    标签:

    小编还为您整理了以下内容,可能对您也有帮助:

    MongoDB复制集/副本集(Replica Set)搭建

    mongo副本集/复制集是mongo高可用性特征之一,是有自动故障恢复功能的主要集群。由一个Primary节点和一个或多个Secondary节点组成。

    复制是在多台服务器之间同步数据的过程,由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点

    Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据

    通过上述方式来保持复制集内所有成员存储相同的数据集,提供数据的高可用

    Failover (故障转移,故障切换,故障恢复)

    Rendancy(数据冗余)

    避免单点,用于灾难时恢复,报表处理,提升数据可用性

    读写分离,分担读压力

    对用户透明的系统维护升级

    主节点记录所有的变更到oplog日志

    辅助节点(Secondary)复制主节点的oplog日志并且将这些日志在辅助节点进行重放(做)

    各个节点之间会定期发送心跳信息,一旦主节点宕机,则触发选举一个新的主节点,剩余的辅助节点指向新的主

    10s内各辅助节点无法感知主节点的存在,则开始触发选举

    通常1分钟内完成主辅助节点切换,10-30s内感知主节点故障,10-30s内完成选举及切换

    用户恢复数据,防止数据丢失,实现灾难恢复

    人为误操作导致数据删除,程序Bug导致数据损坏等

    首要复制节点,由选举产生,提供读写服务的节点,产生oplog日志

    备用(辅助)复制节点,Secondary可以提供读服务,增加Secondary节点可以提供复制集的读服务能力

    在故障时,备用节点可以根据设定的优先级别提升为首要节点。提升了复制集的可用性

    Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据

    Arbiter本身不存储数据,是非常轻量级的服务。

    当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性

    Mongodb版本3.0以上, 三台服务器均为64位

    三台服务器    --------  Primary(Centos7)、 Secondary(Centos7)、 Secondary(Debian8);架设IP分别为 192.168.1.1、1.2、 1.3

    三台服务器关闭防火墙    -------- systemctl  stop firewalld.service

    三台服务器修改mongo配置文件    --------  vi  /etc/mongod.conf 

            侦听地址除了 localhost 外再加上服务器IP; 设置复制集名字(RepliSetName)。

    开启mongod服务: mongod

    三台服务器mongo各自初始化: rs.initiate()

    Primary上副本集配置:

    rsconf(配置名称,可随意取)={_id:"副本集名",member:[{_id:0,host:"IP:port",priority:2},{_id:1,host:"IP:port",priority:1},{_id:2,host:"IP:port",priority:1}]}

    在初始化:rs.initiate(变量名,如下面的config)

    Secondary上配置:

    rs.slaveOk()    #承认自己是Secondary

    三台服务器上互相添加副本集成员:

    rs.add("IP:port"), 如在Primary上 rs.add("192.168.1.2:27017"), rs.add("192.168.1.3:27017")

    查看状态

    rs.status()

    3、rs(replication set) 常用命令:

    初始化副本集  ----  rs.initiate()

    mongo查看状态 ---- rs.status()

    初始化副本集配置

    rsconf = {_id: "rs0",

    members: [{

    _id: 0,

    host: ":27017"}]}

    rs.initiate( rsconf )

    验证副本集配置  ----  rs.config()

    增加副本集成员  ----  rs.add("Ip:port")

    移除副本集成员  ----  rs.remove("IP:port")    #此步骤在Primary上操作

    改变成员变量的优先级

    cfg = rs.conf()

    cfg.members[0].priority = 3

    cfg.members[1].priority = 1

    cfg.members[2].priority = 2

    rs.reconfig(cfg)

    配置延迟副本集

    cfg = rs.conf()

    cfg.members[0].priority = 0

    cfg.members[0].hidden = true

    cfg.members[0].slaveDelay = 3600

    rs.reconfig(cfg)

    #  07/03/2017

    如何在 AWS EC2 上配置 MongoDB 高可用复制集

    安装步骤
      创建并启动主节点、次节点和仲裁节点的EC2实例,主节点、次节点和仲裁节点所需要的配置如上所述。
      为主次两节点创建EBS卷,EBS卷的大小足以满足MongoDB存储数据
      通过SSH连接主次两节点上的EC2实例
      通过sudo mkfs -t ext4 /dev/<已创建的EBS卷> 在主次两个节点上创建Ext4文件系统
      创建目录/data/db或者其他你选择的目录名,然后使用sudo mount -a /dev/<已创建的EBS卷> /data/db挂载到已连接的卷上
      使用sudo echo '/dev/sdf /data/db auto noatime,noexec,nodiratime 0 0' >>/etc/fstab 编辑/etc/fstab,使得实例启动的时候能显示这个目录
      在所有实例上下载并安装MongoDB
      在MongoDB目录下使用mongod --rest -rep|set myHASet命令启动主节点(这儿myHASet是复制集的名字,你可以选择你喜欢的任何名字)
      在MongoDB目录下进入MongoDB终端
      在mongo终端上使用命令rs.initiate()初始化复制集
      初始化完成后使用命令rs.status() 检查复制集的状态
      如果初始化成功,你可以在输出里看到OK,类似下面
      {
    "set" : "sample",
    "myState" : 1,
    "members" : [
    {
    "name" : "<PRIMARY_HOSTNAME>:27017",
    "self" : true
    }
    ],
    "ok" : 1
    }
      你也可以通过http://<主节点>:27017/_rep|set检查复制集状态
      现在你的主节点可以使用了,你可以在这个节点上插入或者更新文档。
      现在用主节点上的mongod --rest --rep|set myHASet相同的命令启动次节点
      现在告知主节点在复制集中增加了次节点。进入主节点上的mongo控制台,使用rs.add("<次节点主机名>")增加次节点到复制集
      如果增加成功的话,你将看到这样的响应{ "ok" : 1 }
      一旦你的次节点与复制集连接成功,你可以通过http://<主节点>:27017/_rep|Set检查复制集状态
      现在使用mongod --rest --rep|Set myset --oplogSize 8命令启动仲裁节点
      使用命令rs.add({_id:2,host:"<仲裁节点主机名>",arbiterOnly:true})把仲裁节点增加到复制集
      一旦仲裁节点增加成功的话,你就已经完成的整个配置,你的复制集可以使用了
      进入http://<主节点>:27017/_rep|Set,你应当能够看到如下屏幕截图所示的每个节点的状态
      要测试复制集,关闭主节点,看看次节点是否能够接管,然后变成主节点
      你可以使用命令db.isMaster()检查状态,看看是否次节点已经成为主节点。
      另外你可以用分片群集的水平分片来扩大应用的数据量。配置分片群集不在这篇文档的范围之内。

    如何在 AWS EC2 上配置 MongoDB 高可用复制集

    安装步骤
      创建并启动主节点、次节点和仲裁节点的EC2实例,主节点、次节点和仲裁节点所需要的配置如上所述。
      为主次两节点创建EBS卷,EBS卷的大小足以满足MongoDB存储数据
      通过SSH连接主次两节点上的EC2实例
      通过sudo mkfs -t ext4 /dev/<已创建的EBS卷> 在主次两个节点上创建Ext4文件系统
      创建目录/data/db或者其他你选择的目录名,然后使用sudo mount -a /dev/<已创建的EBS卷> /data/db挂载到已连接的卷上
      使用sudo echo '/dev/sdf /data/db auto noatime,noexec,nodiratime 0 0' >>/etc/fstab 编辑/etc/fstab,使得实例启动的时候能显示这个目录
      在所有实例上下载并安装MongoDB
      在MongoDB目录下使用mongod --rest -rep|set myHASet命令启动主节点(这儿myHASet是复制集的名字,你可以选择你喜欢的任何名字)
      在MongoDB目录下进入MongoDB终端
      在mongo终端上使用命令rs.initiate()初始化复制集
      初始化完成后使用命令rs.status() 检查复制集的状态
      如果初始化成功,你可以在输出里看到OK,类似下面
      {
    "set" : "sample",
    "myState" : 1,
    "members" : [
    {
    "name" : "<PRIMARY_HOSTNAME>:27017",
    "self" : true
    }
    ],
    "ok" : 1
    }
      你也可以通过http://<主节点>:27017/_rep|set检查复制集状态
      现在你的主节点可以使用了,你可以在这个节点上插入或者更新文档。
      现在用主节点上的mongod --rest --rep|set myHASet相同的命令启动次节点
      现在告知主节点在复制集中增加了次节点。进入主节点上的mongo控制台,使用rs.add("<次节点主机名>")增加次节点到复制集
      如果增加成功的话,你将看到这样的响应{ "ok" : 1 }
      一旦你的次节点与复制集连接成功,你可以通过http://<主节点>:27017/_rep|Set检查复制集状态
      现在使用mongod --rest --rep|Set myset --oplogSize 8命令启动仲裁节点
      使用命令rs.add({_id:2,host:"<仲裁节点主机名>",arbiterOnly:true})把仲裁节点增加到复制集
      一旦仲裁节点增加成功的话,你就已经完成的整个配置,你的复制集可以使用了
      进入http://<主节点>:27017/_rep|Set,你应当能够看到如下屏幕截图所示的每个节点的状态
      要测试复制集,关闭主节点,看看次节点是否能够接管,然后变成主节点
      你可以使用命令db.isMaster()检查状态,看看是否次节点已经成为主节点。
      另外你可以用分片群集的水平分片来扩大应用的数据量。配置分片群集不在这篇文档的范围之内。

    关于MongoDB你需要知道的几件事_MySQL

    通过复制集实现的数据复制效果非常棒,不过也有

    MongoDB中数据复制的复制集策略非常棒,很容易配置并且使用起来确实不错。但如果集群的节点有12个以上,那么你就会遇到问题。MongoDB中的复制集有12个节点的,这里是问题的描述,你可以追踪这个问题看看是否已经被解决了。

    主从复制不会确保高可用性

    尽管已经不建议被使用了,不过MongoDB还是提供了另外一种复制策略,即主从复制。它解决了12个节点问题,不过却产生了新的问题:如果需要改变集群的主节点,那么你必须得手工完成,感到惊讶?看看这个链接吧。

    不要使用32位版本

    MongoDB的32位版本也是不建议被使用的,因为你只能处理2GB大小的数据。还记得第一个么?这是MongoDB关于该的说明。

    咨询费非常非常昂贵(至少对于巴西的开发者与公司来说如此)

    我不清楚其他国家的情况,不过至少在巴西MongoDB的咨询费是个天价。对于“Lightning Consult”计划来说,每小时的价格是450,00美金,而你至少需要购买两个小时的,换句话说,对于任何一家公司来说,每次咨询的价格至少是900,00美金。相比于RedHat和Oracle来说,这个价格太高了。

    差劲的管理工具

    这对于初学者来说依然是个让人头疼的问题,MongoDB的管理控制台太差劲了。我所知道的最好的工具是RoboMongo,它对于那些初次使用的开发者来说非常趁手。

    了解官方的

    让我感到惊讶的是,很少有人会查询关于他们将要使用的工具的。幸好,MongoDB的开发人员发布了一篇MongoDB所有的博客,你可以提前了解相关信息,避免在使用过程中难堪。

    各位读者,现在使用MongoDB的公司也越来越多了,不妨与大家分享你在使用这个NoSQL数据库时的一些经验与教训。

    MongoDB是什么,怎么用?看完你就知道了

    MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。

    (1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。

    使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。

    (2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。

    (3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。

    (1)文档数据类型

    SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。

    (2)即时查询能力

    MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。

    (3)复制能力

    MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。

    (4)速度与持久性

    MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。

    MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据操作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。

    (5)数据扩展

    MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。

    MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理最好是交给操作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。

    MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。

    mongomp和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。

    mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。

    mongosniff,网络嗅探工具,用来观察发送到数据库的操作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。

    因此,可以总结得到,MongoDB结合键值存储和关系数据库的最好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且最好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。

    因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。

    创建数据库并不是必须的操作,数据库与集合只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或集合被意外创建,可以开启严格模式。

    以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去操作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。

    使用java驱动链接MongoDB是一件非常简单的事情,简单的引用,简单的做增删改查。在使用完java驱动后我才发现spring 对MongoDB 的封装还不如官方自身提供出来的东西好用,下面简单的展示一下使用。

    这里只举例了简单的链接与简单的MongoDB操作,可见其操作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。

    插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。

    要清楚了解MongoDB的基本数据单元。在关系型数据库中有带列和行的数据表。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作。

    如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低。系统本身的需求决定mysql还是MongoDB。

    在关于schema 的设计中要注意一些原则,比如:

    数据库是集合的逻辑与物理分组,MongoDB没有提供创建数据库的语法,只有在插入集合时,数据库才开始建立。创建数据库后会在磁盘分配一组数据文件,所有集合、索引和数据库的其他元数据都保存在这些文件中,查阅数据库使用磁盘状态可通过。

    集合是结构上或概念上相似得文档的容器,集合的名称可以包含数字、字母或 . 符号,但必须以字母或数字开头,完全。

    限定集合名不能超过128个字符,实际上 . 符号在集合中很有用,能提供某种虚拟命名空间,这是一种组织上的原则,和其他集合是一视同仁的。在集合中可以使用。

    其次是键值,在MongoDB里面所有的字符串都是UTF-8类型。数字类型包括double、int、long。日期类型都是UTC格式,所以在MongoDB里面看到的时间会比北京时间慢8小时。整个文档大小会*在16m以内,因为这样可以防止创建难看的数据类型,且小文档可以提升性能,批量插入文档理想数字范围是10~200,大小不能超过16MB。

    (1)索引能显著减少获取文档的所需工作量,具体的对比可以通过 .explain()方法进行对比

    (2)解析查询时MongoDB通过最优计划选择一个索引进行查询,当没有最适合索引时,会先不同的使用各个索引进行查询,最终选出一个最优索引做查询

    (3)如果有一个a-b的复合索引,那么仅针对a的索引是冗余的

    (4)复合索引里的键的顺序是很重要的

    (1)单键索引

    (2)复合索引

    (3)唯一性索引

    (4)稀疏索引

    如索引的字段会出现null的值,或是大量文档都不包含被索引的键。

    如果数据集很大时,构建索引将会花费很长的时间,且会影响程序性能,可通过

    当使用 mongorestore 时会重新构建索引。当曾经执行过大规模的删除时,可使用

    对索引进行压缩,重建。

    (1)查阅慢查询日志

    (2)分析慢查询

    注意新版本的MongoDB 的explain方法是需要参数的,不然只显示普通的信息。

    本节同样主要简单呈现MongoDB副本集搭建的简易性,与副本集的强壮性,监控容易性

    提供主从复制能力,热备能力,故障转移能力

    实际上MongoDB对副本集的操作跟mysql主从操作是差不多的,先看一下mysql的主从数据流动过程

    而MongoDB主要依赖的日志文件是oplog

    写操作先被记录下来,添加到主节点的oplog里。与此同时,所有从结点复制oplog。首先,查看自己oplog里最后一条的时间戳;其次,查询主节点oplog里所有大于此时间戳的条目;最后,把那些条目添加到自己的oplog里并应用到自己的库里。从节点使用长轮询立即应用来自主结点oplog的新条目。

    当遇到以下情况,从节点会停止复制

    local数据库保存了所有副本集元素据和oplog日志

    可以使用以下命令查看复制情况

    每个副本集成员每秒钟ping一次其他所有成员,可以通过rs.status()看到节点上次的心跳检测时间戳和 健康 状况。

    这个点没必要过多描述,但是有一个特殊场景,如果从节点和仲裁节点都被杀了,只剩下主节点,他会把自己降级成为从节点。

    如果主节点的数据还没有写到从库,那么数据不能算提交,当该主节点变成从节点时,便会触发回滚,那些没写到从库的数据将会被删除,可以通过rollback子目录中的BSON文件恢复回滚的内容。

    (1)使用单节点链接

    只能链接到主节点,如果链接到从节点的话,会被拒绝写入操作,但是如果没有使用安全模式,因为mongo的fire and forget 特性,会把拒绝写入的异常给吃掉。

    (2)使用副本集方式链接

    能根据写入的情况自动进行故障转移,但是当副本集进行新的选举时,还是会出现故障,如果不使用安全模式,依旧会出现写不进去,但现实成功的情况。

    分片是数据库切分的一个概念实现,这里也是简单总结为什么要使用分片以及分片的原理,操作。

    当数据量过大,索引和工作数据集占用的内存就会越来越多,所以需要通过分片负载来解决这个问题

    (1)分片组件

    (2)分片的核心操作

    分片一个集合:分片是根据一个属性的范围进行划分的,MongoDB使用所谓的分片键让每个文档在这些范围里找到自己的位置

    块:是位于一个分片中的一段连续的分片键范围,可以理解为若干个块组成分片,分片组成MongoDB的全部数据

    (3)拆分与迁移

    块的拆分:初始化时只有一个块,达到最大块尺寸64MB或100000个文档就会触发块的拆分。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档。

    迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块差大于8时,均衡器就会发起一次均衡处理。

    启动两个副本集、三个配置服务器、一个mongos进程

    配置分片

    (1)分片查询类型

    (2)索引

    分片集合只允许在_id字段和分片键上添加唯一性索引,其他地方不行,因为这需要在分片间进行通信,实施起来很复杂。

    当创建分片时,会根据分片键创建一个索引。

    (1)分片键是不可修改的、分片键的选择非常重要

    (2)低效的分片键

    (3)理想的分片键

    (1)部署拓扑

    根据不同的数据中心划分

    这里写图片描述

    (2)最低要求

    (3)配置的注意事项

    需要估计集群大小,可使用以下命令对现有集合进行分片处理

    (4)备份分片集群

    备份分片时需要停止均衡器

    (1)部署架构

    使用64位机器、32位机器会制约mongodb的内存,使其最大值为1.5GB

    (2)cpu

    mongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题

    mongodb写入数据时会使用到CPU,但是mongodb写入时间一次只用到一个核,如果有频繁的写入行为,可以通过分片来解决这个问题

    (3)内存

    大内存是mongodb的保障,如果工作集大小超过内存,将会导致性能下降,因为这将会增加数据加载入内存的动作

    (4)硬盘

    mongodb默认每60s会与磁盘强制同步一次,称为后台刷新,会产生I/O操作。在重启时mongodb会将磁盘里面的数据加载至内存,高速磁盘将会减少同步的时间

    (5)文件系统

    使用ext4 和 xfs 文件系统

    禁用最后访问时间

    (6)文件描述符

    linux 默认文件描述符是1024,需要大额度的提升这个额度

    (7)时钟

    mongodb各个节点服务器之间使用ntp服务器

    (1)绑定IP

    启动时使用 - -bind_ip 命令

    (2)身份验证

    启动时使用 - -auth 命令

    (3)副本集身份认证

    使用keyFile,注意keyFile文件的权限必须是600,不然会启动不起来

    (1)拓扑结构

    搭建副本集至少需要两个节点,其中仲裁结点不需要有自己的服务器

    (2)Journaling日志

    写数据时会先写入日志,而此时的数据也不是直接写入硬盘,而是写入内存

    但是Journaling日志会消耗内存,所以可以在主库上面关闭,在从库上面启动

    可以单独为Journaling日志使用一块固态硬盘

    在插入时,可以通过驱动确保Journaling插入后再反馈,但是会非常影响性能。

    logpath 选项指定日志存储地址

    -vvvvv 选项(v越多,输出越详细)

    db.runCommand({logrotare:1}) 开启滚动日志

    (1)serverStatus

    这里写图片描述

    (2)top

    (3)db.currentOp()

    动态展示mongodb活动数据

    占用当前mongodb监听端口往上1000号的端口

    (1)mongomp

    把数据库内容导出成BSON文件,而mongorestore能读取并还原这些文件

    (2)mongorestore

    把导出的BSON文件还原到数据库

    (3)备份原始数据文件

    可以这么做,但是,操作之前需要进行锁库处理 db.runCommand({fsync:1,lock:true})

    db.$cmd.sys.unlock.findOne() 请求解锁操作,但是数据库不会立刻解锁,需要使用db.currentOp()验证。

    (1)修复

    mongd --repair 修复所有数据库

    db.runCommand({repairDatabase:1}) 修复单个数据库

    修复就是根据Jourling文件读取和重写所有数据文件并重建各个索引

    (2)压紧

    压紧,会重写数据文件,并重建集合的全部索引,需要停机或者在从库上面运行,如果需要在主库上面运行,需要添加force参数 保证加写锁。

    (1)监控磁盘状态

    (2)为提升性能检查索引和查询

    总的来说,扫描尽可能少的文档。

    保证没有冗余的索引,冗余的索引会占用磁盘空间、消耗更多的内存,在每次写入时还需做更多工作

    (3)添加内存

    dataSize 数据大小 和 indexSize 索引大小,如果两者的和大于内存,那么将会影响性能。

    storageSize超过dataSize 数据大小 两倍以上,就会因磁盘碎片而影响性能,需要压缩。

    MongoDB是什么,怎么用?看完你就知道了

    MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。

    (1)MongoDB提出的是文档、集合的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。

    使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。

    (2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台服务器。自动故障转移是副本集的概念,MongoDB能检测主节点是否存活,当失活时能自动提升从节点为主节点,达到故障转移。

    (3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。

    (1)文档数据类型

    SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与唯一性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。

    (2)即时查询能力

    MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。

    (3)复制能力

    MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。

    (4)速度与持久性

    MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。

    MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据操作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。

    (5)数据扩展

    MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个服务器里面存储的数据都是一样大小。

    MongoDB核心服务器主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理最好是交给操作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由服务器使用分片功能。

    MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。

    mongomp和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。

    mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。

    mongosniff,网络嗅探工具,用来观察发送到数据库的操作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。

    因此,可以总结得到,MongoDB结合键值存储和关系数据库的最好特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的服务器上面,且最好单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。

    因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅官方文档。

    创建数据库并不是必须的操作,数据库与集合只有在第一次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或集合被意外创建,可以开启严格模式。

    以上的命令只是简单实例,假设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是java驱动去操作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。

    使用java驱动链接MongoDB是一件非常简单的事情,简单的引用,简单的做增删改查。在使用完java驱动后我才发现spring 对MongoDB 的封装还不如官方自身提供出来的东西好用,下面简单的展示一下使用。

    这里只举例了简单的链接与简单的MongoDB操作,可见其操作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进第一服务器中,将会向服务器发送一个getmore指令获取下一批查询结果。

    插入数据到服务器时间,不会等待服务器的响应,驱动会假设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验服务器端插入的错误。

    要清楚了解MongoDB的基本数据单元。在关系型数据库中有带列和行的数据表。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结操作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新操作。

    如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低。系统本身的需求决定mysql还是MongoDB。

    在关于schema 的设计中要注意一些原则,比如:

    数据库是集合的逻辑与物理分组,MongoDB没有提供创建数据库的语法,只有在插入集合时,数据库才开始建立。创建数据库后会在磁盘分配一组数据文件,所有集合、索引和数据库的其他元数据都保存在这些文件中,查阅数据库使用磁盘状态可通过。

    集合是结构上或概念上相似得文档的容器,集合的名称可以包含数字、字母或 . 符号,但必须以字母或数字开头,完全。

    限定集合名不能超过128个字符,实际上 . 符号在集合中很有用,能提供某种虚拟命名空间,这是一种组织上的原则,和其他集合是一视同仁的。在集合中可以使用。

    其次是键值,在MongoDB里面所有的字符串都是UTF-8类型。数字类型包括double、int、long。日期类型都是UTC格式,所以在MongoDB里面看到的时间会比北京时间慢8小时。整个文档大小会*在16m以内,因为这样可以防止创建难看的数据类型,且小文档可以提升性能,批量插入文档理想数字范围是10~200,大小不能超过16MB。

    (1)索引能显著减少获取文档的所需工作量,具体的对比可以通过 .explain()方法进行对比

    (2)解析查询时MongoDB通过最优计划选择一个索引进行查询,当没有最适合索引时,会先不同的使用各个索引进行查询,最终选出一个最优索引做查询

    (3)如果有一个a-b的复合索引,那么仅针对a的索引是冗余的

    (4)复合索引里的键的顺序是很重要的

    (1)单键索引

    (2)复合索引

    (3)唯一性索引

    (4)稀疏索引

    如索引的字段会出现null的值,或是大量文档都不包含被索引的键。

    如果数据集很大时,构建索引将会花费很长的时间,且会影响程序性能,可通过

    当使用 mongorestore 时会重新构建索引。当曾经执行过大规模的删除时,可使用

    对索引进行压缩,重建。

    (1)查阅慢查询日志

    (2)分析慢查询

    注意新版本的MongoDB 的explain方法是需要参数的,不然只显示普通的信息。

    本节同样主要简单呈现MongoDB副本集搭建的简易性,与副本集的强壮性,监控容易性

    提供主从复制能力,热备能力,故障转移能力

    实际上MongoDB对副本集的操作跟mysql主从操作是差不多的,先看一下mysql的主从数据流动过程

    而MongoDB主要依赖的日志文件是oplog

    写操作先被记录下来,添加到主节点的oplog里。与此同时,所有从结点复制oplog。首先,查看自己oplog里最后一条的时间戳;其次,查询主节点oplog里所有大于此时间戳的条目;最后,把那些条目添加到自己的oplog里并应用到自己的库里。从节点使用长轮询立即应用来自主结点oplog的新条目。

    当遇到以下情况,从节点会停止复制

    local数据库保存了所有副本集元素据和oplog日志

    可以使用以下命令查看复制情况

    每个副本集成员每秒钟ping一次其他所有成员,可以通过rs.status()看到节点上次的心跳检测时间戳和 健康 状况。

    这个点没必要过多描述,但是有一个特殊场景,如果从节点和仲裁节点都被杀了,只剩下主节点,他会把自己降级成为从节点。

    如果主节点的数据还没有写到从库,那么数据不能算提交,当该主节点变成从节点时,便会触发回滚,那些没写到从库的数据将会被删除,可以通过rollback子目录中的BSON文件恢复回滚的内容。

    (1)使用单节点链接

    只能链接到主节点,如果链接到从节点的话,会被拒绝写入操作,但是如果没有使用安全模式,因为mongo的fire and forget 特性,会把拒绝写入的异常给吃掉。

    (2)使用副本集方式链接

    能根据写入的情况自动进行故障转移,但是当副本集进行新的选举时,还是会出现故障,如果不使用安全模式,依旧会出现写不进去,但现实成功的情况。

    分片是数据库切分的一个概念实现,这里也是简单总结为什么要使用分片以及分片的原理,操作。

    当数据量过大,索引和工作数据集占用的内存就会越来越多,所以需要通过分片负载来解决这个问题

    (1)分片组件

    (2)分片的核心操作

    分片一个集合:分片是根据一个属性的范围进行划分的,MongoDB使用所谓的分片键让每个文档在这些范围里找到自己的位置

    块:是位于一个分片中的一段连续的分片键范围,可以理解为若干个块组成分片,分片组成MongoDB的全部数据

    (3)拆分与迁移

    块的拆分:初始化时只有一个块,达到最大块尺寸64MB或100000个文档就会触发块的拆分。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档。

    迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块差大于8时,均衡器就会发起一次均衡处理。

    启动两个副本集、三个配置服务器、一个mongos进程

    配置分片

    (1)分片查询类型

    (2)索引

    分片集合只允许在_id字段和分片键上添加唯一性索引,其他地方不行,因为这需要在分片间进行通信,实施起来很复杂。

    当创建分片时,会根据分片键创建一个索引。

    (1)分片键是不可修改的、分片键的选择非常重要

    (2)低效的分片键

    (3)理想的分片键

    (1)部署拓扑

    根据不同的数据中心划分

    这里写图片描述

    (2)最低要求

    (3)配置的注意事项

    需要估计集群大小,可使用以下命令对现有集合进行分片处理

    (4)备份分片集群

    备份分片时需要停止均衡器

    (1)部署架构

    使用64位机器、32位机器会制约mongodb的内存,使其最大值为1.5GB

    (2)cpu

    mongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题

    mongodb写入数据时会使用到CPU,但是mongodb写入时间一次只用到一个核,如果有频繁的写入行为,可以通过分片来解决这个问题

    (3)内存

    大内存是mongodb的保障,如果工作集大小超过内存,将会导致性能下降,因为这将会增加数据加载入内存的动作

    (4)硬盘

    mongodb默认每60s会与磁盘强制同步一次,称为后台刷新,会产生I/O操作。在重启时mongodb会将磁盘里面的数据加载至内存,高速磁盘将会减少同步的时间

    (5)文件系统

    使用ext4 和 xfs 文件系统

    禁用最后访问时间

    (6)文件描述符

    linux 默认文件描述符是1024,需要大额度的提升这个额度

    (7)时钟

    mongodb各个节点服务器之间使用ntp服务器

    (1)绑定IP

    启动时使用 - -bind_ip 命令

    (2)身份验证

    启动时使用 - -auth 命令

    (3)副本集身份认证

    使用keyFile,注意keyFile文件的权限必须是600,不然会启动不起来

    (1)拓扑结构

    搭建副本集至少需要两个节点,其中仲裁结点不需要有自己的服务器

    (2)Journaling日志

    写数据时会先写入日志,而此时的数据也不是直接写入硬盘,而是写入内存

    但是Journaling日志会消耗内存,所以可以在主库上面关闭,在从库上面启动

    可以单独为Journaling日志使用一块固态硬盘

    在插入时,可以通过驱动确保Journaling插入后再反馈,但是会非常影响性能。

    logpath 选项指定日志存储地址

    -vvvvv 选项(v越多,输出越详细)

    db.runCommand({logrotare:1}) 开启滚动日志

    (1)serverStatus

    这里写图片描述

    (2)top

    (3)db.currentOp()

    动态展示mongodb活动数据

    占用当前mongodb监听端口往上1000号的端口

    (1)mongomp

    把数据库内容导出成BSON文件,而mongorestore能读取并还原这些文件

    (2)mongorestore

    把导出的BSON文件还原到数据库

    (3)备份原始数据文件

    可以这么做,但是,操作之前需要进行锁库处理 db.runCommand({fsync:1,lock:true})

    db.$cmd.sys.unlock.findOne() 请求解锁操作,但是数据库不会立刻解锁,需要使用db.currentOp()验证。

    (1)修复

    mongd --repair 修复所有数据库

    db.runCommand({repairDatabase:1}) 修复单个数据库

    修复就是根据Jourling文件读取和重写所有数据文件并重建各个索引

    (2)压紧

    压紧,会重写数据文件,并重建集合的全部索引,需要停机或者在从库上面运行,如果需要在主库上面运行,需要添加force参数 保证加写锁。

    (1)监控磁盘状态

    (2)为提升性能检查索引和查询

    总的来说,扫描尽可能少的文档。

    保证没有冗余的索引,冗余的索引会占用磁盘空间、消耗更多的内存,在每次写入时还需做更多工作

    (3)添加内存

    dataSize 数据大小 和 indexSize 索引大小,如果两者的和大于内存,那么将会影响性能。

    storageSize超过dataSize 数据大小 两倍以上,就会因磁盘碎片而影响性能,需要压缩。

    Linux Centos 7安装MongoDB(简单!详细!)

    使用 概括几个常用的:

    详解:

    2. 验证安装结果 rpm -qa |grep mongodb 复制代码 rpm -ql mongodb-org-server 复制代码

    启动MongoDB服务

    MongoDB默认端口是27017,查看是否开启

    检查数据库是否安装成功

    4. 验证服务开启 mongo 复制代码

    修改绑定ip默认127.0.0.1只允许本地连接, 所以修改为bindIp:0.0.0.0, 退出保存

    方法一

    方法二

    默认连接

    连接到自定义的用户

    规则

    说明

    root

    只在admin数据库中可用。超级账号,超级权限

    Read

    允许用户读取指定数据库

    readWrite

    允许用户读写指定数据库

    dbAdmin

    允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

    userAdmin

    允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

    clusterAdmin

    只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限

    readAnyDatabase

    只在admin数据库中可用,赋予用户所有数据库的读权限

    readWriteAnyDatabase

    只在admin数据库中可用,赋予用户所有数据库的读写权限

    userAdminAnyDatabase

    只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

    dbAdminAnyDatabase

    只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限

    为什么java无法连接搭在一台机器上的mongo复制集

    一、问题说明:

    最近测试mongo复制集,由于没有机器,所以选择在一台虚拟机上搭建。然后使用mongo-java-driver连接。

    ①、复制集初始化函数如下:

    >

    config = {_id: 'shard1', members: [{_id: 0, host:

    '127.0.0.1:20011'},{_id: 1, host: '127.0.0.1:20012'},{_id: 2,

    host:'127.0.0.1:20013'}]}

    > rs.initiate(config)

    或者你换成localhost,都没有关系。

    ②、java连接代码如下:

    static Mongo m = null;

    static{

    try {

    List<ServerAddress> list= new ArrayList<ServerAddress>();

    ServerAddress sap0 = new ServerAddress("192.168.132.100",20011);

    ServerAddress sas1 = new ServerAddress("192.168.132.100",20012);

    ServerAddress sas2 = new ServerAddress("192.168.132.100",20013);

    list.add(sap0);

    list.add(sas1);

    list.add(sas2);

    m = new Mongo(list);

    } catch (UnknownHostException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    192.168.132.100是虚拟机的IP,并不是使用本地localhost或者127.0.0.1,因为程序不再虚拟机上么。

    报错:

    Exception in thread "main" com.mongodb.MongoException: can't find a master

    原因分析:

    m = new Mongo(list);

    使用此方法:

    public Mongo( List<ServerAddress> replicaSetSeeds , MongoOptions options )

    throws MongoException {

    ....

    _addrs = replicaSetSeeds;

    ....

    _connector = new DBTCPConnector( this , _addrs );

    _connector.start();

    ...

    }