MongoDB——部署MongoDB分片集群

分片的概念

  • 分片(sharding)是一种跨多台机器分布数据的方法, MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

  • 换句话说:分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。

  • 具有大型数据集或高吞吐量应用程序的数据库系统会挑战单个服务器的容量。例如,高查询率会耗尽服务器的CPU容量。工作集大小大于系统的RAM会强调磁盘驱动器的I / O容量。

  • 有两种解决系统增长的方法:垂直扩展和水平扩展。

    1. 垂直扩展意味着增加单个服务器的容量,例如使用更强大的CPU,添加更多RAM或增加存储空间量。可用技术的局限性可能会限制单个机器对于给定工作负载而言足够强大。此外,基于云的提供商基于可用的硬件配置具有硬性上限。结果,垂直缩放有实际的最大值。
    2. 水平扩展意味着划分系统数据集并加载多个服务器,添加其他服务器以根据需要增加容量。虽然单个机器的总体速度或容量可能不高,但每台机器处理整个工作负载的子集,可能提供比单个高速大容量服务器更高的效率。扩展部署容量只需要根据需要添加额外的服务器,这可能比单个机器的高端硬件的总体成本更低。权衡是基础架构和部署维护的复杂性增加。
  • MongoDB支持通过分片进行水平扩展。

分片集群的优势

分片为应对高吞吐量与大数据提供了方法

  • 使用分片减少了每个分片需要处理的请求数,通过水平扩展,集群可以提高自己的存储量和吞吐量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片
  • 使用分片减少了每个分片存储的数据
  • 提供类似线性增长的架构、提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB 单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈,或者需要部署大型应用以充分利用内存时,可以使用分片技术

分片集群包含的组件

在这里插入图片描述
MongoDB分片群集包含以下组件:

  • Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台服务器组成一个Replica Set 承担,防止主机单点故障
  • Config Server:配置服务器存储群集的元数据和配置设置。 从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)
  • Routers:前端路由,客户端由此接入,在客户端应用程序和分片集群之间提供接口,且让整个集群看上去像单一数据库,前端应用可以透明使用

部署MongoDB分片集群的

准备工作

  • Shard:
    • maomao:27017-27019(一主两从),27020(仲裁)
    • zhuzhu:27021-27023(一主两从)
  • Config Server:37017-37019
  • mongos:47017(先使用一台路由,等搭建完成之后再添加一台路由+Atlas做备份)
cd /data/logs/mongodb
touch mongodb-2702{1..3}.log
touch mongodb-3701{7..9}.log
touch mongodb-47017.log
[root@mongodb mongodb]# ls
mongodb-27017.log  mongodb-27019.log  mongodb-27021.log  mongodb-27023.log  mongodb-37018.log  mongodb-47017.log
mongodb-27018.log  mongodb-27020.log  mongodb-27022.log  mongodb-37017.log  mongodb-37019.log

