前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB集群配置

MongoDB集群配置

作者头像
拓荒者
发布2019-09-23 15:40:45
1.1K0
发布2019-09-23 15:40:45
举报
文章被收录于专栏:运维经验分享运维经验分享

版权声明:本文为博主原创文章,遵循 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)下载

代码语言:javascript
复制
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.7.tgz

(2)解压

代码语言:javascript
复制
  1. mkdir -p /opt/apps/
  2. tar -zxvf mongodb-linux-x86_64-rhel70-4.0.7.tgz -C /opt/apps/

(3)重命名mongodb-linux-x86_64-rhel70-4.0.7

代码语言:javascript
复制
  1. cd /opt/apps
  2. mv mongodb-linux-x86_64-rhel70-4.0.7.tgz mongodb

(4)配置环境变量

代码语言:javascript
复制
vim /etc/profile

末尾加上

export PATH=$JAVA_HOME/bin:/opt/apps/mongodb/bin:$PATH 

设置马上生效

三、MongoDB副本集集群

副本集中有三种角色:主节点、从节点、仲裁节点。

仲裁节点不存储数据,主从节点都存储数据。

优点: 主如果宕机,仲裁节点会选举从作为新的主 如果副本集中没有仲裁节点,那么集群的主从切换依然可以进行。 缺点: 如果副本集中拥有仲裁节点,那么一旦仲裁节点挂了,集群中就不能进行主从切换了。

(1)架构图

(2)创建目录

存放数据目录

代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs/data/node1
  2. mkdir -p /opt/apps/mongodb/rs/data/node2
  3. mkdir -p /opt/apps/mongodb/rs/data/node3

存放日志目录

代码语言:javascript
复制
mkdir -p /opt/apps/mongodb/rs/logs/

存放配置文件目录

代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs/conf/node1/
  2. mkdir -p /opt/apps/mongodb/rs/conf/node2/
  3. mkdir -p /opt/apps/mongodb/rs/conf/node3/

(3)创建Master配置文件

代码语言:javascript
复制
vim /opt/apps/mongodb/rs/conf/node1/mongodb.cfg

mongodb.cfg内容为

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27001
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=rs001

(4)创建Arbiter配置文件

代码语言:javascript
复制
vim /opt/apps/mongodb/rs/conf/node2/mongodb.cfg

mongodb.cfg内容为

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs/data/node2
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs/logs/node2.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27002
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=rs001

(5)创建Slave配置文件

代码语言:javascript
复制
vim /opt/apps/mongodb/rs/conf/node3/mongodb.cfg

mongodb.cfg内容为

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs/data/node3
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs/logs/node3.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27003
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=rs001

(6)启动所有mongodb

代码语言:javascript
复制
  1. mongod -config /opt/apps/mongodb/rs/conf/node1/mongodb.cfg
  2. mongod -config /opt/apps/mongodb/rs/conf/node2/mongodb.cfg
  3. mongod -config /opt/apps/mongodb/rs/conf/node3/mongodb.cfg

(7)配置主备和仲裁

需要登录到mongodb的客户端进行配置主备和仲裁角色

代码语言:javascript
复制
mongo 172.17.56.175:27001

用admin身份

代码语言:javascript
复制
use admin

执行Master、Arbiter、Slave配置命令

代码语言:javascript
复制
  1. rs.initiate({_id:"rs001",members: [
  2. {_id:0,host:"172.17.56.175:27001",priority:2},
  3. {_id:1,host:"172.17.56.175:27002",priority:1},
  4. {_id:2,host:"172.17.56.175:27003",arbiterOnly:true}
  5. ]});

说明:

  • cfg中的_id的值是【副本集名称】
  • priority:数字越大,优先级越高。优先级最高的会被选举为主库
  • arbiterOnly:true,如果是仲裁节点,必须设置该参数

(8)测试

