MongoDB分片集群部署(三)

1.分片集群介绍与原理

2.分片集群安装

2.1解压,创建软连接,配置环境变量

2.2config server配置服务器( configsvr角色)

2.3配置分片副本集三台机器都要配( shardsvr角色 )

2.3.1设置第一个分片副本集

2.3.2设置第二个分片副本集:

2.3.2设置第三个分片副本集

2.3配置路由服务器mongos(路由角色)

3.启用分片

4.测试验证


1.分片集群介绍与原理

mongodb分片

  •     一般用得比较少,需要较多的服务器,还有三种的角色
  •     一般把mongodb的副本集应用得好就足够用了,可搭建多套mongodb复本集

mongodb分片技术

  •     mongodb副本集可以解决数据备份、读性能的问题,但由于mongodb副本集是每份数据都一模一样的,无法解决数据量过大问题
  •     mongodb分片技术能够把数据分成两份存储,假如bfd.user(bfd库,user是表)里面有100w条数据,分片能够实现50万左右存储在data1,50万左右存储在data2
  •     data1、data2需要使用副本集的形式,预防数据丢失。

mongodb分片集群三种角色介绍:

 router角色 mongodb的路由,提供入口,使得分片集群对外透明。router不存储数据
configsvr角色 mongodb的配置角色,存储元数据信息。分片集群后端有多份存储,读取数据该去哪个存储上读取,依赖于配置角色。配置角色建议使用副本集
shardsvr角色mongodb的存储角色,存储真正的数据,建议使用副本集

依赖关系:
    当用户通过router角色插入数据时,需要从configsvr知道这份数据插入到哪个节点, 然后执行插入动作插入数据到sharedsvr

    当用户通过router角色获取数据时,需要从configsvr知道这份数据是存储在哪个节点,然后再去sharedsvr获取数据

服务器规划

172.18.1.23172.18.1.24172.18.1.25
mongosmongosmongos
config serverconfig serverconfig server
shard server1 主节点shard server1 副节点shard server1 副节点
shard server2 主节点shard server2 副节点shard server2 副节点
shard server3 主节点shard server3 副节点shard server3 副节点

端口分配:

mongos:27017
configsvr:28017
shard1:29017
shard2:29018
shard3:29019

2.分片集群安装

2.1解压,创建软连接,配置环境变量

#获取
[root@bfd-yiz-1p23 software]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.4.tgz
#解压
[root@bfd-yiz-1p23 software]# tar -xf mongodb-linux-x86_64-rhel70-4.0.4.tgz -C /opt
#改名
[root@bfd-yiz-1p23 software]# cd /opt
[root@bfd-yiz-1p23 opt]# mv mongodb-linux-x86_64-rhel70-4.0.4 mongodb
 
#分别建立config、log、data/shard1/data 、data/shard2/data 、data/shard3/data 5个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
[root@bfd-yiz-1p23 opt] cd /opt/mongodb
[root@bfd-yiz-1p23 /opt/mongodb] mkdir -pv {conf,log,data/shard1/data,data/shard2/data,,data/shard3/data}
 
# 把mongdb文件夹 传到其他两台机器上
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb  172.18.1.24:/opt
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb  172.18.1.25:/opt

配置环境变量(三台机器都需要配置)

[root@bfd-yiz-1p23 opt] vim /etc/profile
# 内容
export MONGODB_HOME=/opt/mongodb
export PATH=${MONGODB_HOME}/bin:$PATH
# 使立即生效
[root@bfd-yiz-1p23 opt] source /etc/profile

2.2config server配置服务器( configsvr角色)

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。

添加配置文件
[root@bfd-yiz-1p23 opt] vim /opt/mongodb/config/configsvr.conf
  
systemLog:
  destination: file
  logAppend: true
  path: "/opt/mongodb/log/mongodb.log" 
storage:
  dbPath: "/opt/mongodb/data/configsvr"
  journal:
    enabled: true
processManagement:
  fork: true
net:
  port: 28017
  bindIp: 0.0.0.0
replication:
  replSetName: bfd
sharding:
  clusterRole: configsvr
 
 
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp  -r /opt/mongodb/configsvr 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp  -r /opt/mongodb/configsvr 172.18.1.25:/opt/mongodb/

启动三台服务器的configsvr角色(三台都要启动)

[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/configsvr.conf
about to fork child process, waiting until server is ready for connections.
forked process: 27999
child process started successfully, parent exiting

登录任意一台配置服务器,初始化配置副本集

#连接
[root@bfd-yiz-1p23 opt] mongo --port 28017
#config变量
>config = { _id:"bfd",
  configsvr: true,
  members:[
    {_id:0,host:"172.18.1.23:28017"},
    {_id:1,host:"172.18.1.24:28017"},
    {_id:2,host:"172.18.1.25:28017"}
  ]
}
rs.initiate(config)
#初始化副本集
>rs.initiate(config)
{ "ok" : 1 }
>rs.status()   #查看状态

其中,"_id" : "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port

2.3配置分片副本集三台机器都要配( shardsvr角色 )

分片集群的数据角色里面存储着真正的数据,所以数据角色一定得使用副本集。

2.3.1设置第一个分片副本集

[root@bgsbtsp0152-dqf opt] vim /opt/mongodb/config/shard1.conf
  
#配置文件内容
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/log/shard1.log
storage:
  dbPath: /opt/mongodb/data/shard1/data
  journal:
    enabled: true
processManagement:
  fork: true
net:
  port: 29017
  bindIp: 0.0.0.0
replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr
  
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard1 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard1 172.18.1.25:/opt/mongodb/

启动三台服务器的shard1 server(三台都要启动)

[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/shard1.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9997
child process started successfully, parent exiting

登陆任意一台服务器,初始化副本集

[root@bgsbtsp0152-dqf opt] mongo --port 29017
#使用admin数据库
use admin
#定义副本集配置
>config = {
...    _id : "shard1",
...     members : [
...         {_id : 0, host : "172.18.1.23:29017" },
...         {_id : 1, host : "172.18.1.24:29017" },
...         {_id : 2, host : "172.18.1.25:29017" }
...     ]
... }
#初始化副本集配置
>rs.initiate(config);
{ "ok" : 1 }

2.3.2设置第二个分片副本集:

[root@bfd-yiz-1p23 opt] vim /opt/mongodb/config/shard2.conf
  
#配置文件内容
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/log/shard2.log
storage:
  dbPath: /opt/mongodb/data/shard2/data
  journal:
    enabled: true
processManagement:
  fork: true
net:
  port: 29018
  bindIp: 0.0.0.0
replication:
  replSetName: shard2
sharding:
  clusterRole: shardsvr
 
  
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard2 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard2 172.18.1.25:/opt/mongodb/

启动三台服务器的shard2 server(三台都要启动)

[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/shard2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10191
child process started successfully, parent exiting

登陆任意一台服务器,初始化副本集 

[root@bfd-yiz-1p23 opt] mongo --port 29018
#使用admin数据库
use admin
#定义副本集配置
>config = {
...    _id : "shard2",
...     members : [
...         {_id : 0, host : "172.18.1.23:29018" },
...         {_id : 1, host : "172.18.1.24:29018" },
...         {_id : 2, host : "172.18.1.25:29018" }
...     ]
... }
#初始化副本集配置
>rs.initiate(config);
{ "ok" : 1 }

2.3.2设置第三个分片副本集

[root@bfd-yiz-1p23 opt] vim /opt/mongodb/config/shard3.conf
  
#配置文件内容
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/log/shard3.log
storage:
  dbPath: /opt/mongodb/data/shard3/data
  journal:
    enabled: true
processManagement:
  fork: true
net:
  port: 29019
  bindIp: 0.0.0.0
replication:
  replSetName: shard3
sharding:
  clusterRole: shardsvr
 
  
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard3 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard3 172.18.1.25:/opt/mongodb/

启动三台服务器的shard3 server(三台都要启动)

[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/shard3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10275
child process started successfully, parent exiting

登陆任意一台服务器,初始化副本集

[root@bfd-yiz-1p23 opt] mongo --port 29019
#使用admin数据库
use admin
#定义副本集配置
>config = {
...    _id : "shard3",
...     members : [
...         {_id : 0, host : "172.18.1.23:29019" },
...         {_id : 1, host : "172.18.1.24:29019" },
...         {_id : 2, host : "172.18.1.25:29019" }
...     ]
... }
#初始化副本集配置
>rs.initiate(config);
{ "ok" : 1 }

2.3配置路由服务器mongos(路由角色)

mongodb中的router(mongos)角色只负责提供一个入口,不存储任何的数据,router最重要的配置是指定configsvr的地址,使用副本集ip+端口的方式指定配置多个router,任何一个都能正常的获取数据。

vim  /opt/mongodb/mongos/config/mongos.conf
  
#配置文件内容如下:
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/log/mongos.log
processManagement:
  fork: true
net:
  port: 27017
  bindIp: 0.0.0.0
sharding:
  configDB: bfd/172.18.1.23:28017,172.18.1.24:28017,172.18.1.25:28017
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/mongos  172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/mongos  172.18.1.25:/opt/mongodb/

启动三台服务器的mongos server(三台机器)

[root@bfd-yiz-1p23 opt] numactl --interleave=all  mongos -f /opt/mongodb/config/mongos.conf

至此,以上三种角色的服务都已经创建并启动成功。

3.启用分片

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

登陆任意一台mongos,给分片集群添加数据角色,数据角色为副本集的方式。

mongo --port 27017
#使用admin数据库
mongos> use  admin
#串联路由服务器与分配副本集
mongos> sh.addShard("shard1/172.18.1.23:29017,172.18.1.24:29017,172.18.1.25:29017")
mongos> sh.addShard("shard2/172.18.1.23:29018,172.18.1.24:29018,172.18.1.25:29018")
mongos> sh.addShard("shard3/172.18.1.23:29019,172.18.1.24:29019,172.18.1.25:29019")
mongos> sh.status() #添加完后,我们看到下图中分片的相关信息

我们可以看到分片集群的信息:

4.测试验证

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
 

#针对某个数据库的某个表使用hash分片存储,分片存储就会同一个colloection分配两个数据角色

mongos> use admin

mongos> db.runCommand( { enablesharding :"bfd"});

#指定数据库里需要分片的集合和片键

mongos> db.runCommand( { shardcollection : "bfd.myuser",key : {_id: "hashed"} } )

mongos>exit

我们设置bfd的 myuser表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。

测试分片配置结果

[root@bgsbtsp0152-dqf opt] mongo  --port 27017
 
#插入测试数据
mongos> use bfd
mongos> for(i=1; i<=500;i++){
...   db.myuser.insert( {name:'mytest'+i, age:i} )
... }
WriteResult({ "nInserted" : 1 })
mongos> db.myuser.count()
500        #我们可以通过路由角色看到插入到了500条记录。

我们去shard1上去查看。

我们去shard2上去查看。

我们去shard3上去查看。

我们再看其中的一个从节点,看看是否也同步到数据了。

发现shard3的从分片上也有了和主shard3分片上一摸一样的数据,可以看到500条记录被分到三个分片上存储了。至此mongodb的分片部署已经完成。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值