Mongodb 数据库安装之集群部署

Posted 我只想躺平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb 数据库安装之集群部署相关的知识,希望对你有一定的参考价值。

一、mongodb集群介绍

  MONGODB 有三种集群部署方式,分别是: Master-Slaver 、Replica Set 、Sharding

  • Master-Slaver:是一种主从副本的模式,官方版本 4.X 后已经不再支持了。

  • Replica Set: 取代了 Master-Slaver 模式,是一种互为主从的关系。

    ​ 将数据复制多份保存,不同服务器保存同一份数据,出现故障时自动切换,实现故障转移。

    ​ 官方建议用副本集替代主从复制的架构

  • Sharding 集群:是真正的高可用集群,模式适合处理大量数据。

    ​ 将数据分开存储,不同服务器分片保存不同的数据,所有服务器数据的总和为整个数据集。

二、mongodb集群安装

1、主从复制介绍
Mongodb 的主从复制 (此处只做简单介绍)
1、主从复制是一个简单的数据库同步备份的集群技术,至少两台服务器,对主服务器的任何操作都会同步到从服务器上。

2、主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移
   对于主从复制无法自动故障转移的缺陷,各个数据库都在改进。mysql推出的MGR,Redis的哨兵,Mongodb的复制集。

3、MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制模式中的的首选
  副本集是特殊的主从复制的一种模式,是能够实现自动故障转移的主从复制

4、mongodb 4.x 版本搭建主从复制实验时,报错如下:
  [main] Master/slave replication is no longer supported
  也就是mongodb4.0后,就不再支持简单的主从复制模式!官方推荐的是 副本集 !

5、mongodb现在的稳定版本,最新的依次是 5.0.X 、4.4.X 、4.2.X, 此次实验采用 4.2.18 的版本
2、副本集集群 安装
1、架构说明

 三节点的副本集架构,有两种成员角色表现形式

  • 第一种: 主节点 + 从节点 + 从节点

  • 第二种: 主节点 + 从节点 + 仲裁节点
2、第一种副本集架构

 集群三节点环境: 10.6.2.237(主节点) 、10.6.2.238 (从节点)、10.6.2.239(从节点)

1) 三台主机设置主机名、关闭SELINUX、防火墙、设置时间同步、安装依赖


[root@localhost ~]# hostnamectl set-hostname Test237
[root@localhost ~]# hostnamectl set-hostname Test238
[root@localhost ~]# hostnamectl set-hostname Test239

[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld

[root@localhost ~]# yum -y install ntp
[root@localhost ~]# \\cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@localhost ~]# ntpdate cn.pool.ntp.org
[root@localhost ~]# systemctl start ntpdate && systemctl enable ntpdate
[root@localhost ~]# date

[root@localhost ~]# yum -y install libcurl openssl numactl

2) 10.6.2.237 上操作:


#  在 10.6.2.237 上操作:
[root@test237 ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.2.18.tgz -C /usr/local
[root@test237 ~]# mv mongodb-linux-x86_64-rhel70-4.2.18/ mongodb
[root@test237 ~]# mkdir -p /usr/local/mongodb/data,config,logs

#  此种方式安装,没有mongodb的配置文件,手动编写一个;为测试集群安装,此处配置文件只加上少量必要的参数
[root@test237 ~]# cd /usr/local/mongodb/config
[root@test237 ~]# vim mongodb.conf
port=27017
bind_ip=10.6.2.237
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/logs/mongo.log
fork=true
replSet=testdata

3)、同步目录


#  将 mongodb 整个目录推送到另外两个节点上,只修改要修改下 bind_ip 的地址即可
[root@test237 ~]# scp -r /usr/local/mongodb root@10.6.2.238:/usr/local/
[root@test237 ~]# scp -r /usr/local/mongodb root@10.6.2.239:/usr/local/

[root@test238 ~]# sed -i "s/237/238/" /usr/local/mongodb/config/mongodb.conf
[root@test239 ~]# sed -i "s/237/239/" /usr/local/mongodb/config/mongodb.conf

4)、三个节点都启动服务并确认


