MongoDB Replica Set集群部署

来源:互联网 发布:被优化掉是什么 编辑:程序博客网 时间:2024/06/11 07:14
复制集是一个带有故障转移的主从集群。是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复。复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一个主结点。该主结点被称为primary,一个或多个从结点被称为secondaries。primary结点基本上就是master结点,不同之处在于primary结点在不同时间可能是不同的服务器。如果当前的主结点失效了,复制集中的其余结点将会试图选出一个新的主结点。复制集模式的好处是,一切自动化。首先,复制集模式本身做了大量的管理工作,自动管理从节点,确保数据不会不一致。其次,主节点挂掉后,会自动判断集群中的服务器并进行故障转移,推举新的主节点。 一个复制集集群支持1-7台服务器,在一个复制集中各个服务器数据保持完全一致。 
在一个复制集集群中,各个服务器有以下几种状态:
Primary 主节点:一个复制集有且仅有一台服务器处于Primary状态,只有主节点才对外提供读写服务。如果主节点挂掉,复制集将会投票选出一个备用节点成为新的主节点。
Secondary 备用节点:复制集允许有多台Secondary,每个备用节点的数据与主节点的数据是完全同步的。
Recovering 恢复中:当复制集中某台服务器挂掉或者掉线后数据无法同步,重新恢复服务后从其他成员复制数据,这时就处于恢复过程,数据同步后,该节点又回到备用状态。
Arbiter 仲裁节点:该类节点可以不用单独存在,如果配置为仲裁节点,就主要负责在复本集中监控其他节点状态,投票选出主节点。该节点将不会用于存放数据。如果没有仲裁节点,那么投票工作将由所有节点共同进行。
Down 无效节点:当服务器挂掉或掉线时就会处于该状态。

复制集的从节点读请求,也是在各个Driver层设置slaveOk的值来实现的。


Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。

一、服务器环境
主节点:192.168.110.71:10111
备节点:192.168.100.90:10111
备节点:192.168.100.110:10111
仲裁节点:192.168.100.90:20111
二、安装mongodb(略)
三、配置mongodb

创建节点数据目录
cd /home/slim/mongodb-2.6.8
主节点:192.168.110.71
mkdir -p ./data/master
备节点:192.168.100.90
mkdir -p ./data/slaver
备节点:192.168.100.110
mkdir -p ./data/slaver
仲裁节点:192.168.100.90
mkdir -p ./data/arbiter
#三个目录分别对应主,备,仲裁节点
1.主节点192.168.110.71配置文件

conf/mongodb-master.conf

dbpath=/home/slim/mongodb-2.6.8/data/masterlogpath=/home/slim/mongodb-2.6.8/logs/master.logpidfilepath=/home/slim/mongodb-2.6.8/data/master.piddirectoryperdb=truelogappend=truereplSet=test_set1bind_ip=192.168.110.71port=10111oplogSize=1000fork=truenoprealloc=true
2.备节点192.168.100.90配置文件
conf/mongodb-slaver.conf

dbpath=/home/slim/mongodb-2.6.8/data/slaverlogpath=/home/slim/mongodb-2.6.8/logs/slaver.logpidfilepath=/home/slim/mongodb-2.6.8/data/slaver.piddirectoryperdb=truelogappend=truereplSet=test_set1bind_ip=192.168.100.90port=10111oplogSize=1000fork=truenoprealloc=truesmallfiles=true
3.备节点192.168.100.110配置文件
conf/mongodb-slaver.conf

dbpath=/home/slim/mongodb-2.6.8/data/slaverlogpath=/home/slim/mongodb-2.6.8/logs/slaver.logpidfilepath=/home/slim/mongodb-2.6.8/data/slaver.piddirectoryperdb=truelogappend=truereplSet=test_set1bind_ip=192.168.100.110port=10111oplogSize=1000fork=truenoprealloc=truesmallfiles=true

