热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【实战】MongoDB分片原理概述+部署MongoDB分片群集+【源码包】

目录:1·MongoDB分片概述2·部署MongoDB分片群集3·MongoDB分片管理4·推荐MongoDB、MySQL基础文章5·文章总结MongoDB分片概述1)什么是分片:

目录:

1· MongoDB 分片概述
2· 部署 MongoDB 分片群集
3· MongoDB 分片管理
4· 推荐 MongoDB 、MySQL 基础文章
5· 文章总结




MongoDB 分片概述

1)什么是分片:


1·不用专业的术语说,从字面的意思讲解,就是把一块东西分成很多很多块。





2·稍微专业术语:分片是一种技术,它是使用多个服务器来存放数据,不再是只用一台服务器。这样就可以满足大量的数据写入,如果没有分片技术,使用其他方法那么随着数据量的增加,磁盘空间、服务器压力总会产生问题





3·分片技术是一种将海量数据水平扩展的数据库群集系统,数据分布存储在分片(sharding)的各个节点上,管理者通过简单的配置就可以方便的构建一个分布式 MongoDB 分片群集




2).分片的条件


1:服务器磁盘不够的时候





2:服务器出现写瓶颈的时候





3:想将大量数据放在内存中提高性能




3)MongoDB 分片群集的组成


1· Shard: 分片服务器,用于存储实际的数据,在生产环境中一个 shard server 角色可以由几台服务器组成一个 Replica Set 承担,防止单点故障





2· Config Server :配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息





3· Routers :前端路由,客户端是由它来接入,且让整个群集看上去像单一数据库,前端应用可以透明使用




MongoDB 分片群集的组成如下图



【实战】MongoDB 分片原理概述 + 部署 MongoDB 分片群集 +【源码包】




部署 MongoDB 分片群集

部署前说明


1· 部署环境: CenOS 7.4





2· MongoDB 的安装这里不再演示,需要的朋友请点击:MongoDB 安装详解





3· 需要源码包的请点击:MongoDB 源码包点击下载密码:tpkt




1)部署开始
1·解压源码包、优化


[root@localhost ~]# tar xvf 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]# ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
[root@localhost opt]# ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod




2·创建日志文件和存储文件的路径


[root@localhost opt]# mkdir -p /data/mongodb/mongodb{1,2,3,4} ----(可以连续创建4个数据储存目录





[root@localhost opt]# cd /data/mongodb/
[root@localhost mongodb]# mkdir logs





[root@localhost mongodb]# touch mongodb{1,2,3,4}.log ----(创建日志文件
[root@localhost mongodb]# chmod 777 .log ---(赋予权限





[root@localhost mongodb]# ulimit -n 25000 ----(调高shell系统所暂用的资源比例)
[root@localhost mongodb]# ulimit -u 25000 ----(放大文件数量)




3·添加配置文件


[root@localhost mongodb]# vim /usr/local/mongodb/bin/mongodb1.conf ---(添加配置文件)





