【学习笔记】MongoDB

本文详述了MongoDB的介绍、安装过程(Windows和Linux)、数据类型、常用指令、Java操作MongoDB、索引创建、备份与恢复、以及集群搭建的原理和步骤。MongoDB是一个分布式文件存储的数据库,支持动态查询和丰富的数据类型,适用于实时数据处理、缓存和高伸缩性场景。文章提供了MongoDB在不同平台的安装教程,以及数据库操作、Java API使用和索引管理的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MongoDB介绍

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

说明:BSON是一种计算机数据交换格式,主要被用作MongoDB数据库中的数据存储和网络传输格式。它是一种二进制表示形式,能用来表示简单数据结构、关联数组(MongoDB中称为“对象”或“文档”)以及MongoDB中的各种数据类型。BSON之名缘于JSON,含义为Binary JSON(二进制JSON)。

特点
(1) 面向集合存储,易存储对象类型的数据
(2) 支持动态查询
(3) 支持完全索引,包含内部对象
(4) 支持复制和故障恢复
(5) 支持多种开发语言
(6) 使用高效的二进制数据存储,包括大型对象(如视频等)

适用场景
1)网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2)缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。
3)高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。

不适用的场景如下
1)要求高度事务性的系统。
2)传统的商业智能应用。
3)复杂的跨文档(表)级联查询。

SQL和MongoDB的术语/概念区别
在这里插入图片描述

2.安装MongoDB

2.1 window下安装mongoDB

第一步:下载压缩包
https://www.mongodb.com/try/download/community

第二步:双击.msi文件,按照提示安装即可
选择Custom(自定义),不选Complete
不要勾选Install MongoDB Compass(默认勾选了的)

第三步:创建一个文件夹用来存储数据信息,这个数据目录不会主动创建,我们在安装完成后需要创建它

第四步:命令行下运行MongoDB服务器
为了从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行mongod.exe 文件。命令中的路径是第三步的路径。

E:\MongoDB\bin>mongod --dbpath E:\MongoDB\data

第五步:连接服务器
新打开一个cmd界面,在mongoDB目录的bin目录中执行mongo.exe文件

E:\MongoDB\bin>mongo

测试连接成功:输入一些简单的指令

> db
test
> 3+5
8

2.2 Liunx下安装mongoDB

1.下载安装包

2.上传到linux,并解压

[a@czn001 mongodb]$ tar -zxvf mongodb-linux-x86_64-4.0.19-rc0.tgz 
[a@czn001 mongodb]$ ll
total 83428
drwxrwxr-x. 3 a a     4096 Nov 13 19:32 mongodb-linux-x86_64-4.0.19-rc0
-rw-rw-r--. 1 a a 85426098 Jun  3 15:00 mongodb-linux-x86_64-4.0.19-rc0.tgz

3.配置环境变量

[root@czn001 mongodb]# vi /etc/profile

在profile文件中添加以下内容:

export mongodb_home=/home/a/mongodb/mongodb-linux-x86_64-4.0.19-rc0
export PATH=$PATH:$mongodb_home/bin

保存并退出后,使文件生效:

[root@czn001 mongodb]# source /etc/profile

4.创建数据库目录data

[root@czn001 mongodb]# mkdir data
[root@czn001 mongodb]# ll
total 83432
drwxr-xr-x. 2 root root     4096 Nov 13 19:44 data
drwxrwxr-x. 3 a    a        4096 Nov 13 19:32 mongodb-linux-x86_64-4.0.19-rc0
-rw-rw-r--. 1 a    a    85426098 Jun  3 15:00 mongodb-linux-x86_64-4.0.19-rc0.tgz

5.创建日志目录logs和日志文件mongodb.log

[root@czn001 mongodb]# mkdir logs
[root@czn001 mongodb]# cd logs
[root@czn001 logs]# touch mongodb.log
[root@czn001 logs]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 13 19:46 mongodb.log

6.在bin文件夹创建配置文件mongodb.conf

[root@czn001 mongodb]# cd mongodb-linux-x86_64-4.0.19-rc0
[root@czn001 mongodb-linux-x86_64-4.0.19-rc0]# cd bin
[root@czn001 bin]# vi mongodb.conf

配置文件中添加内容:

dbpath = /home/a/mongodb/data
logpath = /home/a/mongodb/logs/mongodb.log
port = 27017
fork = true

7.启动服务端、客户端

[root@czn001 bin]# ./mongod -f mongodb.conf
[root@czn001 bin]# ./mongo

3.mongodb支持的数据类型

