热门标签 | 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 前端路由





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



推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 如何修改MySQL数据库密码的方法及步骤详解
    本文详细介绍了四种修改MySQL数据库密码的方法,包括使用SET PASSWORD命令、mysqladmin命令、UPDATE语句直接编辑user表的步骤和操作示例。通过本文的指导,读者可以轻松掌握修改MySQL数据库密码的技巧和方法。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
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社区 版权所有