搭建需要有耐心呀(●’◡’●)
一、什么是MongoDB分片?
我们在MongoDB官网可以查找到MongoDB分片的具体介绍,在MongoDB里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。例如:当本地磁盘不足时,本来100G的数据,可以分别给到10台机器上每一台机器10G的数据,通过建立多个shard存储用户的数据,不同的shard可以保存不同用户的数据,并且为副本集来保证高可用性,当要调用这些数据时,就需要建立一个mongos进程,通过这个进程实现分片之后的数据存储与访问,也就是说,分片的整个核心所在就是mongos,mongos是分片集群的访问入口,可以对正在请求的数据进行路由、分发与合并,
下图是集群的示意图:
分片的优势
分片是把数据分配到多个服务器上的一种方式,MongoDB使用分片实现大数据部署以及高吞吐操作。
大数据以及高吞吐量的应用会对单个服务器的容量造成很大的挑战。比如,高频率的查询操作会消耗服务器的CPU,如果数据集大于系统的RAM容量,也会对硬盘的性能造成影响。
应对系统容量增加有两种方式:水平扩展和垂直扩展。
垂直扩容就是增加单个服务器的容量,比如,使用更高性能的CPU,增加RAM容量,或者增加存储容量。但是单个服务器扩容是有限制性的,何况,云设备提供商在硬件配置上很容易达到容量上限。所以垂直扩容很有限制性。
水平扩容就是把数据和系统压力分散到多个服务器上,增加多个服务器以达到增加整个系统容量的目的。尽管单个服务器的速度或者容量并不是很大,但是每个服务器都可以分担一部分系统压力,比单个高性能的服务器更加高效。增加整个部署系统的容量只需要增加几台服务器,这样比增加单个服务的性能更节约成本。缺点就是增加了系统的复杂性以及系统的维护成本。
分片集群的组成部分
分片集群包括以下几个成员:
shard:每个shard包含一组分片数据,每个shard都可以以复制集的方式部署。
mongos:mongos的任务是查询路由,是客户端和分片集群之间的交互接口
config servers:配置服务器存放着系统的元数据以及集群的配置信息。
MongoDB3.4之后,配置服务器必须用复制集的方式部署。
IP配置(根据自身自己设置IP)
机器1:IP:192.168.81.185
shard1:22001 shard2:22002 shard3:22003 搭建mongos、config server
机器2:IP:192.168.81.186
shard1:22001 shard2:22002 shard3:22003 搭建mongos、config server
机器3:IP:192.168.81.187
shard1:22001 shard2:22002 shard3:22003 搭建mongos、config server
二、部署分片集群
1、安装环境
系统:VMware Workstation Pro下OpenEuler20.03
软件版本:mongodb4.0.0(软件版本不能低于3.4)
需要关闭防火墙及selinux(一定!一定!一定要关!!!)
vi /etc/selinux/config #关闭selinux
将SELINUX的赋值修改为disabled
systemctl stop firewalld #暂停防火墙
systemctl disable firewalld #关闭防火墙
.
.
2、三台虚拟机下载解压MongoDB
第一种下载方法:(使用xshell、Xftp7上传)
MongoDB下载地址:https://www.mongodb.com/try/download/community
因为OpenEuler的是基于CentOS8开发的,所以我们Platform选择:RedHat/CentOS8.0,Package选择tgz,下载完成后通过Xshell、Xftp 7 上传至OpenEuler。
Xshell下载方法:https://www.jianshu.com/p/4716cc35750f
Xftp下载方法: https://blog.youkuaiyun.com/xc_123/article/details/92806570
第二种下载方法(使用源码下载)
#如果OpenEuler已通网,也可以直接在OpenEuler终端输入:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz #源码下载
tar -zxvf /usr/mongodb-linux-x86_64-4.0.0.tgz -C /usr #解压
mv /usr/mongodb-linux-x86_64-4.0.0/ /usr/mongodb #重命名
为mongo分片配置系统变量,以便后续使用
echo 'export MONGODB_HOME=/usr/mongodb' >> /etc/profile #注意mongodb的安装目录
echo 'export PATH=$PATH:$MONGODB_HOME/bin' >> /etc/profile
source /etc/profile
.
.
3、分别在三台虚拟机上创建所需要的目录(三台虚拟机操作相同)
4、创建config server副本集
分别在三台机器创建配置文件(注意ip与mongodb存放目录)
[root@mongodb1 ~]# mkdir /etc/mongod/
[root@mongodb1 ~]# vi /etc/mongod/config.conf
虚拟机1配置文件内容
pidfilepath = /usr/mongodb/configsrv.pid #注意自己的mongodb存放目录
dbpath = /data/mongodb/config/data
logpath = /data/mongodb/config/log/configsrv.log
logappend =true
bind_ip = 127.0.0.1,192.168.81.185 #注意后面自己的ip地址
port = 21000
fork =true
configsvr =true
replSet = configs #副本集名称
maxConns = 20000 #最大连接数
虚拟机2配置文件内容
pidfilepath = /usr/mongodb/configsrv.pid #注意自己的mongodb存放目录
dbpath = /data/mongodb/config/data
logpath = /data/mongodb/config/log/configsrv.log
logappend =true
bind_ip = 127.0.0.1,192.168.81.186 #注意后面自己的ip地址
port = 21000
fork =true
configsvr =true
replSet = configs #副本集名称
maxConns = 20000 #最大连接数
虚拟机3配置文件内容
pidfilepath = /usr/mongodb/configsrv.pid #注意自己的mongodb存放目录
dbpath = /data/mongodb/config/data
logpath = /data/mongodb/config/log/configsrv.log
logappend =true
bind_ip = 127.0.0.1,192.168.81.187 #注意后面自己的ip地址
port = 21000
fork =true
configsvr =true
replSet = configs #副本集名称
maxConns = 20000 #最大连接数
输入完成后,ESC→:wq 保存退出
.
.
5、在三台机器启动config server(启动失败注意是否配置系统变量)
[root@mongodb1 ~]# mongod -f /etc/mongod/config.conf
登录任意一台虚拟机的21000端口
[root@mongodb1 ~]# mongo --port 21000
配置副本集
config = { _id: "configs", members: [ {_id : 0, host : "192.168.81.185:21000"},{_id : 1, host : "192.168.81.186:21000"},{_id : 2, host : "192.168.81.187:21000"}] }
初始化(初始化失败注意是否关闭防火墙)
rs.initiate(config) #只需要打这个
"ok" : 1, #注意是否显示1,显示1就是初始化成功
"$gleStats" : {
"lastOpTime" : Timestamp(15154898756, 1),
"electionId" : ObjectId("000000000000000000000000")
},
"lastCommittedOpTime" : Timestamp(0, 0),
"$clusterTime" : {
"clusterTime" : Timestamp(15154898756, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(15154898756, 1)
}
configs:SECONDARY>
configs:PRIMARY>
输入初始化命令后命令行的先变为configs:SECONDARY(从节点),过一会就自动变成configs:PRIMARY(主节点)。
.
.
6、配置分片(三台虚拟机都要创建并且配置,可以使用Xshell的发送键输入到所有会话)
vi /etc/mongod/shard1.conf #创建shard1配置文件
shard1配置文件输入
pidfilepath = /usr/mongodb/shard1.pid #注意自己的mongodb存放目录
dbpath = /data/mongodb/shard1/data
logpath = /data/mongodb/shard1/log/shard1.log
logappend = true
bind_ip = 0.0.0.0
port = 22001
fork = true
replSet=shard1 #副本集名称
shardsvr = true
maxConns=20000 #设置最大连接数
输入完成后,ESC→:wq 保存退出
vi etc/mongod/shard2.conf #创建shard2配置文件
shard2配置文件输入
pidfilepath = /usr/mongodb/shard2.pid #注意自己的mongodb存放目录
dbpath = /data/mongodb/shard2/data
logpath = /data/mongodb/shard2/log/shard2.log
logappend = true
bind_ip = 0.0.0.0
port = 22002
fork = true
replSet=shard2 #副本集名称
shardsvr = true
maxConns=20000 #设置最大连接数
输入完成后,ESC→:wq 保存退出
vi /etc/mongod/shard3.conf #创建shard3配置文件
shard3配置文件输入
pidfilepath = /usr/mongodb/shard3.pid #注意自己的mongodb存放目录
dbpath = /data/mongodb/shard3/data
logpath = /data/mongodb/shard3/log/shard3.log
logappend = true
bind_ip = 0.0.0.0
port = 22003
fork = true
replSet=shard3 #副本集名称
shardsvr = true
maxConns=20000 #设置最大连接数
输入完成后,ESC→:wq 保存退出
启动shard1(三台虚拟机启动)
[root@mongodb1 ~]# mongod -f /etc/mongod/shard1.conf
about to fork child process, waiting until server is ready for connections.
forked process: 2296
child process started successfully, parent exiting
在192.168.81.185或者192.168.81.186登录MongoDB的22001端口创建副本集,不能在192.168.81.187登录,因为187是shard1的仲裁节点
[root@mongodb2 ~] mongo --port 22001
> use admin
>config = { _id: "shard1", members: [ {_id : 0, host : "192.168.81.185:22001"}, {_id: 1,host : "192.168.81.186:22001"},{_id : 2, host : "192.168.81.187:22001",arbiterOnly:true}] }
初始化
> rs.initiate(config)
shard1:SECONDARY>
shard1:PRIMARY>
初始化之后shard1先变为SECONDARY,过了一会自动变成PRIMARY
输入exit退出shard1 shell
.
.
启动shard2(三台虚拟机启动)
[root@mongodb1 ~] mongod -f /etc/mongod/shard2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 2229
child process started successfully, parent exiting
在192.168.81.186或者192.168.81.187登录MongoDB的22002端口创建副本集,不能在192.168.81.185登录,因为185是shard2的仲裁节点
[root@mongodb2 ~] mongo --port 22002
>use admin
switched to db admin
>config = { _id: "shard2", members: [{_id : 0, host : "192.168.81.185:22002" ,arbiterOnly:true},{_id : 1, host :"192.168.81.186:22002"},{_id : 2, host:"192.168.81.187:22002"}]}
初始化
>rs.initiate(config) #只需要打这个
shard2:SECONDARY>
shard2:PRIMARY>
初始化之后shard2先变为SECONDARY,过了一会自动变成PRIMAR
输入exit退出shard2 shell
启动shard3(三台虚拟机启动)
[root@mongodb1 ~]mongod -f /etc/mongod/shard3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 2296
child process started successfully, parent exiting
在185或者187机器登录MongoDB的22003端口,创建副本集,之所以不能在186登录,是因为186是shard3的仲裁节点
[root@mongodb1 ~] mongo --port 22003
>use admin
switched to db admin
>config = { _id: "shard3", members: [ {_id : 0, host : "192.168.81.185:22003"}, {_id : 1, host : "192.168.81.186:22003", arbiterOnly:true}, {_id : 2, host : "192.168.81.187:22003"}] }
初始化
>rs.initiate(config) #只需要打这个
shard3:SECONDARY>
shard3:PRIMARY>
初始化之后shard3先变为SECONDARY,过了一会自动变成PRIMAR
输入exit退出shard3 shell
7、配置mongos路由服务器
创建配置文件(三台虚拟机都要创建并且配置,可以使用Xshell的发送键输入到所有会话)
vim /etc/mongod/mongos.conf
配置文件输入
pidfilepath = /usr/mongodb/mongos.pid #注意自己的mongodb存放目录
logpath = /data/mongodb/mongos/log/mongos.log
logappend = true
bind_ip = 0.0.0.0
port = 20000
fork = true
configdb = configs/192.168.81.185:21000,192.168.81.186:21000,192.168.81.187:21000
maxConns=20000
启动mongos服务(三台虚拟机)
mongos -f /etc/mongod/mongos.conf
在任意一台虚拟机登录mongoDB 20000端口
mongo --port 20000
启用分片(将分片和路由器串联)
mongos> sh.addShard("shard1/192.168.81.185:22001,192.168.81.186:22001,192.168.81.187:22001")
mongos> sh.addShard("shard2/192.168.81.185:22002,192.168.81.186:22002,192.168.81.187:22002")
mongos> sh.addShard("shard3/192.168.81.185:22003,192.168.81.186:22003,192.168.81.187:22003")
查看集群状态
mongos>sh.status()
8、测试MongoDB分片
在任意一台机器连接MongoDB的20000端口
[root@mongodb1~]mongo --port 20000
指定要分片的库db1
mongos>sh.enableSharding("db1")
在db1库中创建/指定分片的集合cl01
mongos> sh.shardCollection("db1.cl01",{"id":1})
第二种方式
db.runCommand( { shardcollection : “db1.cl01”,key : {id: 1} } )
查看状态sh.status()
sh.status()
查看databases的状态会看到db1库和cl01集合
exit退出
到这一步,测试完成,mongodb分片部署完成!