简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。
Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这
个设置叫做 Read Preference Modes,同时 Java 客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。
介绍完了集群方案,那么现在就开始搭建了。
注意:为了方便,没个节点只有一个解压MongoDB文件,启动的时候按不同的配置文件启动就行
1.建立数据文件夹
mkdir -p /opt/mongodb/replset/master
mkdir -p /opt/mongodb/replset/slaver
mkdir -p /opt/mongodb/replset/arbiter
2.建立配置文件
由于配置比较多,所以我们将配置写到文件里。
vi /opt/mongodb/replset/master/mongodb.cfg
dbpath=/opt/mongodb/replset/master/data
logpath=/opt/mongodb/replset/master/logs/mongodb.log
logappend=true
replSet=shard002
bind_ip=192.168.209.128
port=27017
fork=true
vi /opt/mongodb/replset/slave/mongodb.cfg
dbpath=/opt/mongodb/replset/slave/data
logpath=/opt/mongodb/replset/slave/logs/mongodb.log
logappend=true
replSet=shard002
bind_ip=192.168.209.129
port=27017
fork=true
vi /opt/mongodb/replset/arbiter/mongodb.cfg
dbpath=/opt/mongodb/replset/arbiter/data
logpath=/opt/mongodb/replset/arbiter/logs/mongodb.log
logappend=true
replSet=shard002
bind_ip=192.168.209.130
port=27017
fork=true
参数解释:
logpath:日志存放路径
logappend:以追加的方式记录日志
replSet:replica set 的名字
port:mongodb 进程所使用的端口号,默认为 27017
fork:以后台方式运行进程
3、分发到集群下的其他机器
#将从节点配置发送到 192.168.209.129
scp -r /opt/mongodb/replset/slave
root@192.168.209.129:/opt/mongodb/replset
#将仲裁节点配置发送到 192.168.209.130
scp -r /opt/mongodb/replset/arbiter
root@192.168.209.130:/opt/mongodb/replset
4.启动 mongodb
#登录 192.168.209.128 启动主节点
monood -f /opt/mongodb/replset/master/mongodb.cfg
#登录 192.168.209.129 启动从节点
mongod -f /opt/mongodb/replset/slave/mongodb.cfg
#登录 192.168.209.130 启动仲裁节点
mongod -f /opt/mongodb/replset/arbiter/mongodb.cfg
注意配置文件的路径一定要保证正确,可以是相对路径也可以是绝对路径。
5.配置主,备,仲裁节点
可以通过客户端连接 mongodb,也可以直接在三个节点中选择一个连接 mongodb。
mongo 192.168.209.128:27017
use admin
cfg={_id:"shard002",members:[{_id:0,host:'192.168.209.128:27017',priority:9},{_id:1,host:'192.168.209.129:27017',priority:1},{_id:2,host:'192.168.209.130:27017',arbiterOnly:true}]};
#使配置生效
rs.initiate(cfg)
先级。优先级最高的即成为主节点,即这里的 192.168.209.128:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。
配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行 rs.status()命令会看到如下信息:
{
"set" : "testrs",
"date" : ISODate("2013-01-05T02:44:43Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.209.128:27004",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 200,
"optime" : Timestamp(1357285565000, 1),
"optimeDate" :
ISODate("2017-12-22T07:46:05Z"),
"self" : true
},
{
"_id" : 1,
"name" : "192.168.209.128:27003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 200,
"optime" : Timestamp(1357285565000, 1),
"optimeDate" :
ISODate("2017-12-22T07:46:05Z"),
"lastHeartbeat" :
ISODate("2017-12-22T02:44:42Z"),
"pingMs" : 0
},
{
"_id" : 2,
"name" : "192.168.209.128:27005",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 200,
"lastHeartbeat" :
ISODate("2017-12-22T02:44:42Z"),
"pingMs" : 0
}
],
"ok" : 1
}
如果配置正在生效,其中会包含如下信息:
"stateStr" : "STARTUP"
同时可以查看对应节点的日志,发现正在等待别的节点生效或者正在分配数据文件。
现在基本上已经完成了集群的所有搭建工作。