代码语言:javascript
复制
rs.status()
代码语言:javascript
复制
  1. rs001:PRIMARY> rs.status()
  2. {
  3. "set" : "rs001",
  4. "date" : ISODate("2019-06-30T05:20:18.846Z"),
  5. "myState" : 1,
  6. "term" : NumberLong(2),
  7. "syncingTo" : "",
  8. "syncSourceHost" : "",
  9. "syncSourceId" : -1,
  10. "heartbeatIntervalMillis" : NumberLong(2000),
  11. "optimes" : {
  12. "lastCommittedOpTime" : {
  13. "ts" : Timestamp(1561872010, 1),
  14. "t" : NumberLong(2)
  15. },
  16. "readConcernMajorityOpTime" : {
  17. "ts" : Timestamp(1561872010, 1),
  18. "t" : NumberLong(2)
  19. },
  20. "appliedOpTime" : {
  21. "ts" : Timestamp(1561872010, 1),
  22. "t" : NumberLong(2)
  23. },
  24. "durableOpTime" : {
  25. "ts" : Timestamp(1561872010, 1),
  26. "t" : NumberLong(2)
  27. }
  28. },
  29. "lastStableCheckpointTimestamp" : Timestamp(1561871968, 1),
  30. "members" : [
  31. {
  32. "_id" : 0,
  33. "name" : "172.17.56.175:27001",
  34. "health" : 1,
  35. "state" : 1,
  36. "stateStr" : "PRIMARY",
  37. "uptime" : 351,
  38. "optime" : {
  39. "ts" : Timestamp(1561872010, 1),
  40. "t" : NumberLong(2)
  41. },
  42. "optimeDate" : ISODate("2019-06-30T05:20:10Z"),
  43. "syncingTo" : "",
  44. "syncSourceHost" : "",
  45. "syncSourceId" : -1,
  46. "infoMessage" : "",
  47. "electionTime" : Timestamp(1561871679, 1),
  48. "electionDate" : ISODate("2019-06-30T05:14:39Z"),
  49. "configVersion" : 1,
  50. "self" : true,
  51. "lastHeartbeatMessage" : ""
  52. },
  53. {
  54. "_id" : 1,
  55. "name" : "172.17.56.175:27002",
  56. "health" : 1,
  57. "state" : 2,
  58. "stateStr" : "SECONDARY",
  59. "uptime" : 345,
  60. "optime" : {
  61. "ts" : Timestamp(1561872010, 1),
  62. "t" : NumberLong(2)
  63. },
  64. "optimeDurable" : {
  65. "ts" : Timestamp(1561872010, 1),
  66. "t" : NumberLong(2)
  67. },
  68. "optimeDate" : ISODate("2019-06-30T05:20:10Z"),
  69. "optimeDurableDate" : ISODate("2019-06-30T05:20:10Z"),
  70. "lastHeartbeat" : ISODate("2019-06-30T05:20:17.056Z"),
  71. "lastHeartbeatRecv" : ISODate("2019-06-30T05:20:17.832Z"),
  72. "pingMs" : NumberLong(0),
  73. "lastHeartbeatMessage" : "",
  74. "syncingTo" : "172.17.56.175:27001",
  75. "syncSourceHost" : "172.17.56.175:27001",
  76. "syncSourceId" : 0,
  77. "infoMessage" : "",
  78. "configVersion" : 1
  79. },
  80. {
  81. "_id" : 2,
  82. "name" : "172.17.56.175:27003",
  83. "health" : 1,
  84. "state" : 7,
  85. "stateStr" : "ARBITER",
  86. "uptime" : 340,
  87. "lastHeartbeat" : ISODate("2019-06-30T05:20:17.055Z"),
  88. "lastHeartbeatRecv" : ISODate("2019-06-30T05:20:18.193Z"),
  89. "pingMs" : NumberLong(0),
  90. "lastHeartbeatMessage" : "",
  91. "syncingTo" : "",
  92. "syncSourceHost" : "",
  93. "syncSourceId" : -1,
  94. "infoMessage" : "",
  95. "configVersion" : 1
  96. }
  97. ],
  98. "ok" : 1,
  99. "operationTime" : Timestamp(1561872010, 1),
  100. "$clusterTime" : {
  101. "clusterTime" : Timestamp(1561872010, 1),
  102. "signature" : {
  103. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
  104. "keyId" : NumberLong(0)
  105. }
  106. }
  107. }
  108. 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策略选择

当shard key总是单调递增时hash sharding并不是一个很好的选择,其查询分发基本和broadcast operation一样了,因为hash会把数据比较均匀的分布在各个shard上,但此时选择ranged sharding也有缺点,因为数据过度集中会导致数据集中于某个shard。

在shard key选取不正确的情况下,范围分片会导致数据分布不均匀,也可能遭遇性能瓶颈,因此需要合理的选择ranged shard key。

原理如下:

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

