mongoDB 分片集群部署

mongodb分片模型图

在这里插入图片描述
mongodb将大量的数据文件进行切割,将切割的数据块分别保存到不同的片上,其中每个片为一个副本集,而对外通过mongos提供统一接口,用户实际上感觉不到内部分片机制。

ReplicaSet(副本集): mongodb集群的一种实现方式,该副本集由一台活跃Mongodb服务器(节点)和两台非活跃Mongodb服务器(节点)组成,其中活跃节点会由Mongodb自动选举产生,数据插入在活跃节点,备份到非活跃节点,默认非活跃节点不可进行读写操作,可配置在非活跃节点进行读操作。

Mongos: mongo路由器,对外屏蔽内部数据存储,客户端只需要连接mongos,mongos会根据实际情况将操作分发到不同的片(Replica Set)
shard: 存储数据的节点,可以是单个mongod或者副本集

环境说明&机器规划

操作系统:CentOS7.6
MongoDB:v3.6.11

首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这里使用三台机器进行测试,机器规划如下图所示:
在这里插入图片描述

集群搭建

1.创建目录
在每台机器上分别创建mongos 、config 、 shard1 、shard2、shard3对应目录:

mkdir -p /data/db/{shard1,shard2,shard3}
mkdir -p /data/configdb 
mkdir -p /data/logs
chown -R mongod.mongod /data/configdb/
chown -R mongod.mongod /data/logs/
chown -R mongod.mongod /data/db

# tree /data/
/data/
├── configdb
├── db
│   ├── shard1
│   ├── shard2
│   └── shard3
└── logs

6 directories, 0 files

2.配置shard server(分片服务)
(1)在每台机器上分别启动副本集成员:

mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/db/shard1/ --logpath /data/logs/shard1.log --bind_ip_all --logappend --fork
mongod --shardsvr --replSet shard2 --port 27019 --dbpath /data/db/shard2/ --logpath /data/logs/shard2.log --bind_ip_all --logappend --fork
mongod --shardsvr --replSet shard3 --port 27020 --dbpath /data/db/shard3/ --logpath /data/logs/shard3.log --bind_ip_all --logappend --fork

(2)创建副本集并初始化:
复制集通过replSetInitiate命令(或mongo shell的rs.initiate())进行初始化
在设置mongodb副本集时,Primary节点,second节点,仲裁节点,有可能资源配置(CPU或者内存)不均衡,所以要求某些节点不能成为Primary。我们知道mongodb的设置:

  • 除了仲裁节点,其他每个节点都有个优先权,可以手动设置优先权来决定谁的成为primay的权重最大。
  • 副本集中通过设置priority的值来决定优先权的大小,这个值的范围是0–100,值越大,优先权越高。
  • 默认的值是1,rs.conf是不显示的;如果值是0,那么不能成为primay。
    登录成员主节点,设置节点成员:
    192.168.20.215:
	# mongo --port 27018
	> config={_id:"shard1",members:[{_id:0,host:"192.168.20.215:27018",priority:2},{_id:1,host:"192.168.20.216:27018"},{_id:2,host:"192.168.20.217:27018",arbiterOnly:1}]}
	> rs.initiate(config)
	
	192.168.20.216:
	# mongo --port 27019
	> config={_id:"shard2",members:[{_id:0,host:"192.168.20.215:27019"},{_id:1,host:"192.168.20.216:27019",priority:2},{_id:2,host:"192.168.20.217:27019",arbiterOnly:1}]}
	> rs.initiate(config)
	
	192.168.20.217:
	# mongo --port 27020
	> config={_id:"shard3",members:[{_id:0,host:"192.168.20.215:27020",arbiterOnly:1},{_id:1,host:"192.168.20.216:27020"},{_id:2,host:"192.168.20.217:27020",priority:2}]}
	> rs.initiate(config)

replSetInitiate命令:
> db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{_id:0,host:"192.168.20.215:27018",priority:2},{_id:1,host:"192.168.20.216:27018"},{_id:2,host:"192.168.20.217:27018",arbiterOnly:1}]}})

3.配置config server
(1)在每一台服务器分别启动配置服务器:

mongod --configsvr --replSet cfgReplSet --port 27016 --dbpath /data/configdb/ --logpath /data/logs/config.log --bind_ip_all --logappend --fork

(2)连接到任意一台配置服务器上,创建配置服务器副本集

# mongo --port 27016
> rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:"192.168.20.215:27016"},{_id:1,host:"192.168.20.216:27016"},{_id:2,host:"192.168.20.217:27016"}]})

4.配置mongos
(1)在每台机上启动mongos路由服务

mongos --port 27017 --configdb cfgReplSet/192.168.20.215:27016,192.168.20.216:27016,192.168.20.217:27016 --logpath /data/logs/mongos.log --bind_ip_all --logappend --fork

(2)添加shards成员

  • 1.连接到mongos
  • 2.add shards
  • 3.enable sharding
  • 4.对一个集合进行分片

登录路由服务客户端,添加分片到集群:

# mongo			#mongos启动的27017端口
mongos> use admin
mongos> db.runCommand({addshard:"shard1/192.168.20.215:27018,192.168.20.216:27018,192.168.20.217:27018"})
mongos> db.runCommand({addshard:"shard2/192.168.20.215:27019,192.168.20.216:27019,192.168.20.217:27019"})
mongos> db.runCommand({addshard:"shard3/192.168.20.215:27020,192.168.20.216:27020,192.168.20.217:27020"})

开启数据库的分片功能

mongos> use admin
mongos> db.runCommand({enablesharding:"mydb1"})

开启集合的分片功能:

mongos> use admin
mongos> db.runCommand({shardcollection:"mydb1.user",key:{userid:"hashed"}})

验证

1.查看分片db.shards.find()

mongos> use config
switched to db config
mongos> db.shards.find()
{ "_id" : "shard1", "host" : "shard1/192.168.20.215:27018,192.168.20.216:27018", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.20.215:27019,192.168.20.216:27019", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/192.168.20.216:27020,192.168.20.217:27020", "state" : 1 }

2.查看集合状态db.collectionName.status()

mongos> use mydb1
mongos> db.user.stats()

3.查看分片信息db.printShardingStatus()
在这里插入图片描述
4.插入数据测试:

mongos> use mydb1
mongos> for(i=0;i<100000;i++){db.user.insert({userid:i})}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值