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()