代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs1/shareconf1/data/node1
  2. mkdir -p /opt/apps/mongodb/rs1/shareconf2/data/node1
  3. mkdir -p /opt/apps/mongodb/rs1/shareconf3/data/node1

--Master

代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs1/share1/data/node1
  2. mkdir -p /opt/apps/mongodb/rs1/share1/data/node2
  3. mkdir -p /opt/apps/mongodb/rs1/share1/data/node3

--Slavte

代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs1/share2/data/node1
  2. mkdir -p /opt/apps/mongodb/rs1/share2/data/node2
  3. mkdir -p /opt/apps/mongodb/rs1/share2/data/node3

--Arbiter

代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs1/share3/data/node1
  2. mkdir -p /opt/apps/mongodb/rs1/share3/data/node2
  3. mkdir -p /opt/apps/mongodb/rs1/share3/data/node3
  • 创建日志目录
代码语言:javascript
复制
  1. mkdir -p /opt/apps/mongodb/rs1/share1/logs
  2. mkdir -p /opt/apps/mongodb/rs1/share2/logs
  3. mkdir -p /opt/apps/mongodb/rs1/share3/logs
  4. mkdir -p /opt/apps/mongodb/rs1/shareconf1/logs
  5. mkdir -p /opt/apps/mongodb/rs1/shareconf2/logs
  6. mkdir -p /opt/apps/mongodb/rs1/shareconf3/logs
  7. mkdir -p /opt/apps/mongodb/rs1/routers/logs

(9)创建Config配置

vim /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/shareconf1/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/shareconf1/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=28001
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=config
  16. #指定配置服务器
  17. configsvr=true

vim /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/shareconf2/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/shareconf2/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=28002
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=config
  16. #指定配置服务器
  17. configsvr=true

vim /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/shareconf3/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/shareconf3/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=28003
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=config
  16. #指定配置服务器
  17. configsvr=true

(10)创建Share1配置 vim /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share1/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share1/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27004
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share1
  16. #指定是Shard
  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share1/data/node2
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share1/logs/node2.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27005
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share1
  16. #指定是Shard
  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share1/data/node3
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share1/logs/node3.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27006
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share1
  16. #指定是share
  17. shardsvr=true

(11)创建Share2配置

vim /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share2/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share2/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27007
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share2
  16. #指定是share
  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share2/data/node2
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share2/logs/node2.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27008
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share2
  16. #指定是share
  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share2/data/node3
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share2/logs/node3.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27009
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share2
  16. #指定是share
  17. shardsvr=true

(12)创建Share3配置 vim /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share3/data/node1
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share3/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27011
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share3
  16. #指定是share
  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share3/data/node2
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share3/logs/node2.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27012
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share3
  16. #指定是share
  17. shardsvr=true

vim /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. dbpath=/opt/apps/mongodb/rs1/share3/data/node3
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/share3/logs/node3.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork = true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=27013
  13. #注意:不需要显式的去指定主从,主从是动态选举的
  14. #副本集集群,需要指定一个名称,在一个副本集下,名称是相同的
  15. replSet=share3
  16. #指定是share
  17. shardsvr=true

(13)创建路由配置

vim /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg

代码语言:javascript
复制
  1. #数据库文件位置
  2. configdb=config/172.17.56.175:28001,172.17.56.175:28002,172.17.56.175:28003
  3. #日志文件
  4. logpath=/opt/apps/mongodb/rs1/routers/logs/node1.log
  5. #以追加方式写日志
  6. logappend=true
  7. #是否以守护进程方式启动
  8. fork=true
  9. #绑定ip地址
  10. bind_ip=172.17.56.175
  11. #默认端口27017
  12. port=30000

(14)启动并配置config server

启动所有

代码语言:javascript
复制
  1. mongod -f /opt/apps/mongodb/rs1/conf/shareconf1/mongodb.cfg
  2. mongod -f /opt/apps/mongodb/rs1/conf/shareconf2/mongodb.cfg
  3. mongod -f /opt/apps/mongodb/rs1/conf/shareconf3/mongodb.cfg
  4. mongod -config /opt/apps/mongodb/rs1/conf/node4/mongodb.cfg
  5. mongod -config /opt/apps/mongodb/rs1/conf/node5/mongodb.cfg
  6. mongod -config /opt/apps/mongodb/rs1/conf/node6/mongodb.cfg
  7. mongod -config /opt/apps/mongodb/rs1/conf/node7/mongodb.cfg
  8. mongod -config /opt/apps/mongodb/rs1/conf/node8/mongodb.cfg
  9. mongod -config /opt/apps/mongodb/rs1/conf/node9/mongodb.cfg
  10. mongod -config /opt/apps/mongodb/rs1/conf/node11/mongodb.cfg
  11. mongod -config /opt/apps/mongodb/rs1/conf/node12/mongodb.cfg
  12. mongod -config /opt/apps/mongodb/rs1/conf/node13/mongodb.cfg
  13. mongos -config /opt/apps/mongodb/rs1/conf/routers/mongodb.cfg

客户端连接

代码语言:javascript
复制
mongo 172.17.56.175:28001

配置

使用admin用户

代码语言:javascript
复制
use admin
代码语言:javascript
复制
  1. rs.initiate({_id:"config",members: [
  2. {_id:0,host:"172.17.56.175:28001",priority:2},
  3. {_id:1,host:"172.17.56.175:28002",priority:1},
  4. {_id:2,host:"172.17.56.175:28003",priority:1}
  5. ]})

用rs.status(),显示如下内容证明成功

代码语言:javascript
复制
  1. config:PRIMARY> rs.status()
  2. {
  3. "set" : "config",
  4. "date" : ISODate("2019-06-30T15:59:05.588Z"),
  5. "myState" : 1,
  6. "term" : NumberLong(1),
  7. "syncingTo" : "",
  8. "syncSourceHost" : "",
  9. "syncSourceId" : -1,
  10. "configsvr" : true,
  11. "heartbeatIntervalMillis" : NumberLong(2000),
  12. "optimes" : {
  13. "lastCommittedOpTime" : {
  14. "ts" : Timestamp(1561910326, 3),
  15. "t" : NumberLong(1)
  16. },
  17. "readConcernMajorityOpTime" : {
  18. "ts" : Timestamp(1561910326, 3),
  19. "t" : NumberLong(1)
  20. },
  21. "appliedOpTime" : {
  22. "ts" : Timestamp(1561910326, 3),
  23. "t" : NumberLong(1)
  24. },
  25. "durableOpTime" : {
  26. "ts" : Timestamp(1561910326, 3),
  27. "t" : NumberLong(1)
  28. }
  29. },
  30. "lastStableCheckpointTimestamp" : Timestamp(1561910325, 1),
  31. "members" : [
  32. {
  33. "_id" : 0,
  34. "name" : "172.17.56.175:28001",
  35. "health" : 1,
  36. "state" : 1,
  37. "stateStr" : "PRIMARY",
  38. "uptime" : 1342,
  39. "optime" : {
  40. "ts" : Timestamp(1561910326, 3),
  41. "t" : NumberLong(1)
  42. },
  43. "optimeDate" : ISODate("2019-06-30T15:58:46Z"),
  44. "syncingTo" : "",
  45. "syncSourceHost" : "",
  46. "syncSourceId" : -1,
  47. "infoMessage" : "could not find member to sync from",
  48. "electionTime" : Timestamp(1561910324, 1),
  49. "electionDate" : ISODate("2019-06-30T15:58:44Z"),
  50. "configVersion" : 1,
  51. "self" : true,
  52. "lastHeartbeatMessage" : ""
  53. },
  54. {
  55. "_id" : 1,
  56. "name" : "172.17.56.175:28002",
  57. "health" : 1,
  58. "state" : 2,
  59. "stateStr" : "SECONDARY",
  60. "uptime" : 32,
  61. "optime" : {
  62. "ts" : Timestamp(1561910326, 3),
  63. "t" : NumberLong(1)
  64. },
  65. "optimeDurable" : {
  66. "ts" : Timestamp(1561910326, 3),
  67. "t" : NumberLong(1)
  68. },
  69. "optimeDate" : ISODate("2019-06-30T15:58:46Z"),
  70. "optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"),
  71. "lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"),
  72. "lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"),
  73. "pingMs" : NumberLong(0),
  74. "lastHeartbeatMessage" : "",
  75. "syncingTo" : "172.17.56.175:28001",
  76. "syncSourceHost" : "172.17.56.175:28001",
  77. "syncSourceId" : 0,
  78. "infoMessage" : "",
  79. "configVersion" : 1
  80. },
  81. {
  82. "_id" : 2,
  83. "name" : "172.17.56.175:28003",
  84. "health" : 1,
  85. "state" : 2,
  86. "stateStr" : "SECONDARY",
  87. "uptime" : 32,
  88. "optime" : {
  89. "ts" : Timestamp(1561910326, 3),
  90. "t" : NumberLong(1)
  91. },
  92. "optimeDurable" : {
  93. "ts" : Timestamp(1561910326, 3),
  94. "t" : NumberLong(1)
  95. },
  96. "optimeDate" : ISODate("2019-06-30T15:58:46Z"),
  97. "optimeDurableDate" : ISODate("2019-06-30T15:58:46Z"),
  98. "lastHeartbeat" : ISODate("2019-06-30T15:59:04.297Z"),
  99. "lastHeartbeatRecv" : ISODate("2019-06-30T15:59:04.549Z"),
  100. "pingMs" : NumberLong(0),
  101. "lastHeartbeatMessage" : "",
  102. "syncingTo" : "172.17.56.175:28001",
  103. "syncSourceHost" : "172.17.56.175:28001",
  104. "syncSourceId" : 0,
  105. "infoMessage" : "",
  106. "configVersion" : 1
  107. }
  108. ],
  109. "ok" : 1,
  110. "operationTime" : Timestamp(1561910326, 3),
  111. "$gleStats" : {
  112. "lastOpTime" : Timestamp(1561910313, 1),
  113. "electionId" : ObjectId("7fffffff0000000000000001")
  114. },
  115. "lastCommittedOpTime" : Timestamp(1561910326, 3),
  116. "$clusterTime" : {
  117. "clusterTime" : Timestamp(1561910326, 3),
  118. "signature" : {
  119. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
  120. "keyId" : NumberLong(0)
  121. }
  122. }
  123. }
  124. config:PRIMARY>