添加内容如下:



  1. > port=37017 ----(配置服务器端口

  2. > dbpath=/data/mongodb/mongodb1 ----(数据存储目录

  3. > logpath=/data/mongodb/logs/mongodb1.log ----(指定日志文件存储目录

  4. > logappend=true -----(使用追加方式写日志

  5. > maxCOnns=5000 -----(最大链接数

  6. > fork=true -----(后台运行

  7. > storageEngine=mmapv1 -----(指定存储引擎为内存映射文件

  8. > cOnfigsvr=true -----(模式为配置服务器模式)




当一个节点可用内存不足时,系统会从其他几点分配内存


[root@localhost mongodb]# sysctl -w vm.zone_reclaim_mode=0





[root@localhost mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/enabled





[root@localhost mongodb]# echo never > /sys/kernel/mm/transparent_hugepage/defrag




到这里配置服务器已经配置完毕,接下来会配置第一个分片服务器:


[root@localhost mongodb]# cd /usr/local/mongodb/bin/
[root@localhost bin]# cp -p mongodb1.conf mongodb2.conf ---(把配置文件复制一份出来,稍作修改)
[root@localhost bin]# vim mongodb2.conf ---(修改内容如下





加粗内容需要注意与修改:



  1. > port=47017 ---(这里的端口号需要修改

  2. > dbpath=/data/mongodb/mongodb2 ---(数据存储路径修改

  3. > logpath=/data/mongodb/logs/mongodb2.log ----(日志存储路径修改

  4. > logappend=true

  5. > maxCOnns=5000

  6. > fork=true

  7. > storageEngine=mmapv1

  8. > shardsvr=true ----(这里是最重要的,这里的模式就是代表分片模式




配置第二个分片服务器,方法如下:


[root@localhost bin]# cp -p mongodb2.conf mongodb3.conf ---(在复制一份配置文件)





[root@localhost bin]# vim mongodb3.conf ---(修改内容如下)





修改内容如下:



  1. > port=47018 ----(端口号需要修改

  2. > dbpath=/data/mongodb/mongodb3 ----(数据存储路径

  3. > logpath=/data/mongodb/logs/mongodb3.log ---(日志文件

  4. > logappend=true

  5. > maxCOnns=5000

  6. > fork=true

  7. > storageEngine=mmapv1

  8. > shardsvr=true




开启3台实例服务:



  • > [root@localhost bin]# mongod -f mongodb1.conf -----(启动3台实例)

  • > [root@localhost bin]# mongod -f mongodb2.conf

  • > [root@localhost bin]# mongod -f mongodb3.conf



开启前端路由模式,这里不明白的可以看看上面的组成图:



  1. > [root@localhost ~]# cd /usr/local/mongodb/bin/

  2. > [root@localhost bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.106.154:37017 --chunkSize 1




显示如下字符,开启成功
2018-09-18T16:03:49.695+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: 41001
child process started successfully, parent exiting




现在可以进入 MongoDB 服务器


[root@localhost bin]# mongo




添加两台分片服务器:


mongos> sh.addShard("192.168.106.154:47017") ---(这里注意把端口号写正确)
{ "shardAdded" : "shard0000", "ok" : 1 }





mongos> sh.addShard("192.168.106.154:47018")
{ "shardAdded" : "shard0001", "ok" : 1 }




查看分片服务器状态信息:


mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
> { "_id" : "shard0000", "host" : "192.168.106.154:47017" }
> { "_id" : "shard0001", "host" : "192.168.106.154: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:




写入五万条数据,等待测验


mongos> for(var i=1;i<=50000;i++)db.school.insert({"id":i,"name":"tpm"+i})
WriteResult({ "nInserted" : 1 }) ----(利用 for 循环添加,只是为了验证后面分片存储)




查看信息是否写入,就看前五条即可,因为数据太多。


mongos> db.school.find().limit(5)
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce165"), "id" : 1, "name" : "tpm1" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce166"), "id" : 2, "name" : "tpm2" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce167"), "id" : 3, "name" : "tpm3" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce168"), "id" : 4, "name" : "tpm4" }
{ "_id" : ObjectId("5ba0b3c6dcdebde5a87ce169"), "id" : 5, "name" : "tpm5" }




对 test 这个库进行分片处理,默认写入数据就是写入 test


mongos> sh.enableSharding("test")
{ "ok" : 1 }




对集合建立索引


mongos> db.school.createIndex({"id":1}) ----(建立索引以 id 为列)
{
"raw" : {
"192.168.106.154:47017" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}




对test.shcool这个数据库中的这个school集合进行分片,指定索引为 id:1


mongos> sh.shardCollection("test.school",{"id":1}) ----(开始分片
{ "collectionsharded" : "test.school", "ok" : 1 }




查看分片状态:


mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154: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:
5 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 6
shard0001 5
-----(两个分片)
以下是把五万条数据分片存储

{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0001 Timestamp(2, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(3, 0)
{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0)
{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0)
{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0)
{ "id" : 23410 } -->> { "id" : 28092 } on : shard0000 Timestamp(6, 1)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0000 Timestamp(1, 6)
{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(1, 7)
{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8)
{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9)
{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10



现在来模拟,由于大量的数据,导致空间不足,这时我们需要添加分片服务器:


[root@localhost bin]# cp mongodb3.conf mongodb4.conf --(复制配置文件)
[root@localhost bin]# vim mongodb4.conf ---(做如下修改)





修改内容如下:
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
maxCOnns=5000
fork=true
storageEngine=mmapv1
shardsvr=true





[root@localhost bin]# mongod -f mongodb4.conf ---(启动第4个实例)





[root@localhost bin]# mongo ----(进入mongo)





mongos> sh.addShard("192.168.106.154:47019")
{ "shardAdded" : "shard0002", "ok" : 1 } ---(再次添加一台分片服务器)




再次查看状态, 我们会发现会自动重新分片到新的服务器中
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ba0b1655ba2e21d63505818")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017" }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018" }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019" }

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:
8 : Success
databases:
{ "_id" : "test", "primary" : "shard0000", "partitioned" : true }
test.school
shard key: { "id" : 1 }
unique: false
balancing: true
chunks:
shard0000 4 ------(又加入一个分片服务器)
shard0001 4
shard0002 3

{ "id" : { "$minKey" : 1 } } -->> { "id" : 4682 } on : shard0002 Timestamp(9, 0)
{ "id" : 4682 } -->> { "id" : 9364 } on : shard0001 Timestamp(9, 1)
{ "id" : 9364 } -->> { "id" : 14046 } on : shard0001 Timestamp(4, 0)
{ "id" : 14046 } -->> { "id" : 18728 } on : shard0001 Timestamp(5, 0)
{ "id" : 18728 } -->> { "id" : 23410 } on : shard0001 Timestamp(6, 0)
{ "id" : 23410 } -->> { "id" : 28092 } on : shard0002 Timestamp(7, 0)
{ "id" : 28092 } -->> { "id" : 32774 } on : shard0002 Timestamp(8, 0)
{ "id" : 32774 } -->> { "id" : 37456 } on : shard0000 Timestamp(8, 1)
{ "id" : 37456 } -->> { "id" : 42138 } on : shard0000 Timestamp(1, 8)
{ "id" : 42138 } -->> { "id" : 46820 } on : shard0000 Timestamp(1, 9)
{ "id" : 46820 } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 10)




结论:我们可以知道,重新添加分片服务器会让数据进行重新分片,并不会影响什么,同理,删除一台分片服务器,那么数据一样会重新重整数据,进行分片。这样的话,我们几乎就不需要在做分片服务器的集群,因为分片服务器本来就可以添加多台,无论是否挂掉都不会影响什么。




还可以给分片服务器贴上自己容易记住的标签:


mongos> sh.addShardTag("shard0000","abc00")
mongos> sh.addShardTag("shard0001","abc01")
mongos> sh.addShardTag("shard0002","abc02")




可以再次查看分片服务器:


shards:
{ "_id" : "shard0000", "host" : "192.168.106.154:47017", "tags" : [ "abc00" ] }
{ "_id" : "shard0001", "host" : "192.168.106.154:47018", "tags" : [ "abc01" ] }
{ "_id" : "shard0002", "host" : "192.168.106.154:47019", "tags" : [ "abc02" ] }




下图是数据分片的截图,让效果更加直观,重点会又标记:
【实战】MongoDB 分片原理概述 + 部署 MongoDB 分片群集 +【源码包】




关联知识点文章推荐:


MongoDB 数据库安装:http://blog.51cto.com/13746824/2174874





MongoDB 复制集 + 选举原理:http://blog.51cto.com/13746824/2175720





详解 MySQL 高可用群集,MMM搭建高可用:http://blog.51cto.com/13746824/2173073





Amoeba 代理 MySQL 主从复制 + 读写分离:http://blog.51cto.com/13746824/2172139





总结:


MongoDB 分片通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据





MongoDB 分片群集主要如下三个组件:可以参考文章第一张图:Shard 分片服务器、Config Server 配置服务器、Routers 前端路由





重新添加分片服务器会让数据进行重新分片,并不会影响什么,同理,删除一台分片服务器,那么数据一样会重新重整数据,进行分片!



推荐阅读
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 本文详细介绍了在XAMPP环境中如何修改Apache和MySQL的默认端口号,并确保WordPress能够正常访问。同时,提供了针对Go语言社区和Golang开发者的相关建议。 ... [详细]
  • 当 WebLogic 连接的数据源数据库密码发生更改时,需要在域目录的 config 文件夹下的 jdbc 配置文件中更新相应的密码。本文将详细介绍如何安全地修改和验证这些配置文件中的加密密码。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • ThinkPHP 数据库配置详解
    本文详细介绍了如何在 ThinkPHP 框架中正确配置数据库连接参数,包括数据库类型、服务器地址、数据库名称等关键配置项。 ... [详细]
  • 本文介绍了如何利用MongoDB的$exists操作符在Java应用程序中检查特定字段是否存在于文档中,包括示例代码和解释。 ... [详细]
author-avatar
宝宝彪恒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有