玩转MongoDB—搭建MongoDB集群

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 玩转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(副本集)

网络异常,图片无法展示
|


(图片来自:www.mongodb.com/docs/manual…

Replica Set概念翻译过来就是副本集 ,也是相当于主从复制的意思,主节点负责读写数据,从节点负责备份数据,当主节点宕机后,剩余从节点会自动的选取出主节点进行数据的读写。

网络异常,图片无法展示
|


(图片来自:www.mongodb.com/docs/manual…

两个角色:

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

3.1 总体流程

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

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 6月  26 16:28 .
drwxr-xr-x 19 root root  0 6月  26 07:37 ..
drwxrwxrwx  4 root root  0 6月  26 21:52 db1
drwxrwxrwx  4 root root  0 6月  26 21:52 db2
drwxrwxrwx  4 root root  0 6月  26 21:52 db3
ymx@ymxdedeepin:/data$ cd ..
ymx@ymxdedeepin:/$ sudo chmod 777 -R data/
复制代码
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
复制代码

语法:

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

概念:

网络异常,图片无法展示
|


3.2.3 进入配置

语法:

var config = { 
    _id:[副本集名称], 
    members:[
        {_id:0,host:[节点主机名:端口号]},
        {_id:1,host:[节点主机名:端口号]},
        ......
    }
rs.initiate(config);
复制代码

实例:

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
复制代码
3.2.4 进入其他节点观察
ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo 127.0.0.1:27012
......
ymx:SECONDARY> 
复制代码
ymx@ymxdedeepin:~/Desktop/mongodb/bin$ ./mongo 127.0.0.1:27013
......
ymx:SECONDARY> 
复制代码
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(分片)

网络异常,图片无法展示
|


(图片来自:www.mongodb.com/docs/manual…

三个角色:

  • 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配置分片数据库和集合以及片键信息
复制代码

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/
复制代码
4.2.2 启动Shard节点
mongod --port 27021 --dbpath /data/shard_test/db1 --bind_ip 0.0.0.0 --shardsvr --replSet "shards"/localhost:27022
复制代码
mongod --port 27022 --dbpath /data/shard_test/db2 --bind_ip 0.0.0.0 --shardsvr --replSet "shards"/localhost:27021
复制代码

进入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)
}
复制代码
4.2.3 启动Config Servers节点
mongod --port 27100 --dbpath /data/shard_test/config1 --bind_ip 0.0.0.0 --replSet  "configs"/localhost:27101 --configsvr
复制代码
mongod --port 27101 --dbpath /data/shard_test/config2 --bind_ip 0.0.0.0 --replSet "configs"/localhost:27100 --configsvr
复制代码
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);
复制代码

实例:

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);
复制代码
4.2.5 启动Router节点
./mongos --port 27999 --configdb "configs"/localhost:27100,localhost:27101 --bind_ip 0.0.0.0
复制代码

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

4.2.6 利用mongos进入路由配置分片节点
./mongo -port 27999
use admin
db.runCommand({ addshard:"localhost:27021","allowLocal":true });
db.runCommand({ addshard:"localhost:27022","allowLocal":true });
复制代码
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~


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5月前
|
NoSQL Cloud Native MongoDB
MongoDB 主从集群 2
MongoDB 主从集群 2
|
6月前
|
运维 NoSQL 安全
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。 适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。
485 1
|
5月前
|
存储 NoSQL 网络协议
MongoDB 主从集群 1
MongoDB 主从集群 1
|
1月前
|
NoSQL MongoDB
搭建MongoDB分片式集群
搭建MongoDB分片式集群
13 0
|
2月前
|
存储 缓存 NoSQL
MongoDB详解(三)——MongoDB集群
MongoDB详解(三)——MongoDB集群
35 4
|
6月前
|
NoSQL MongoDB
MongoDB分片+副本集高可用集群的启停步骤
MongoDB分片+副本集高可用集群的启停步骤
139 0
|
7月前
|
存储 NoSQL 网络安全
如何开通MongoDB的专属集群
本案例旨在展示如何开通MongoDB的专属集群。
68 1
|
4月前
|
NoSQL MongoDB Docker
docker搭建mongodb集群
docker搭建mongodb集群
86 0
|
4月前
|
Kubernetes NoSQL MongoDB
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
k8s教程(pod篇)-使用StatefulSet搭建MongoDB集群
446 1
|
7月前
|
存储 NoSQL 关系型数据库
MongoDB 的集群架构与设计
MongoDB 的集群架构与设计
1808 0