我正在参加「掘金·启航计划」
环境: centos7 docker vbox虚拟机
目的:入门熟悉下mongodb副本集
简介
MongoDB中的副本集是一组维护相同数据集合的 mongod进程。副本集提供了冗余和高可用性(主节点挂了之后可以调度其他节点进行提升),并且这是所有生产部署的基础。
它含有三种角色:主节点,副本节点,仲裁者
拉取mongo
docker pull mongo
运行并挂载容器
-d 后台运行
--name 取名
-p 本机开放端口:docker端口
--restart=always 随着docker的启动而启动
--privileged=true 获取root权限
-v 目标路径:源路径 挂载路径,它会自动创建没有的目录
--replSet 副本集名字
容器1
docker run -d --name mongo1 -p 27001:27017 \
--restart=always --privileged=true \
-v /dzz/mongo1/db:/data/db \
-v /dzz/mongo1/log:/data/log \
mongo --replSet mongo_all
容器2
docker run -d --name mongo2 -p 27002:27017 \
--restart=always --privileged=true \
-v /dzz/mongo2/db:/data/db \
-v /dzz/mongo2/log:/data/log \
mongo --replSet mongo_all
容器3
docker run -d --name mongo3 -p 27003:27017 \
--restart=always --privileged=true \
-v /dzz/mongo3/db:/data/db \
-v /dzz/mongo3/log:/data/log \
mongo --replSet mongo_all
docker ps查看启动的容器
docker inspect 容器名或ID 查看详细信息
进入mongo
选择其中一个作为主节点
首先进入容器内部
docker exec -it mongo1 bash
在进入mongo里
mongo
创建集群
自己取名={_id:"副本集名称",members:[{_id:0,host:"IP地址:27001",priority:优先级数字越大越高},{_id:1,host:"IP地址:27002",priority:优先级数字越大越高},{_id:2,host:"IP地址:27003",arbiterOnly:仲裁节点为true}]};
mycfg={_id:"mongo_all",members:[{_id:0,host:"192.168.56.106:27001",priority:2},{_id:1,host:"192.168.56.106:27002",priority:1},{_id:2,host:"192.168.56.106:27003",arbiterOnly:true}]};
rs.initiate(mycfg); #初始化
结果
在主节点mongo1创建数据库
use db1;
db.db1.insert({"name": "dzz"}); #想要查看数据库需要插入一些数据
查看db1
show dbs;
在另一个终端打开mongo2(副本节点)
show dbs;
报错
原因:SECONDARY(副本节点)不允许读
解决:
rs.slaveOk();
查看数据库
show dbs;
mongo3是仲裁节点,负责主节点挂了之后升级副本节点
完毕!