听说MongoDB你很豪横?-------------MongoDB 部署分片群集以及管理分片

时间:2022-07-24
本文章向大家介绍听说MongoDB你很豪横?-------------MongoDB 部署分片群集以及管理分片,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录

  • 一、副本的概念
    • 1、副本集的两种类型
    • 2、三种角色:
    • 4、缺点
  • 二、分片概念
  • 三、分片集群包含的组件
  • 四、部署 MongoDB 分片群集
    • 1、环境准备
    • 2、拓扑图如下
    • 3、环境搭建
    • 4、config配置服务器
    • 5、shard服务器
    • 6、当某节点内存不足时,从其他节点分配内存
    • 7、启动路由服务器
    • 8、设置分片
    • 9、加入shard节点
  • 五、分片管理
    • 1、添加数据,进行分片存储
    • 2、添加标签
    • 3、连接config配置服务器:
    • 4、添加/删除分片服务器

一、副本的概念

主从复制和副本集区别 主从集群和制本集最大的区别就是副本集没有固定的“主节点";整个集群会选出一个主节点当其挂掉后,又在剩下的从节点中选中其他节点为"主节点"。副本集总有一个活跃点(主primary和一 个或多个备份节点(从secondary)。

1、副本集的两种类型

副本集有两种类型三种角色 两种类型: 主节点(Primary) 类型:数据操作的主要连接点,可读写. 次要(辅助、从)节点(Secondaries) 类型:数据冗余备份节点,可以读或选举。

2、三种角色:

  • 主要成员(Primary) :主要接收所有写操作。就是主节点。
  • 副本成员(Replicate) :从主节点通过复制操作以维护相同的数据集。即备份数据,可写操作,但可以读操作但需要配置。是默认的一种从节点类型。
  • 仲裁者(Arbiter) :不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。

4、缺点

相当于只从复制 master宕机后就凉了 ,为了实现高可用,就不得不介绍一下分片的概念了

二、分片概念

分片(sharding) 是一-种跨多 台机器分布数据的方法,MongoDB使用分 片来支持具有非常大的数据集和高吞吐量操作的部署。 换句话说:分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。 具有大型数据集或高吞吐量应用程序的数据库系统可以会挑战单个服务器的容量。例如,高查询率会耗尽服务器的CPU容量。工作集大小大于系统的RAM会强调磁盘驱动器的I / 0容量。

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

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

三、分片集群包含的组件

