MongoDB 3.4 shard 分片

简介:

数据压力大到机器支撑不了的时候能否做到自动扩展?


在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的。而MongoDB主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题。


传统数据库怎么做海量数据读写?其实一句话概括:分而治之。上图看看就清楚了,如下 taobao岳旭强在infoq中提到的 架构图:


上图中有个TDDL,是taobao的一个数据访问层组件,他主要的作用是SQL解析、路由处理。根据应用的请求的功能解析当前访问的sql判断是在哪个业务数据库、哪个表访问查询并返回数据结果。具体如图:


说了这么多传统数据库的架构,那Nosql怎么去做到了这些呢?MySQL要做到自动扩展需要加一个数据访问层用程序去扩展,数据库的增加、删除、备份还需要程序去控制。一但数据库的节点一多,要维护起来也是非常头疼的。不过mongodb所有的这一切通过他自己的内部机制就可以搞定!还是上图看看mongodb通过哪些机制实现路由、分片:


从图中可以看到有四个组件:mongos、config server、shard、replica set。

mongos:数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

config server:顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。

shard:这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:



一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。也许有人问一台机器硬盘加大一点不就可以了,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈。在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。在生产环境中分片的片键可要好好设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!

replica set:前面已经详细讲过了这个东东,怎么这里又来凑热闹!其实上图4个分片如果没有 replica set 是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set 副本集保证分片的可靠性。生产环境通常是 2个副本 + 1个仲裁。

说了这么多,还是来实战一下如何搭建高可用的mongodb集群:

首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里测试资源有限,只准备了 3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:


1、准备机器,IP分别设置为: 192.168.4.200、192.168.4.201、192.168.4.202,并分别创建mongos 、config 、 shard1 、shard2、shard3对应目录



#建立mongos及日志目录
mkdir  -p  /data/mongodbtest/mongos/log

#建立config server 数据文件存放目录
mkdir  -p  /data/mongodbtest/config/data

#建立config server 日志文件存放目录
mkdir  -p  /data/mongodbtest/config/log

#建立shard1 数据文件存放目录
mkdir  -p  /data/mongodbtest/shard1/data

#建立shard1 日志文件存放目录
mkdir  -p  /data/mongodbtest/shard1/log

#建立shard2 数据文件存放目录
mkdir  -p  /data/mongodbtest/shard2/data

#建立shard2 日志文件存放目录
mkdir  -p  /data/mongodbtest/shard2/log

#建立shard3 数据文件存放目录
mkdir  -p  /data/mongodbtest/shard3/data

#建立shard3 日志文件存放目录
mkdir  -p  /data/mongodbtest/shard3/log

2、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.


3、在每一台服务器分别启动配置服务器(后台运行)

/home/weixla/mongodb-3.4.0/bin/mongod --configsvr --replSet cfgReplSet --dbpath /data/mongodbtest/config/data --port 21000 --logpath /data/mongodbtest/config/log/config.log --fork


连接到任意一台配置服务器上 

/home/weixla/mongodb-3.4.0/bin/mongo --host 192.168.4.200 --port 21000


创建配置服务器副本集

rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:"192.168.4.200:21000"},{_id:1,host:"192.168.4.201:21000"},{_id:2,host:"192.168.4.202:21000"}]})


4、在每一台服务器分别启动分片及副本集。(后台运行)

在每一台服务器分别以副本集方式启动分片1

/home/weixla/mongodb-3.4.0/bin/mongod --shardsvr --replSet shard1ReplSet --port 22001 --dbpath /data/mongodbtest/shard1/data  --logpath /data/mongodbtest/shard1/log/shard1.log --fork --nojournal  


连接任意一台分片服务器

/home/weixla/mongodb-3.4.0/bin/mongo --host 192.168.4.200 --port 22001


创建副本集并初始化

rs.initiate({_id:"shard1ReplSet",members:[{_id:0,host:"192.168.4.200:22001"},{_id:1,host:"192.168.4.201:22001"},{_id:2,host:"192.168.4.202:22001"}]})



同样操作shar2  shard3

/home/weixla/mongodb-3.4.0/bin/mongod --shardsvr --replSet shard2ReplSet --port 22002 --dbpath /data/mongodbtest/shard2/data  --logpath /data/mongodbtest/shard2/log/shard2.log --fork --nojournal  

/home/weixla/mongodb-3.4.0/bin/mongod --shardsvr --replSet shard3ReplSet --port 22003 --dbpath /data/mongodbtest/shard3/data  --logpath /data/mongodbtest/shard3/log/shard3.log --fork --nojournal 


5、选择一台服务器启动mongos路由服务。

/home/weixla/mongodb-3.4.0/bin/mongos  --configdbcfgReplSet/192.168.4.200:21000,192.168.4.201:21000,192.168.4.202:21000 --port  20000  --logpath  /data/mongodbtest/mongos/log/mongos.log --fork


登录路由服务客户端

/home/weixla/mongodb-3.4.0/bin/mongo --host 192.168.4.200 --port 20000


添加分片到集群

sh.addShard("shard1ReplSet/192.168.4.200:22001,192.168.4.201:22001,192.168.4.202:22001")


依次添加shard2  shard3


sh.addShard("shard2ReplSet/192.168.4.200:22002,192.168.4.201:22002,192.168.4.202:22002")

sh.addShard("shard3ReplSet/192.168.4.200:22003,192.168.4.201:22003,192.168.4.202:22003")


6、Enable Sharding for a Database

sh.enableSharding("test")



7、Shard a Collection

sh.shardCollection("test.Log", { id: 1})



8、测试

use test

for(var i = 1; i <= 100000; i++){

  db.Log.save({id:i,"message":"message"+i});

}



从这个结果看来,1个分片 保存了1条,另一个分片保存了剩下的所有记录,这是shard key的策略造成的,让我们看下官方图



那我们修改一下sharding key的策略为hashed,重新插入数据


结果如下



这里基本保持了数据的均衡。

本文转自不要超过24个字符博客51CTO博客,原文链接http://blog.51cto.com/cstsncv/1944517如需转载请自行联系原作者


cstsncv

相关文章
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
存储 NoSQL 前端开发
MongoDB 分片
10月更文挑战第17天
242 2
|
存储 监控 NoSQL
*MongoDB的水平扩展主要通过分片技术实
*MongoDB的水平扩展主要通过分片技术实
282 5
|
存储 NoSQL 前端开发
MongoDB 分片总结
这篇文章总结了MongoDB分片的概念、集群结构、分片实例、配置和测试过程。
1131 6
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
604 3
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
775 3
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
存储 负载均衡 NoSQL
MongoDB的分片功能
【6月更文挑战第6天】MongoDB的分片功能
401 1
|
存储 运维 NoSQL
轻松上手:逐步搭建你的高可用MongoDB集群(分片)
【8月更文挑战第13天】在数据激增的背景下,传统单机数据库难以胜任。MongoDB作为流行NoSQL数据库,采用分片技术实现水平扩展,有效处理海量数据。分片将数据分散存储,提高并发处理能力和容错性,是高可用架构基石。构建MongoDB集群需理解shard、config server和router三组件协同工作原理。通过具体实例演示集群搭建流程,包括各组件的启动及配置,确保数据高可用性和系统稳定性。合理规划与实践可构建高效稳定的MongoDB集群,满足业务需求并支持未来扩展。
961 0
|
负载均衡 NoSQL 中间件
|
存储 监控 NoSQL
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
781 0

推荐镜像

更多