[root@test237 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/mongodb.conf
[root@test238 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/mongodb.conf
[root@test239 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/config/mongodb.conf

[root@test237 ~]# netstat -lntp | grep 27017 | grep -v grep
tcp     0    0 10.6.2.237:27017       0.0.0.0:*         LISTEN      15791/mongod  
[root@test238 ~]# netstat -lntp | grep 27017 | grep -v grep
tcp     0    0 10.6.2.237:27017       0.0.0.0:*         LISTEN      16586/mongod  
[root@test239 ~]# netstat -lntp | grep 27017 | grep -v grep
tcp     0    0 10.6.2.237:27017       0.0.0.0:*         LISTEN      12717/mongod  

5)、配置环境变量


#  在三个节点启配置好环境变量
[root@test237 ~]# cp /etc/profile /etc/profile.bak
[root@test237 ~]# vim /etc/profile   文本末尾追加下面两行
export MONGODB_HOME=/usr/local/mongodb
export PATH=.:$PATH:$MONGODB_HOME/bin

[root@test237 ~]# source /etc/profile

6)、初始化集群 (任意节点执行,选择执行的节点将成为主节点)


 ###  集群的初始化有两种方法

 1) 初始化方式一:通过自定义"配置文件"设置好角色,引用"配置文件"完成初始化

    [root@test237 ~]# mongo 10.6.2.237:27017
    > show dbs
    2022-01-10T17:45:33.993+0800 E  QUERY    [js] uncaught exception: Error:     
    listDatabases failed:
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotPrimaryNoSecondaryOk"
     

    #  查看数据库的信息,报错!!!
    #  MONGODB集群和单机版的不同,没进行初始化之前,无法查看数据库的信息的,第一步必须初始化

    > use admin        # 切换到 admin 库下面进行
    switched to db admin

    #  定义一个配置文件,依据配置文件内容强进行初始化
    > config = _id: "testdata",members:[_id: 0,host: 10.6.2.237:27017,_id: 1,host:      10.6.2.238:27017,_id: 2,host: 10.6.2.239:27017];

    ### 执行之后输出的信息
    
        "_id" : "testdata",
        "members" : [
            
                "_id" : 0,
                "host" : "10.6.2.237:27017"
            ,
            
                "_id" : 1,
                "host" : "10.6.2.238:27017"
            ,
            
                "_id" : 2,
                "host" : "10.6.2.239:27017"
            
        ]
    

    #  初始化操作
    > rs.initiate(config);
     "ok" : 1 

    #  初始化后敲几次回车,此时可以看到,本机(10.6.2.237)已经是主节点了
    testdata:SECONDARY> 
    testdata:PRIMARY> 
    testdata:PRIMARY>

    #  状态查看,主要看  member 里面的关键几行
    testdata:PRIMARY> rs.status() 
          。。。 此处省略若干行   。。。

 2) 初始化方式二:先设置主节点,后面逐个加入集群角色完成初始化的过程

    [root@test237 ~]# mongo 10.6.2.237:27017
    > rs.initiate()
    
        "info2" : "no configuration specified. Using a default configuration for the 
        set",
        "me" : "10.6.2.237:27017",
        "ok" : 1
    

    #  初始化后敲几次回车,此时可以看到,本机(10.6.2.237)已经是主节点了
    testmongo:SECONDARY> 
    testmongo:PRIMARY> 
    testmongo:PRIMARY> 

    testmongo:PRIMARY> rs.add("10.6.2.238:27017")
    
        "ok" : 1,
        "$clusterTime" : 
            "clusterTime" : Timestamp(1641862999, 1),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        ,
        "operationTime" : Timestamp(1641862999, 1)
    

    testmongo:PRIMARY> rs.add("10.6.2.239:27017")
    
        "ok" : 1,
        "$clusterTime" : 
            "clusterTime" : Timestamp(1641863542, 1),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        ,
        "operationTime" : Timestamp(1641863542, 1)
    

    testmongo:PRIMARY> rs.status()       # 信息量太大,这里就不展示输出了