4.仲裁节点192.168.100.90 配置文件conf/mongodb-arbiter.conf

dbpath=/home/slim/mongodb-2.6.8/data/arbiterlogpath=/home/slim/mongodb-2.6.8/logs/arbiter.logpidfilepath=/home/slim/mongodb-2.6.8/data/arbiter.piddirectoryperdb=truelogappend=truereplSet=test_set1bind_ip=192.168.100.90port=20111oplogSize=1000fork=truenoprealloc=true
参数解释
dbpath:数据存放目录
logpath:日志存放路径
pidfilepath:进程文件,方便停止mongodb
directoryperdb:为每一个数据库按照数据库名建立文件夹存放
logappend:以追加的方式记录日志
replSet:replica set的名字
bind_ip:mongodb所绑定的ip地址
port:mongodb进程所使用的端口号,默认为27017
oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
fork:以后台方式运行进程
noprealloc:不预先分配存储

四、启动服务
进入每个mongodb节点根据配置,启动服务
./bin/monood -f conf/mongodb-master.conf
./bin/mongod -f conf/mongodb-slaver.conf
./bin/mongod -f conf/mongodb-arbiter.conf
5、配置主、备、仲裁节点
可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。

./mongo 192.168.100.90:10111>use admin>cfg={_id:"test_set1", members:[{_id:0,host:'192.168.110.71:10111',priority:3}, {_id:1,host:'192.168.100.90:10111',priority:2}, {_id:2,host:'192.168.100.110:10111',priority:1}, {_id:3,host:'192.168.100.90:20111',arbiterOnly:true}]};>rs.initiate(cfg); #使配置生效{        "info" : "Config now saved locally. Should come online in about a minute.",        "ok" : 1}
cfg是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的192.168.110.71:10111。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:

SECONDARY> rs.status();{        "set" : "test_set1",        "date" : ISODate("2015-03-16T08:28:20Z"),        "myState" : 2,        "syncingTo" : "192.168.110.71:10111",        "members" : [                {                        "_id" : 0,                        "name" : "192.168.110.71:10111",                        "health" : 1,                        "state" : 1,                        "stateStr" : "PRIMARY",                        "uptime" : 122,                        "optime" : {                                "t" : 1426494376000,                                "i" : 1                        },                        "optimeDate" : ISODate("2015-03-16T08:26:16Z"),                        "lastHeartbeat" : ISODate("2015-03-16T08:28:19Z"),                        "lastHeartbeatRecv" : ISODate("2015-03-16T08:28:19Z"),                        "pingMs" : 0,                        "electionTime" : {                                "t" : 1426494425000,                                "i" : 1                        },                        "electionDate" : ISODate("2015-03-16T08:27:05Z")                },                {                        "_id" : 1,                        "name" : "192.168.100.90:10111",                        "health" : 1,                        "state" : 2,                        "stateStr" : "SECONDARY",                        "uptime" : 366,                        "optime" : {                                "t" : 1426494376000,                                "i" : 1                        },                        "optimeDate" : ISODate("2015-03-16T08:26:16Z"),                        "infoMessage" : "syncing to: 192.168.110.71:10111",                        "self" : true                },                {                        "_id" : 2,                        "name" : "192.168.100.110:10111",                        "health" : 1,                        "state" : 2,                        "stateStr" : "SECONDARY",                        "uptime" : 122,                        "optime" : {                                "t" : 1426494376000,                                "i" : 1                        },                        "optimeDate" : ISODate("2015-03-16T08:26:16Z"),                        "lastHeartbeat" : ISODate("2015-03-16T08:28:20Z"),                        "lastHeartbeatRecv" : ISODate("2015-03-16T08:28:20Z"),                        "pingMs" : 66,                        "syncingTo" : "192.168.110.71:10111"                },                {                        "_id" : 3,                        "name" : "192.168.100.90:20111",                        "health" : 1,                        "state" : 7,                        "stateStr" : "ARBITER",                        "uptime" : 122,                        "lastHeartbeat" : ISODate("2015-03-16T08:28:19Z"),                        "lastHeartbeatRecv" : ISODate("2015-03-16T08:28:20Z"),                        "pingMs" : 0                }        ],        "ok" : 1}
如果配置正在生效,其中会包含如下信息:
"stateStr" : "RECOVERING"
同时可以查看对应节点的日志,发现正在等待别的节点生效或者正在分配数据文件。

