MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行
这些操作,从而保证从节点的数据与主节点一致。

MongoDB复制结构图
具有 自动故障转移机制
MongoDB副本集在主从复制基础上实现了故障转移的功能,也就是当主节点宕机时,某一台副本节点会自动提升为新主节点。
缺陷
所有读写都在主节点,不能解决主节点单点压力问题
搭建副本集
至少两个节点以上,一般时奇数个,3台、5台、7台……
1. 创建数据目录
# 在安装目录(~/mongodb/bin)中创建
- mkdir -p ../repl/data1
- mkdir -p ../repl/data2
- mkdir -p ../repl/data3
2. 搭建副本集
建议localhost写成具体IP
# 在多个命令行窗口分别启用
# 一个副本集的多个MongoDB进程,要在同一副本集中名字相同(myReplaceName)
$ mongo --port 27017 --dbpath ../repl/data1 --bind_ip 0.0.0.0 --replSet myReplaceName/[localhost:27018,localhost:27019]
$ mongo --port 27018 --dbpath ../repl/data2 --bind_ip 0.0.0.0 --replSet myReplaceName/[localhost:27017,localhost:27019]
$ mongo --port 27019 --dbpath ../repl/data3 --bind_ip 0.0.0.0 --replSet myReplaceName/[localhost:27017,localhost:27018]
# --replSet 副本集 myReplace 副本集名称/集群中其他节点的主机端口
3. 配置副本集
不初始化不能进行选举
3.1 登录任意客户端节点,连接任意节点
$ cd mongodb/bin
$ ./mongo --port 27017
3.2 初始化副本集
> use admin
> var config = {
_id:"myReplaceName",
members:[
{_id:0,host:"localhost:27017"},
{_id:1,host:"localhost:27018"},
{_id:2,host:"localhost:27019"}]
}
> rs.initiate(config); #初始化配置
#从节点是无法读的
> rs.slaveOk();
> rs.secondaryOk() #允许客户端临时访问
客户端使用副本集
SpringBoot应用程序中
spring:
data:
mongodb:
uri: mongodb://192.168.0.1:27017,192.168.0.1:27018,192.168.0.1:27019/databaseName?replicaSet=myReplaceName
#语法:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]