从零开始 MongoDB 集群(ReplSet)搭建 之二 群集搭建
从零开始 MongoDB 集群(ReplSet)搭建 之二 群集搭建
前言
本文只是根据个人经验介绍在搭建集群过程中遇到的坑和需要理解的内容,经过多次尝试,总结的结论,可能这些结论也不一定是对的,但目前是好使的。如果有经验的高手看到了,欢迎指正。
会安装MongoDB服务之后,我们开始搭建群集。
MongoDB群集的概念
群集又叫复制集(Replication Set)。MongoDB用replSet表示,有时候也会ReplSet。一般是一个主节点Primary Node 和多个从节点 Secondary Node 组成,有时候还会有 Arbiter Node 也就是仲裁节点。集群必须有个名字,这个名字就是配置节点中的replSet配置。
Type | Desc |
---|---|
Primary | 默认负责数据的读写。 |
Secondary | 默认负责同步Primary 的日志。用来更新自己的数据,保证自身的数据跟 Primary一致。后期可以设置为可读,用以分担Primary的读取压力。读写分离一般会设置Secondary为可读。 |
Arbiter | 平时啥也不干,也不存储数据,只在Primary 宕机后,投票选出谁做主节点。(做集群的时候可以没有) |
结构如下图(图中没有包含仲裁节点):
搭建实例
依照图上看我们至少要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 |
我的目录结构是这样的:
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 shell管理控制台实例中 mongo 127.0.0.1:30000
如图:
关联三台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管理控制台中执行上述代码。
结果是这样的:
代表创建成功,但这个有个问题,我们准备做主节点的 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})
在查看状态:rs.status()
后记
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 |
至此,文章结束,希望对你有帮助,如果有不足的地方,希望能指出,共同进步!