由于生产环境中一般使用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主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来 ...
随机推荐
- 2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解
1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程 ...
- 关于DFS与BFS
DFS(深度优先搜索) 为无向图 DFS的过程类似于树的先序遍历. 请看图: DFS此图的过程为: 1.首先任意找一个未被便利过的顶点,例如从V1开始,由于率先访问了它,所以需要标记V1即已经访问 ...
- $.ready和onload 区别
1.jq ready()的方法就是Dom Ready 他的作用或者意义就是:在DOM加载完成后就可以可以对DOM进行操作. 一般情况先一个页面响应加载的顺序是,域名解析-加载html-加载js和css ...
- java并发编程——Excutor
概述 Excutor这个接口用的不多,但是ThreadPoolExcutor这个就用的比较多了,ThreadPoolExcutor是Excutor的一个实现.Excutor体系难点没有,大部分的关键点 ...
- ROC曲线与AUC
一.ROC曲线 1.简介 ROC曲线全称是"受试者工作特征曲线 "(Receiver Operating Characteristic curve),又称为感受性曲线(Sensit ...
- curl命令实现上网认证登录
为了想让组里的服务器连外网下数据,需要命令行上网登录.与很多高校的上网方式一样,大气所上网采用的是用户帐号登录验证的方法.上网需要需要先开浏览器,然后打开网页输入帐号密码登录.参考了前人的一些帖子,最 ...
- Jmeter+ant+jenkins接口自动化测试 平台搭建(二)
一.依赖文件配置 1.在ant目录C:\apache-ant-1.10.5下新建一个demo文件夹,并将jmeter测试脚本放在该文件夹中 2.将\apache-jmeter-3.3\extras下面 ...
- WPF中的颜色转换
HEX16色转Bursh: Brush brush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFFFF ...
- PKCS#7
1.名词解释 数字签名:在ISO7498-2标准中定义为:"附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性 ...
- C#例题集
收集一些从网上看到的例题 1.抽象类 抽象类不能被实例化一个抽象类只能通过接口和作为其它类的基类使用 抽象方法的声明只能在抽象类中 抽象方法必定不能实现(方法带一对{}都不行) 当一个子类集成自抽象类 ...