六、测试
1.往主节点插入数据,能从备节点查到之前插入的数据

PRIMARY> use test;switched to db testPRIMARY> db.user.insert({name:'jack',age:80});PRIMARY> db.user.find();{ "_id" : ObjectId("55069502bcdd8c8031522ddb"), "name" : "jack", "age" : 80 }
2.停掉主节点,备节点能变成主节点提供服务

SECONDARY> rs.status();{        "set" : "test_set1",        "date" : ISODate("2015-03-16T08:37:17Z"),        "myState" : 2,        "syncingTo" : "192.168.100.90:10111",        "members" : [                {                        "_id" : 0,                        "name" : "192.168.110.71:10111",                        "health" : 0,                        "state" : 8,                        "stateStr" : "(not reachable/healthy)",                        "uptime" : 0,                        "optime" : {                                "t" : 1426494722000,                                "i" : 1                        },                        "optimeDate" : ISODate("2015-03-16T08:32:02Z"),                        "lastHeartbeat" : ISODate("2015-03-16T08:37:15Z"),                        "lastHeartbeatRecv" : ISODate("2015-03-16T08:35:46Z"),                        "pingMs" : 0                },                {                        "_id" : 1,                        "name" : "192.168.100.90:10111",                        "health" : 1,                        "state" : 1,                        "stateStr" : "PRIMARY",                        "uptime" : 656,                        "optime" : {                                "t" : 1426494722000,                                "i" : 1                        },                        "optimeDate" : ISODate("2015-03-16T08:32:02Z"),                        "lastHeartbeat" : ISODate("2015-03-16T08:37:15Z"),                        "lastHeartbeatRecv" : ISODate("2015-03-16T08:37:16Z"),                        "pingMs" : 4,                        "electionTime" : {                                "t" : 1426494955000,                                "i" : 1                        },                        "electionDate" : ISODate("2015-03-16T08:35:55Z")                },                {                        "_id" : 2,                        "name" : "192.168.100.110:10111",                        "health" : 1,                        "state" : 2,                        "stateStr" : "SECONDARY",                        "uptime" : 1142,                        "optime" : {                                "t" : 1426494722000,                                "i" : 1                        },                        "optimeDate" : ISODate("2015-03-16T08:32:02Z"),                        "infoMessage" : "syncing to: 192.168.100.90:10111",                        "self" : true                },                {                        "_id" : 3,                        "name" : "192.168.100.90:20111",                        "health" : 1,                        "state" : 7,                        "stateStr" : "ARBITER",                        "uptime" : 656,                        "lastHeartbeat" : ISODate("2015-03-16T08:37:16Z"),                        "lastHeartbeatRecv" : ISODate("2015-03-16T08:37:16Z"),                        "pingMs" : 0                }        ],        "ok" : 1}
可以发现192.168.110.71:10111不可以用。
3.恢复主节点,备节点也能恢复其备的角色,而不是继续充当主的角色
主节点192.168.110.71:10111又获取PRIMARY

注意
当我们在 replica set 进行检索操作时,默认的路由会选择 master 机器,当我们需 要针对任意的从机进行查询的时候,我们需要开启 slaveOk 选项。当我们在没有 开启 salveOk 选项的时候,如果进行此操作会报如下错:
*** not master and slaveok=false 所以我们要进行如下操作:
rs.slaveOk(); // enable querying a secondary
db.user.find(...)

0 0
原创粉丝点击