MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的荣誉备份,提高可用性。
一:原理
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
客户端从主节点读取数据,在客户端写入数据到主节点时, 主节点与从节点进行数据交互保障数据的一致性。
二:MongoDB副本集设置
1):启动主节点
首先停止当前mongoDB服务,然后使用下面命令重新启动服务
mongod --port 27017 --dbpath "/wing/mongo/data" --replSet rs0
# --dbpath :指定mongo数据存储地址
# --replSet :指定mongo实例名称
2):添加副本集
rs.add("192.168.1.2:27017")
3):状态查看
rs.conf() # 查看副本集的配置
rs.status() # 查看副本集状态
三:配置流程
1:启动容器
# 1:启动三个容器,三个节点指向一个"rs"
# 1-1
docker run -itd --name mongo1 -p 27021:27017 --restart=always -v /docker_volume/mongodb_1/data/db:/data/db -v /docker_volume/mongodb_1/data/conf:/data/conf -v /docker_volume/mongodb_1/data/log:/data/log mongo:4.4 --replSet "rs"
# 1-2
docker run -itd --name mongo2 -p 27022:27017 --restart=always -v /docker_volume/mongodb_2/data/db:/data/db -v /docker_volume/mongodb_2/data/conf:/data/conf -v /docker_volume/mongodb_2/data/log:/data/log mongo:4.4 --replSet "rs"
# 1-3
docker run -itd --name mongo3 -p 27023:27017 --restart=always -v /docker_volume/mongodb_3/data/db:/data/db -v /docker_volume/mongodb_3/data/conf:/data/conf -v /docker_volume/mongodb_3/data/log:/data/log mongo:4.4 --replSet "rs"
# 上面是参数形式启动,下面是第二种方式通过配置文件启动
2:设置主节点
# 选择你要设为主节点的mong容器,进入并连接 ,只在主节点执行
sudo docker exec -it mongo1 mongo --host 10.0.4.17 --port 27021
# 进入容器化,执行初始化命令,将该节点变为主节点
rs.initiate()
# 或者
rs.initiate(
{
_id:"集群名称", # mongoDB启动时 --replSet "rs" 一致,此处值应该是rs
version:1,
members:[
{_id:0,host:"主节点IP:27017"}, #主节点
{_id:1,host:"从节点IP:27017"},
{_id:2,host:"从节点IP:27017"}
]
}
)
# 例子
rs.initiate(
{
_id:"rs2",
version:1,
members:[
{_id:0,host:"10.0.4.17:27024"},
{_id:1,host:"10.0.4.17:27025"},
{_id:2,host:"10.0.4.17:27026"}
]
}
)
3:配置从节点
# 从节点默认是不可读 不可写的,需开启读,才能验证是否配置成功!只在从节点执行
db.getMongo().setSlaveOk()
四:配置流程(配置文件方式:推荐)
1:创建配置文件
# 创建文件mongo.conf.orig,修改权限777,添加如下内容
# 每个配置文件都要配置
storage:
dbPath: /data/db # 容器里的路径,并非挂载路径
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /data/log/mongodb.log # 容器里的路径,并非挂载路径
processManagement:
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 0.0.0.0
# 复制集的名字
replication:
replSetName: rs2
# 分片集群必须要的属性
sharding:
clusterRole: shardsvr
2:创建日志文件并修改权限
# 创建日志文件,空文件,不需加内容,每个节点都要添加
touch mongodb.log
# 修改权限
sudo chmod 777 mongodb.log
3:启动容器
# 1:启动三个容器,三个节点指向一个"rs"
# 1-1
docker run -itd --name mongo4 -p 27024:27017 --restart=always -v /docker_volume/mongodb_4/data/db:/data/db -v /docker_volume/mongodb_4/data/conf:/data/conf -v /docker_volume/mongodb_4/data/log:/data/log mongo:4.4 -f /data/conf/mongo.conf.orig
# 1-2
docker run -itd --name mongo5 -p 27025:27017 --restart=always -v /docker_volume/mongodb_5/data/db:/data/db -v /docker_volume/mongodb_5/data/conf:/data/conf -v /docker_volume/mongodb_5/data/log:/data/log mongo:4.4 -f /data/conf/mongo.conf.orig
# 1-3
docker run -itd --name mongo6 -p 27026:27017 --restart=always -v /docker_volume/mongodb_6/data/db:/data/db -v /docker_volume/mongodb_6/data/conf:/data/conf -v /docker_volume/mongodb_6/data/log:/data/log mongo:4.4 -f /data/conf/mongo.conf.orig
# -f 配置文件:指的是容器内的配置文件
4:设置主节点
# 选择你要设为主节点的mong容器,进入并连接 ,只在主节点执行
sudo docker exec -it mongo1 mongo --host 10.0.4.17 --port 27021
# 进入容器化,执行初始化命令,将该节点变为主节点
rs.initiate()
# 或者
rs.initiate(
{
_id:"集群名称", # mongoDB启动时 --replSet "rs" 一致,此处值应该是rs
version:1,
members:[
{_id:0,host:"主节点IP:27017"}, #主节点
{_id:1,host:"从节点IP:27017"},
{_id:2,host:"从节点IP:27017"}
]
}
)
# 例子
rs.initiate(
{
_id:"rs1",
version:1,
members:[
{_id:0,host:"10.0.4.17:27021"},
{_id:1,host:"10.0.4.17:27022"},
{_id:2,host:"10.0.4.17:27023"}
]
}
)
5:配置从节点
# 从节点默认是不可读 不可写的,需开启读,才能验证是否配置成功!只在从节点执行
db.getMongo().setSlaveOk()