vlambda博客
学习文章列表

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


回复”669“获取独家整理的精选资料集

回复”加群“加入全国服务端高端社群「后端圈」

文章目录

  • 一、副本的概念

  • 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你很豪横?MDB部署分片群集及管理分片



在这里插入图片描述

四、部署 MongoDB 分片群集

1、环境准备

Vmware 虚拟机
centos7.6 192.168.110.132
mongodb3.2

2、拓扑图如下

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



在这里插入图片描述

创建多实例的数据目录和日志文件;
修改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/logstouch /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 dbsmongos> use schoolmongos> show collections //查看集合
mongos> db.users.find().limit(5) 查看前五行
mongos> sh.status() //查看数据库分片信息
'下面要开启集合的分片;'
'先对users集合创建索引;'
'然后对集合的索引进行分片。'
mongos> use shangmongos> 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=truefork=truemaxConns=5000
storageEngine=mmapv1shardsvr=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.logmongod -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"}) //删除节点

— 本文结束 —


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

● 

● 

● 

● 

● 



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


关注我,回复 「加群」 加入各种主题讨论群。



对「服务端思维」有期待,请在文末点个在看


在看点这里