前言
在搭建Mongo的副本集过程中,由于没有找到详细的资料,再加上钻了个牛角尖,左弄右弄,尝试多次终于搭建成功,特此详细记录下来,供后来者参考与借鉴。
复制
如果我们的数据库只存在于一台服务器,若这台服务器宕机了,那对于我们的数据将会是灾难,当然这只是其中一个原因,若数据量非常大,读写操作势必会影响数据库的性能,这时候复制就显得相当重要了,因为 MongoDB 可以通过复制,实现读写分离。
复制是一种在多个服务器上同步数据的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
总之,复制可以使你免受硬件故障与服务中断的影响,及时恢复数据。由于数据有多个副本,所以可以将其中一个副本用于灾难恢复、报告或备份。
复制的作用
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据(读写的灵活性)
以上,是教科书或网络上给的标准答案,在这我从另一个角度来重新阐释复制,由于移动支付的深度介入,从而把线上线下的数据进行了有效整合,把以前的线下数据通过“交易”链接到了线上,交易需要支付才能支撑,因而移动支付构成了整个人类社会网络的“端口”,这样就产生了大量的活数据实时更新,形成闭环,支持决策。
大数据的产生依赖于移动支付,而大数据的存储却依赖于数据有效存储,数据的有效存储当然根植于数据的备份与复制机制,这就是数据的高可用性。
Mongo的副本集
主节点(Primary)
提供所有增、删、查、改操作
从节点(Secondary)
可以提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到从节点上。
仲裁节点(Arbiter)
仲裁节点是一种特殊的节点,它本身并不存储数据,主要作用在于,当主节点挂掉以后,通过投票的方式决定哪个从节点成为主节点。如果没有仲裁节点,如果主节点挂掉,那么整个副本集中就没有了主节点
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
副本集特点
- 具有 N 个节点的集群
- 任何节点都可能成为主节点
- 所有写入操作必须由主节点来完成
- 自动故障转移
- 自动故障恢复
- 重新推举主节点
副本集的搭建
- 准备Mongo服务器
- 172.16.152.57:27017
- 172.16.152.60:27017
- 172.16.154.237:27017 (Arbiter)
注意:服务器Mongo服务启动后请确定,相互间能否正常通信,可用命令telnet IP 端口
- 启动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,这样局域网内的副本集节点间才能相互通信。
- 初始化副本集
#连接 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")
- 添加仲裁节点
#添加仲裁节点Arbiter命令rs.addArb(HOST_NAME:PORT)
rs.addArb("172.16.154.237:27017")
- 使用 rs.status() 命令查看副本集的状态
SECONDARY和ARBITER上看到的信息类似
- 通过db.isMaster()查看副本集信息
- 当我们的Mongo副本集正常运行后,可用命令tail -200f /usr/local/mongodb/mongo_log.log,查看日志
至此,MongoDB 复制(副本集)搭建完成。