Replication:副本集
副本集可以将客户端的写操作分散到不同的服务器,可以用于灾难恢复,报告和备份。
副本集需要一个主服务器和一个备服务器,以及一个仲裁服务器。仲裁服务器决定将哪一个服务器作为主服务器,主服务器将接收所有的写操作。
可以根据特殊的目的对备服务器做配置:
1.防止备服务器被选为主服务,因此可以用这台服务器提供冷备。
2.防止客户端从这台备服务器读取数据,因此可以用来提供需要单独运行的服务。
3.保存历史快照用于确定的恢复过程,例如无意删除数据。
仲裁服务器:
仲裁服务器不保存任何数据,也不能作为主服务器提供服务。仲裁服务不能运行在主备服务器的任何一台。
PS:副本集只支持最多50台服务器,如果所需要的进程超过50台服务器,则需要使用master-slave。但是master-slave没有自动失效备援的能力。
主服务接收客户端写操作,然后将写操作的记录保持在自己的oplog中,从服务使用这个日志来操作自己的数据,与主服务保持一致。
副本集中所有的应用都可以进行读的操作,但是默认的,会在主应用中读取数据。
当主应用不可用的时候,仲裁服务会选择一个备应用作为主应用来提供服务。
优先级为0的从服务将不会被些选为主应用提供服务,但是优先级为0的从服务也同样可以提供正常的服务。它们可以复制数据、进行读的操作、进行选举。这样的设置在多数据中心的开发中非常有用。
延时的副本集成员:
延时的副本集成员会保存比副本集数据库延时的数据,可以作为快照或者回滚点,应用于恢复各种认为错误,例如,数据更新失败、删除数据等。
延时成员的要求:1.必须是优先级为0的成员。2.必须是隐藏的成员。3.在仲裁权被设置为1的时候,拥有仲裁的权利。
Replica sets副本集部署详细过程:
1.***启动mongodb,一台主服务器(192.168.0.83),一台从服务器(192.168.0.84),一台仲裁服务器(192.168.0.85)
2.登陆mongo实例,进入admin库,执行config命令:
&use admin
&config = {_id:”repset”,members:[
{_id:0,host:”192.168.0.83:27017”},
{_id:1,host:”192.168.0.84:27017”},
{_id:2,host:”192.168.0.85:27017”}
初始化副本集:
&rs.initiate(config)
3.查看replica sets的状态:
登陆任意一台mongo服务,查看状态,以及数据是否保持一致:
&rs.status();
4.查看后台日志,查看目前状态的PRIMARY和SECONDARY:
5.验证一致性:
在PRIMARY中对数据进行操作,在SECONDARY中查看数据是否一致。
6.PRIMARY和SECONDARY自动切换的验证:
a.停掉PRIMARY上的服务
&db.ShutdownServer()
b.查看日志,从库自动切换为主库,登陆新的主库,查看状态:
c.将之前的主库(192.168.0.83恢复),查看主从是否再次切换。
阅读(...) 评论()1610人阅读
一、工作原理
1.&&&MongoDB 2.6版本开始推荐使用副本集,对主从复制已经不再推荐.
2.&&&副本集至少需要3个, 可以3个全部做副本集, 也可以让其中一个做仲裁.
3.&&&副本集中只有1台主才能进行写,其余的只能读.
4.&&&副本集之间的复制是通过oplog日志现实的.备份节点通过查询这个集合就可以知道需要进行复制的操作.
5.&&&oplog是节点中local库中的一个固定的集合,在默认情况下oplog初始化大小为空闲磁盘的5%.oplog是capped collection,所以当oplog的空间被占满时,会覆盖最初写入的日志.
6.&&&通过改变oplog文档的大小直接改变local所占磁盘空间的大小.可以在配置文件中设置oplogSize参数来指定oplog文档的大小,例如oplogSize=1024单位默认为M& 每个local文档在磁盘空间的空间都为2G,设置不足2G的,初始化依然为2G大小,例如上面oplogSize=1024,但创建的local.01大小依然为2G.
7.&&&如果备份节点不幸挂掉,由于复制过程中是先写数据,再写oplog,这样重新启动时,可能会重复复制操作.但MongoDB在设计过程中已经考虑过这个问题.当 oplog中同一个操作执行多次的时候,只执行一次.
8.&&&初始化工作.
a)&&&备份找到一个同步的主节点,然后再到local.me中创建一个标识符.开始同步的过程中,需要清空备节点的所有数据库(版本:2.6.7).
b)&&通过oplog中的操作记录,把数据复制在备份节点.
c)&&&完全同步时开始创建索引.
9.&&&如果备节点的同步速度远远跟不上主节点的oplog写入的数据,并且主节点的oplog被覆盖.这样,可能就无法同步那些被覆盖的数据(出现这种情况,暂时还无法解决,只能通过备份主节点的数据,然后再重新同步).
10. 每个成员通过心跳去查看其他节点的状态,每隔2秒钟就有一次心跳检测.
11. 当主节点宕机之后,各个节点通过选举的方式来选择下一个主节点.
二、***方法
1.&& 3台机器上分别装上MongDB 服务.
&&&&& 192.168.10.21:27017& (备)
&&&&& 192.168.10.26:27017& (备)
&&&&& 192.168.10.27:27018& (主)
2.&& 设置密码认证文件.
&&&&& 可以使用grub-md5-crypt生成加密文件.
& & &&把生成的密文放到一个文件中.并且3台机器要有相同的密文.
& & & 这里把密文放到mongodb主目录下的mongod_key文件中.
3.&& 3个mongo分别设置自己admin库的登录权限.
&&&&& 这个具体方法可以略掉.
4.&& 配置mongo.conf文件.
& & &192.168.10.27 (主)的配置文件
& & &192.168.10.21 (备)的配置文件
& & &192.168.10.26 (备)的配置文件
5.& 关闭每台机器的防火墙
/etc/init.d/iptables &stop
6.& 启动每台机器上的mongodb
7.& 在主机上进行初始化工作,一般在哪台机器上初始化,主就是哪台机器.但是,也可以用权重来控制哪台为主.
&&& config_repl={_id:'alex',members:[
&&& {_id:0,host:'192.168.10.27:27018',priority:10},
&&& {_id:1,host:'192.168.10.26:27017',priority:9},
&&& {_id:2,host:'192.168.10.21:27017',priority:9}]}
&&& 这里的priority越大,主就是哪一台
& & &然后执行rs.initiate(config_repl);&
& & &这时副本集已经配置完成.
&&& &可以用rs.status() 查看各个节点状态.
以我的理解,查看备库同步到主库的什么位置,可以通过optime来看
8. & &设置副本集后,备节点默认是不能读数据的,但可以设置rs.slaveOk().
&&&& 但只对当前session有效.
&&&& 如果用程序去连接,实现读写分离.例如J***A有相应的方法和参数去达到这一点
9.&&& 切换主-备. (192.168.10.26 提升为主)
& & &rs.conf()&&& # 查看配置
& & &执行:
& &&cfg=rs.conf();
& & cfg.members[1] = 11 & 把id为1的主机priority改为11
& & rs.reconfig(cfg)
10.& 查看同步状态.
& & & &上面第9步操作使192.168.10.26升级成为主了.
& & & &db.printSlaveReplicationInfo();
& & & &再执行
& & &&use local
& & & db.oplog.rs.find();
& & & 可以查看到同步的语句.
{ &ts& : Timestamp(, 1), &h& : NumberLong(&-1116878&), &v& : 2, &op& : &i&, &ns& : &bbbb.test1&, &o& : { &_id& : ObjectId(&d5b1bcd83dd2&), &a& : 111 } }
& & &含义解释如下:
ts: 8字节的时间戳,由4字节unix timestamp + 4字节自增计数表示。这个值很重要,在选举(如master宕机时)新primary时,会选择ts最大的那个secondary作为新primary
op:1字节的操作类型
i :insert
u :update
d :delete
c :db cmd
db:声明当前数据库 (其中ns 被设置成为=&数据库名称+ '.')
n : no op,即空操作,其会定期执行以确保时效性
ns:操作所在的namespace
o :操作所对应的document,即当前操作的内容(比如更新操作时要更新的的字段和值)
o2: 在执行更新操作时的where条件,仅限于update时才有该属性
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:161013次
积分:1813
积分:1813
排名:千里之外
原创:38篇
转载:11篇
评论:15条
(2)(1)(1)(6)(15)(10)(3)(2)(2)(1)(4)(2)