mongoDB基础入门
介绍
mongoDB是一个存储文档
的非关系型数据库
- mongoDB的结构:
- 数据库: 包含集合
- 集合: 存储文档
- 文档: json格式
一条命令在docker容器中运行mongoDB
代码语言:javascript复制docker run --name mymongo -v /mongo/data:/data/db -d mongo:4
docker ps #查看容器状态
docker logs mymongo #查看日志
mongoExpress 的使用
基于网络的mongoDB数据库管理页面
代码语言:javascript复制docker pull mongo-express
docker run --link mymongo:mongo -p 8081:8081 mongo-express
浏览器访问http://ip:8081 即可
mongo Shell客户端
是一个用来操作mongoDB的javascript客户端界面
代码语言: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()