设为首页 收藏本站
查看: 833|回复: 0

[经验分享] 部署MongoDB分片群集

[复制链接]

尚未签到

发表于 2018-10-24 11:37:54 | 显示全部楼层 |阅读模式
部署MongoDB分片群集

分片概述
  高数据量和吞吐量的数据库应用会对单机的性能造成较大的压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
  MongoDB分片是使用多个服务器储存数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或者不足以能提供可接受打读写吞吐量时,我们可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。

MongoDB分片优势
  分片为应对吞吐量和大数据量提供了方法。
  1、使得分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量和吞吐量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
  2、使用分片减少了每个分片存储的数据。
  如下图所示,假设一个collection中有1TB的数据,通过分片可以将1TB数据分片到四个shard中,当查询对应数据时,就会去对应的分片服务器查询,可以提高数据可用性。

MongoDB分片群集组成
  MongoDB分片集群主要有三个主要组件:
  1、Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server角色可以由几台服务器组成一个复制集(Replica Set)承担,防止主机单点故障。
  2、Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
  3、Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
DSC0000.jpg


实验环境
  这里实验是在同一台服务器上搭建MongoDB分片,但是MongoDB3.4以后Shard默认都是要搭建MongoDB服务集,为了方便起见,我们使用的MongoDB版本是3.2的。

组件
端口号
路由实例
27017
配置实例
37017
Shard1实例
47017
Shard2实例
47018
分片群集部署

1、部署配置服务器
  安装相关依赖包和解压软件到指定目录中。
  

[root@localhost ~]# yum install openssl-devel -y   #安装依赖包  
[root@localhost ~]# tar xfvz mongodb-linux-x86_64-3.2.1.tgz -C /opt/
  
[root@localhost ~]# cd /opt/
  
[root@localhost opt]# mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
  
#将软件包重命名,方便下面使用
  

  将即将创建的实例所需要的数据目录,日志目录和日志文件先创建好。
  

[root@localhost opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4}  
#创建实例的数据存储目录
  
[root@localhost opt]# mkdir /data/mongodb/logs
  
#创建实例的日志目录
  
[root@localhost opt]# touch /data/mongodb/logs/mongodb{1,2,3,4}.log
  
#创建实例的日志文件
  
[root@localhost opt]# chmod -R 777 /data/mongodb/logs/*.log
  
#修改日志权限
  
[root@localhost opt]# ulimit -n 25000
  
#将可以打开的最大进程数修改为25000
  
[root@localhost opt]# ulimit -u 25000
  
#将可以打开的最大文件数修改为25000
  
[root@localhost opt]# sysctl -w vm.zone_reclaim_mode=0
  
#当某个节点可用内存不足时,如果为0的话,那么系统会倾向于从其他节点分配内存。如果为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候。
  
[root@localhost opt]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
  
[root@localhost opt]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
  
#当节点可用内存不足时,选择关闭占内存多的大页面
  
[root@localhost opt]# export PATH=$PATH:/usr/local/mongodb/bin/
  
#将MongoDB路径添加到环境变量中
  
[root@localhost bin]# vim mongodb1.conf
  
#创建配置服务器的配置文件
  
port=37017
  
dbpath=/data/mongodb/mongodb1
  
logpath=/data/mongodb/logs/mongodb1.log
  
logappend=true
  
fork=true
  
maxConns=5000
  
storageEngine=mmapv1
  
configsvr=true   #设置为配置服务器
  
[root@localhost mongodb]# mongod -f /usr/local/mongodb/bin/mongodb1.conf
  
#启动配置服务器进程
  

DSC0001.jpg


2、配置分片服务器
  编辑mongodb2.conf配置文件,端口为47017,设置为shardsvr=true,同样编辑mongodb3.conf,端口为47018,shardsvr=true,然后同时启动。
  

[root@localhost mongodb]# cd /usr/local/mongodb/bin/  
[root@localhost bin]# cp -p mongodb1.conf mongodb2.conf
  
