由于生产环境中一般使用zoomkeeper做config节点的仲裁节点,zoomkeeper会在三个config节点中挑选出一台作为主config节点。且mongos节点一般是两个节点,必须做高可用,可以用keepalived实现(任何具有负载均衡能力的服务器节点都可以使用keepalived做高可用)
1:准备四个节点mongodb1(mongos)、mongodb2(config)、mongodb3(shard1)、mongodb4(shard2)且保证可以通过主机名访问,且时间同步
2:配置mongodb2(config)节点,使得mongodb2为config节点,编辑配置文件/etc/mongod.conf
添加:configsvr = true
同时注释:#replSet=uplooking #replIndexPrefetch=_id_only #port=27017 这3个指令
(因为副本集与config节点不能同时工作)
4:启动config server,此时默认config server监听在27019端口
systemctl start mongod.service
5: 在mongodb1上操纵:mongodb1作为路由,使用mongos连接config server,先清空配置文件,再添加如下信息
logpath=/var/log/mongodb/mongod.log # 指明日志路径
pidfilepath=/var/run/mongodb/mongod.pid # 指明pid路径
logappend=true # 指明日志累加
fork=true # 指明运行于守护进程
port=27017 # 指明端口
configdb=192.168.43.11:27019 # 指明config server 的地址在哪里
6:指定配置文件,启动mongos,也可以使用systemctl启动,但是需要修改下启动脚本/etc/rc.d/init.d/mongod
mongos -f /etc/mongod.conf
7:将mongodb3和mongodb4配置文件中关于副本集的指令注释,然后直接启动
systemctl start mongod
8:mongodb3、mongodb4启动之后,在mongodb1上,通过mongo登入到mongos,将mongodb3、mongodb4作为shard添加到mongos的路由策略中
9:创建支持shard机制的数据库
sh.enableSharding("uplookingdb")
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("59f6caf5c93e5ff2a637a0cd")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.43.13:27017" }
{ "_id" : "shard0001", "host" : "192.168.43.12:27017" }
databases: # 这里会显示支持shard的数据库,分片collection放置在各个shard,而没有分片的collection放置在主shard中
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0001" }
{ "_id" : "uplookingdb", "partitioned" : true, "primary" : "shard0001" }
10:在对应支持shard机制的数据库上创建支持shard的collection,{"age": 1}指明索引为age,升序排序,这样shard集群的功能就已经启动了,之后就可以调用mongodb1这个接口写数据了,但是写入mongodb1的数据不会保存在mongodb1,因为mongodb1是一个router节点,所有的数据都会保存至shard节点上。
sh.shardCollection("uplookingdb.students", {"age": 1})
11:此时mongodb1节点上会有uplookingdb库 和 students表了
mongos> show dbs;
admin (empty)
config 0.016GB
uplookingdb 0.078GB
mongos> use uplookingdb
switched to db uplookingdb
mongos> show collections;
students
system.indexes
12:给students表创建添加数据(可以使用js的循环语法插入数据)
mongos> for (i=1; i<1000000; i++){
db.students.insert({"name": "yhy"+i, "age": i%100, "student_id": i, "skill": "ok"+i, "salary": "$"+i%10000})
}
13:复制mongodb1窗口,先查看一下students表有多少行数据了,在看看此时的shard分片的状态
mongos>db.students.find().count(); # 查看students表中有多少行数据了
237751
mongos> sh.status() # 再查看一下shard的状态信息
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("59f6caf5c93e5ff2a637a0cd")
}
shards: # 只是shard节点列表
{ "_id" : "shard0000", "host" : "192.168.43.13:27017" }
{ "_id" : "shard0001", "host" : "192.168.43.12:27017" }
databases: # 这是支持shard机制的库
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : false, "primary" : "shard0001" }
{ "_id" : "uplookingdb", "partitioned" : true, "primary" : "shard0001" }
uplookingdb.students 这是支持shard机制的表
shard key: { "age" : 1 } # 用表上的哪个索引作为shard的键
chunks: # 这里是显示chunk的发布情况
shard0000 2 # 发布两个chunk
shard0001 3 # 发布三个chunk
{ "age" : { "$minKey" : 1 } } -->> { "age" : 1 } on : shard0000 Timestamp(2, 0)
{ "age" : 1 } -->> { "age" : 47 } on : shard0000 Timestamp(3, 0)
{ "age" : 47 } -->> { "age" : 72 } on : shard0001 Timestamp(3, 2)
{ "age" : 72 } -->> { "age" : 99 } on : shard0001 Timestamp(3, 3)
{ "age" : 99 } -->> { "age" : { "$maxKey" : 1 } } on : shard0001 Timestamp(2, 3)
14:过一段时间之后,等数据在mongodb1节点插入完毕,在mongodb3,mongodb4上就会发现一部分年龄的人在mongodb3,而另外一部分在mongodb4上
db.students.find();
15:再添加一个新的节点进来,在mongodb1上设置它为shard节点,此时你会发现chunk就会自动迁移,无需我们手动管理,但是chunk在shard节点中自动迁移会消耗大量的带宽以及带来I/O压力,因此,一般是现在mongodb1节点将
16:如果创建一个库,且添加一张表,且并没有将库和表添加到shard机制中来,那么对于每一个shard节点实现副本集赋值功能,以及多个config节点,同学们一定要完成(我出去调研的时候发现,MongoDB的应用场景再某种程度上不比MySQL弱)
- Mongodb 分片操作 介绍
为什么需要分片操作?由于数据量太大,使得CPU,内存,磁盘I/O等压力过大.当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台 ...
- MongoDB 分片操作
添加分片 use admin //添加分片节点,每个分片都是一个副本集[allowLocal:true仅仅开发时才将分片配置到本地,生产时不能这样] db.runCommand({addshard:& ...
- [置顶] MongoDB 分布式操作——分片操作
MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...
- MongoDB 分片集群实战
背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁 ...
- python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战
python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...
- (转)MongoDB分片实战 集群搭建
环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...
- (转)mongodb分片
本文转载自:http://www.cnblogs.com/huangxincheng/archive/2012/03/07/2383284.html 在mongodb里面存在另一种集群,就是分片技术, ...
- MongoDB分片技术[转]
8天学通MongoDB——第六天 分片技术 在mongodb里面存在另一种集群,就是分片技术,跟sql server的表分区类似,我们知道当数据量达到T级别的时候,我们的磁盘,内存 就吃不消了,针 ...
- mongodb分片
在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来 ...
随机推荐
- Rust 智能指针(一)
Rust 智能指针(一) 1.Box<T> Box<T>是指向堆中的指针. fn main() { let box = Box::new(3); println!(" ...
- 【转】 不需要任何权限获得Android设备的唯一ID
不需要任何权限获得Android设备的唯一ID,权限android设备id 这个问题来自于Is there a unique Android device ID? 我对这个问题的答案做了整理,包括将另 ...
- 20155238 2016-2017-2 《Java程序设计》第三周学习总结
教材学习内容总结 类定义使用class关键词,名称使用Cloths,建立实例运用New关键词 Clothes c1 = new Clothes(); = :制定参考名称参考某个对象 == :比较参考名 ...
- 20155321 《信息安全系统设计》课堂测试(ch06)
20155321 <信息安全系统设计>课堂测试(ch06) (单选题|1分)下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为() A .1 B .1/4 C . ...
- FFT/NTT/MTT学习笔记
FFT/NTT/MTT Tags:数学 作业部落 评论地址 前言 这是网上的优秀博客 并不建议初学者看我的博客,因为我也不是很了解FFT的具体原理 一.概述 两个多项式相乘,不用\(N^2\),通过\ ...
- mfc 函数模板
函数模板的使用 一. 函数模板的使用 使用函数模板可以简化 形参个数相同,而类型不同的函数. template<typename T> //可以用class替换typename int m ...
- 牛客国庆集训派对Day1 B. Attack on Titan
B. Attack on Titan 链接 #include<cstdio> #include<algorithm> #include<cstring> #incl ...
- wpf 中Listbox获取选中的值
布局代码: <ListBox Name="listBox1" Width="120" Height="52" SelectionC ...
- ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
Grunt和Gulp是Javascript世界里的用来做自动压缩.Typescript编译.代码质量lint工具.css预处理器的构建工具,它帮助开发者处理客户端开发中的一些烦操重复性的工作.Grun ...
- 菜鸟vimer成长记——第2.1章、normal模式
目的 掌握normal模式下常用操作的语法和概念,这些操作对应的应用场景以及实用技巧. 通过normal模式举一反三掌握cmd-line和visual的常用文本操作. 简介 文本操作的理想状态为:一个 ...