MongoDB集群配置
2019年06月30日 13:21:05 2014Team 阅读数 77更多
分类专栏: MongoDB
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012965203/article/details/94307690
一、简介
官网地址:https://www.mongodb.com/
MongoDB 是一个基于【分布式文件存储】的数据库,它属于NoSQL数据库。由 C++ 语言编写。旨在为 WEB 应用提
供【可扩展】的【高性能】数据存储解决方案。
MongoDB是一个介于非系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它
支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部
分功能,而且还支持对数据建立索引。
二、下载
(1)下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.7.tgz
![]()
(2)解压
-
mkdir -p /opt/apps/ -
tar -zxvf mongodb-linux-x86_64-rhel70-4.0.7.tgz -C /opt/apps/
(3)重命名mongodb-linux-x86_64-rhel70-4.0.7
-
cd /opt/apps -
mv mongodb-linux-x86_64-rhel70-4.0.7.tgz mongodb
![]()
(4)配置环境变量
vim /etc/profile
末尾加上
export PATH=$JAVA_HOME/bin:/opt/apps/mongodb/bin:$PATH
设置马上生效
![]()
三、MongoDB副本集集群
副本集中有三种角色:主节点、从节点、仲裁节点。
仲裁节点不存储数据,主从节点都存储数据。
优点:
主如果宕机,仲裁节点会选举从作为新的主
如果副本集中没有仲裁节点,那么集群的主从切换依然可以进行。
缺点:
如果副本集中拥有仲裁节点,那么一旦仲裁节点挂了,集群中就不能进行主从切换了。
(1)架构图

(2)创建目录
存放数据目录
-
mkdir -p /opt/apps/mongodb/rs/data/node1 -
mkdir -p /opt/apps/mongodb/rs/data/node2 -
mkdir -p /opt/apps/mongodb/rs/data/node3
存放日志目录
mkdir -p /opt/apps/mongodb/rs/logs/
存放配置文件目录
-
mkdir -p /opt/apps/mongodb/rs/conf/node1/ -
mkdir -p /opt/apps/mongodb/rs/conf/node2/ -
mkdir -p /opt/apps/mongodb/rs/conf/node3/
(3)创建Master配置文件
vim /opt/apps/mongodb/rs/conf/node1/mongodb.cfg
mongodb.cfg内容为
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27001 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=rs001
(4)创建Arbiter配置文件
vim /opt/apps/mongodb/rs/conf/node2/mongodb.cfg
mongodb.cfg内容为
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs/data/node2 -
#日志文件 -
logpath=/opt/apps/mongodb/rs/logs/node2.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27002 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=rs001
(5)创建Slave配置文件
vim /opt/apps/mongodb/rs/conf/node3/mongodb.cfg
mongodb.cfg内容为
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs/data/node3 -
#日志文件 -
logpath=/opt/apps/mongodb/rs/logs/node3.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27003 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=rs001
(6)启动所有mongodb
-
mongod -config /opt/apps/mongodb/rs/conf/node1/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs/conf/node2/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs/conf/node3/mongodb.cfg

(7)配置主备和仲裁
需要登录到mongodb的客户端进行配置主备和仲裁角色
mongo 172.17.56.175:27001
用admin身份
use admin

执行Master、Arbiter、Slave配置命令
-
rs.initiate({_id:"rs001",members: [ -
{_id:0,host:"172.17.56.175:27001",priority:2}, -
{_id:1,host:"172.17.56.175:27002",priority:1}, -
{_id:2,host:"172.17.56.175:27003",arbiterOnly:true} -
]});
说明:
- cfg中的_id的值是【副本集名称】
- priority:数字越大,优先级越高。优先级最高的会被选举为主库
- arbiterOnly:true,如果是仲裁节点,必须设置该参数
(8)测试
rs.status()
-
rs001:PRIMARY> rs.status() -
{ -
"set" : "rs001", -
"date" : ISODate("2019-06-30T05:20:18.846Z"), -
"myState" : 1, -
"term" : NumberLong(2), -
"syncingTo" : "", -
"syncSourceHost" : "", -
"syncSourceId" : -1, -
"heartbeatIntervalMillis" : NumberLong(2000), -
"optimes" : { -
"lastCommittedOpTime" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
}, -
"readConcernMajorityOpTime" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
}, -
"appliedOpTime" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
}, -
"durableOpTime" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
} -
}, -
"lastStableCheckpointTimestamp" : Timestamp(1561871968, 1), -
"members" : [ -
{ -
"_id" : 0, -
"name" : "172.17.56.175:27001", -
"health" : 1, -
"state" : 1, -
"stateStr" : "PRIMARY", -
"uptime" : 351, -
"optime" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
}, -
"optimeDate" : ISODate("2019-06-30T05:20:10Z"), -
"syncingTo" : "", -
"syncSourceHost" : "", -
"syncSourceId" : -1, -
"infoMessage" : "", -
"electionTime" : Timestamp(1561871679, 1), -
"electionDate" : ISODate("2019-06-30T05:14:39Z"), -
"configVersion" : 1, -
"self" : true, -
"lastHeartbeatMessage" : "" -
}, -
{ -
"_id" : 1, -
"name" : "172.17.56.175:27002", -
"health" : 1, -
"state" : 2, -
"stateStr" : "SECONDARY", -
"uptime" : 345, -
"optime" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
}, -
"optimeDurable" : { -
"ts" : Timestamp(1561872010, 1), -
"t" : NumberLong(2) -
}, -
"optimeDate" : ISODate("2019-06-30T05:20:10Z"), -
"optimeDurableDate" : ISODate("2019-06-30T05:20:10Z"), -
"lastHeartbeat" : ISODate("2019-06-30T05:20:17.056Z"), -
"lastHeartbeatRecv" : ISODate("2019-06-30T05:20:17.832Z"), -
"pingMs" : NumberLong(0), -
"lastHeartbeatMessage" : "", -
"syncingTo" : "172.17.56.175:27001", -
"syncSourceHost" : "172.17.56.175:27001", -
"syncSourceId" : 0, -
"infoMessage" : "", -
"configVersion" : 1 -
}, -
{ -
"_id" : 2, -
"name" : "172.17.56.175:27003", -
"health" : 1, -
"state" : 7, -
"stateStr" : "ARBITER", -
"uptime" : 340, -
"lastHeartbeat" : ISODate("2019-06-30T05:20:17.055Z"), -
"lastHeartbeatRecv" : ISODate("2019-06-30T05:20:18.193Z"), -
"pingMs" : NumberLong(0), -
"lastHeartbeatMessage" : "", -
"syncingTo" : "", -
"syncSourceHost" : "", -
"syncSourceId" : -1, -
"infoMessage" : "", -
"configVersion" : 1 -
} -
], -
"ok" : 1, -
"operationTime" : Timestamp(1561872010, 1), -
"$clusterTime" : { -
"clusterTime" : Timestamp(1561872010, 1), -
"signature" : { -
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), -
"keyId" : NumberLong(0) -
} -
} -
} -
rs001:PRIMARY>
四、MongoDB混合方式集群
(1)Sharding集群简介

MongoDB分片群集包含以下组件:
- 数据分片(Shards):每个分片包含分片数据的子集。每个分片都可以部署为副本集。启动服务使用mongo脚本命令
- 查询路由(Query Routers):
mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口。启动服务使用mongod脚本命令 - 配置服务器(Config servers):配置服务器存储群集的元数据和配置设置。从MongoDB 3.2开始,配置服务器可以部署为副本集,config server的rs不能有arbiter。启动服务使用mongos脚本命令。
各节点都需要自定义mongodb.cfg文件,因为在一台机器配置,安装一次mongodb,配置7份配置文件即可。
Mongod中的Replica set1与Replica set Replica set2 (副文本集),Replica set 与Replica set1内容是不一样的,所以可以无限扩容。
Mongod副文本集中的副本内容是一样,除仲裁节点。
Cluster由多个Replica set组成,Replica set由多个数据节点组成,每个数据节点有多少chunk(块)组成。
(2)分片键:Shard keys
- shard key在sharding搭建完毕后是不能修改的,一个collection上只能有一个shard key。
- shard key上必须有索引(可以是以shard key开头的联合索引),如果没有mongodb会为shard key创建索引。如果是已经存在的collection那么必须手动为shard key创建索引。
- 在sharding的collection中只有_id和shard key前缀的索引可以是unique index,其他索引只能是普通索引。如果一个普通key上有unique index那么你不能以其他key为shard key对collection进行sharding。
- shard key的选择将会影响整个集群的效率,可扩展性和性能。而且也会影响你所能选择的分片策略。
关于shard key详见:https://docs.mongodb.com/v3.2/core/sharding-shard-key/
分片范围是[shard_key_value_m,shard_key_value_n),MongoDB把每个分片叫做一个shard,一部分shard key的集合叫做chunk,一个shard上可以有多个chunk也可以只有一个chunk,一般会有多个
(3)Sharding的优势
- 读写方面:
sharding将读写负载均匀到各个shard,且workload上限可以通过水平扩展来增加。
- 扩容方面:
每个shard保存一部分数据,可以通过增加shards来扩容。
- 高可用方面:
即便某个shard不可用了,整个集群也可以对外提供服务,只不过访问down掉的shard会报"Connection refused"的错误。而且MongoDB3.2以后可以为每个shard都配置副本集(replica set),这样保证最大程度的高可用性。
(4)Sharding的劣势
数据量较少时不建议使用sharding,毕竟读写都要经过一层路由会有性能损耗,直接表现就是ips和qps会降低。
(5)使用Sharding前需要考虑的一些事情
- sharding集群不支持一些常规的单实例方法,如group(),可以使用mapReduce()或者aggregate()中的group来替代,因此建议从一开始学习就直接使用aggregate(),这种写法较为简单明了,且统一化易于识别。
- 对于没有用到shard key的查询,路由进行全集群广播(broadcast operation),对每个shard都查一遍进行scatter/gather,此时效率会很低。
- 生产上使用副本集或sharding时,要考虑到安全认证的问题,除了开启对外的auth账户认证外,集群节点间最好指定keyfile启动,这样可以防止陌生节点随意加入集群。
(6)Sharding策略选择
- hash sharding:https://docs.mongodb.com/v3.2/core/hashed-sharding/
当shard key总是单调递增时hash sharding并不是一个很好的选择,其查询分发基本和broadcast operation一样了,因为hash会把数据比较均匀的分布在各个shard上,但此时选择ranged sharding也有缺点,因为数据过度集中会导致数据集中于某个shard。
- ranged sharding:https://docs.mongodb.com/v3.2/core/ranged-sharding/
在shard key选取不正确的情况下,范围分片会导致数据分布不均匀,也可能遭遇性能瓶颈,因此需要合理的选择ranged shard key。
- Tag aware sharding:https://docs.mongodb.com/v3.2/core/tag-aware-sharding/
原理如下:
sh.addShardTag() 给shard设置标签A
sh.addTagRange() 给集合的某个chunk范围设置标签A,最终MongoDB会保证设置标签 A 的chunk范围(或该范围的超集)分布设置了标签 A 的 shard 上。
Tag aware sharding可应用在如下场景:
将部署在不同机房的shard设置机房标签,将不同chunk范围的数据分布到指定的机房
将服务能力不通的shard设置服务等级标签,将更多的chunk分散到服务能力更强的shard上去
使用 Tag aware sharding 需要注意是,chunk分配到对应标签的shard上不是立即完成,而是在不断insert、update后触发split、moveChunk后逐步完成的,并且需要保证balancer是开启的。所以你可能会观察到,在设置了tag range后一段时间后,写入仍然没有分布到tag相同的shard上去
(7)搭建设计
| config server配置服务器 | ||
| 172.17.56.175:28001 | 172.17.56.175:28002 | 172.17.56.175:28003 |
| mongos路由 | ||
| 172.17.56.175:30000 | ||
| Shards数据分片master | ||
| 172.17.56.175:27004 | 172.17.56.175:27007 | 172.17.56.175:27011 |
| Shards数据分片Slave | ||
| 172.17.56.175:27005 | 172.17.56.175:27008 | 172.17.56.175:27012 |
| Shards数据分片arbiter | ||
| 172.17.56.175:27006 | 172.17.56.175:27009 | 172.17.56.175:27013 |

