由于生产环境中一般使用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主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来 ...
随机推荐
- Flex自定义组件开发 - jackyWHJ
一般情况下需要组件重写都是由于以下2个原因: 1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展. 2.为了模块化设计或进一步重用,需要对FLEX组件进行组合. ...
- # 2017-2018-1 20155224 《信息安全系系统设计基础》第四周MyOD
2017-2018-1 20155224 <信息安全系系统设计基础>第四周MyOD 在这里跟老师先道歉,当时我的git没有安装好,后面也一直没有装上,所以程序没有git. 要求 参考教材第 ...
- 标准输入输出 sys.stdin与sys.stdin
1.python中的标准输入输出 如果需要更好的控制输出,而print不能满足需求,input也不能 sys.stdout,sys.stdin,sys.stderr就是你需要的. 2.输入:sys.s ...
- 12-[CSS]-margin塌陷,margin 0 auto,善用父级的padding
1.margin塌陷 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- JAVAWEB tomcat服务器启动错误原因总结
tomcat服务器启动错误: org.apache.catalina.LifecycleException 这种异常的原因是 servlet的代码出现了错误 实例: 这里的servlet由于使 ...
- restful framework之权限组件
一.权限简介 只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制 二.局部使用 from rest_framework.permissions import BasePerm ...
- 5 行 Python 代码调用电脑摄像头
前提: 确保 python 中安装了 opencv-python 模块.如果没有安装,可以参考:https://pypi.org/project/opencv-python/ 进行安装.话不多少,直接 ...
- js中for循环的多种方式
For/In 循环 JavaScript for/in 语句循环遍历对象的属性: 实例 var person={fname:"John",lname:"Doe" ...
- 41F继电器座的解剖与妙用
摘要:如果继电器不是焊在电路板上使用,就需要有个插座,这样方便接线,否则继电器的管脚是没法固定导线的.实际项目中使用了HF41F的继电器(宏发),在选择继电器座的时候,有一点感想,分享给大家.继电器是 ...
- RSA详解
RSA RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作.RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥 ...