MongoDB基础入门之一:基础入门和复制集
mongoDB基础入门
介绍
mongoDB是一个存储文档
的非关系型数据库
- mongoDB的结构:
- 数据库: 包含集合
- 集合: 存储文档
- 文档: json格式
一条命令在docker容器中运行mongoDB
docker run --name mymongo -v /mongo/data:/data/db -d mongo:4 docker ps #查看容器状态 docker logs mymongo #查看日志
mongoExpress 的使用
基于网络的mongoDB数据库管理页面
docker pull mongo-express docker run --link mymongo:mongo -p 8081:8081 mongo-express
浏览器访问http://ip:8081 即可
mongo Shell客户端
是一个用来操作mongoDB的javascript客户端界面
运行mongo shell docker exec -it mymongo mongo > exit #退出mongoshell进程
mongoDB复制集
数据复制
带来的好处
- 高可用性
- 安全性
- 分流与分工
复制集
mongodb集群
不同节点有不同的分工
- 主节点: 处理写请求
- 副节点: 从主节点复制和更新数据,和主节点数据保持一致;处理读请求
复制集节点
- 每个节点都会想其他节点按照一定频率发送心跳请求
- 每隔2s发送一次,超过10s则请求超时
- 每个复制集节点最多有50个节点(因为心跳请求的数量是有限的,会影响机器的性能)
- 复制集选举
- 复制集节点上有term的计数器,每次选举会将term+1
- 如果主节点下线或者故障,剩余的副节点会因为心跳不通而开始选举
- 各节点优先级的不同会使其成为新主节点的可能性
- 候选节点会发起选举,先给自己投一票,然后更新计数器
- 对比数据和先主节点的数据同步程度,高的会优先选择
- 候选节点得票数超过一半,会优先被选举成新的主节点
复制集的候选节点发起选举,每个节点投票给比自己更同步的节点
得到超过半数选票的候选节点会当选为主节点
复制集中最多可以有7个投票节点
- 触发选举的事件
- 主节点和副节点之间的心跳超时
- 复制集初始化
- 新节点加入复制集
投票机
- 也是一个副节点
- 不会从主节点同步数据
- 不可能被选举为主节点
- 可以参与投票,但不能给自己投票
初始同步
- 主节点上的所有信息拷贝到副节点
同步写库记录
- 性能比较差,会出现block的情况
- local.oplog.rs(主副节点是同步的)
- 写库记录中的每条记录都可以被重复使用
- 多个线程分批次使用日志记录
- 写库日志的大小和文档的大小不一定成正比
复制集的搭建
- 使用docker的方式
### 前期准备 ~]# docker network create mynetwork ~]# docker network ls ~]# docker run --net mynetwork --name mongo1 -v /mymongo/data1:/data/db -p 27017:27017 -d mongo:4 --replSet myset --port 27017 ~]# docker run --net mynetwork --name mongo2 -v /mymongo/data2:/data/db -p 27018:27018 -d mongo:4 --replSet myset --port 27018 ~]# docker run --net mynetwork --name mongo3 -v /mymongo/data3:/data/db -p 27019:27019 -d mongo:4 --replSet myset --port 27019 ### 创建复制集 ~]# docker exec -it mongo1 mongo > rs.initiate( { _id: "myset", members: [ { _id: 0, host: "mongo1:27017" }, { _id: 1, host: "mongo2:27018" }, { _id: 2, host: "mongo3:27019" } ] } ) > rs.status()