chmod 777 ./*

mkdir mongodb-2702{1..3}
mkdir mongodb-3701{7..9}
mkdir mongodb-47017

cp -a mongod-27017.conf mongod-27021.conf

配置shard

注意两个复制集的名字不能相同
第一个复制集
sharding:
  clusterRole: shardsvr
replication:
  oplogSizeMB: 2048
  replSetName: maomao

第二个复制集
sed -ri -e 's/27017/27021/g' -e 's/maomao/zhuzhu/g' mongod-27021.conf
sed -ri -e 's/27017/27022/g' -e 's/maomao/zhuzhu/g' mongod-27022.conf 
sed -ri -e 's/27017/27023/g' -e 's/maomao/zhuzhu/g' mongod-27023.conf 

只在切片服务器上添加
sharding:
  clusterRole: shardsvr

配置Config Server

sed -ri -e 's/27017/37017/g'  mongod-37017.conf

vim mongod-37017.conf
sharding:
  clusterRole: configsvr
replication:
  oplogSizeMB: 2048
  replSetName: configReplSet

配置 mongos

sed -ri -e 's/27017/47017/g'  mongod-47017.conf

添加config server的地址和端口

sharding:
  configDB: configReplSet/192.168.188.101:37017,192.168.188.101:37018,192.168.188.101:37019

并且将存储路注销
#storage:
#  dbPath: /data/mongodb-47017
#  journal:
#    enabled: true

配置复制集

将所有节点打开

mongod -f /mongod-27017.conf
mongod -f mongod-27017.conf
mongod -f mongod-27018.conf
mongod -f mongod-27019.conf
mongod -f mongod-27020.conf
mongod -f mongod-27021.conf
mongod -f mongod-27022.conf
mongod -f mongod-27023.conf
mongod -f mongod-37017.conf
mongod -f mongod-37018.conf
mongod -f mongod-37019.conf

ss -ntl
进入两个主节点
第一个:
config={_id:"maomao",members:[{_id:0,host:"192.168.188.101:27017"},{_id:1,host:"1192.168.188.101:27018"},{_id:2,host:"192.168.188.101:27019"}]} 
 
rs.initiate(config)
{ "ok" : 1 }

config={_id:"zhuzhu",members:[{_id:0,host:"192.168.188.101:27021"},{_id:1,host:"192.168.188.101:27022"},{_id:2,host:"192.16
8.188.101:27023"}]}
{
	"_id" : "zhuzhu",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.188.101:27021"
		},
		{
			"_id" : 1,
			"host" : "192.168.188.101:27022"
		},
		{
			"_id" : 2,
			"host" : "192.168.188.101:27023"
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }

进入节点服务器集群配置节点衔接

mongo --host 192.168.188.101 --port 37017


> config={_id:"configReplSet",members:[{_id:0,host:"192.168.188.101:37017"},{_id:1,host:"192.168.188.101:37018"},{_id:2,host:
"192.168.188.101:37019"}]} 

{
	"_id" : "configReplSet",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.188.101:37017"
		},
		{
			"_id" : 1,
			"host" : "192.168.188.101:37018"
		},
		{
			"_id" : 2,
			"host" : "192.168.188.101:37019"
		}
	]
}

>  rs.initiate(config)
{ "ok" : 1 }

启动mongos

路由命令较为特殊,使用的是mongos而非mongod

whatis mongos
mongos (1)           - MongoDB Sharded Cluster Query Router

whatis mongo
mongo (1)            - MongoDB Shell

whatis mongod
mongod (1)           - MongoDB Server
mongos -f /usr/local/mongodb/bin/mongod-47017.conf 

mongo --host 192.168.188.101 --port 47017

进入路由数据库,可以看到路由数据库的名字为mongos
mongos> 

切换到admin
mongos> use admin
switched to db admin

添加分片信息
mongos> db.runCommand({addshard:"maomao/192.168.188.101:27017,192.168.188.101:27018,192.168.188.101:27019,1
92.168.188.101:27020",name:"shard1"})
{ "shardAdded" : "shard1", "ok" : 1 }

mongos>  db.runCommand({addshard:"zhuzhu/192.168.188.101:27021,192.168.188.101:27022,192.168.188.101:27023"
,name:"shard2"})
{ "shardAdded" : "shard2", "ok" : 1 }

列出分片信息
mongos> db.runCommand({listshards:1})
{
	"shards" : [
		{
			"_id" : "shard1",
			"host" : "maomao/192.168.188.101:27017,192.168.188.101:27018,192.168.188.101:27019"
,			"state" : 1
		},
		{
			"_id" : "shard2",
			"host" : "zhuzhu/192.168.188.101:27021,192.168.188.101:27022,192.168.188.101:27023"
,			"state" : 1
		}
	],
	"ok" : 1
}

整体状态查看
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("5f0574f7fe0c76b475e50326")
  }
  shards:
        {  "_id" : "shard1",  "host" : "kgcrs/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "kgcrs1/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022",  "state" : 1 }
  active mongoses:
        "3.4.24" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
NaN
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:

激活分片功能
mongos> db
admin
mongos> db.runCommand({enablesharding:"test"})
{ "ok" : 1 }

指定分片键对集合分片

创建索引 :优化查询的重要手段
mongos> use test
switched to db test
mongos> db
test

创建索引
mongos> db.stu.ensureIndex({id:1})
{
	"raw" : {
		"zhuzhu/192.168.188.101:27021,192.168.188.101:27022,192.168.188.101:27023" : {
			"createdCollectionAutomatically" : true,
			"numIndexesBefore" : 1,
			"numIndexesAfter" : 2,
			"ok" : 1,
			"$gleStats" : {
				"lastOpTime" : {
					"ts" : Timestamp(1618913138, 2),
					"t" : NumberLong(1)
				},
				"electionId" : ObjectId("7fffffff0000000000000001")
			}
		}
	},
	"ok" : 1
}


mongos> use admin
switched to db admin

开启分片
mongos> db.runCommand({shardcollection:"test.stu",key:{id:1}})
{ "collectionsharded" : "test.stu", "ok" : 1 }

测试

集合分片验证
产生大量数据
mongos> use test;
switched to db test
mongos> for(var i=1;i<=1000000;i++){db.stu.insert({'id':i,'name':'Alice'});}

当test大小变成64mb之后 chunks: shard2会变成shard1
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值