1.null
null用于表示空值或不存在的字段。

{"x" : null}

2.布尔类型
布尔型数据有true和false两个值。

{"x" : true}

3.数值类型
在Mongo shell中,默认使用64位浮点型数据。因此,会有以下两种数值形式:

{"x" : 2.32}//或{"x" : 2}

对于整数类型,可以使用NumberInt()或NumberLong()方法进行转换。

{"x" : NumberInt(2)} 
{"x" : NumberLong(2)}

4.字符串
MongoDB中字符串类型使用UTF-8编码的字符表示。

{"x" : "123@qq.com"}

5.日期类型
MongoDB中日期使用时间戳表示,单位为毫秒,不存储时区

{"x" : new Date()}

创建日期对象时应该使用new Date(),而非构造函数Date()。将构造函数作为函数时返回的日期格式 是字符串,而非日期对象(与JavaScript工作机制有关)。
6.正则表达式
MongoDB中可使用与JavaScript相同的正则表达式进行查询筛选等

{"x" : /kaikeba/i}

7.数组
数据集可以用数组格式存储,与JavaSript中的数组表示相同

{"x" : ["kaikeba", "kaikeba.com"]}

数组中可以包含不同类型的数据元素,包括内嵌文档和数组等。所有MongoDB中键-值对支持的数据类型都可以用做数组的值。
8.内嵌文档
文档中可以嵌套一个子文档。在MongoDB文档总大小限制为16MB,建议使用子文档的形式组织数据,子文档查询效率要高于多键查询。

{"x" : {"kaikeba" : "kaikeba.com"}}

文档可以做为键的值,即:内嵌文档。MongoDB与关系型数据库相比,最大的优势就是内嵌文档。 与关系型数据库的扁平化数据结构相比,使用内嵌文档可以数据的组织方式更加自然。
9._id和ObjectId
MongoDB中每个文档都有一个"id"键,“id"可以是任何类型,不赋值”_id"时MongoDB会生成一个 ObjectId对象,示例如下。在实际应用中,建议给id赋值。

{"_id" : ObjectId()}

ObjectId是一个12字节(24个十六进制数字)的存储空间,ObjectId的12字节数据组织方式如下

{"_id" : ObjectId("5444cce6aef53b0f343e2b9b")} 
/* 上面ObjectId各位字符含义如下 */ 
//5444cce6,第0〜3字节(第1〜8位)为时间戳 
//aef53b,第4〜6字节(第9〜14位)为机器码 
//0f34,第7〜8字节(第15〜18位)为进程ID 
//3e2b9b,第9〜11字节(第19〜24位)为自增计数器

10.代码
MongoDB的文档和代码中可以包括JavaScript代码

{"x" : function(){ /*这里是一段JavaScript代码*/}}

11.二进制数据
二进制数据是一个二进制字节的字符串,要保存非UTF-8字符到数据库中,只能使用十进制数据。

4.mongoDB常用指令

登录,退出

登录:

>mongo ip地址   //默认端口号27017

如果想要外界访问本机的mongodb,需要修改mongodb.conf文件里的bind_ip:

bind_ip=0.0.0.0

退出:

>exit

有关数据库的操作

查看数据库
注意:数据库中至少有一条数据,此时的数据库才会显示出来

>show dbs

切换数据库
注意:这个指令也可以用于创建数据库,但只有添加数据后,show dbs才能看到该数据库

>use 数据库名

查看当前数据库,默认数据库:test

>db

删除当前数据库
注意:只是清空了当前的数据库,数据库还存在。

>db.dropDatabase()

有关集合(相当于表)的操作

查看所有的数据集

>show collections

创建集合
(相当于创建表)

>db.createCollection("user1")

删除集合

>db.collectionName.drop()

集合重命名

>db.oldCollectionName.renameCollection("newName")

关于集合中数据的操作

新增数据

>db.collectionName.insert({"key":value,"key":value})>db.collectionName.save({"key":value,"key":value})

删除某集合中的所有数据

>db.collectionName.remove({})

注意:
remove用于将集合中的文档删除,但不删除集合本身,也不删除集合的索引。
drop不仅删除集合的文档,也会删除集合本身,同时也会删除在集合上创建的索引。
条件删除

>db.collectionName.remove({key:value})>db.collectionName.remove({key:value},1)//指定删除数据的条数

例子:
在这里插入图片描述

查询所有数据

>db.collectionName.find()

例子:没有指定_id,_id自动被赋值。建议在实际应用中,对_id赋值。注意是_id而不是id。
在这里插入图片描述
查询一条数据

