第一部分

在搭建mongoDB之前,我们要考虑几个小问题:

1、我们搭建集群的目的是什么?是多备份提高容错和系统可用性还是横向拓展存储大规模数据还是两者兼有?

  如果是为了多备份那么选择replication集群搭建即可,如果是为了处理大数据则需要搭建sharding集群,如果两者兼有需要对每个shardsvr创建replica。

2、什么是sharding?和replication有什么不同?

  简单而言,replica是mongo提供服务的一个基本单位,单机系统和replication集群对用户来讲没有区别,都只相当于一个服务节点,只不过replication集群有多备份,还有服务端选举,安全性更加有保证。而sharding集群包含3个角色:mongos,configsvr,shardsvr,对于一个集群来说mongos相当于master,负责对外提供服务,shardsvr相当于slave,负责分片存储数据,而configsvr相当于router,负责记录分片元信息。这3种角色中的任何一个角色中的子节点都是一个replica。具体说明参考官方网站对sharding和replication的描述:

  replication:https://docs.mongodb.com/manual/replication/

  sharding:https://docs.mongodb.com/manual/sharding/

3、我们集群的架构又该是什么样子?

  如果对问题1和2有足够的认知的话,那么根据本地硬件环境构建一个什么样的集群大致也就清楚了,每个shardsvr的replication相当于一个slave,我们需要几个子节点就需要创建多少个shardsvr,configsvr是router信息,我们可以将所有机器都组成一个configsvr的replication用以提供router服务,至于mongos,内部使用一个节点也可以,如果需要稳定运行的话也需要组一个小的mongos的replication。

 第二部分

下面是实战环节:

  我这可以有5台服务器用来跑mongodb还有一批数据,当然,这5台机器上也跑着其他框架如spark,hadoop等等,由于spark和hadoop都是单点故障的(什么?多master?secondary?不存在的,老夫部署集群从来都是单点故障)所以mongos也是一台节点,数据端存放在5台机器上,又由于数据量较大,硬盘较小(别人组的raid5,加一起一台服务器也就1T多空间),所以肯定不考虑备份和稳定性了(2备份硬盘就没多大地方了,hdfs还有其他数据要放),那么架构可以构建如下:

  

下面shardsvr每一个都是一个单独的replica,开始部署:

1、创建配置文件:

  a) configsvr

systemLog:
destination: file
path: "/home/cloud/platform/logs/mongodb/configsvr.log"
logAppend: true
storage:
dbPath: "/home/cloud/platform/data/configData"
journal:
enabled: true
setParameter:
enableLocalhostAuthBypass: false
processManagement:
fork: true
replication:
replSetName: "configsvr0"
sharding:
clusterRole: "configsvr"

  b) shardsvr

systemLog:
destination: file
path: "/home/cloud/platform/logs/mongodb/shardsvr.log"
logAppend: true
storage:
dbPath: "/home/cloud/platform/data/shardData"
journal:
enabled: true
setParameter:
enableLocalhostAuthBypass: false
processManagement:
fork: true
replication:
replSetName: "shardsvr1"
sharding:
clusterRole: "shardsvr"

  c) mongos

systemLog:
destination: file
path: "/home/cloud/platform/logs/mongodb/mongos.log"
logAppend: true
net:
bindIp: 192.168.12.161
port:
setParameter:
enableLocalhostAuthBypass: false
processManagement:
fork: true
sharding:
configDB: "configsvr0/192.168.12.161:27019,192.168.12.162:27019,192.168.12.163:27019,192.168.12.164:27019,192.168.12.169:27019"

  注意:每台机器上的配置都略有不同,简易参考官方文档进行修改,replSetName这个是replication的设置,每个角色的子replication应该有相同的值,不同的replication应该有不同的值

  接下来是启动脚本

  a)shardsvr

#!/bin/bash

