共计 5738 个字符,预计需要花费 15 分钟才能阅读完成。
第一部分
在搭建 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: 27017
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:0,host:"192.168.12.161:27018"}]})
/home/cloud/platform/mongodb-3.4.5/bin/mongod --config /home/cloud/platform/mongodb-3.4.5/shardserver.conf
b)configsvr
#!/bin/bash
#use this to initiate: rs.initiate({_id:"configsvr0",configsvr:true,members:[{_id:0,host:"192.168.12.161:27019"},{_id:1,host:"192.168.12.162:27019"},{_id:2,host:"192.168.12.163:27019"},{_id:3,host:"192.168.12.164:27019"},{_id:4,host:"192.168.12.169:27019"}]})
MONGO_HOME=/home/cloud/platform/mongodb-3.4.5/
${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.5/bin/mongos --config /home/cloud/platform/mongodb-3.4.5/mongosserver.conf
2、启动过程
a、将脚本和配置文件复制到每台机器上
b、启动每个 shardsvr,然后登录到 shardsvr 上,执行初始化过程:
1、执行 start-shardsvr.sh
2、执行 bin/mongo --host ${hostIP} --port ${hostport}
shardsvr 的默认端口是 27018
configsvr 的默认端口是 27019
mongos 的默认端口是 27017
在上面配置文件中未指定端口,一切都以默认为主
3、执行 rs.initiate({_id:"shardsvr1",members:[{_id:0,host:"192.168.12.161:27018"}]})
进行初始化工作
4、执行 rs.status()查看 shardsvr 状态,一个成功的例子如下:
c、启动所有 configsvr,并使用 mongo –host –port 命令登录到任意一台 configsvr 的 configsvr 端口上(default:27019)。并执行初始化工作:
rs.initiate({_id:"configsvr0",configsvr:true,members:[{_id:0,host:"192.168.12.161:27019"},{_id:1,host:"192.168.12.162:27019"},{_id:2,host:"192.168.12.163:27019"},{_id:3,host:"192.168.12.164:27019"},{_id:4,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":1})
第三部分
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
更多 MongoDB 相关教程见以下内容:
MongoDB 文档、集合、数据库简介 http://www.linuxidc.com/Linux/2016-12/138529.htm
MongoDB 3 分片部署及故障模拟验证 http://www.linuxidc.com/Linux/2016-12/138529.htm
Linux CentOS 6.5 yum 安装 MongoDB http://www.linuxidc.com/Linux/2016-12/137790.htm
CentOS 7 yum 方式快速安装 MongoDB http://www.linuxidc.com/Linux/2016-11/137679.htm
MongoDB 的查询操作 http://www.linuxidc.com/Linux/2016-10/136581.htm
在 Azure 虚拟机上快速搭建 MongoDB 集群 http://www.linuxidc.com/Linux/2017-09/146778.htm
MongoDB 复制集原理 http://www.linuxidc.com/Linux/2017-09/146670.htm
MongoDB 3.4 远程连接认证失败 http://www.linuxidc.com/Linux/2017-06/145070.htm
Ubuntu 16.04 中安装 MongoDB3.4 数据库系统 http://www.linuxidc.com/Linux/2017-07/145526.htm
MongoDB 权威指南第 2 版 PDF 完整带书签目录 下载见 http://www.linuxidc.com/Linux/2016-12/138253.htm
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149538.htm