>db.collectionName.findOne();

条件查询
gt: greater than
lt: less than
e: equals

>db.collectionName.find({"age":26}) //查询等值关系 
>db.collectionName.find({age : {$gt : 100}})  // 大于100 
>db.collectionName.find({age : {$gte : 100}})  //大于等于100 
>db.collectionName.find({age : {$lt : 150}}) //小于150 
>db.collectionName.find({age : {$lte : 150}}) //小于等于150 
>db.collectionName.find({age : {$lt :200, $gt : 100}})  //大于100,小于200

find()以非结构化的方式展示文档,如果你需要以易读的方式来读取数据,可以使用 pretty() 方法:

>db.collectionName.find().pretty()

例子:
在这里插入图片描述
and 关系
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,相当于SQL 的 AND ,但在mongodb中并不将and关键字写出来。

>db.collectionName.find({key1:value1, key2:value2}).pretty()

or关系
MongoDB OR 条件语句使用了关键字 $or

>db.collectionName.find({$or: [ {key1: value1}, {key2:value2}]}).pretty()

例子:
在这里插入图片描述
查询指定列
1,1,true代表要显示,而不是取值

> db.collectionName.find({},{name:1,age:1,sex_orientation:true})

查询指定字段的数据,并去重

> db.collectionName.distinct('sex')

对结果集排序

> db.collectionName.find().sort({salary:1})   //升序 
> db.collectionName.find().sort({salary:-1}) //降序

例子:
在这里插入图片描述
统计记录数

> db.collectionName.find().count()

查询限定条数

>db.collectionName.find().limit(number)

使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过开头指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

>db.collectionName.find().limit(NUMBER).skip(NUMBER)

更新数据

db.collectionName.update(<query>,<update>,{upsert: <boolean>, multi: <boolean>)

参数说明:
query: 查询条件
update : 更新后的数据,可以理解为sql update查询内set后面的
upsert : 可选,如果不存在update的记录,是否插入新数据,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
示例:

> db.collectionName.update({name:'tom'},{$set:{age:23}},false,true) 

5.Java操作MongoDB

在这之前,需要在Linux的mongodb.conf里修改bind_ip,如果没有指定bind_ip,会导致mongodb默认绑定为127.0.0.1,导致外部无法访问。
mongodb.conf在安装包的bin文件夹下:

[root@czn001 mongodb-linux-x86_64-4.0.19-rc0]# cd bin
[root@czn001 bin]# ll
total 234072
-rwxr-xr-x. 1 a    a     9179776 Jun  3 06:01 bsondump
-rwxr-xr-x. 1 a    a        7732 Jun  3 06:15 install_compass
-rwxr-xr-x. 1 a    a    39753192 Jun  3 06:15 mongo
-rwxr-xr-x. 1 a    a    62446952 Jun  3 06:15 mongod
-rw-r--r--. 1 root root       99 Nov 13 19:52 mongodb.conf
-rwxr-xr-x. 1 a    a    11386400 Jun  3 06:01 mongodump
-rwxr-xr-x. 1 a    a    10894080 Jun  3 06:01 mongoexport
-rwxr-xr-x. 1 a    a    10760264 Jun  3 06:01 mongofiles
-rwxr-xr-x. 1 a    a    11058824 Jun  3 06:01 mongoimport
-rwxr-xr-x. 1 a    a    15408640 Jun  3 06:02 mongoreplay
-rwxr-xr-x. 1 a    a    11553120 Jun  3 06:01 mongorestore
-rwxr-xr-x. 1 a    a    35449488 Jun  3 06:15 mongos
-rwxr-xr-x. 1 a    a    11074960 Jun  3 06:01 mongostat
-rwxr-xr-x. 1 a    a    10692184 Jun  3 06:01 mongotop
[root@czn001 bin]# vi mongodb.conf

mongodb.conf:

dbpath = /home/a/mongodb/data
logpath = /home/a/mongodb/logs/mongodb.log
port = 27017
fork = true
bind_ip=0.0.0.0

第一步:添加mongodb-java-driver驱动包

    <dependencies>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.11.0</version>
        </dependency>
    </dependencies>

第二步:连接数据库并操作数据(增删改查)

public class Demo1 {
    public static void main(String[] args) {
        //1.建立mongodb的连接
        MongoClient mgc = new MongoClient("这里填ip地址",27017);
        //2.获取数据库(如果不存在该数据库,就创建)
        MongoDatabase mydb1 = mgc.getDatabase("mydb1");
        //如果能打印出数据库信息,说明连接成功
        System.out.println(mydb1);//com.mongodb.client.internal.MongoDatabaseImpl@3bd82cf5
        //3.创建新集合(如果该集合已存在了,会报错)
        //mydb1.createCollection("users");
        //4.获取该集合,对其进行增删改查
        MongoCollection<Document> users = mydb1.getCollection("users");
        //增
        for(int i=30;i<35;i++){
            Document doc = new Document("_id",i);//_id重复会报错
            doc.append("name","李四");
            doc.append("age",i);
            users.insertOne(doc);//无返回值
            System.out.println("新增成功");
        }
        Document doc = new Document("_id",1);//_id重复会报错
        doc.append("name","王五");
        doc.append("age",20);
        users.insertOne(doc);//无返回值
        System.out.println("新增成功");

        //改 (把王五的年龄改成35)
        //改单行
        users.updateOne(Filters.eq("name","王五"),new Document("$set",new Document("age",35)));
        //改多行:updateMany

        //删除 (把名字为李四、年龄为33的信息删除掉)
        users.deleteOne(Filters.and(Filters.eq("name","李四"),Filters.eq("age",33)));
        //删多行:updateMany

        //查
        FindIterable<Document> documents = users.find();
        //获取迭代器
        MongoCursor<Document> iterator = documents.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //清空数据库
        //users.drop();

    }
}

补充:这两篇教程是关于Java操作MongoDB的,第一篇讲基本的增删改查,第二篇讲条件查询。
java连接mongoDB 并进行增删改查操作
MongoDB 组合多个条件查询( and、 in、 gte、 lte)

6.MongoDB索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个 文件并选取那些符合查询条件的记录。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列 的值进行排序的一种结构。

1.创建索引的语法

>db.collection.createIndex(keys, options)

options取值的含义:
在这里插入图片描述
在这里插入图片描述
2.索引分类
(1) 默认索引
MongoDB有个默认的“ _id ”的键,相当于“主键”的角色。集合创建后系统会自动创建一个索引在“ _id”键上,它是默认索引,索引名叫“ _id _ ”,是无法被删除的。我们可以通过以下方式查看:

>db.collectionName.getIndexes()

例子:

> db.users.find()
{ "_id" : 30, "name" : "李四", "age" : 30 }
{ "_id" : 31, "name" : "李四", "age" : 31 }
{ "_id" : 32, "name" : "李四", "age" : 32 }
{ "_id" : 34, "name" : "李四", "age" : 34 }
{ "_id" : 1, "name" : "王五", "age" : 35 }
> db.users.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "mydb1.users"
	}
]

