Mongodb 数据库安装之集群部署

幽映每白日,清辉照衣裳。这篇文章主要讲述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 tcp00 10.6.2.237:270170.0.0.0:*LISTEN15791/mongod [root@test238 ~]# netstat -lntp | grep 27017 | grep -v grep tcp00 10.6.2.237:270170.0.0.0:*LISTEN16586/mongod [root@test239 ~]# netstat -lntp | grep 27017 | grep -v grep tcp00 10.6.2.237:270170.0.0.0:*LISTEN12717/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 EQUERY[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 testtestmongo: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 admin0.000GB config0.000GB local0.000GB test0.000GBtestmongo:SECONDARY> use test switched to db testtestmongo:SECONDARY> db.info.find() "_id" : ObjectId("61dfeec75ccc3a257cf82a5a"), "name" : "bob" 如果去 10.6.2.239 上查看 ,发现同样是存在的测试二: 把主节点服务进程停掉,会发现另外两个节点其中有一个会成为主节点[root@test237 ~]# netstat -lntp | grep 27017 | grep -v grep tcp0 10.6.2.237:270170.0.0.0:*LISTEN15791/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、不参与选举,也不提供服务,但是数据还是要同步的。这里可以说只是一种安全性的角度考虑,
【Mongodb 数据库安装之集群部署】    延迟节点 (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++ wgetcurl 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:300002、推送 安装文件、配置文件到 节点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 tcp00 0.0.0.0:270000.0.0.0:*LISTEN17350/mongos tcp00 0.0.0.0:270170.0.0.0:*LISTEN16094/mongod tcp00 0.0.0.0:270190.0.0.0:*LISTEN16139/mongod tcp00 0.0.0.0:300000.0.0.0:*LISTEN17989/mongod[root@test238 ~]# netstat -lntp | grep mongo tcp00 0.0.0.0:270170.0.0.0:*LISTEN16894/mongod tcp00 0.0.0.0:270190.0.0.0:*LISTEN16659/mongod tcp00 0.0.0.0:300000.0.0.0:*LISTEN14794/mongod [root@test239 ~]# netstat -lntp | grep mongo tcp00 0.0.0.0:270170.0.0.0:*LISTEN16422/mongod tcp00 0.0.0.0:270190.0.0.0:*LISTEN13564/mongod tcp00 0.0.0.0:300000.0.0.0:*LISTEN14564/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 27000mongos> 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 testdbmongos> 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 admin0.000GB config0.003GB testdb0.000GBmongos> db testdbmongos> 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 adminmyshard01:PRIMARY> show dbs admin0.000GB config0.001GB local0.001GB testdb0.000GBmyshard01:PRIMARY> use testdb switched to db testdbmyshard01:PRIMARY> show collections infomyshard01:PRIMARY> db.info.find().count() 4963#分片二上查看 [root@test237 ~]# /usr/local/mongodb/bin/mongo --port 27019myshard02:PRIMARY> show dbs admin0.000GB config0.000GB local0.000GB testdb0.000GBmyshard02:PRIMARY> use testdb switched to db testdbmyshard02:PRIMARY> show collections infomyshard02: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 adminmyshard01:SECONDARY> rs.secondaryOk()myshard01:SECONDARY> show dbs admin0.000GB config0.001GB local0.001GB testdb0.000GBmyshard01:SECONDARY> use testdb switched to db testdbmyshard01:SECONDARY> show collections infomyshard01:SECONDARY> db.info.find().count() 4963[root@test239 ~]# /usr/local/mongodb/bin/mongo --port 27017myshard01:SECONDARY> use admin switched to db adminmyshard01:SECONDARY> rs.secondaryOk()myshard01:SECONDARY> show dbs admin0.000GB config0.001GB local0.001GB testdb0.000GBmyshard01:SECONDARY> use testdb switched to db testdbmyshard01:SECONDARY> show collections infomyshard01: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 adminmyshard02:SECONDARY> rs.secondaryOk()myshard02:SECONDARY> show dbs admin0.000GB config0.000GB local0.001GB testdb0.000GBmyshard02:SECONDARY> use testdb switched to db testdbmyshard02:SECONDARY> show collections infomyshard02:SECONDARY> db.info.find().count() 5037[root@test239 ~]# /usr/local/mongodb/bin/mongo --port 27019myshard02:SECONDARY> use admin switched to db adminmyshard02:SECONDARY> rs.secondaryOk()myshard02:SECONDARY> show dbs admin0.000GB config0.000GB local0.001GB testdb0.000GBmyshard02:SECONDARY> use testdb switched to db testdbmyshard02:SECONDARY> show collections infomyshard02:SECONDARY> db.info.find().count() 5037 #分片集群 shard02 ,在另外两个节点 10.6.2.238、10.6.2.239 上面,都是存储 45037 条数据


    推荐阅读