前言

本文只是根据个人经验介绍在搭建集群过程中遇到的坑和需要理解的内容,经过多次尝试,总结的结论,可能这些结论也不一定是对的,但目前是好使的。如果有经验的高手看到了,欢迎指正。

会安装MongoDB服务之后,我们开始搭建群集。

MongoDB群集的概念

群集又叫复制集(Replication Set)。MongoDB用replSet表示,有时候也会ReplSet。一般是一个主节点Primary Node 和多个从节点 Secondary Node 组成,有时候还会有 Arbiter Node 也就是仲裁节点。集群必须有个名字,这个名字就是配置节点中的replSet配置。

Type

Desc

Primary

默认负责数据的读写。

Secondary

默认负责同步Primary 的日志。用来更新自己的数据,保证自身的数据跟 Primary一致。后期可以设置为可读,用以分担Primary的读取压力。读写分离一般会设置Secondary为可读。

Arbiter

平时啥也不干,也不存储数据,只在Primary 宕机后,投票选出谁做主节点。(做集群的时候可以没有)

结构如下图(图中没有包含仲裁节点):

mongodb remove 性能 mongodb replset_群集

搭建实例

依照图上看我们至少要3个MongoDB的实例,根据第一篇文章,我们知道如何创建MongoDB服务。依照这样的方式创建3个:

type

ip

port

servicename

service display Name

primary

127.0.0.1

30000

mongodb_primary

mongodb priamry

secondary

127.0.0.1

30001

mongodb_secondary

mongodb secondary

arbiter

127.0.0.1

30002

mongodb_arbiter

mongodb arbiter

我的目录结构是这样的:

mongodb remove 性能 mongodb replset_群集_02

Primary

配置:

#primary.conf    
dbpath=D:\MongoDBCluster\Test\shard0_primary\data
logpath=D:\MongoDBCluster\Test\shard0_primary\log\shard0_primary.log    
pidfilepath=D:\MongoDBCluster\Test\shard0_primary\shard0_primary.pid    
directoryperdb=true    
logappend=true   
replSet=replSet_demo
port=30000
bind_ip=127.0.0.1

安装代码:

mongod --config D:\MongoDBCluster\Test\shard0_primary\primary.cfg --serviceName "mongodb_primary" --serviceDisplayName "mongodb priamry" --install

请注意上述配置文件中比之前多了一个 replSet=replSet_demo replSet_demo就是集群的名称,也叫复制集的名称。
配置文件中的目录是创建好了的

Secondary

#secondary.conf    
dbpath=D:\MongoDBCluster\Test\shard0_secondary\data
logpath=D:\MongoDBCluster\Test\shard0_secondary\log\shard0_secondary.log    
pidfilepath=D:\MongoDBCluster\Test\shard0_secondary\shard0_secondary.pid    
directoryperdb=true    
logappend=true   
replSet=replSet_demo
port=30001
bind_ip=127.0.0.1

安装代码:

mongod.exe --config D:\MongoDBCluster\Test\shard0_secondary\secondary.cfg --serviceName "mongodb_secondary" --serviceDisplayName "mongodb secondary" --install

Arbiter

#arbiter.conf    
dbpath=D:\MongoDBCluster\Test\shard0_arbiter\data
logpath=D:\MongoDBCluster\Test\shard0_arbiter\log\shard0_arbiter.log    
pidfilepath=D:\MongoDBCluster\Test\shard0_arbiter\shard0_arbiter.pid    
directoryperdb=true    
logappend=true   
replSet=replSet_demo
port=30002
bind_ip=127.0.0.1

安装代码:

mongod.exe --config D:\MongoDBCluster\Test\shard0_arbiter\arbiter.cfg --serviceName "mongodb_arbiter" --serviceDisplayName "mongodb arbiter" --install

以上代码执行下来,结果如图:

mongodb remove 性能 mongodb replset_修改_03

mongodb remove 性能 mongodb replset_安装_04

关联实例,设置集群

启动所有服务,然后随意进到一个Mongodb shell管理控制台实例中 mongo 127.0.0.1:30000 如图:

mongodb remove 性能 mongodb replset_mongodb remove 性能_05

关联三台mongodb实例,配置如下:

config = {
    _id: 'replSet_demo', 
    members: [
            {_id: 0, host: '127.0.0.1:30000',priority:1},
            {_id: 1, host: '127.0.0.1:30001',priority:2},
            {_id: 2, host: '127.0.0.1:30002',"arbiterOnly":true}]
          }  

rs.initiate(config)

config._id 为 集群的名称,也就是我们之前配置的 replSet=replSet_demo。"arbiterOnly":true 代表这个节点是仲裁节点。
在 mongodb shell管理控制台中执行上述代码。

结果是这样的:

mongodb remove 性能 mongodb replset_MongoDB_06

代表创建成功,但这个有个问题,我们准备做主节点的 127.0.0.1:30000变成了secondary,只需要调整一下就可以了,原因是我们在配置的时候,把优先级些错了。priority 是优先级,级别越高越优先。

此时,主节点为:127.0.0.1:30001,我们登录主节点才能修改,mongo 127.0.0.1:30001执行如下代码:

config = {
    _id: 'replSet_demo', 
    members: [
            {_id: 0, host: '127.0.0.1:30000',priority:2},
            {_id: 1, host: '127.0.0.1:30001',priority:1},
            {_id: 2, host: '127.0.0.1:30002',"arbiterOnly":true}]
          }  
    rs.reconfig(config,{force:true})

mongodb remove 性能 mongodb replset_修改_07

在查看状态:rs.status()

mongodb remove 性能 mongodb replset_群集_08

后记

MongoDB的复制集就搭建完毕了。但为什么要搭建集群,什么样的情况搭建适合搭建集群。这个问题留给读者自己吧。
在搭建完毕之后如何修改,我们可以查看 rs.help() 去查看帮助命令。相对比较简单,我就不赘述了。最后附上比较常用的方法:

方法

作用

rs.help()

查看帮助

rs.status()

查询复制集状态

rs.conf()

获取复制集配置

rs.initiate()

使用null初始化复制集

rs.initiate(config)

使用配置文件初始化复制集

rs.add(hostportstr)

增加新的节点

rs.remove(hostportstr)

删除节点

rs.addArb(hostportstr)

添加仲裁节点,一个复制集建议只需要一个仲裁节点。

rs.secondaryOk()

让从节点可以支持查询操作。Allows read operations on secondary members for the MongoDB connection.

db.isMaster()

check who is primary

db.hello()

check who is primary

至此,文章结束,希望对你有帮助,如果有不足的地方,希望能指出,共同进步!