7)、 进行集群测试


  测试一: 文档同步测试
  1、在 10.6.2.237 上 创建一个集合和文档
  [root@test237 ~]# mongo 10.6.2.237:27017 
  testmongo:PRIMARY> use test
  switched to db test

  testmongo:PRIMARY> db.info.insert("name":"bob")
  WriteResult( "nInserted" : 1 )

  testmongo:PRIMARY> db.info.find()
   "_id" : ObjectId("61dfeec75ccc3a257cf82a5a"), "name" : "bob" 

  2、 分别去 10.6.2.238 、10.6.2.239 上查看
  10.6.2.238 :
  testmongo:SECONDARY>
  testmongo:SECONDARY> rs.secondaryOk()
  testmongo:SECONDARY> show dbs
  admin   0.000GB
  config  0.000GB
  local   0.000GB
  test    0.000GB

  testmongo:SECONDARY> use test
  switched to db test

  testmongo:SECONDARY> db.info.find()
   "_id" : ObjectId("61dfeec75ccc3a257cf82a5a"), "name" : "bob" 

  如果去 10.6.2.239 上查看 ,发现同样是存在的

  测试二: 把主节点服务进程停掉,会发现另外两个节点其中有一个会成为主节点

  [root@test237 ~]# netstat -lntp | grep 27017 | grep -v grep
  tcp  0 10.6.2.237:27017       0.0.0.0:*         LISTEN      15791/mongod 
  [root@test237 ~]# kill -2 15791

  #  在另外两个节点观察,发现 10.6.2.238 瞬间 成为了 主节点
  [root@test238 ~]# /usr/local/mongodb/bin/mongo 10.6.2.238:27017
  testmongo:SECONDARY> use test
  switched to db test
  testmongo:SECONDARY> db.info.find()
   "_id" : ObjectId("61dfeec75ccc3a257cf82a5a"), "name" : "bob" 
  testmongo:SECONDARY> 
  testmongo:PRIMARY> 
  testmongo:PRIMARY> 

  在此时往集合里面添加一个文档
  testmongo:PRIMARY> db.info.insert("name":"rose")
  WriteResult( "nInserted" : 1 )

  testmongo:PRIMARY> db.info.find()
   "_id" : ObjectId("61dfeec75ccc3a257cf82a5a"), "name" : "bob" 
   "_id" : ObjectId("61dfefd46f394e63f352414c"), "name" : "rose" 

  此时到 10.6.2.239 上去查看,发现刚加的文档已经同步过去了
3、另一种副本集集群

上面的副本集集群,不论那种初始化的方式,集群成员角色构成都是  主节点 + 从节点 + 从节点
下面说下副本集集群的第二种成员构成: 主节点 + 从节点 + 仲裁节点

两者唯一的区别:在开始安装的时候是一样的,就是初始化时的区别

  1、 第一种初始化方式的区别:配置文件里面指定一个仲裁节点,然后进行初始化

     > config = _id: "testdata",members:[_id: 0,host: 10.6.2.237:27017,priority: 2, 
     _id: 1,host: 10.6.2.238:27017,priority: 1,_id: 2,host: 
     10.6.2.239:27017,arbiterOnly: true];

     > rs.initiate(config);
     "ok" : 1 

    testdata> rs.status()

  2、 第二种初始化方式的区别:主节点添加其他节点时指定仲裁节点

    #  进到mongodb的shell界面后,直接进行初始化,初始化后此节点就是 主节点 了 
    > rs.initiate(config);
     "ok" : 1 

    #  初始化后敲几次回车,此时可以看到,本机(10.6.2.237)已经成为主节点了
    testdata:SECONDARY> 
    testdata:PRIMARY> 
    testdata:PRIMARY>

    testdata:PRIMARY> rs.add("10.6.2.238:27017")
    
        "ok" : 1,
        "$clusterTime" : 
            "clusterTime" : Timestamp(1641862999, 1),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        ,
        "operationTime" : Timestamp(1641862999, 1)
    

    testdata:PRIMARY> rs.addArb("10.6.2.239:27017")
    
        "ok" : 1,
        "$clusterTime" : 
            "clusterTime" : Timestamp(1641863056, 1),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        ,
        "operationTime" : Timestamp(1641863056, 1)
    

    testdata:PRIMARY> rs.status()
4、副本集节点的管理
本次实验的副本集集群只是最少节点,即三台服务节点
在实际中会有更多节点的副本集集群存在,这里就涉及到了副本集集群节点的增删问题

1、 增加一个节点作为 从节点
    步骤:
   1、先在节点上部署安装启动服务
   2、在主节点增加此节点,设置角色为 从节点 
    testmongo:PRIMARY> 
    testmongo:PRIMARY> rs.add("10.6.2.238:27017")

    testmongo:PRIMARY> rs.status()       ### 查看验证

2、 增加一个节点作为 仲裁节点
    步骤:
    1、先在节点上部署安装启动服务
    2、在主节点增加此节点,设置角色为 仲裁节点

    testmongo:PRIMARY>    
    testmongo:PRIMARY> rs.addArb("10.6.2.239:27017")

    testmongo:PRIMARY> rs.status()       ### 查看验证

 3、 删除一个节点(从节点、仲裁节点) 

    testmongo:PRIMARY> 
    testmongo:PRIMARY> rs.remove("10.6.2.239:27017")

    testmongo:PRIMARY> rs.status()       ### 查看验证
5、两种集群角色组成的区别

  第一种: 主节点 + 从节点 + 从节点 , 简称: PSS
  第二种: 主节点 + 从节点 + 仲裁节点,简称: PSA

  PSS构成:
   1、P节点故障后,两个S节点通过选举算法,选出新的P节点
   2、此种情况存在脑裂的风险,当两个SS选不出来谁当新的P节点,不是百分百的能选出来,是有这个可能性
  PSA构成:A是仲裁节点,只负责投票选举,A节点上不提供服务,不存放数据,安全性比上面的一种要好

6、扩展的副本集集群架构 --- 特殊节点

  副本集集群中,除了常见的三个集群角色( 主节点、从节点、仲裁节点 )之外,还有两个特殊的节点,分别是 隐藏节点 、 延迟节点
 
  隐藏节点(hidden):
  1、隐藏的节点,对外是不可见的。
  2、不参与选举,也不提供服务,但是数据还是要同步的。这里可以说只是一种安全性的角度考虑,

  延迟节点 (delay):
  1、延迟从库是一个作用,即这个节点上的数据和主节点数据有一定延迟的同步。
  2、延迟时间由人工指定,通常是建议设置时长为3600(一个小时)
  3、由于有延迟的特性,通常也会将delay节点配置为hidden节点,以加强安全性。

3、分片集 + 副本集 集群 安装
1、集群说明及规划

#   此种集群涉及的节点比较多,内存不足无法创建更多的虚拟机,因此采取在各节点起多实例的运行服务的形式来部署完成

1、节点规划
# 节点1: 10.6.2.237  四个实例,端口分别为:27017、27019、27000 、30000
# 节点2: 10.6.2.238  三个实例,端口分别为:27017、27019、27000 
# 节点3: 10.6.2.239  三个实例,端口分别为:27017、27019、27000 

# 数据分片1集群: 10.6.2.237:27017,10.6.2.238:27017,10.6.2.239:27017
# 数据分片2集群: 10.6.2.237:27019,10.6.2.238:27019,10.6.2.239:27019

# 配置集集群: 10.6.2.237:27000,10.6.2.238:27000,10.6.2.239:27000
# 路由节点:   10.6.2.237:30000

# 27017   分片一集群使用的端口
# 27019   分片二集群使用的端口
# 30000   配置集集群使用的端口
# 27000   路由节点使用的端口

