如何配置 MongoDBmongo 副本集配置

1320人阅读
mongodb(2)
分别在三个主机上安装mongodb,可以使用yum进行安装。
主机IP分别为:
192.168.0.1
192.168.0.2
192.168.0.3
2.配置文件设置
由于配置比较多,所以我们将配置写到文件里。
编辑每个节点的配置文件:
vi /etc/mongod.conf
文件内容:
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
dbPath: /var/lib/mongo
enabled: true
directoryPerDB:true
processManagement:
pidFilePath: /var/lib/mongo/mongod.pid
fork: true
bindIp:192.168.0.X
port: 27017
replication:
oplogSizeMB: 10000
replSetName: test
参数解释:
storage.dbpath:数据存放目录
storage.directoryperdb:为每一个数据库按照数据库名建立文件夹存放
systemLog.path:日志存放路径
systemLog.logappend:以追加的方式记录日志
processManagement.pidfilepath:进程文件,方便停止mongodb
processManagement.fork:以后台方式运行进程
replication.oplogSizeMB:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
replication.replSetName:replica set的名字
net.bind_ip:mongodb所绑定的ip地址,默认绑定127.0.0.1
net.port:mongodb进程所使用的端口号,默认为27017
其他参数说明请参考
3.启动mongodb
systemctl start mongod
4.配置主备仲裁节点
可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
192.168.0.1:27017
切换到admin数据库
配置集群参数
cfg={_id:"test",members:[{_id:0,host:"192.168.0.1:27017",priority:2},{_id:1,host:"192.168.0.2:27017",priority:1},{_id:2,host:"192.168.0.3:27017",arbiterOnly:true}]}
使配置生效
rs.initiate(cfg)
cfg是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的192.168.0.1:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。
配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。如果生效了,执行rs.status()命令会看到如下信息:
"set" : "test",
"date" : ISODate("2016-04-21T07:47:40.515Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
"_id" : 0,
"name" : "192.168.0.1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 84,
"optime" : {
"ts" : Timestamp(, 1),
"t" : NumberLong(1)
"optimeDate" : ISODate("2016-04-21T07:47:22Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(, 1),
"electionDate" : ISODate("2016-04-21T07:47:21Z"),
"configVersion" : 1,
"self" : true
"_id" : 1,
"name" : "192.168.0.2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 30,
"optime" : {
"ts" : Timestamp(, 1),
"t" : NumberLong(1)
"optimeDate" : ISODate("2016-04-21T07:47:22Z"),
"lastHeartbeat" : ISODate("2016-04-21T07:47:39.985Z"),
"lastHeartbeatRecv" : ISODate("2016-04-21T07:47:39.657Z"),
"pingMs" : NumberLong(1),
"syncingTo" : "szss-app-soa1:27017",
"configVersion" : 1
"_id" : 2,
"name" : "192.168.0.3:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 30,
"lastHeartbeat" : ISODate("2016-04-21T07:47:39.980Z"),
"lastHeartbeatRecv" : ISODate("2016-04-21T07:47:36.649Z"),
"pingMs" : NumberLong(1),
"configVersion" : 1
其他相关文章:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:92153次
积分:1099
积分:1099
排名:千里之外
原创:31篇
译文:10篇
(1)(4)(5)(5)(1)(2)(1)(3)(13)(4)(1)(2)(1)MongoDB(1)
进行副本集的配置:
1.&MongoDB数据文件存储路径。
2.&MongoDB日志文件存储路径。
3.&MongoDB&key文件存储路径。
4.&MongoDB实例监听端口。(/28012)
----------
mongod&--replSet&myset&--keyFile&C:\data\key\key0\key0&--port&28010&--dbpath&C:&
\data\data\data0&--logpath&C:\data\log\log0\log0.log&--logappend
mongod&--replSet&myset&--keyFile&C:\data\key\key1\key1&--port&28011&--dbpath&C:&
\data\data\data1&--logpath&C:\data\log\log1\log1.log&--logappend
mongod&--replSet&myset&--keyFile&C:\data\key\key2\key2&--port&28012&--dbpath&C:&
\data\data\data2&--logpath&C:\data\log\log2\log2.log&--logappend
----------
如何通过mongo客户端配置副本集
config_myset={_id:&'summer',&members:&[{_id:&0,&host:&'localhost:28010'},&{_id:&1,&host:&&
'localhost:28011'},&{_id:&2,&host:&'localhost:28012'}]};
rs.initate(config_myset);
db.getMongo().setSlaveOk();
不使用keyFile启动副本集
mongod&--replSet&myset&--port&28010&--dbpath&C:\data\data\data0&--logpath&C:\data\log\log0\log0.log&--logappend
mongod&--replSet&myset&--port&28011&--dbpath&C:\data\data\data1&--logpath&C:\data\log\log1\log1.log&--logappend
mongod&--replSet&myset&--port&28012&--dbpath&C:\data\data\data2&--logpath&C:\data\log\log2\log2.log&--logappend
关于副本集的原理分析:
1.&&&&副本集有且只有一台机器是primary,primary与secondary之间的数据复制是异步进行的,并且通过oplog进行。
2.&&&&副本集中的机器数最好为奇数。
3.&&&&Primary机器接收所有的写操作(无法改变的),我们可以配置read&preference,使得读操作可以发生在secondary机器上。如果读操作发生在primary机器上,那么数据就是强一致性的
4.&&&&副本集中最多有50台机器,之前的版本最多有12台机器。如果超过了50台,那么只能使用Master-Slave方式。不过如果使用Master-Salve方式,那么就失去了自动化的failover机制。
5.&&&&Arbiter机器(仲裁机器),它本身并不存放数据库数据,仅提供选举功能。
6.&&&&不要将arbiter机器放在primary或是secondary机器上。
7.&&&&对于secondary机器,可以进行如下配置:
a)&&&&禁止某台secondary机器成为primary机器,&priority为0。
b)&&&&禁止客户端读取某台secondary机器的数据,隐藏成员。
c)&&&&仅记录历史快照的secondary,延迟成员。比如说延迟一小时。
8.&&&&最常见的secondary机器依然是进行数据异步复制与保持系统高可用的形式。
9.&&&&副本集中最多有50台机器,其中具有投票功能的机器数量最多是7台(Secondary和Arbiter)。
10.&&&&Priority为0的机器,无法成为Primary的。
11.&&&&关于MongoDB的读写分离:
1).如果进行读写分离,那么要注意读有延迟,因为要通过oplog进行异步复制。
2).Secondary机器要通过oplog异步复制primary的数据,因此从整体来看,primary与Secondary机器的读速度相当。
3).默认情况下,MogonDB的读和写都是在primary中进行的。
12.read&preference
&&&&1).primary,默认值,表示所有的读操作都是在primary机器上执行的
&&&&2).primaryPreferred,大多数情况下在primary上进行,当primary不可用时,会从secondary中进行。如primary宕机,还未选举出primary时。
&&&&3).secondary,所有的读操作都从secondary上执行
&&&&4).secondaryPreferred,和2相反
&&&&5).nearest,从延迟最小(ping最快)的机器上读取,无论primary和secondary
13.关于延迟成员(deleyed&member)
&&&&1).延迟成员的priority必须为0,表示它无法成为primary。
&&&&2).延迟成员也是隐藏成员,应用无法通过延迟成员查询数据的。
&&&&3).可以对primary的选举进行投票
14.确保副本集中的个数为奇数,如果是偶数的话,添加一个arbiter成员。
15.关于MongoDB的投票与故障恢复。
&&&&1).MongoDB要求投票时系统中可用的机器数量要是全体副本集中成员个数的大多数。
&&&&2).如果副本集中有3台机器,那么有几台机器宕掉后可以确保MongoDB副本集可以正常使用?2
3).如果副本集中有4台机器,那么有几台机器宕掉后可以确保MongoDB副本集可以正常使用?3
4).如果副本集中有5台机器,那么有几台机器宕掉后可以确保MongoDB副本集可以正常使用?3
5).如果副本集中有6台机器,那么有几台机器宕掉后可以确保MongoDB副本集可以正常使用?4
6).如果副本集中有7台机器,那么有几台机器宕掉后可以确保MongoDB副本集可以正常使用?4
16.向副本集中添加成员并不总是会确保系统的故障恢复能力,不过这样做可以实现一些额外的功能:备份、统计报表等。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8485次
排名:千里之外Mongodb的安装、主从配置、replicaSet配置 - Linux,MongoDB,主从,副本集,repicaSet - Tech - ITeye论坛
Mongodb的安装、主从配置、replicaSet配置
锁定老帖子
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
来自: 北京
发表时间:&&
相关知识库:
Mongodb的安装、主从配置、replicaSet配置
——gongyong
前段时间一直在研究mongodb,看了一些书,网上也看了很多资料,其实都是抄来抄去,很多根本都没有经过自己验证,随便往博客上一贴,然后坑死人,这样真的要不得,本人在开始就深受其害,所以这里未免后来人也跟我一样走这些弯路,自己就花点时间把自己的一些实践操作整理了下,写了这篇文章。
文章很简单,主要还是讲基本的配置,关键是配置的时候要细心,这里没有讲到原理性的东西,毕竟篇幅有限,所以如果大家在配置过程中有什么疑点都可以和我交流。希望大家多多支持。
还有,我工作很忙的,写篇帖子也不容易,大家觉得写得有用,给个回复,表示下支持,也算给点动力啦,呵呵。
一.Mongodb的安装
环境:linux 64bit
版本:2.0.1
位置:/opt/mongodb
安装步骤:
tar –zxvf mongodb-linux-x86_64-2.0.1.tar –C /opt/mongodb
mkdir /opt/mongodb/data
touch /opt/mongodb/logs
安装是很简单的,关键是下面的启动的配置。启动配置有三种情况,分别是正常的单主机启动,主从启动,副本集启动三种方式。
1.单主机启动方式
cd /opt/mongodb/bin
/opt/mongodb/bin/mongod –f mongodb.conf
#mongodb.conf是自定义的启动配置文件,其中参数auth表明需要认证才能登录,内容如下:
#start as daemon and need authentication
port=27017
dbpath=/opt/mongodb/data/
logpath=/opt/mongodb/logs
设置开机自动启动(可选)
echo "/opt/mongodb/bin/mongod –f /opt/mongodb/bin/mongodb.conf" && /etc/rc.local
#连接mongodb
cd /opt/mongodb/bin
#默认进入到mongodb默认的test库
#为数据库设置用户名密码
#首先切换到admin库,先建立一个管理员账号
& use admin
& db.addUser("root","root");
#切换到test库
#为test库添加用户名和密码
& db.addUser("testUser","123456");
#注:若此时显示
Tue May 22 16:16:29 uncaught exception: error {
"$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",
"code" : 10057
说明设置密码已生效,此时要先转到admin库,输入认证再转回到test库设置用户名密码,如下:
db.auth(“root”,”root”);
#下次再连接mongodb时需要使用如下方式:
./mongo –u testUser –p 123456
Db.system.users.remove({“user”:”testUser”});
#注:mongodb的用户名和密码都是针对每一个库的,所以不同的库可以设置不同的用户名和密码。
2.主从方式启动
实际上现在这种方式已经不推荐使用了,推荐使用的是replicaset,下面会讲到
假设已经将mongodb安装在了两台主机上ip分别为192.168.0.1和192.168.0.2上,下面是启动配置
启动master(192.168.0.1)cd /opt/mongodb/./bin/mongod --dbpath=/opt/mongodb/data --logpath=/opt/mongodb/logs--master --oplogSize 64 --logappend
--port=27017 –fork
启动slave(192.168.0.2)cd /opt/mongodb/./bin/mongod --dbpath=/opt/mongodb/data --logpath=/opt/mongodb/logs--slave --source 192.168.0.1 --only test --slavedelay 10--logappend
--port=27017 –fork
这样配置就完成了,当然也可以将这些启动参数像前面一样写在配置文件中,启动时使用配置文件启动。
配置完成后可以测试一下,如下:
在主机器上添加数据cd /opt/mongodb/./bin/mongodb.foo.save({"id":123,"name":gongyong});成功的话可以在从服务器看到数据:cd /opt/mongodb/./bin/mongodb.foo.find({"id":123})
3.replcaSet的配置
我们假设有三台服务器,分别已经安装好了mongodb,有如下三段配置
#10.127.65.92上的配置
logpath=/opt/mongodb/logs
dbpath=/opt/mongodb/data/
port=27017
logappend=true
replSet=snsgame/10.127.65.95:27017
#10.127.65.95上的配置
logpath=/opt/mongodb/logs
dbpath=/opt/mongodb/data/
port=27017
logappend=true
replSet=snsgame/10.127.65.92:27017
#10.11.154.91上的配置
logpath=/opt/mongodb/logs
dbpath=/opt/mongodb/data/
port=27017
logappend=true
replSet=snsgame/10.127.65.92:.65.95:27017
分别将上面三段配置复制后放到每台mongodb的某个位置(推荐bin目录),三台服务器分别使用上面的配置启动后,要进行初始化
首先连接上65.92这台mongo
./mongo -port 27017
这样就连接上了mongodb的默认库test,然后输入如下指令:
& config_rs1={_id:'snsgame',members:[
...{_id:0,host:'10.127.65.92:27017',priority:10},
...{_id:1,host:'10.127.65.95:27017',priority:9},
...{_id:2,host:'10.11.154.91:27017',priority:9}]
& rs.initiate(config_rs1);
回车后出现下面的提示:
“info”:"Config now saved locallly. should come online in about a minute.",
说明初始化成功,注意只需要在其中任何一台上初始化就可以
运行如下指令查看是否成功
rs.status()
然后退出再重新连接,发现光标变成下面这种就对了:
rs1:PRIMARY
配置完成后可以进行秘密和用户名的设置,设置方式前面已经提到,需要注意的是,每台mongodb都需要用同样的方式设置用户名和秘密。
到这里,mongodb的安装,主从,副本集的配置就基本完成,再往后还有mongodb的集群分片的搭建,在另一篇文章里会详细说明。
附:各启动参数的说明
参数解释: --dbpath 数据库路径(数据文件)--logpath 日志文件路径--master 指定为主机器--slave 指定为从机器--source 指定主机器的IP地址--pologSize 命令行参数(与--master一同使用)配置用于存储给从节点可用的更新信息占用的磁盘空间(M为单位),如果不指定这个参数,默认大小为当前可用磁盘空间的5%(64位机器最小值为1G,32位机器为50M)。--logappend 日志文件末尾添加--port 启用端口号--fork 在后台运行--only 指定只复制哪一个数据库--slavedelay 指从复制检测的时间间隔--auth 是否需要验证权限登录(用户名和密码)-h [ --help ]
show this usage information--version
show version information-f [ --config ] arg
configuration file specifying additional options--port arg
specify port number--bind_ip arg
local ip address to bind listener - all local ips
bound by default-v [ --verbose ]
be more verbose (include multiple times for more
verbosity e.g. -vvvvv)--dbpath arg (=/data/db/) directory for datafiles
指定数据存放目录--quiet
quieter output
静默模式--logpath arg
file to send all output to instead of stdout
指定日志存放目录--logappend
appnd to logpath instead of over-writing 指定日志是以追加还是以覆盖的方式写入日志文件--fork
fork server process
以创建子进程的方式运行--cpu
periodically show cpu and iowait utilization 周期性的显示cpu和io的使用情况--noauth
run without security 无认证模式运行--auth
run with security 认证模式运行--objcheck
inspect client data for validity on receipt 检查客户端输入数据的有效性检查--quota
enable db quota management
开始数据库配额的管理--quotaFiles arg
number of files allower per db, requires --quota 规定每个数据库允许的文件数--appsrvpath arg
root directory for the babble app server --nocursors
diagnostic/debugging option 调试诊断选项--nohints
ignore query hints 忽略查询命中率--nohttpinterface
disable http interface 关闭http接口,默认是28017--noscripting
disable scripting engine 关闭脚本引擎--noprealloc
disable data file preallocation 关闭数据库文件大小预分配--smallfiles
use a smaller default file size 使用较小的默认文件大小--nssize arg (=16)
.ns file size (in MB) for new databases 新数据库ns文件的默认大小--diaglog arg
0=off 1=W 2=R 3=both 7=W+some reads 提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式--sysinfo
print some diagnostic system information 打印系统诊断信息--upgrade
upgrade db if needed 如果需要就更新数据库--repair
run repair on all dbs 修复所有的数据库--notablescan
do not allow table scans 不运行表扫描--syncdelay arg (=60)
seconds between disk syncs (0 for never) 系统同步刷新磁盘的时间,默认是60sReplication options:--master
master mode 主复制模式--slave
slave mode 从复制模式--source arg
when slave: specify master as &server:port& 当为从时,指定主的地址和端口--only arg
when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库--pairwith arg
address of server to pair with--arbiter arg
address of arbiter server 仲裁服务器,在主主中和pair中用到--autoresync
automatically resync if slave data is stale 自动同步从的数据--oplogSize arg
size limit (in MB) for op log 指定操作日志的大小--opIdMem arg
size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存大小Sharding options:--configsvr
declare this is a config db of a cluster 指定shard中的配置服务器--shardsvr
declare this is a shard db of a cluster 指定shard服务器
注:版权所有,转载请注明来源:
java_eye_0412
来自: 北京
发表时间:&&
文章写到分成好,很受教,谢谢不过,我是个菜鸟,刚接触 mongodb replcaSet的配置 replSet=snsgame/10.127.65.92:.65.95:27017 对应到IP 什么意思啊,为什么配置前两个配置制定和第三个制定是不一样的,分别是什么含义 ,哪台机器是主控机器 master,哪台机器是从空机器 slave,请指教,谢谢
请登录后投票
java_eye_0412
来自: 北京
发表时间:&&
这及几种启动方式,对于集群哪总方式性能是比较好的,为什么 主从启动方式推荐使用了,由什么缺点吗,谢谢
请登录后投票
来自: 北京
发表时间:&&
java_eye_0412 写道这及几种启动方式,对于集群哪总方式性能是比较好的,为什么 主从启动方式推荐使用了,由什么缺点吗,谢谢关于“ replSet=snsgame/10.127.65.92:.65.95:27017 对应到IP 什么意思啊?”,replSet这个参数的意思是指定这台mongodb服务器所属的副本集的名字,这里表明这个副本集的名字是snsgame,与前几台的副本集名字必须要一致,另外后面的ip和端口,表明的是这个副本集中已经有哪些服务器了,这个是可选的,你可以写已经存在于该副本集中的任何一台mongodb服务器,也可以都不写,但是写的就必须是已经存在的,我写了是为了便于查看该副本集中已经存在的mongodb服务器。关于“哪台机器是主控机器 master”,副本集的最大特点就是可以自动选择master,一般来说第一次你是在那台服务器执行初始化的,哪台就是主,但是主也是可以通过设置优先级来自主选择的。同时这也回答了为什么不推荐使用主从方式了,因为副本集可以自动判断当前副本集状态,如果原来的主宕机了,那副本集可以自动从剩余的机器中选择新的主服务器。
请登录后投票
java_eye_0412
来自: 北京
发表时间:&&
首先非常感谢谢您的指点,好像是有点明白了,比如说我要用11台机器中到10台机器来进行集群配置,如有11 台机器IP分别是 1,2,3,4,5,6,7,8,9,10,11 这11台机器replSet 的值直接等于副本到名字就可以了吧,不用写任何到IP吧,比如:replSet = snsgame 这个值,是吧,但是,问题又来了,MongoDB 如何知道都有哪10台机器是在MongoDB到集群中呢?其中到哪台机器不是再这个集群中呢?请指点下,谢谢
请登录后投票
java_eye_0412
来自: 北京
发表时间:&&
另外执行脚本时cfg={ "_id" : "mymongo", "members" : [
"_id" : 0,
"host" : "192.168.104.163:27017",
"priority" : 10
"_id" : 1,
"host" : "192.168.104.159:27017",
"priority" : 9
"_id" : 2,
"host" : "192.168.104.185:27017",
"priority" : 9
"_id" : 3,
"host" : "192.168.104.183:27017",
"priority" : 8
} ]}rs.initiate(cfg);报错,包以下错误: "errmsg" : "couldn't initiate : member 192.168.104.159:27017 has data already, cannot initiate set.& All members except initiator must be empty."删除 159 中数据集合后,出现以下错误。是什么原因?{ "errmsg" : "couldn't initiate : need all members up to initiate, not ok : 192.168.104.159:27017", "ok" : 0}谢谢
请登录后投票
java_eye_0412
来自: 北京
发表时间:&&
谢谢版主,我已经明白上述我提出到问题了,同时问题已经找到了,是因为,有一台机器,被被别人安装了一个mongodb,我安装到mongodb 没有正确启动,而且是启动别人到那个了,导致replSet值不正确
请登录后投票
java_eye_0412
来自: 北京
发表时间:&&
版主,你所说到mongodb的集群分片的搭建文档位置再哪了,可以共享学习下不
请登录后投票
来自: 北京
发表时间:&&
java_eye_0412 写道版主,你所说到mongodb的集群分片的搭建文档位置再哪了,可以共享学习下不你好,我之前写的那篇已经被我删掉了,因为需要做一些改动,不过很快我会再贴出了,因为最近这段时间有点忙,一直没顾上。另外你问到“MongoDB 如何知道都有哪10台机器是在MongoDB到集群中呢?”,这个很简单,就是根据你启动时指定的“replSet=snsgame”这个参数判断的,这个参数相当是每个副本集的唯一标识符,只要某台mongodb启动时指定了这个参数的值,就会根据这个值把他们聚合到一个副本集中。
请登录后投票
等级: 初级会员
来自: 珠海
发表时间:&&
我也同遇到了这个问题,只是我两个服务器是不同区域的,不知道出什么问题{"errmsg" : "couldn't initiate : need all members up to initiate, not ok : ****","ok" : 0}
请登录后投票
跳转论坛:移动开发技术
Web前端技术
Java企业应用
编程语言技术搭建高可用MongoDB集群(三):深入副本集内部机制 - 文章 - 伯乐在线
& 搭建高可用MongoDB集群(三):深入副本集内部机制
在上一篇文章介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制。还是带着副本集的问题来看吧!
副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点。
官方说副本集数量最好是奇数,为什么?
mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性?
mongodb的故障转移会不会无故自动发生?什么条件会触发?频繁触发可能会带来系统负载加重?
Bully算法 mongodb副本集故障转移功能得益于它的选举机制。选举机制采用了Bully算法,可以很方便从分布式节点中选出主节点。一个分布式集群架构中一般都有一个所谓的主节点,可以有很多用途,比如缓存机器节点元数据,作为集群的访问入口等等。主节点有就有吧,我们干嘛要什么Bully算法?要明白这个我们先看看这两种架构:
指定主节点的架构,这种架构一般都会申明一个节点为主节点,其他节点都是从节点,如我们常用的mysql就是这样。但是这样架构我们在第一节说了整个集群如果主节点挂掉了就得手工操作,上架一个新的主节点或者从从节点恢复数据,不太灵活。
2.不指定主节点,集群中的任意节点都可以成为主节点。mongodb也就是采用这种架构,一但主节点挂了其他从节点自动接替变成主节点。如下图:
好了,问题就在这个地方,既然所有节点都是一样,一但主节点挂了,怎么选择出来下一个节点是谁来做为主节点呢?这就是Bully算法解决的问题。
那什么是Bully算法,Bully算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。别的节点可以选择接受这个声称或是拒绝并进入主节点竞争。被其他所有节点接受的节点才能成为主节点。节点按照一些属性来判断谁应该胜出。这个属性可以是一个静态ID,也可以是更新的度量像最近一次事务ID(最新的节点会胜出)。详情请参考还有 。
选举 那mongodb是怎进行选举的呢?官方这么描述:
We use a consensus protocol to pick a primary. Exact details will be spared here but that basic process is:
get maxLocalOpOrdinal from each server.
if a majority of servers are not up (from this server’s POV), remain in Secondary mode and stop.
if the last op time seems very old, stop and await human intervention.
else, using a consensus protocol, pick the server with the highest maxLocalOpOrdinal as the Primary.
大致翻译过来为使用一致协议选择主节点。基本步骤为:
得到每个服务器节点的最后操作时间戳。每个mongodb都有oplog机制会记录本机的操作,方便和主服务器进行对比数据是否同步还可以用于错误恢复。
如果集群中大部分服务器down机了,保留活着的节点都为 secondary状态并停止,不选举了。
如果集群中选举出来的主节点或者所有从节点最后一次同步时间看起来很旧了,停止选举等待人来操作。
如果上面都没有问题就选择最后操作时间戳最新(保证数据是最新的)的服务器节点作为主节点。
这里提到了一个一致协议(其实就是bully算法),这个和数据库的一致性协议还是有些区别,一致协议主要强调的是通过一些机制保证大家达成共识;而一致性协议强调的是操作的顺序一致性,比如同时读写一个数据会不会出现脏数据。一致协议在分布式里有一个经典的算法叫“Paxos算法”,后续再介绍。
上面有个问题,就是所有从节点的最后操作时间都是一样怎么办?就是谁先成为主节点的时间最快就选谁。
选举触发条件 选举不是什么时刻都会被触发的,有以下情况可以触发。
初始化一个副本集时。
副本集和主节点断开连接,可能是网络问题。
主节点挂掉。
选举还有个前提条件,参与选举的节点数量必须大于副本集总节点数量的一半,如果已经小于一半了所有节点保持只读状态。
日志将会出现:
can't see a majority of the set, relinquishing primary
can't see a majority of the set, relinquishing primary
主节点挂掉能否人为干预?答案是肯定的。
可以通过replSetStepDown命令下架主节点。这个命令可以登录主节点使用
db.adminCommand({replSetStepDown : 1})
db.adminCommand({replSetStepDown : 1})
如果杀不掉可以使用强制开关
db.adminCommand({replSetStepDown : 1, force : true})
db.adminCommand({replSetStepDown : 1, force : true})
或者使用 rs.stepDown(120)也可以达到同样的效果,中间的数字指不能在停止服务这段时间成为主节点,单位为秒。
设置一个从节点有比主节点有更高的优先级。
先查看当前集群中优先级,通过rs.conf()命令,默认优先级为1是不显示的,这里标示出来。
rs.conf();
rs.conf();
"_id" : "rs0",
"version" : 9,
"members" : [
"_id" : 0,
"host" : "192.168.1.136:27017"
"_id" : 1,
"host" : "192.168.1.137:27017"
"_id" : 2,
"host" : "192.168.1.138:27017"
123456789101112131415
{&&&&&&&&"_id" : "rs0",&&&&&&&&"version" : 9,&&&&&&&&"members" : [&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&"_id" : 0,&&&&&&&&&&&&&&&&&&&&&&&&"host" : "192.168.1.136:27017"&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&"_id" : 1,&&&&&&&&&&&&&&&&&&&&&&&&"host" : "192.168.1.137:27017"&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&"_id" : 2,&&&&&&&&&&&&&&&&&&&&&&&&"host" : "192.168.1.138:27017"&&&&&&&&&&&&&&&&}&&&&&&&&]&&&&&&&&}
我们来设置,让id为1的主机可以优先成为主节点。
cfg = rs.conf()
cfg.members[0].priority = 1
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)
cfg = rs.conf()cfg.members[0].priority = 1cfg.members[1].priority = 2cfg.members[2].priority = 1rs.reconfig(cfg)
然后再执行rs.conf()命令查看优先级已经设置成功,主节点选举也会触发。
"_id" : "rs0",
"version" : 9,
"members" : [
"_id" : 0,
"host" : "192.168.1.136:27017"
"_id" : 1,
"host" : "192.168.1.137:27017",
"priority" : 2
"_id" : 2,
"host" : "192.168.1.138:27017"
1234567891011121314151617
{&&&&&&&&"_id" : "rs0",&&&&&&&&"version" : 9,&&&&&&&&"members" : [&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&"_id" : 0,&&&&&&&&&&&&&&&&&&&&&&&&"host" : "192.168.1.136:27017"&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&"_id" : 1,&&&&&&&&&&&&&&&&&&&&&&&&"host" : "192.168.1.137:27017",&&&&&&&&&&&&&&&&&&&&&&&&"priority" : 2&&&&&&&&&&&&&&&&},&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&"_id" : 2,&&&&&&&&&&&&&&&&&&&&&&&&"host" : "192.168.1.138:27017"&&&&&&&&&&&&&&&&}&&&&&&&&&&]&&&&&&&& }
如果不想让一个从节点成为主节点可以怎么操作?
a、使用rs.freeze(120)冻结指定的秒数不能选举成为主节点。
b、按照上一篇设置节点为Non-Voting类型。
当主节点不能和大部分从节点通讯。把主机节点网线拔掉,嘿嘿:)优先级还可以这么用,如果我们不想设置什么hidden节点,就用secondary类型作为备份节点也不想让他成为主节点怎么办?看下图,共三个节点分布在两个数据中心,数据中心2的节点设置优先级为0不能成为主节点,但是可以参与选举、数据复制。架构还是很灵活吧!
奇数 官方推荐副本集的成员数量为奇数,最多12个副本集节点,最多7个节点参与选举。最多12个副本集节点是因为没必要一份数据复制那么多份,备份太多反而增加了网络负载和拖慢了集群性能;而最多7个节点参与选举是因为内部选举机制节点数量太多就会导致1分钟内还选不出主节点,凡事只要适当就好。这个“12”、“7”数字还好,通过他们官方经过性能测试定义出来可以理解。具体还有哪些限制参考官方文档。 但是这里一直没搞懂整个集群为什么要奇数,通过测试集群的数量为偶数也是可以运行的,参考这个文章http://www.itpub.net/thread--1.html。后来突然看了一篇终于顿悟了,mongodb本身设计的就是一个可以跨IDC的分布式数据库,所以我们应该把它放到大的环境来看。
假设四个节点被分成两个IDC,每个IDC各两台机器,如下图。但这样就出现了个问题,如果两个IDC网络断掉,这在广域网上很容易出现的问题,在上面选举中提到只要主节点和集群中大部分节点断开链接就会开始一轮新的选举操作,不过mongodb副本集两边都只有两个节点,但是选举要求参与的节点数量必须大于一半,这样所有集群节点都没办法参与选举,只会处于只读状态。但是如果是奇数节点就不会出现这个问题,假设3个节点,只要有2个节点活着就可以选举,5个中的3个,7个中的4个。。。
心跳 综上所述,整个集群需要保持一定的通信才能知道哪些节点活着哪些节点挂掉。mongodb节点会向副本集中的其他节点每两秒就会发送一次pings包,如果其他节点在10秒钟之内没有返回就标示为不能访问。每个节点内部都会维护一个状态映射表,表明当前每个节点是什么角色、日志时间戳等关键信息。如果是主节点,除了维护映射表外还需要检查自己能否和集群中内大部分节点通讯,如果不能则把自己降级为secondary只读节点。
同步,副本集同步分为初始化同步和keep复制。初始化同步指全量从主节点同步数据,如果主节点数据量比较大同步时间会比较长。而keep复制指初始化同步过后,节点之间的实时同步一般是增量同步。初始化同步不只是在第一次才会被处罚,有以下两种情况会触发:
secondary第一次加入,这个是肯定的。
secondary落后的数据量超过了oplog的大小,这样也会被全量复制。
那什么是oplog的大小?前面说过oplog保存了数据的操作记录,secondary复制oplog并把里面的操作在secondary执行一遍。但是oplog也是mongodb的一个集合,保存在local.oplog.rs里,但是这个oplog是一个capped collection也就是固定大小的集合,新数据加入超过集合的大小会覆盖。所以这里需要注意,跨IDC的复制要设置合适的oplogSize,避免在生产环境经常产生全量复制。oplogSize 可以通过–oplogSize设置大小,对于linux 和windows 64位,oplog size默认为剩余磁盘空间的5%。
同步也并非只能从主节点同步,假设集群中3个节点,节点1是主节点在IDC1,节点2、节点3在IDC2,初始化节点2、节点3会从节点1同步数据。后面节点2、节点3会使用就近原则从当前IDC的副本集中进行复制,只要有一个节点从IDC1的节点1复制数据。
设置同步还要注意以下几点:
secondary不会从delayed和hidden成员上复制数据。
只要是需要同步,两个成员的buildindexes必须要相同无论是否是true和false。buildindexes主要用来设置是否这个节点的数据用于查询,默认为true。
如果同步操作30秒都没有反应,则会重新选择一个节点进行同步。
到此,本章前面提到的问题全部解决了,不得不说mongodb的设计还真是强大!
后续继续解决上一节这几个问题:
主节点挂了能否自动切换连接?目前需要手工切换。
主节点的读写压力过大如何解决?
还有这两个问题后续解决:
从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?
数据压力大到机器支撑不了的时候能否做到自动扩展?
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线}

我要回帖

更多关于 魔域法师副本最佳配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信