MongoDB 复制(副本集)详解原理与搭建

MongoDB 复制(副本集)详解原理与搭建

前言

在搭建Mongo的副本集过程中,由于没有找到详细的资料,再加上钻了个牛角尖,左弄右弄,尝试多次终于搭建成功,特此详细记录下来,供后来者参考与借鉴。

复制

如果我们的数据库只存在于一台服务器,若这台服务器宕机了,那对于我们的数据将会是灾难,当然这只是其中一个原因,若数据量非常大,读写操作势必会影响数据库的性能,这时候复制就显得相当重要了,因为 MongoDB 可以通过复制,实现读写分离。

复制是一种在多个服务器上同步数据的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

总之,复制可以使你免受硬件故障与服务中断的影响,及时恢复数据。由于数据有多个副本,所以可以将其中一个副本用于灾难恢复、报告或备份。
复制的作用

  • 保障数据的安全性
  • 数据高可用性 (24*7)
  • 灾难恢复
  • 无需停机维护(如备份,重建索引,压缩)
  • 分布式读取数据(读写的灵活性)

以上,是教科书或网络上给的标准答案,在这我从另一个角度来重新阐释复制,由于移动支付的深度介入,从而把线上线下的数据进行了有效整合,把以前的线下数据通过“交易”链接到了线上,交易需要支付才能支撑,因而移动支付构成了整个人类社会网络的“端口”,这样就产生了大量的活数据实时更新,形成闭环,支持决策。
大数据产生依赖于移动支付,而大数据存储却依赖于数据有效存储,数据的有效存储当然根植于数据的备份与复制机制,这就是数据的高可用性。

Mongo的副本集

主节点(Primary)

提供所有增、删、查、改操作

从节点(Secondary)

可以提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到从节点上。

仲裁节点(Arbiter)

仲裁节点是一种特殊的节点,它本身并不存储数据,主要作用在于,当主节点挂掉以后,通过投票的方式决定哪个从节点成为主节点。如果没有仲裁节点,如果主节点挂掉,那么整个副本集中就没有了主节点

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

典型的 MongoDB 复制图
副本集特点

  • 具有 N 个节点的集群
  • 任何节点都可能成为主节点
  • 所有写入操作必须由主节点来完成
  • 自动故障转移
  • 自动故障恢复
  • 重新推举主节点

副本集的搭建

  1. 准备Mongo服务器
  • 172.16.152.57:27017
  • 172.16.152.60:27017
  • 172.16.154.237:27017 (Arbiter)
    注意:服务器Mongo服务启动后请确定,相互间能否正常通信,可用命令telnet IP 端口
  1. 启动Mongo服务
    (1) mongod命令直接启动
    mongod --fork --bind_ip=0.0.0.0 --port=27017 --logpath=/usr/local/mongodb/mongo_log.log --dbpath=/home/mongodb/db/ --logappend --replSet=rs1
    

(2) 通过配置文件启动

i. 配置文件mongo.conf

     #新建或编辑命令(可根据需要选择路径与配置文件名)
 	vi /usr/local/mongodb/mongo.conf 	
 	
 	#配置内容
 	#后台启动
 	fork=true
 	#绑定服务启动的IP,0.0.0.0无限制访问
 	#有限制的多个ip以逗号分隔,也可这样配置bind_ip=127.0.0.1,172.16.152.57(本机内网IP)
 	bind_ip=0.0.0.0 
 	#服务启动端口
 	port=27017 
 	#日志
 	logpath=/usr/local/mongodb/mongo_log.log
 	#数据文件
 	dbpath=/home/db/
 	#追加方式写日志
 	logappend=true
 	#复制集名称
 	replSet=rs1

ii. 以配置文件方式,启动Mongo服务

    #启动命令
   mongod -f /usr/local/mongodb/mongo.conf

注意:因为我们启动的Mongo服务的端口都是27017,所有的服务器都按照以上配置,如果bind_ip配置多个ip,除了本地的127.0.0.1外,需要配置本机的内网IP,这样局域网内的副本集节点间才能相互通信。

  1. 初始化副本集
   #连接 MongoDB 服务
    mongo
    #交互方式是javascript形式
    #初始化时给副本集添加节点
   rs.initiate({_id: "rs1",members: [{_id:0,host:"172.16.152.57:27017" },{_id:1,host:"172.16.152.60:27017" }]})
   #或者只是直接初始化,使用命令rs.initiate()

注意:若是全新的数据集,没有数据可任意挑选一台服务器进行初始化;若启动有一台有数据,请在有数据的那台服务器上初始化;若多台都有数据,则不能初始化。
4. rs.add() 命令添加节点
当直接初始化rs.initiate(),或者初始化副本集时有未添加的节点,此命令适用于单个添加节点,只能添加Primary和Secondary

#添加命令rs.add(HOST_NAME:PORT)
rs.add("172.16.152.60:27017")
  1. 添加仲裁节点
#添加仲裁节点Arbiter命令rs.addArb(HOST_NAME:PORT)
rs.addArb("172.16.154.237:27017")
  1. 使用 rs.status() 命令查看副本集的状态
    rs.status()

primary&secondary
arbiter
SECONDARY和ARBITER上看到的信息类似

  1. 通过db.isMaster()查看副本集信息

db.isMater()

  1. 当我们的Mongo副本集正常运行后,可用命令tail -200f /usr/local/mongodb/mongo_log.log,查看日志

PRIMARY
SECONDARY
ARBITER
至此,MongoDB 复制(副本集)搭建完成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值