• 玩转MongoDB—搭建MongoDB集群


    1 概述

    如题,本次玩转MongoDB我们从搭建集群开始,话说MongoDB一共有三种搭建集群的方式,但是由于版本更新,据说在4.0版本之后第一种方式,也就是主从复制的方式被遗弃掉了,大概是因为这种方式的效率不高吧,因为目前我们使用的是5.x版本,因此就不花时间讲解第一种方式了,在其他的文章上摘录了一下,可供大家参考。重点还是要放在后两种。

    2 方式一:主从复制

    (1)准备三个机器一个主机两个备机

    mongod --port 27007 --dbpath /data/master/ --bind_ip 0.0.0.0 --master --oplogSize 50

    mongod --port 27008 --dbpath /data/slave1 --bind_ip 0.0.0.0 --slave --source 127.0.0.1:27007 --only ymx

    mongod --dbpath /data/slave2 --port 27009 --bind_ip 0.0.0.0 --slave --source 127.0.0.1:27007 --only ymx --slavedelay 30

    (2)主从复制的选项

    • –master :主节点
    • –slave :从节点
    • –source [server:port] :为从节点时从哪个主节点复制<>
    • –only [库名] : 为从节点时只复制主节点的那个库
    • –slavedelay [秒数]:从节点延迟多长时间复制主节点 秒
    • –autoresync :从机数据不是最新是自动重新同步数据
    • –oplogSize :主节点的操作日志单位是M

    (3)查看集群状态

    rs.help();

    rs.slaveOk(); //开启从机查询

    3 方式二:Replica Set(副本集)


    (图片来自:https://www.mongodb.com/docs/manual/replication/)

    Replica Set概念翻译过来就是副本集 ,也是相当于主从复制的意思,主节点负责读写数据,从节点负责备份数据,当主节点宕机后,剩余从节点会自动的选取出主节点进行数据的读写。
    在这里插入图片描述
    (图片来自:https://www.mongodb.com/docs/manual/replication/)

    两个角色:

    • Primary:主节点,负责数据的交互
    • Secondary:从节点,负责数据的备份

    3.1 总体流程

    环境:一台Linux虚拟机,三个MongoDB节点(一主二从)

    1. 创建对应目录
    2. 根据目录和端口以及其他集群参数启动各个节点
    3. 在主节点进行集群配置
    4. 进入各个从节点观察
    5. 配置成功
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.2 具体流程

    3.2.1 创建对应目录
    ymx@ymxdedeepin:/data$ sudo mkdir db1
    ymx@ymxdedeepin:/data$ sudo mkdir db2
    ymx@ymxdedeepin:/data$ sudo mkdir db3
    ymx@ymxdedeepin:/data$ ls -al
    drwxrwxrwx  6 root root  0 626 16:28 .
    drwxr-xr-x 19 root root  0 626 07:37 ..
    drwxrwxrwx  4 root root  0 626 21:52 db1
    drwxrwxrwx  4 root root  0 626 21:52 db2
    drwxrwxrwx  4 root root  0 626 21:52 db3
    ymx@ymxdedeepin:/data$ cd ..
    ymx@ymxdedeepin:/$ sudo chmod 777 -R data/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    3.2.2 启动各个节点
    mongod --port 27011 --dbpath /data/db1 --bind_ip 0.0.0.0 --replSet  ymx/localhost:27012
    mongod --port 27012 --dbpath /data/db2 --bind_ip 0.0.0.0 --replSet  ymx/localhost:27013
    mongod --port 27013 --dbpath /data/db3 --bind_ip 0.0.0.0 --replSet  ymx/localhost:27011
    
    • 1
    • 2
    • 3

    语法:

    [命令] --port [端口] --dbpath [目录] --bind_ip [绑定IP] --replSet [副本集名称]/[相邻接点主机名:端口号]
    mongod --port 27011 --dbpath /data/db1 --bind_ip 0.0.0.0 --replSet  ymx/localhost:27012
    
    • 1
    • 2

    概念:
    在这里插入图片描述

    3.2.3 进入配置

    语法:

    var config = { 
        _id:[副本集名称], 
        members:[
            {_id:0,host:[节点主机名:端口号]},
            {_id:1,host:[节点主机名:端口号]},
            ......
        }
    rs.initiate(config);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    实例:

    ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo 127.0.0.1:27011
    ......
    > use admin
    switched to db admin
    > 
    > var config = { 
    ...     _id:"ymx", 
    ...     members:[
    ...         {_id:0,host:"localhost:27011"},
    ...         {_id:1,host:"localhost:27012"},
    ...         {_id:2,host:"localhost:27013"}]
    ...     }
    > rs.initiate(config);
    {
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1656250256, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1656250256, 1)
    }
    ymx:SECONDARY> 
    ymx:PRIMARY> 
    ymx:PRIMARY> show databases
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    3.2.4 进入其他节点观察
    ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo 127.0.0.1:27012
    ......
    ymx:SECONDARY> 
    
    • 1
    • 2
    • 3
    ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo 127.0.0.1:27013
    ......
    ymx:SECONDARY> 
    
    • 1
    • 2
    • 3
    3.2.5 配置成功

    在这里插入图片描述

    3.3 注意点

    3.3.1 Driver的URL

    mongodb://127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/ems(库名)?replcaSet=spock(副本集名称)

    3.3.2 从节点访问数据

    从节点是不能直接访问数据的,如果需要访问,则可以使用rs.slaveOk();

    4 方式三:Sharding(分片)

    在这里插入图片描述
    (图片来自:https://www.mongodb.com/docs/manual/sharding/)

    三个角色:

    • Router:路由,客户端由此接入,且让整个集群看上去像单一数据库。
    • Config Servers:mongod实例,存储了整个 ClusterMetadata,即元数据。
    • Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

    4.1 总体流程

    环境:一台Linux虚拟机,一个Router、两个Shard、两个Config Servers

    1. 创建数据目录
    2. 根据端口和目录启动Shard节点
    3. 根据端口和目录启动Config Servers节点
    4. 配置Config Servers节点副本集
    5. 启动Router节点
    6. 利用mongos进入路由配置分片节点
    7. 利用mongos配置分片数据库和集合以及片键信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.2 具体流程

    4.2.1 创建数据目录
    ymx@ymxdedeepin:/$ cd data/
    
    ymx@ymxdedeepin:/data$ sudo mkdir shard_test
    请输入密码:
    验证成功
    ymx@ymxdedeepin:/data$ cd shard_test/
    ymx@ymxdedeepin:/data/shard_test$ ls
    ymx@ymxdedeepin:/data/shard_test$ sudo mkdir db1 db2 config1 config2
    ymx@ymxdedeepin:/data/shard_test$ ls
    config1  config2  db1  db2
    ymx@ymxdedeepin:/data/shard_test$ cd ..
    ymx@ymxdedeepin:/data$ sudo chmod 777 -R shard_test/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    4.2.2 启动Shard节点
    mongod --port 27021 --dbpath /data/shard_test/db1 --bind_ip 0.0.0.0 --shardsvr --replSet "shards"/localhost:27022
    
    • 1
    mongod --port 27022 --dbpath /data/shard_test/db2 --bind_ip 0.0.0.0 --shardsvr --replSet "shards"/localhost:27021
    
    • 1

    进入Shard节点进行配置:

    ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo 127.0.0.1:27011
    ......
    > use admin
    switched to db admin
    > 
    > var config = { 
    ...     _id:"shards", 
    ...     members:[
    ...         {_id:0,host:"localhost:27022"},
    ...         {_id:1,host:"localhost:27021"},]
    ...     }
    > rs.initiate(config);
    {
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1656250256, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1656250256, 1)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    4.2.3 启动Config Servers节点
    mongod --port 27100 --dbpath /data/shard_test/config1 --bind_ip 0.0.0.0 --replSet  "configs"/localhost:27101 --configsvr
    
    • 1
    mongod --port 27101 --dbpath /data/shard_test/config2 --bind_ip 0.0.0.0 --replSet "configs"/localhost:27100 --configsvr
    
    • 1
    4.2.4 配置Config Servers节点副本集
    use admin 
    var config = { 
    	 	_id:"configs", 
    		configsvr: true,
    	 	members:[
    	   	{_id:0,host:"localhost:27100"},
    	   	{_id:1,host:"localhost:27101"}]
    }
    rs.initiate(config);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    实例:

    ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo -port 27999
    ......
    mongos> use admin
    switched to db admin
    mongos> var config = { 
    	 	_id:"configs", 
    		configsvr: true,
    	 	members:[
                {_id:0,host:"localhost:27100"},
                {_id:1,host:"localhost:27101"}
    	   	]
    	   	}
    mongos> rs.initiate(config);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    4.2.5 启动Router节点
    ./mongos --port 27999 --configdb "configs"/localhost:27100,localhost:27101 --bind_ip 0.0.0.0
    
    • 1

    注意: config为上面的副本集名称

    4.2.6 利用mongos进入路由配置分片节点
    ./mongo -port 27999
    
    use admin
    
    db.runCommand({ addshard:"localhost:27021","allowLocal":true });
    
    db.runCommand({ addshard:"localhost:27022","allowLocal":true });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4.2.7 利用mongos配置分片数据库和集合以及片键信息
    • 设置分片的库:db.runCommand({ enablesharding:“[库名]” });

    • 设置库中集合和片键信息:

      db.runCommand({ shardcollection: “[库名].users”, key: { _id:1}}) //按照id分片

      db.runCommand({ shardcollection: “[库名].users”, key: { _id: “hashed”}}) //按照hash分片

    5 总结

    总结下三种类型的优缺点吧:

    • 主从复制:
      • 优点:配置简单
      • 缺点:被不推荐使用了
    • Replica Set:
      • 优点:高可用,能够自动故障转移
      • 缺点:占用存储空间过多,数据冗余
    • Sharding:
      • 优点:存储空间的利用率较高
      • 缺点:节点类型复杂

    see you~

  • 相关阅读:
    开源电子合同签署平台小程序源码 在线签署电子合同小程序源码 合同在线签署源码
    【Vue基础】Vue快速上手
    解决nexus3登录x509: certificate has expired or is not yet valid
    代码规范之-理解ESLint、Prettier、EditorConfig
    LeetCode——二分查找(Java)
    怎样分配vlan联通全过程
    【MindSpore易点通】Transformer的注意力机制
    面试题: 线程池的核心参数
    微服务项目:尚融宝(26)(后端搭建:Nuxt.js入门)
    【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间
  • 原文地址:https://blog.csdn.net/Mr_YanMingXin/article/details/125551491