[root@localhost bin]# 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   #设置为分片服务器
  

  
[root@localhost bin]# cp -p mongodb2.conf mongodb3.conf
  
[root@localhost bin]# 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
  

  都修改完后,将两个分片服务器启动。
DSC0002.jpg


3、启动路由服务器
  

[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.58.131:37017 --chunkSize 1  
#这条命令意思就是凡事访问mongodb 27017端口的,都会转到 192.168.58.131:37017上面
  
[root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.58.131:37017 --chunkSize 1
  
2018-07-17T17:20:58.990+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.
  
about to fork child process, waiting until server is ready for connections.
  
forked process: 6430
  
child process started successfully, parent exiting
  

DSC0003.jpg

  

[root@localhost ~]# mongo  
MongoDB shell version: 3.2.1
  
connecting to: test
  
Server has startup warnings:
  
2018-07-17T17:20:59.120+0800 I CONTROL  [main] ** WARNING: You are running this process as the root user, which is not recommended.
  
2018-07-17T17:20:59.120+0800 I CONTROL  [main]
  
mongos> sh.status()
  
--- Sharding Status ---
  sharding version: {
  "_id" : 1,
  "minCompatibleVersion" : 5,
  "currentVersion" : 6,
  "clusterId" : ObjectId("5b4db4fdf19287c74d1a4081")
  
}
  shards:
  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:
  
#可以看到shards下面为空,所以我们需要将两个分片服务器添加进去
  

DSC0004.jpg

  

mongos> sh.addShard("192.168.58.131:47017")  
#将47017端口的分片服务器添加进去
  
{ "shardAdded" : "shard0000", "ok" : 1 }
  

  
mongos> sh.addShard("192.168.58.131:47018")
  
#将47018端口的分片服务器添加进去
  
{ "shardAdded" : "shard0001", "ok" : 1 }
  

DSC0005.jpg

  进行测试,查看是否能够进行分片功能,我们创建一个collection,在里面插入50000条数据。
  

mongos> use test  
switched to db test
  
mongos> for(var i=1;i db.users.find().limit(10)
  
#查看collection中的前10条数据,表示插入成功。
  

  

DSC0006.jpg

  

mongos> sh.status()  
--- Sharding Status ---
  sharding version: {
  "_id" : 1,
  "minCompatibleVersion" : 5,
  "currentVersion" : 6,
  "clusterId" : ObjectId("5b4db4fdf19287c74d1a4081")
  
}
  shards:
  {  "_id" : "shard0000",  "host" : "192.168.58.131:47017" }
  {  "_id" : "shard0001",  "host" : "192.168.58.131:47018" }
  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:
  {  "_id" : "test",  "primary" : "shard0000",  "partitioned" : false }
  
#可以看到partitioned:false,说明并没有进行分片。
  
mongos> sh.enableSharding("test")
  
{ "ok" : 1 }
  
#启用分片功能
  
mongos> sh.status()
  
{  "_id" : "test",  "primary" : "shard0000",  "partitioned" : true }
  
mongos> db.users.createIndex({"id":1})
  
{
  "raw" : {
  "192.168.58.131:47017" : {
  "createdCollectionAutomatically" : false,
  "numIndexesBefore" : 1,
  "numIndexesAfter" : 2,
  "ok" : 1
  }
  },
  "ok" : 1
  
}
  
#创建索引,方便分片
  
mongos> sh.shardCollection("test.users",{"id":1})
  
{ "collectionsharded" : "test.users", "ok" : 1 }
  
#执行分片,可以看到分片成功1-20165,写入到shard0001中,20166-50000写入到shard0000中
  

DSC0007.jpg

DSC0008.jpg

DSC0009.jpg




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625881-1-1.html 上篇帖子: MongoDB配置复制集 下篇帖子: 【MongoDB】4.0版本事务上手测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表