# use this to initiate: rs.initiate({_id:"shardsvr1",members:[{_id:,host:"192.168.12.161:27018"}]})
/home/cloud/platform/mongodb-3.4./bin/mongod --config /home/cloud/platform/mongodb-3.4./shardserver.conf

  b)configsvr

#!/bin/bash

#use this to initiate: rs.initiate({_id:"configsvr0",configsvr:true,members:[{_id:,host:"192.168.12.161:27019"},{_id:,host:"192.168.12.162:27019"},{_id:,host:"192.168.12.163:27019"},{_id:,host:"192.168.12.164:27019"},{_id:,host:"192.168.12.169:27019"}]})

MONGO_HOME=/home/cloud/platform/mongodb-3.4./
${MONGO_HOME}/bin/mongod --config ${MONGO_HOME}/configserver.conf

  c)mongos

#!/bin/bash

#mogos dont need to initiate,
#sh.enableSharding("dbname") to create database
#sh.shardCollection("dbname.tablename", {id: "hashed"}) to create a shard table split by id /home/cloud/platform/mongodb-3.4./bin/mongos --config /home/cloud/platform/mongodb-3.4./mongosserver.conf

2、启动过程

  a、将脚本和配置文件复制到每台机器上

  b、启动每个shardsvr,然后登录到shardsvr上,执行初始化过程:

 

、执行start-shardsvr.sh
、执行bin/mongo --host ${hostIP} --port ${hostport}
shardsvr的默认端口是27018
configsvr的默认端口是27019
mongos的默认端口是27017
在上面配置文件中未指定端口,一切都以默认为主
、执行rs.initiate({_id:"shardsvr1",members:[{_id:,host:"192.168.12.161:27018"}]})
进行初始化工作
、执行rs.status()查看shardsvr状态,一个成功的例子如下:

  c、启动所有configsvr,并使用mongo --host --port命令登录到任意一台configsvr的configsvr端口上(default:27019)。并执行初始化工作:

   

rs.initiate({_id:"configsvr0",configsvr:true,members:[{_id:,host:"192.168.12.161:27019"},{_id:,host:"192.168.12.162:27019"},{_id:,host:"192.168.12.163:27019"},{_id:,host:"192.168.12.164:27019"},{_id:,host:"192.168.12.169:27019"}]})

  d、启动mongos,这时已经可以在mongos上执行我们的操作了。

//先添加shard分片,如果shardsvr1有多个节点也只用写一个,毕竟一个replica相当于一个节点,使用时会自动找到primary的
sh.addShard("shardsvr1/192.168.12.161:27018"))
//把所有的都加进去之后
printShardingStatus()

然后就是正常的mongo shell操作了,可以把mongos当成一个普通的单机mongodb来使用,操作基本相同,除了创建sharding表

创建表如下:

sh.enableSharding("dbname") to create database
sh.shardCollection("dbname.tablename", {"_id": "hashed"}) to create a shard table hashed by _id

需要注意的是,"_id"是mongo分片依据,不能重复,如果想以其他字段来进行hash,将命令中的"_id"改为字段名称就可以了,但是mongo还是会自动创建一个_id列用来索引

添加索引:

db.collectionname.ensureIndex({"indexColumn":})

第三部分

JavaAPI小tips

获取连接:

lazy val mongo = new MongoClient("192.168.12.161", 27017)
lazy val db = mongo.getDatabase("testdb")
lazy val dbColl = db.getCollection("origin2")

插入数据:

var resList = new ArrayList[Document]
var d = new Document
d.append("path", x.getPath)
d.append("name", x.getName)
d.append("content", filterHtml(Source.fromFile(x, detector(x)).getLines().toArray).mkString("\n"))
resList.add(d)
dbColl.insertMany(resList, new InsertManyOptions().ordered(false))

在插入过程中,如果"_id"出现重复值,那么默认情况下会中止当前插入操作并throw一个exception,即之前的数据已经插入进去,后面的数据没插入进表,在后面加入new InsertManyOptions().ordered(false)参数就可以将所有不重复的数据插入完成后再throw一个exception