### 规划说明:
1、这里使用的由10个节点来完成部署,是实现此种集群部署的最少节点数
2、如果部署 3个或者4个 分片,则需要的节点总数(实例总数)会加上3的倍数
3、路由节点这里使用的是单节点的方式,很多地方把路由节点也部署成一个集群,数量上要再加上二
2、安装前准备工作

   三个节点都要执行下面的命令(注意主机名不同)

    [root@localhost ~]# yum -y install epel-release vim net-tools lrzsz gcc gcc-c++ wget     curl unzip zip ntp git telnet 
    [root@localhost ~]# hostnamectl set-hostname XXX    ### 不同主机对应不同主机名 
    [root@localhost ~]# bash

    [root@localhost ~]#  setenforce 0
    [root@localhost ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g"                 
    /etc/selinux/config
    [root@localhost ~]#  systemctl stop firewalld && systemctl disable firewalld
    [root@localhost ~]#  systemctl stop postfix && systemctl disable postfix

    [root@localhost ~]#  \\cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    [root@localhost ~]#  ntpdate cn.pool.ntp.org
    [root@localhost ~]#  systemctl start ntpdate && systemctl enable ntpdate
    [root@localhost ~]#  date

    [root@localhost ~]#  yum -y install libcurl openssl numactl
3、集群部署

   1、解压安装包、编辑配置文件 (在节点1 10.6.2.237 上操作)
   [root@test237 ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.2.18.tgz -C /usr/local
   [root@test237 ~]# mv mongodb-linux-x86_64-rhel70-4.2.18/ mongodb
   [root@test237 ~]# /usr/local/mongodb/bin/mongo --version
    MongoDB shell version v4.2.18

   [root@test237 ~]# mkdir -p /data/mongodb/shard01/data,config,logs
   [root@test237 ~]# mkdir -p /data/mongodb/shard02/data,config,logs
   [root@test237 ~]# mkdir -p /data/mongodb/config/data,config,logs
   [root@test237 ~]# mkdir -p /data/mongodb/route/config,logs

   [root@test237 ~]# vim /data/mongodb/shard01/config/mongodb.conf
    port=27017
    bind_ip=0.0.0.0
    dbpath=/data/mongodb/shard01/data/
    logpath=/data/mongodb/shard01/logs/shard01.log
    fork=true
    shardsvr=true
    replSet=myshard01
    #   由于集群配置比较复杂,这里配置文件只配置基本的几项

   [root@test237 ~]# vim /data/mongodb/shard02/config/mongodb.conf
    port=27019
    bind_ip=0.0.0.0
    dbpath=/data/mongodb/shard02/data/
    logpath=/data/mongodb/shard02/logs/shard02.log
    fork=true
    shardsvr=true
    replSet=myshard02

   [root@test237 ~]# vim /data/mongodb/route/config/route.conf 
    port=27000
    bind_ip=0.0.0.0
    fork=true
    logpath=/data/mongodb/route/logs/route.log
    configdb=myconfig/10.6.2.237:30000,10.6.2.238:30000,10.6.2.239:30000

   2、推送 安装文件、配置文件到 节点2、节点3  (在节点1 10.6.2.237 上操作)
   [root@test237 ~]# scp -r /usr/local/mongodb root@10.6.2.238:/usr/local/
   [root@test237 ~]# scp -r /usr/local/mongodb root@10.6.2.239:/usr/local/

   [root@test237 ~]# scp -r /data root@10.6.2.238:/
   [root@test237 ~]# scp -r /data root@10.6.2.239:/

   3、在所有节点上启动服务 (无先后顺序之分)
   [root@test237 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/shard01/config/mongodb.conf
   [root@test237 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/shard02/config/mongodb.conf
   [root@test237 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/config/config/mongodb.conf
   [root@test237 ~]#/usr/local/mongodb/bin/mongos -f                
   /data/mongodb/route/config/route.conf

   [root@test238 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f       
   /data/mongodb/shard01/config/mongodb.conf
   [root@test238 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/shard02/config/mongodb.conf
   [root@test238 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/config/config/mongodb.conf

   [root@test239 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/shard01/config/mongodb.conf
   [root@test239 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/shard02/config/mongodb.conf
   [root@test239 ~]# numactl --interleave=all /usr/local/mongodb/bin/mongod -f        
   /data/mongodb/config/config/mongodb.conf

   [root@test237 ~]# netstat -lntp | grep mongo  
   tcp     0    0 0.0.0.0:27000      0.0.0.0:*         LISTEN      17350/mongos
   tcp     0    0 0.0.0.0:27017       0.0.0.0:*        LISTEN      16094/mongod        
   tcp     0    0 0.0.0.0:27019       0.0.0.0:*        LISTEN      16139/mongod        
   tcp     0    0 0.0.0.0:30000       0.0.0.0:*        LISTEN      17989/mongod    

   [root@test238 ~]# netstat -lntp | grep mongo      
   tcp     0    0 0.0.0.0:27017       0.0.0.0:*        LISTEN      16894/mongod        
   tcp     0    0 0.0.0.0:27019       0.0.0.0:*        LISTEN      16659/mongod        
   tcp     0    0 0.0.0.0:30000       0.0.0.0:*        LISTEN      14794/mongod 

   [root@test239 ~]# netstat -lntp | grep mongo      
   tcp     0    0 0.0.0.0:27017       0.0.0.0:*        LISTEN      16422/mongod        
   tcp     0    0 0.0.0.0:27019       0.0.0.0:*        LISTEN      13564/mongod        
   tcp     0    0 0.0.0.0:30000       0.0.0.0:*        LISTEN      14564/mongod 

4、初始化所有集群
   # 都在是在节点1上操作
   1)、初始化 分片一集群:
   [root@test237 ~]# /usr/local/mongodb/bin/mongo --port 27017 
    > use admin
    switched to db admin

    > config= _id:"myshard01",members:[_id:0,host:"10.6.2.237:27017",    
    _id:1,host:"10.6.2.238:27017",_id:2,host:"10.6.2.239:27017"]
    
        "_id" : "myshard01",
        "members" : [
            
                "_id" : 0,
                "host" : "10.6.2.237:27017"
            ,
            
                "_id" : 1,
                "host" : "10.6.2.238:27017"
            ,
            
                "_id" : 2,
                "host" : "10.6.2.239:27017"
            
        ]
    

    > rs.initiate(config);
     "ok" : 1 

    myshard01:SECONDARY> rs.status()

       。。。 输出行数太多,这里直接省略掉 。。。

    myshard01:SECONDARY> 
    myshard01:SECONDARY> 
    myshard01:PRIMARY> 
    myshard01:PRIMARY> 

   2)、初始化 分片二集群:
   [root@test237 ~]# /usr/local/mongodb/bin/mongo --port 27019
    >
    > use admin
    switched to db admin
    >
    > config= _id:"myshard02",members:[_id:0,host:"10.6.2.237:27019",
    _id:1,host:"10.6.2.238:27019",_id:2,host:"10.6.2.239:27019"]
    
        "_id" : "myshard02",
        "members" : [
            
                "_id" : 0,
                "host" : "10.6.2.237:27019"
            ,
            
                "_id" : 1,
                "host" : "10.6.2.238:27019"
            ,
            
                "_id" : 2,
                "host" : "10.6.2.239:27019"
            
        ]
    

    > rs.initiate(config);
     "ok" : 1 

    myshard02:SECONDARY> rs.status()

         。。。 输出行数太多,这里直接省略掉 。。。

    myshard02:SECONDARY> 
    myshard02:PRIMARY> 
    myshard02:PRIMARY> 

   3)、初始化配置集集群:
   [root@test237 ~]# /usr/local/mongodb/bin/mongo --port 30000
    >
    > use admin
    switched to db admin

    > config= _id:"myconfig",members:[_id:0,host:"10.6.2.237:30000",
    _id:1,host:"10.6.2.238:30000",_id:2,host:"10.6.2.239:30000"]
    
        "_id" : "myconfig",
        "members" : [
            
                "_id" : 0,
                "host" : "10.6.2.237:30000"
            ,
            
                "_id" : 1,
                "host" : "10.6.2.238:30000"
            ,
            
                "_id" : 2,
                "host" : "10.6.2.239:30000"
            
        ]
    

    > rs.initiate(config);
    
        "ok" : 1,
        "$gleStats" : 
            "lastOpTime" : Timestamp(1642041882, 1),
            "electionId" : ObjectId("000000000000000000000000")
        ,
        "lastCommittedOpTime" : Timestamp(0, 0)
    

    myconfig:SECONDARY> rs.status()

        。。。 输出行数太多,这里直接省略掉 。。。

    myconfig:PRIMARY> 
    myconfig:PRIMARY> 

5、 在路由中添加分片节点

  [root@test237 config]# /usr/local/mongodb/bin/mongo --port 27000

    mongos> 
    mongos> sh.status()
    --- Sharding Status --- 
      sharding version: 
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("61df92254fbf974c27710513")
      
      shards:
      active mongoses:
      autosplit:
            Currently enabled: yes
      balancer:
            Currently enabled:  yes
            Currently running:  no
            Failed balancer rounds in last 5 attempts:  0
            Migration Results for the last 24 hours: 
                    No recent migrations
      databases:
              "_id" : "config",  "primary" : "config",  "partitioned" : true 

    #  添加分片一集群
    mongos> sh.addShard("myshard01/10.6.2.237:27017,10.6.2.238:27017,10.6.2.239:27017");
    
        "shardAdded" : "myshard01",
        "ok" : 1,
        "operationTime" : Timestamp(1642043021, 7),
        "$clusterTime" : 
            "clusterTime" : Timestamp(1642043021, 7),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        
    

    #  添加分片二集群
    mongos> sh.addShard("myshard02/10.6.2.237:27019,10.6.2.238:27019,10.6.2.239:27019");
    
        "shardAdded" : "myshard02",
        "ok" : 1,
        "operationTime" : Timestamp(1642043033, 6),
        "$clusterTime" : 
            "clusterTime" : Timestamp(1642043033, 6),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        
    

    mongos> sh.status()
    --- Sharding Status --- 
      sharding version: 
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("61df92254fbf974c27710513")
      
      shards:
              "_id" : "myshard01",  "host" : 
            "myshard01/10.6.2.237:27017,10.6.2.238:27017,10.6.2.239:27017",  "state" : 1      
              "_id" : "myshard02",  "host" : 
            "myshard02/10.6.2.237:27019,10.6.2.238:27019,10.6.2.239:27019",  "state" : 1      
      active mongoses:
            "4.2.18" : 1
      autosplit:
            Currently enabled: yes
      balancer:
            Currently enabled:  yes
            Currently running:  no
            Failed balancer rounds in last 5 attempts:  0
            Migration Results for the last 24 hours: 
                    No recent migrations
      databases:
              "_id" : "config",  "primary" : "config",  "partitioned" : true 

    mongos> 
    mongos> 

6、 使用分片集群

   [root@test237 config]# /usr/local/mongodb/bin/mongo --port 27000
   mongos> 
   mongos> 

   ### 指定要使用分片的数据库名
   mongos> sh.enableSharding("testdb")
    
        "ok" : 1,
        "operationTime" : Timestamp(1642044957, 5),
        "$clusterTime" : 
            "clusterTime" : Timestamp(1642044957, 5),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        
    

   #  对分片存储的具体集合指定分片规则
    mongos> sh.shardCollection("testdb.info", "name":"hashed")
    
        "collectionsharded" : "testdb.info",
        "collectionUUID" : UUID("cfce6b24-0049-422f-8b17-a06a1f9a8b20"),
        "ok" : 1,
        "operationTime" : Timestamp(1642044991, 29),
        "$clusterTime" : 
            "clusterTime" : Timestamp(1642044991, 29),
            "signature" : 
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            
        
       

   mongos> use testdb
   switched to db testdb

   mongos> db.info.stats()   ###  这里就不展示了,太多行了

 ### 上面两条命令也可以使用下面的写法
     db.runCommand("enablesharding" : "testdb")
     db.runCommand("shardcollection" : "testdb.info",key:"name":"hashed")

7、 集群验证之分片的验证

   1) 批量插入大量文档数据
   [root@test237 config]# /usr/local/mongodb/bin/mongo --port 27000
   mongos> 
   mongos> show dbs
    admin   0.000GB
    config  0.003GB
    testdb  0.000GB

    mongos> db
    testdb

    mongos> for(var i=1;i<= 10000;i++) db.info.insert("name":"name"+i, salary:   
    (Math.random()*20000).toFixed(2)); 
    WriteResult( "nInserted" : 1 )

  2)开启另一个终端查看

    #  分片一上查看
    [root@test237 ~]# /usr/local/mongodb/bin/mongo 10.6.2.237:27017

    > use admin
    switched to db admin

    myshard01:PRIMARY> show dbs
    admin   0.000GB
    config  0.001GB
    local   0.001GB
    testdb  0.000GB

    myshard01:PRIMARY> use testdb
    switched to db testdb

    myshard01:PRIMARY> show collections
    info

    myshard01:PRIMARY> db.info.find().count()
    4963

   #  分片二上查看
   [root@test237 ~]# /usr/local/mongodb/bin/mongo --port 27019

    myshard02:PRIMARY> show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    testdb  0.000GB

    myshard02:PRIMARY> use testdb
    switched to db testdb

    myshard02:PRIMARY> show collections
    info

    myshard02:PRIMARY> db.info.find().count()
    5037

    #  可以看到,上面插入的 10000条 数据,由两个分片集群共同存储了
    #  分片一集群 myshard01 存了  4963 条数据 ,分片二集群 myshard02 存放了  5037 条数据

8、 集群验证之副本集的验证  

   [root@test238 logs]# /usr/local/mongodb/bin/mongo --port 27017
    myshard01:SECONDARY> use admin
    switched to db admin

    myshard01:SECONDARY> rs.secondaryOk()

    myshard01:SECONDARY> show dbs
    admin   0.000GB
    config  0.001GB
    local   0.001GB
    testdb  0.000GB

    myshard01:SECONDARY> use testdb
    switched to db testdb

    myshard01:SECONDARY> show collections
    info

    myshard01:SECONDARY> db.info.find().count()
    4963

    [root@test239 ~]# /usr/local/mongodb/bin/mongo --port 27017

    myshard01:SECONDARY> use admin
    switched to db admin

    myshard01:SECONDARY> rs.secondaryOk()

    myshard01:SECONDARY> show dbs
    admin   0.000GB
    config  0.001GB
    local   0.001GB
    testdb  0.000GB

    myshard01:SECONDARY> use testdb
    switched to db testdb

    myshard01:SECONDARY> show collections
    info

    myshard01:SECONDARY> db.info.find().count()
    4963

  #  分片集群 shard01 ,在另外两个节点 10.6.2.238、10.6.2.239 上面,都是存储 4963 条数据

    [root@test238 ~]# /usr/local/mongodb/bin/mongo --port 27019
    myshard02:SECONDARY> use admin
    switched to db admin

    myshard02:SECONDARY> rs.secondaryOk()

    myshard02:SECONDARY> show dbs
    admin   0.000GB
    config  0.000GB
    local   0.001GB
    testdb  0.000GB

    myshard02:SECONDARY> use testdb
    switched to db testdb

    myshard02:SECONDARY> show collections
    info

    myshard02:SECONDARY> db.info.find().count()
    5037

    [root@test239 ~]# /usr/local/mongodb/bin/mongo --port 27019

    myshard02:SECONDARY> use admin
    switched to db admin

    myshard02:SECONDARY> rs.secondaryOk()

    myshard02:SECONDARY> show dbs
    admin   0.000GB
    config  0.000GB
    local   0.001GB
    testdb  0.000GB

    myshard02:SECONDARY> use testdb
    switched to db testdb

    myshard02:SECONDARY> show collections
    info

    myshard02:SECONDARY> db.info.find().count()
    5037

 #  分片集群 shard02 ,在另外两个节点 10.6.2.238、10.6.2.239 上面,都是存储 45037 条数据

以上是关于Mongodb 数据库安装之集群部署的主要内容,如果未能解决你的问题,请参考以下文章

大数据之高可用Mongodb集群部署

mongodb 监控工具 mongo-monitor 安装部署

mongodb+分片集群+ycsb测试一例

使用ansible一键部署MongoDB分片集群

mongodb6.0统计信息

图解MongoDB集群部署原理