MongoDB分片群集包含以下组件: . ●分片(存储)shard:每个分片包含分片数据的子集。 每个分片都可以部署为副本集。 ●mongos (路由) : mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。 ●config servers (“调度"的配置) : 配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)。 下图描述了分片集群中组件的交互:

四、部署 MongoDB 分片群集

1、环境准备

Vmware 虚拟机 centos7.6 192.168.110.132 mongodb3.2

2、拓扑图如下

创建多实例的数据目录和日志文件; 修改ulimit -n 和ulimit -u 的值为25000;

3、环境搭建

tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{1,2,3,4}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{1,2,3,4}.log
chmod -R 777 /data/mongodb/logs/*.log
ulimit -n 25000        //临时修改 重启后失效   指定同一时间最多可打开的文件数
ulimit -u 25000        //临时修改 重启后失效   用户最多可启动的进程数目。
创建软连接:
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod

4、config配置服务器

cd /usr/local/mongodb/bin/
port=37017       端口
dbpath=/data/mongodb/mongodb1     数据存储位置
logpath=/data/mongodb/logs/mongodb1.log   日志存储位置
logappend=true      mongos或mongod会将新条目附加到现有日志文件的末尾。
fork=true                   启用在后台运行mongos或mongod进程的守护进程模式                         
maxConns=5000       最大连接数
storageEngine=mmapv1     引擎
configsvr=true     指定配置服务器
启动:

mongod -f /usr/local/mongodb/bin/mongodb1.conf   '启动不起来  -f使用不了 改个环境变量'
mongo --port 27017   //查看端口是否正常开放

5、shard服务器

cp -p mongodb1.conf mongodb2.conf
vim mongodb2.conf
   port=47017
    dbpath=/data/mongodb/mongodb2
    logpath=/data/mongodb/logs/mongodb2.log
    logappend=true
    fork=true
    maxConns=5000
    storageEngine=mmapv1
    shardsvr=true


cp -p mongodb1.conf mongodb3.conf
vim mongodb3.conf
    port=47018
    dbpath=/data/mongodb/mongodb3
    logpath=/data/mongodb/logs/mongodb3.log
    logappend=true
    fork=true
    maxConns=5000
    storageEngine=mmapv1
    shardsvr=true
    启动:

mongod -f /usr/local/mongodb/bin/mongodb1.conf   '启动服务'

6、当某节点内存不足时,从其他节点分配内存

sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

7、启动路由服务器

–port指定对方连接入口27017 –fork后台运行 –logpath指定日志文件存储路径 –configdb指定给谁处理

./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.110.132:37017 --chunkSize 1

8、设置分片

 mongos> sh.addShard("192.168.110.132:47018");    添加分片服务器
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.110.132:47017");     添加分片服务器
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> sh.status()      再次查看分片的服务器
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f5b73644e296224377d5e65")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.110.132:47018" }
	{  "_id" : "shard0001",  "host" : "192.168.110.132:47017" }
  active mongoses:
	"3.2.1" : 1
  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:

9、加入shard节点

> use school
> for(var i=1;i<=10000;i++) db.users.insert({"id":i,"name":"tom"+i})
mongos> show dbs
mongos> use school
mongos> show collections      //查看集合
mongos> db.users.find().limit(5)   查看前五行
mongos> sh.status()          //查看数据库分片信息


'下面要开启集合的分片;'
'先对users集合创建索引;'
'然后对集合的索引进行分片。'
mongos> use shang
mongos> db.users.createIndex({"id":1})       //对users表创建索引
mongos> sh.shardCollection("school.users",{"id":1})    //表分片给shard节点
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f5b73644e296224377d5e65")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.110.132:47018" }
	{  "_id" : "shard0001",  "host" : "192.168.110.132:47017" }
  active mongoses:
	"3.2.1" : 1
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		1 : Success
  databases:
	{  "_id" : "school",  "primary" : "shard0000",  "partitioned" : true }
		school.users
			shard key: { "id" : 1 }
			unique: false
			balancing: true
			chunks:
				shard0000	2
				shard0001	1
			{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0) 
			{ "id" : 4682 } -->> { "id" : 9364 } on : shard0000 Timestamp(2, 1) 
			{ "id" : 9364 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 2) 

五、分片管理

1、添加数据,进行分片存储

mongos> for(var i=1;i<=60000;i++) db.users2.insert({"id":i,"name":"tom"+i})
WriteResult({ "nInserted" : 1 })
mongos> db.users2.count()  
60000
mongos> db.users2.createIndex({"id":1})   '添加索引'
{
	"raw" : {
		"192.168.110.132:47018" : {
			"createdCollectionAutomatically" : false,
			"numIndexesBefore" : 1,
			"numIndexesAfter" : 2,
			"ok" : 1
		}
	},
	"ok" : 1
}
mongos> 
mongos> sh.shardCollection("school.users2",{"id":1})   '添加分片存储'
{ "collectionsharded" : "school.users2", "ok" : 1 }
mongos> db.users2.stats()
{
	"sharded" : true,
	"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
	"userFlags" : 1,
	"capped" : false,
	"ns" : "school.users2",
	"count" : 60000,
	"numExtents" : 12,
	"size" : 6720000,
	"storageSize" : 22364160,
	"totalIndexSize" : 3581088,
	"indexSizes" : {
		"_id_" : 1970416,
		"id_1" : 1610672
	},
	"avgObjSize" : 112,
	"nindexes" : 2,
	"nchunks" : 13,
	"shards" : {
		"shard0000" : {
			"ns" : "school.users2",
			"count" : 31909,
			"size" : 3573808,
			"avgObjSize" : 112,
			"numExtents" : 6,
			"storageSize" : 11182080,
			"lastExtentSize" : 8388608,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 1872304,
			"indexSizes" : {
				"_id_" : 1054704,
				"id_1" : 817600
			},
			"ok" : 1
		},
		"shard0001" : {
			"ns" : "school.users2",
			"count" : 28091,
			"size" : 3146192,
			"avgObjSize" : 112,
			"numExtents" : 6,
			"storageSize" : 11182080,
			"lastExtentSize" : 8388608,
			"paddingFactor" : 1,
			"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
			"userFlags" : 1,
			"capped" : false,
			"nindexes" : 2,
			"totalIndexSize" : 1708784,
			"indexSizes" : {
				"_id_" : 915712,
				"id_1" : 793072
			},
			"ok" : 1
		}
	},
	"ok" : 1
}
mongos> 

2、添加标签

mongos> sh.addShardTag("shard0000","sales00")
mongos> sh.addShardTag("shard0001","sales01")

3、连接config配置服务器:

mongo --port 37017

configsvr> use config              //打开配置数据库
configsvr> show collections        //查看集合

configsvr> db.chunks.findOne()      //记录所有块的信息
configsvr> db.collections.find()    //分片集合信息
configsvr> db.databases.find()      //分片中所有数据库信息

4、添加/删除分片服务器

[root@localhost bin]# cp -p mongodb3.conf mongodb4.conf
[root@localhost bin]# vim mongodb4.conf 
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
[root@localhost bin]# ls /data/mongodb/
logs  mongodb1  mongodb2  mongodb3  mongodb4
[root@localhost bin]# ls /data/mongodb/logs/
mongodb1.log  mongodb2.log  mongodb3.log  mongodb4.log
mongod -f mongodb4.conf  '启动'

添加分片节点:

mongos> sh.addShard("192.168.110.132:47019") //添加分片服务器
mongos> sh.status()    '查看分片信息'
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("5f5b73644e296224377d5e65")
}
  shards:
	{  "_id" : "shard0000",  "host" : "192.168.110.132:47018",  "tags" : [ "sales00" ] }
	{  "_id" : "shard0001",  "host" : "192.168.110.132:47017",  "tags" : [ "sales01" ] }
	{  "_id" : "shard0002",  "host" : "192.168.110.132:47019" }

删除分片节点:

mongos> use admin
mongos> db.runCommand({"removeshard":"192.168.110.132:47019"})    //删除节点