(8)创建目录
- 创建数据目录
--Config
-
mkdir -p /opt/apps/mongodb/rs1/shareconf1/data/node1 -
mkdir -p /opt/apps/mongodb/rs1/shareconf2/data/node1 -
mkdir -p /opt/apps/mongodb/rs1/shareconf3/data/node1
--Master
-
mkdir -p /opt/apps/mongodb/rs1/share1/data/node1 -
mkdir -p /opt/apps/mongodb/rs1/share1/data/node2 -
mkdir -p /opt/apps/mongodb/rs1/share1/data/node3
--Slavte
-
mkdir -p /opt/apps/mongodb/rs1/share2/data/node1 -
mkdir -p /opt/apps/mongodb/rs1/share2/data/node2 -
mkdir -p /opt/apps/mongodb/rs1/share2/data/node3
--Arbiter
-
mkdir -p /opt/apps/mongodb/rs1/share3/data/node1 -
mkdir -p /opt/apps/mongodb/rs1/share3/data/node2 -
mkdir -p /opt/apps/mongodb/rs1/share3/data/node3
- 创建日志目录
-
mkdir -p /opt/apps/mongodb/rs1/share1/logs -
mkdir -p /opt/apps/mongodb/rs1/share2/logs -
mkdir -p /opt/apps/mongodb/rs1/share3/logs -
mkdir -p /opt/apps/mongodb/rs1/shareconf1/logs -
mkdir -p /opt/apps/mongodb/rs1/shareconf2/logs -
mkdir -p /opt/apps/mongodb/rs1/shareconf3/logs -
mkdir -p /opt/apps/mongodb/rs1/routers/logs
(9)创建Config配置
vim /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/shareconf1/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/shareconf1/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=28001 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=config -
#指定配置服务器 -
configsvr=true
vim /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/shareconf2/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/shareconf2/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=28002 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=config -
#指定配置服务器 -
configsvr=true
vim /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/shareconf3/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/shareconf3/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=28003 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=config -
#指定配置服务器 -
configsvr=true
(10)创建Share1配置
vim /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share1/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share1/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27004 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share1 -
#指定是Shard -
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share1/data/node2 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share1/logs/node2.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27005 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share1 -
#指定是Shard -
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share1/data/node3 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share1/logs/node3.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27006 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share1 -
#指定是share -
shardsvr=true
(11)创建Share2配置
vim /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share2/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share2/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27007 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share2 -
#指定是share -
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share2/data/node2 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share2/logs/node2.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27008 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share2 -
#指定是share -
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share2/data/node3 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share2/logs/node3.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27009 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share2 -
#指定是share -
shardsvr=true
(12)创建Share3配置
vim /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share3/data/node1 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share3/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27011 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share3 -
#指定是share -
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share3/data/node2 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share3/logs/node2.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27012 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share3 -
#指定是share -
shardsvr=true
vim /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg
-
#数据库文件位置 -
dbpath=/opt/apps/mongodb/rs1/share3/data/node3 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/share3/logs/node3.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork = true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=27013 -
#注意:不需要显式的去指定主从,主从是动态选举的 -
#副本集集群,需要指定一个名称,在一个副本集下,名称是相同的 -
replSet=share3 -
#指定是share -
shardsvr=true
(13)创建路由配置
vim /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg
-
#数据库文件位置 -
configdb=config/172.17.56.175:28001,172.17.56.175:28002,172.17.56.175:28003 -
#日志文件 -
logpath=/opt/apps/mongodb/rs1/routers/logs/node1.log -
#以追加方式写日志 -
logappend=true -
#是否以守护进程方式启动 -
fork=true -
#绑定ip地址 -
bind_ip=172.17.56.175 -
#默认端口27017 -
port=30000
(14)启动并配置config server
启动所有
-
mongod -f /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg -
mongod -f /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg -
mongod -f /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg -
mongod -config /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg -
mongos -config /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg
客户端连接
mongo 172.17.56.175:28001
配置
使用admin用户
use admin
-
rs.initiate({_id:"config",members: [ -
{_id:0,host:"172.17.56.175:28001",priority:2}, -
{_id:1,host:"172.17.56.175:28002",priority:1}, -
{_id:2,host:"172.17.56.175:28003",priority:1} -
]})
用rs.status(),显示如下内容证明成功
-
config:PRIMARY> rs.status() -
{ -
"set" : "config", -
"date" : ISODate("2019-06-30T15:59:05.588Z"), -
"myState" : 1, -
"term" : NumberLong(1), -
"syncingTo" : "", -
"syncSourceHost" : "", -
"syncSourceId" : -1, -
"configsvr" : true, -
"heartbeatIntervalMillis" : NumberLong(2000), -
"optimes" : { -
"lastCommittedOpTime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"readConcernMajorityOpTime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"appliedOpTime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"durableOpTime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
} -
}, -
"lastStableCheckpointTimestamp" : Timestamp(1561910325, 1), -
"members" : [ -
{ -
"_id" : 0, -
"name" : "172.17.56.175:28001", -
"health" : 1, -
"state" : 1, -
"stateStr" : "PRIMARY", -
"uptime" : 1342, -
"optime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"optimeDate" : ISODate("2019-06-30T15:58:46Z"), -
"syncingTo" : "", -
"syncSourceHost" : "", -
"syncSourceId" : -1, -
"infoMessage" : "could not find member to sync from", -
"electionTime" : Timestamp(1561910324, 1), -
"electionDate" : ISODate("2019-06-30T15:58:44Z"), -
"configVersion" : 1, -
"self" : true, -
"lastHeartbeatMessage" : "" -
}, -
{ -
"_id" : 1, -
"name" : "172.17.56.175:28002", -
"health" : 1, -
"state" : 2, -
"stateStr" : "SECONDARY", -
"uptime" : 32, -
"optime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"optimeDurable" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"optimeDate" : ISODate("2019-06-30T15:58:46Z"), -
"optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"), -
"lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"), -
"lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"), -
"pingMs" : NumberLong(0), -
"lastHeartbeatMessage" : "", -
"syncingTo" : "172.17.56.175:28001", -
"syncSourceHost" : "172.17.56.175:28001", -
"syncSourceId" : 0, -
"infoMessage" : "", -
"configVersion" : 1 -
}, -
{ -
"_id" : 2, -
"name" : "172.17.56.175:28003", -
"health" : 1, -
"state" : 2, -
"stateStr" : "SECONDARY", -
"uptime" : 32, -
"optime" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"optimeDurable" : { -
"ts" : Timestamp(1561910326, 3), -
"t" : NumberLong(1) -
}, -
"optimeDate" : ISODate("2019-06-30T15:58:46Z"), -
"optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"), -
"lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"), -
"lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"), -
"pingMs" : NumberLong(0), -
"lastHeartbeatMessage" : "", -
"syncingTo" : "172.17.56.175:28001", -
"syncSourceHost" : "172.17.56.175:28001", -
"syncSourceId" : 0, -
"infoMessage" : "", -
"configVersion" : 1 -
} -
], -
"ok" : 1, -
"operationTime" : Timestamp(1561910326, 3), -
"$gleStats" : { -
"lastOpTime" : Timestamp(1561910313, 1), -
"electionId" : ObjectId("7fffffff0000000000000001") -
}, -
"lastCommittedOpTime" : Timestamp(1561910326, 3), -
"$clusterTime" : { -
"clusterTime" : Timestamp(1561910326, 3), -
"signature" : { -
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), -
"keyId" : NumberLong(0) -
} -
} -
} -
config:PRIMARY>
(15)配置share1
客户端连接
mongo 172.17.56.175:27004
使用admin用用户
use admin
配置
-
rs.initiate({_id:"share1",members: [ -
{_id:0,host:"172.17.56.175:27004",priority:2}, -
{_id:1,host:"172.17.56.175:27005",priority:1}, -
{_id:2,host:"172.17.56.175:27006",arbiterOnly:true} -
]})
(16)配置share2
客户端连接
mongo 172.17.56.175:27007
使用admin用用户
use admin
配置
-
rs.initiate({_id:"share2",members: [ -
{_id:0,host:"172.17.56.175:27007",priority:2}, -
{_id:1,host:"172.17.56.175:27008",priority:1}, -
{_id:2,host:"172.17.56.175:27009",arbiterOnly:true} -
]})
(17)配置share3
客户端连接
mongo 172.17.56.175:27011
使用admin用用户
use admin
配置
-
rs.initiate({_id:"share3",members: [ -
{_id:0,host:"172.17.56.175:27011",priority:2}, -
{_id:1,host:"172.17.56.175:27012",priority:1}, -
{_id:2,host:"172.17.56.175:27013",arbiterOnly:true} -
]})
(18)至此完成了所有服务器的配置,接下来开始配置具体collection的分片策略
客户端连接路由
mongo 172.17.56.175:30000
使用admin用用户
-
use admin -
sh.addShard("share1/172.17.56.175:27004,172.17.56.175:27005,172.17.56.175:27005"); -
sh.addShard("share2/172.17.56.175:27007,172.17.56.175:27008,172.17.56.175:27009"); -
sh.addShard("share3/172.17.56.175:27011,172.17.56.175:27012,172.17.56.175:27013");
然后在mongos上为具体的数据库配置sharding:
sh.enableSharding("test")
--允许test数据库进行sharding
--对test.t集合以id列为shard key进行hashed sharding
sh.shardCollection("test.t",{id:"hashed"})
通过db.t.getIndexes()可以看到自动为id列创建了索引。
(19)hashed分片验证
-
mongo 172.17.56.175:30000 -
use test
for (i=1;i<=1000;i++) {db.t.insert({id:i,name:"Leo"})}
在3个shard的primary上使用db.t.find().count()会发现1000条数据近似均匀的分布到了3个shard上。
使用db.t.stats()查看分片结果,使用sh.status()查看本库内所有集合的分片信息
推荐文章:https://www.cnblogs.com/leohahah/p/8652572.html

