幽映每白日,清辉照衣裳。这篇文章主要讲述Mongodb 数据库安装之集群部署相关的知识,希望能为你提供帮助。
一、mongodb集群介绍
MONGODB 有三种集群部署方式,分别是: Master-Slaver 、Replica Set 、Sharding
- Master-Slaver:是一种主从副本的模式,官方版本 4.X 后已经不再支持了。
- Replica Set:取代了 Master-Slaver 模式,是一种互为主从的关系。
?将数据复制多份保存,不同服务器保存同一份数据,出现故障时自动切换,实现故障转移。
?官方建议用副本集替代主从复制的架构
- Sharding 集群:是真正的高可用集群,模式适合处理大量数据。
?将数据分开存储,不同服务器分片保存不同的数据,所有服务器数据的总和为整个数据集。
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、架构说明 三节点的副本集架构,有两种成员角色表现形式
- 第一种:主节点 +从节点+从节点
- 第二种:主节点 +从节点+仲裁节点
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 条数据
推荐阅读
- GC(垃圾回收机制,不用手动回收释放#yyds干货盘点#)
- uniapp实战笔记使用uni-nav-bar自定义顶部状态栏和导航栏
- Adult数据集分析及四种模型实现
- 基于Pinpoint对SpringCloud微服务项目实现全链路监控 #yyds干货盘点#
- Linux之route命令
- 应用系统缓存体系深入研究(Java版)
- 实践GoF的23的设计模式(SOLID原则(下))
- #yyds干货盘点#自定义spring boot starter三部曲之三(源码分析spring.factories加载过程)
- k8s初面考点ReplicaSet副本集极限9连击你懂了吗()