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 数据库安装之集群部署的主要内容,如果未能解决你的问题,请参考以下文章