mongoDB3.4的sharding集群搭建及JavaAPI的简易使用的更多相关文章

  1. mongodb sharding集群搭建

    创建虚拟机,如果是使用copy的方式安装系统,记得修改机器名,否则所有的机器名称都一样,会造成安装失败 同时关闭掉防火墙,将所有的机器的时间调成一致,master和slave的heartbeat间隔不 ...

  2. (转)MongoDB分片实战 集群搭建

    环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...

  3. Mongo 3.6.1版本Sharding集群配置

    Mongo低版本和高版本的sharding集群配置,细节不太一样.目前网上的配置文档大都是针对低版本的.本人在配置3.6.1版本的mongosharding集群的过程中,碰到不少问题,官方文档没有直观 ...

  4. mongodb3.6集群搭建:分片+副本集

    mongodb是最常用的noSql数据库,在数据库排名中已经上升到了前五.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  5. MongoDB3.2 集群搭建

    一.集群的理论知识 1.1 集群成员 MongoDB的集群类似于GreenPlum集群,由一个入口节点负责任务分发与结果统计,分片结节负责执行任务.不同GP,多了一个config servers. 集 ...

  6. mongodb3集群搭建

    三台服务器:先设置hosts 10.0.0.231 node1 10.0.0.232 node2 10.0.0.233 node3 1:下载 mongodb-linux-x86_64-rhel70-3 ...

  7. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  8. mongodb 3.6 集群搭建:分片+副本集

    mongodb是最常用的nosql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  9. MongoDB集群搭建-分片

    MongoDB集群搭建-分片 一.场景: 1,机器的磁盘不够用了.使用分片解决磁盘空间的问题. 2,单个mongod已经不能满足写数据的性能要求.通过分片让写压力分散到各个分片上面,使用分片服务器自身 ...

随机推荐

  1. Oracle内置函数SQLCODE和SQLERRM的使用

    在我们写proc程序中经常要有错误处理,在错误处理中我们经常要输出错误信息来给帮助我们分析和解决错误原因,从而更正数据.这时候就会用到SQLCODE和SQLERRM. SQLCode:数据库操作的返回 ...

  2. 【托业】【新托业TOEIC新题型真题】学习笔记8-题库五->P7

    ———————————————————单词———————————————————— minister 部长 construction contractor 施工方 commence 开始:着手 bac ...

  3. MySQL Sandbox安装使用

    前言 经常看见新同学对于安装MySQL十分惧怕,这是因为不熟悉的缘故,确实源码编译比较麻烦,缺少各种依赖包也够折腾的.当然还有预编译包,但是对于新同学来说好像都挺麻烦的.当然有yum安装,但是我们需要 ...

  4. UE4程序及资源加密保护方案

    UnrealEngine4外壳加密 . Virbox Protector 解决代码反汇编和反dump代码,解决软件盗版与算法抄袭. 虚幻引擎4是由游戏开发者为开发游戏而制作的.完整的游戏开发工具套件. ...

  5. input debounce

    项目背景是一个搜索框,不能实时的监听onChange 事件去发送请求,这样会造成服务器的压力 解决思路就是用 setTimeout + clearTimeout 普通js代码如下: / 下面是普通的j ...

  6. 【LeetCode每天一题】4Sum(4数之和)

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  7. js模拟散列

    //散列 //类似于 对象存储,key-value // 存入前,先将key进行hash编码,然后存入 function HashTable(){ var hashData = []; this.dj ...

  8. nodejs 网上下载图片到本地,并判断图片路径是否存在

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  9. css--纵向margin设置auto和百分数真的无效吗?

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. python demjson

    这个是第三方的json库 首先安装 http://deron.meranda.us/python/demjson/ demjson-2.2.4.tar.gz #tar -xzf demjson-2.2 ...