(15)配置share1

客户端连接

代码语言:javascript
复制
mongo 172.17.56.175:27004

使用admin用用户

代码语言:javascript
复制
use admin

配置

代码语言:javascript
复制
  1. rs.initiate({_id:"share1",members: [
  2. {_id:0,host:"172.17.56.175:27004",priority:2},
  3. {_id:1,host:"172.17.56.175:27005",priority:1},
  4. {_id:2,host:"172.17.56.175:27006",arbiterOnly:true}
  5. ]})

(16)配置share2

客户端连接

代码语言:javascript
复制
mongo 172.17.56.175:27007

使用admin用用户

代码语言:javascript
复制
use admin

配置

代码语言:javascript
复制
  1. rs.initiate({_id:"share2",members: [
  2. {_id:0,host:"172.17.56.175:27007",priority:2},
  3. {_id:1,host:"172.17.56.175:27008",priority:1},
  4. {_id:2,host:"172.17.56.175:27009",arbiterOnly:true}
  5. ]})

(17)配置share3

客户端连接

代码语言:javascript
复制
mongo 172.17.56.175:27011

使用admin用用户

代码语言:javascript
复制
use admin

配置

代码语言:javascript
复制
  1. rs.initiate({_id:"share3",members: [
  2. {_id:0,host:"172.17.56.175:27011",priority:2},
  3. {_id:1,host:"172.17.56.175:27012",priority:1},
  4. {_id:2,host:"172.17.56.175:27013",arbiterOnly:true}
  5. ]})

(18)至此完成了所有服务器的配置,接下来开始配置具体collection的分片策略

客户端连接路由

代码语言:javascript
复制
mongo 172.17.56.175:30000

使用admin用用户

代码语言:javascript
复制
  1. use admin
  2. sh.addShard("share1/172.17.56.175:27004,172.17.56.175:27005,172.17.56.175:27005");
  3. sh.addShard("share2/172.17.56.175:27007,172.17.56.175:27008,172.17.56.175:27009");
  4. sh.addShard("share3/172.17.56.175:27011,172.17.56.175:27012,172.17.56.175:27013");

然后在mongos上为具体的数据库配置sharding:

代码语言:javascript
复制
sh.enableSharding("test") 

--允许test数据库进行sharding

--对test.t集合以id列为shard key进行hashed sharding

代码语言:javascript
复制
sh.shardCollection("test.t",{id:"hashed"})

通过db.t.getIndexes()可以看到自动为id列创建了索引。

(19)hashed分片验证

代码语言:javascript
复制
  1. mongo 172.17.56.175:30000
  2. use test
代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、下载
  • 三、MongoDB副本集集群
  • 四、MongoDB混合方式集群
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档