(2) 单列索引
在单个键上创建的索引就是单列索引,语法如下:(1表示正序,-1逆序)

>db.collectionName.createIndex({"name":1})

例子:
例如我们要在users集合上给name键创建一个单列索引

> db.users.createIndex({"name":1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
> db.users.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "mydb1.users"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1
		},
		"name" : "name_1",
		"ns" : "mydb1.users"
	}
]

(3) 组合索引
另外,我们还可以同时对多个键创建组合索引。

>db.collectionName.createIndex({"userid":1,"username":-1})

例子:
例如按照name正序、age逆序创建组合索引

> db.users.createIndex({"name":1,"age":-1});
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}
> db.users.getIndexes()
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "mydb1.users"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1
		},
		"name" : "name_1",
		"ns" : "mydb1.users"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1,
			"age" : -1
		},
		"name" : "name_1_age_-1",
		"ns" : "mydb1.users"
	}
]

(4) 唯一索引
唯一索引限制了对当前键添加值时,不能添加重复的信息。值得注意的是,当文档不存在指定键时,会被认为键值是“null”,所以“null”也会被认为是重复的 ,所以一般被作为唯一索引的键,最好都要有键值对
对“UserId”创建唯一索引(这时候最后一个参数为“true”):

>db.collectionName.CreateIndex({"UserId":1}, { unique: true });

(5)TTL索引
TTL指生命周期的意思。即存储的document存储带有过期时间属性,超过生命周期自己主动删除。像日志数据、系统自己主动产生的暂时数据、会话数据等均符合这一场景。

db.log_events.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600})

(6) 删除索引

>db.collectionName.dropIndexes()
>db.collectionName.dropIndex("索引名称")//删除集合指定索引

remove用于将集合中的文档删除,但不删除集合本身,也不删除集合的索引。
drop不仅删除集合的文档,也会删除集合本身,同时也会删除在集合上创建的索引。
例子:

> db.users.remove({})
WriteResult({ "nRemoved" : 3 })
> db.users.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "mydb1.users"
}
]
> db.users.drop()
true
> db.users.getIndexes()
[ ]

7.MongoDB备份与恢复

使用mongodump命令来备份数据,使用mongorestore 命令来恢复备份的数据。

mongodump命令:备份数据
该命令可以导出所有数据到指定目录中。

>mongodump -h dbhost -d dbname -o dbdirectory
  • -h:
    MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
  • -d:
    需要备份的数据库实例,例如:test
  • -o:
    备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
    mongorestore 命令:恢复备份的数据
>mongorestore -h <hostname><:port> -d dbname <path>
  • –host <:port>, -h <:port>:
    MongoDB所在服务器地址,默认为: localhost:27017
  • –db , -d :
    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
  • –drop:
    恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
  • path:
    mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定 和 --dir 选项,–dir也可以设置备份目录。
  • –dir:
    指定备份的目录
    你不能同时指定path和–dir选项。

8.集群搭建

集群搭建方式之一就是mongoDB复制集,即一组mongod的进程。他们维护同一个数据集合。复制集 保证了数据的可靠性和高读取能力。

原理

一组复制集就是一组mongod实例管理同一个数据集,实例key在不同的机器上,实例包含主实例 (primary),接受所有的写操作,其他的属于副本实例(Secondary),从服务器保持与主服务器数据同步,类似于redis中的主从复制

每个复制集还有一个仲裁者(Arbiter),仲裁者对偶数集群有效,仲裁者的任务就是通过心跳机制来确认集群中集合的数量,并在选举主服务器的过程中进行裁决。仲裁者并不存储数据,性质等价于redis中的哨兵机制

MongoDB中的复制集(也被称为副本)是一组维护相同数据集的mongod进程。副本集提供冗余性及和高可用,是所有生产部署的基础。简单来说,复制集有多台MongoDB组成的一个集群,集群中有一个主节点(Primary)和N个副本节点(Secondary)等,它们有相同的数据库,假如主MongoDB服务器或者MongoDB实例Down机之后,其它的副本服务器可以继续提供服务,实现数据的高可用及可靠性。

术语类型描述
Primary主节点负责整个集群的读写操作,包含了所有改变操作的日志
Secondary备节点同步主服务器所有的数据,负责集群的读取请求,主服务器宕机可以变成主节点
Arbiter仲裁者在主节点宕机后只进行投票,不参与选举,不同步主节点数据

1)Primary节点为主节点,所有的写操作或者更改操作都只能从Primary节点中操作(复制集内的所有成员都可以接收读操作,但是,默认情况下,应用程序将其读操作指向主成员),主节点上所有的更改及写操作都会记录到oplog日志中。

2)两台Secondary节点复制Primary节点的oplog日志,通过异步的方式去执行oplog日志中的记录来和Primary节点达到数据一致性。

3)oplog作用主要是记录主节点的写入操作,充当复制源。

4)如果Primary节点无故Down机之后,复制集集群会通过投票机制在两台Secondary中选举一台升级为Primary节点。

详见:
MongoDB官方文档(英文)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

搭建步骤

(1)准备三台虚拟机服务器,并各自安装好mongoDB,保证三个服务器的防火墙都已关闭

192.168.132:27017

192.168.133:27017

192.168.134:27017
(2)修改mongodb.conf文件,添加replSet配置(三台都需要修改成同一个名称),然后3个mongoDB

#复制集名称 
replSet=rep1

(3)初始化复制集,使用任意一台虚拟机执行初始化操作

rs.initiate({_id:'rep1',members:[{_id:1,host:'192.168.197.132:27017'}, {_id:2,host:'192.168.197.133:27017'},{_id:3,host:'192.168.197.134:27017'}]})

(4)查看集群状态

rs.status()

(5)在主机的momgoDB进行写操作,在从机进行读操作

db.users.insert({"name":"lisi","age":11})

切换到从数据库查询数据 如果不允许查询,是因为默认情况下从数据库是不允许读写操作的,需要设置:

>rs.slaveOK() //从机执行该命令后可以查询数据

(7) 主复制集添加仲裁者(arbiter)
现在我们的环境是一主两从,仲裁者对偶数集群有效。需要停止一个从机,在主服务器中运行下面命令

rs.remove(“ip:端口号”) //删除从节点

在一主一从关系中,主机宕机无法选举出新主机(从机并不会变成主机),无法提供写操作,此时需要加入仲裁者节点。

rs.addArb(“ip:端口号”)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值