一 前期准备

1.1 组件说明

MongoDB分片群集包含以下组件:
shard:每个分片是分片数据的子集。从MongoDB 3.6开始,必须将分片部署为副本集。
mongos:mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口。
config servers:配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)。
注意:mongos不需创建复制集,config不需指定主副节点及仲裁节点,但是要创建复制集。

1.2 组件规划

本实验基于生产环境考虑,组件规划如下:
将Config Server部署为3成员副本集;
将每个Shard部署为3成员副本集,总共部署三个shard;
部署两个mongos路由器。
提示:部署多个mongos路由器支持高可用性和可伸缩性。常见的模式是mongos在每个应用程序服务器上放置一个,可以减少应用程序和路由器之间的网络延迟。
也可以将mongos路由器放在专用主机上,通过用于大型规模部署。因为它将客户端应用程序服务器的数量与mongos实例数量分离。这样可以更好地控制mongod实例所服务的连接数。
注意:mongos路由器部署的数量没有限制。但是,由于mongos路由器经常与Config Server通信,因此在增加路由器数量时会密切监视配置服务器性能。如果发现性能下降,那么可以适当限制mongos路由器部署的数量。
MongoDB角色
服务器一
mongo01
服务器二
mongo02
服务器三
mongo03
服务器四
mongo04
服务器五
mongo05
mongos
     
172.24.8.74:27017
172.24.8.75:27017
config server
172.24.8.71:20001
主节点
172.24.8.72:20001
副节点
172.24.8.73:20001
仲裁节点
   
shard server 1
172.24.8.71:20002
主节点
172.24.8.72:20002
副节点
172.24.8.73:20002
仲裁节点
   
shard server 2
172.24.8.71:20003
仲裁节点
172.24.8.72:20003
主节点
172.24.8.73:20003
副节点
   
shard server 3
172.24.8.71:20004
副节点
172.24.8.72:20004
仲裁节点
172.24.8.73:20004
主节点
   
提示:为保证高可用,任何一台物理服务器不应该存在多个主。

1.3 其他准备

NTP同步;
关闭SELinux;
关闭防火墙或放通相应规则;
添加如下解析至所有节点:
 [root@localhost ~]# vi /etc/hosts		#追加如下解析
172.24.8.71 mongo01
172.24.8.72 mongo02
172.24.8.73 mongo03
172.24.8.74 mongo04
172.24.8.75 mongo05
 

二 MongoDB安装

2.1 下载tar包

 [root@mongo01 ~]# yum -y install libcurl openssl			#安装依赖包
[root@mongo01 ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.9.tgz
 

2.2 解压MongoDB包

 [root@mongo01 ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.0.9.tgz
[root@mongo01 ~]# mv mongodb-linux-x86_64-rhel70-4.0.9 /usr/local/mongodb
[root@mongo01 ~]# useradd mongod -s /bin/false -c mongod
[root@mongo01 ~]# chown -R mongod:mongod /usr/local/mongodb/
 

2.3 添加PATH路径

 [root@mongo01 ~]# echo "export PATH=/usr/local/mongodb/bin::$PATH" >> .bashrc
提示:2.1——2.3需要在所有节点进行操作。

2.4 配置key

 [root@mongo01 ~]# mkdir -p /etc/mongo
[root@mongo01 ~]# openssl rand -base64 100 > /etc/mongo/mongo.key
[root@mongo01 ~]# chown -R mongod:mongod /etc/mongo
[root@mongo01 ~]# chmod 600 /etc/mongo/mongo.key
[root@mongo01 ~]# scp -r /etc/mongo root@mongo02:/etc/
[root@mongo01 ~]# scp -r /etc/mongo root@mongo03:/etc/
[root@mongo01 ~]# scp -r /etc/mongo root@mongo04:/etc/
[root@mongo01 ~]# scp -r /etc/mongo root@mongo05:/etc/
[root@mongo02 ~]# chown -R mongod:mongod /etc/mongo
[root@mongo03 ~]# chown -R mongod:mongod /etc/mongo
[root@mongo04 ~]# chown -R mongod:mongod /etc/mongo
[root@mongo05 ~]# chown -R mongod:mongod /etc/mongo
 

2.5 创建MongoDB相关目录

 [root@mongo01 ~]# mkdir -p /var/log/mongodb		#日志目录
[root@mongo01 ~]# mkdir -p /var/run/mongodb #pid目录
[root@mongo01 ~]# mkdir -p /var/lib/mongodb/config #config server存储目录
[root@mongo01 ~]# mkdir -p /var/lib/mongodb/shard{1,2,3} #shard server存储目录
[root@mongo01 ~]# chown -R mongod:mongod /var/log/mongodb
[root@mongo01 ~]# chown -R mongod:mongod /var/run/mongodb
[root@mongo01 ~]# chown -R mongod:mongod /var/lib/mongodb
 
注意:通过下载tar包形式安装,未创建默认的MongoDB目录及用户,需要如上所示手动创建并授权即可。
以上操作需要在mongo01、mongo02、mongo03,即所有config server节点操作。

三 配置config server

3.1 服务器一配置

 [root@mongo01 ~]# cat << EOF > /etc/mongo/config.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/config.log storage:
dbPath: /var/lib/mongodb/config
journal:
enabled: true
wiredTiger:
engineConfig:
directoryForIndexes: true processManagement:
fork: true
pidFilePath: /var/run/mongodb/config.pid
timeZoneInfo: /usr/share/zoneinfo net:
port: 20001
bindIp: 0.0.0.0
maxIncomingConnections: 500 security:
keyFile: /etc/mongo/mongo.key
authorization: enabled replication:
replSetName: configs sharding:
clusterRole: configsvr
EOF
[root@mongo01 ~]# scp -r /etc/mongo/config.conf root@mongo02:/etc/mongo/config.conf
[root@mongo01 ~]# scp -r /etc/mongo/config.conf root@mongo03:/etc/mongo/config.conf
 

3.2 启动mongod

 [root@mongo01 ~]# mongod --config /etc/mongo/config.conf
[root@mongo02 ~]# mongod --config /etc/mongo/config.conf
[root@mongo03 ~]# mongod --config /etc/mongo/config.conf
 

3.3 初始化configsrv副本集群

 [root@mongodb01 ~]# mongo --port 20001
> config = { _id: "configs", members: [
{_id: 0, host: "172.24.8.71:20001"},
{_id: 1, host: "172.24.8.72:20001"},
{_id: 2, host: "172.24.8.73:20001"}]
}
 
参数解释:
"_id": 副本集的名称
"members": 副本集的服务器列表
"_id": 服务器的唯一ID
"host": 服务器主机
"priority": 是优先级,默认为1,优先级0为被动节点,不能成为活跃节点。优先级不为0则按照有大到小选出活跃节点。
"arbiterOnly": 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。

3.4 初始化副本集

 > rs.initiate(config)			#初始化集群
my_rep1:PRIMARY> rs.status() #查看集群状态
 

四 配置shard server 1

4.1 服务器一配置

 [root@mongo01 ~]# cat << EOF > /etc/mongo/shard1.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/shard1.log storage:
dbPath: /var/lib/mongodb/shard1
journal:
enabled: true
wiredTiger:
engineConfig:
directoryForIndexes: true processManagement:
fork: true
pidFilePath: /var/run/mongodb/shard1.pid
timeZoneInfo: /usr/share/zoneinfo net:
port: 20002
bindIp: 0.0.0.0
maxIncomingConnections: 500 security:
keyFile: /etc/mongo/mongo.key
authorization: enabled replication:
replSetName: shard1 sharding:
clusterRole: shardsvr
EOF
[root@mongo01 ~]# scp -r /etc/mongo/shard1.conf root@mongo02:/etc/mongo/shard1.conf
[root@mongo01 ~]# scp -r /etc/mongo/shard1.conf root@mongo03:/etc/mongo/shard1.conf
 

4.2 启动mongod

 [root@mongo01 ~]# mongod --config /etc/mongo/shard1.conf
[root@mongo02 ~]# mongod --config /etc/mongo/shard1.conf
[root@mongo03 ~]# mongod --config /etc/mongo/shard1.conf
 

4.3 初始化configsrv副本集群

 [root@mongodb01 ~]# mongo --port 20002
> config = { _id: "shard1", members: [
{_id: 0, host: "172.24.8.71:20002",priority:2},
{_id: 1, host: "172.24.8.72:20002",priority:1},
{_id: 2, host: "172.24.8.73:20002",arbiterOnly:true}]
}
 

4.4 初始化副本集

 > rs.initiate(config)			#初始化集群
my_rep1:PRIMARY> rs.status() #查看集群状态
 

五 配置shard server 2

5.1 服务器一配置

 [root@mongo01 ~]# cat << EOF > /etc/mongo/shard2.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/shard2.log storage:
dbPath: /var/lib/mongodb/shard2
journal:
enabled: true
wiredTiger:
engineConfig:
directoryForIndexes: true processManagement:
fork: true
pidFilePath: /var/run/mongodb/shard2.pid
timeZoneInfo: /usr/share/zoneinfo net:
port: 20003
bindIp: 0.0.0.0
maxIncomingConnections: 500 security:
keyFile: /etc/mongo/mongo.key
authorization: enabled replication:
replSetName: shard2 sharding:
clusterRole: shardsvr
EOF
[root@mongo01 ~]# scp -r /etc/mongo/shard2.conf root@mongo02:/etc/mongo/shard2.conf
[root@mongo01 ~]# scp -r /etc/mongo/shard2.conf root@mongo03:/etc/mongo/shard2.conf
 

5.2 启动mongod

 [root@mongo01 ~]# mongod --config /etc/mongo/shard2.conf
[root@mongo02 ~]# mongod --config /etc/mongo/shard2.conf
[root@mongo03 ~]# mongod --config /etc/mongo/shard2.conf
 

5.3 初始化configsrv副本集群

 [root@mongodb02 ~]# mongo --port 20003
> config = { _id: "shard2", members: [
{_id: 0, host: "172.24.8.71:20003",arbiterOnly:true},
{_id: 1, host: "172.24.8.72:20003",priority:2},
{_id: 2, host: "172.24.8.73:20003",priority:1}]
}
 
提示:如果选择在预先规划为仲裁节点的服务器上创建复制集会报错,需要在非仲裁节点创建。
5.4 初始化副本集
 > rs.initiate(config)			#初始化集群
my_rep1:PRIMARY> rs.status() #查看集群状态
 

六 配置shard server 3

6.1 服务器一配置

 [root@mongo01 ~]# cat << EOF > /etc/mongo/shard3.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/shard3.log storage:
dbPath: /var/lib/mongodb/shard3
journal:
enabled: true
wiredTiger:
engineConfig:
directoryForIndexes: true processManagement:
fork: true
pidFilePath: /var/run/mongodb/shard3.pid
timeZoneInfo: /usr/share/zoneinfo net:
port: 20004
bindIp: 0.0.0.0
maxIncomingConnections: 500 security:
keyFile: /etc/mongo/mongo.key
authorization: enabled replication:
replSetName: shard3 sharding:
clusterRole: shardsvr
EOF
[root@mongo01 ~]# scp -r /etc/mongo/shard3.conf root@mongo02:/etc/mongo/shard3.conf
[root@mongo01 ~]# scp -r /etc/mongo/shard3.conf root@mongo03:/etc/mongo/shard3.conf
 

6.2 启动mongod

 [root@mongo01 ~]# mongod --config /etc/mongo/shard3.conf
[root@mongo02 ~]# mongod --config /etc/mongo/shard3.conf
[root@mongo03 ~]# mongod --config /etc/mongo/shard3.conf
 

6.3 初始化configsrv副本集群

 [root@mongodb01 ~]# mongo --port 20004
> config = { _id: "shard3", members: [
{_id: 0, host: "172.24.8.71:20004",priority:1},
{_id: 1, host: "172.24.8.72:20004",arbiterOnly:true},
{_id: 2, host: "172.24.8.73:20004",priority:2}]
}
 
提示:如果选择在预先规划为仲裁节点的服务器上创建复制集会报错,需要在非仲裁节点创建。

6.4 初始化副本集

 > rs.initiate(config)			#初始化集群
my_rep1:PRIMARY> rs.status() #查看集群状态
 

七 配置mongos路由节点

7.1 创建MongoDB相关目录

 [root@mongo04 ~]# mkdir -p /var/log/mongodb		#日志目录
[root@mongo04 ~]# mkdir -p /var/run/mongodb #pid目录
[root@mongo04 ~]# chown -R mongod:mongod /var/log/mongodb
[root@mongo04 ~]# chown -R mongod:mongod /var/run/mongodb
 
注意:通过下载tar包形式安装,未创建默认的MongoDB目录及用户,需要如上所示手动创建并授权即可。
以上操作需要在mongo04、mongo05即所有mongos server节点操作。

7.2 服务器四配置

 [root@mongo04 ~]# cat << EOF > /etc/mongo/mongos.conf
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongos.log processManagement:
fork: true
pidFilePath: /var/run/mongodb/mongos.pid
timeZoneInfo: /usr/share/zoneinfo net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 2000 security:
keyFile: /etc/mongo/mongo.key
# authorization: enabled sharding:
configDB: configs/172.24.8.71:20001,172.24.8.72:20001,172.24.8.73:20001
EOF
[root@mongo04 ~]# scp -r /etc/mongo/mongos.conf root@mongo05:/etc/mongo/mongos.conf
 

7.3 启动mongos

 [root@mongo04 ~]# mongos --config /etc/mongo/mongos.conf
[root@mongo05 ~]# mongos --config /etc/mongo/mongos.conf
 

7.4 创建管理员用户

 [root@mongodb04 ~]# mongo --port 27017
mongos> use admin #进入admin数据库
mongos> db.createUser({ user: "admin", pwd: "admin", roles: [{ role: "_system", db: "admin" }] })
mongos> db.createUser({"user":"root","pwd":"root","roles":["root"]})
mongos> db.auth("admin", "admin") #验证创建结果
1
 
提示:以上为建议项,建议创建一个管理员用于内部管理MongoDB。
mongodb中的用户是基于身份role的,该管理员账户的 role是 userAdminAnyDatabase。 ‘userAdmin’代表用户管理身份,’AnyDatabase’ 代表可以管理任何数据库。
db.auth()可以验证 用户。
 mongos> db.getUsers()
mongos> db.system.users.find().pretty() #查看全局所有账户
 
提示:mongo shell 可通过.pretty() 对输出进行JSON格式化,以便提高输出的可读性。

八 开启分片功能

8.1 启用分片功能

 [root@mongo04 ~]# mongo --port 27017 -u admin -p admin
mongos> use amdin
mongos> sh.addShard("shard1/172.24.8.71:20002,172.24.8.72:20002,172.24.8.73:20002")
mongos> sh.addShard("shard2/172.24.8.71:20003,172.24.8.72:20003,172.24.8.73:20003")
 
 mongos> sh.status()		#查看分片集群状态

8.2 设置分片chunk大小

 mongos> use config
mongos> db.settings.save({"_id":"chunksize","value":1}) #设置分片大小为1M便于测试
 

8.3 模拟数据写入

 mongos> use mydb				#创建用于模拟的数据库
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
#模拟写入5W条数据到user集合
WriteResult({ "nInserted" : 1 }) #输出
 

8.4 启用数据库分片

 mongos> sh.enableSharding("mydb")

8.5 创建索引

 mongos> db.user.createIndex({"id": 1})

8.6 启用表分片

 mongos> sh.shardCollection("mydb.user",{"id": 1})

8.7 查看分片情况

 mongos> sh.status()

8.8 手动添加第三个分片

 mongos> sh.addShard("shard3/172.24.8.71:20004,172.24.8.72:20004,172.24.8.73:20004")

8.9 再次观察分片情况

 mongos> sh.status()
提示:当分片有变动时,服务器会对数据进行重新分片(均衡),当你再次移除一个分片服务器,此时又会对数据再次进行分片处理。
 
相关参考:
https://blog.51cto.com/bigboss/2160311
https://blog.51cto.com/13643643/2148825

009.MongoDB分片群集部署的更多相关文章

  1. MongoDB分片群集的部署(用心描述,详细易懂)!!

    概念: MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行存储 优势: 1.减少了每个分片需啊哟处理的请求数,群集可以提高自己的存储容量和吞吐量 2.减少了每个分片存储 ...

  2. 【MangoDB分片】配置mongodb分片群集(sharding cluster)

    配置mongodb分片群集(sharding cluster) Sharding cluster介绍 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monod ...

  3. 008.MongoDB分片群集概念及原理

    一 MongoDB分片介绍 1.1 分片 Mongodb另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足 ...

  4. mongodb 分片群集(sharding cluster)

    实际环境架构 分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica set1,作为cluster的s ...

  5. MongoDB分片 在部署和维护管理 中常见事项的总结

    分片(sharding)是MongoDB将大型集合分割到不同服务器(或者说集群)上所采用的方法,主要为应对高吞吐量与大数据量的应用场景提供了方法. 和既有的分库分表.分区方案相比,MongoDB的最大 ...

  6. Mongodb分片集群技术+用户验证

    随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,“分片”就用这个来解决这个问题. 从图中可以看到有四个组件:mongos.config server. ...

  7. MongoDB 分片集群

    每日一句 Medalist don't grow on trees, you have to nurture them with love, with hard work, with dedicati ...

  8. MongoDB分片集群-Sharded Cluster

    分片概念 分片(sharding)是一种跨多台机器分布数据的方法, MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署. 换句话说:分片(sharding)是指将数据拆分,将其分散存在 ...

  9. MySQL Cluster 与 MongoDB 复制群集分片设计及原理

    分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Clus ...

随机推荐

  1. Selenium环境要配置浏览器驱动

    1.浏览器环境变量添加到path 2.将浏览器相应的驱动.exe复制到浏览器目录 3.这条就是让我傻逼似的配置一上午的罪魁祸首:将驱动.exe复制到python目录!!!! Selenium

  2. js的常用场景效果

    转自https://www.cnblogs.com/tangdiao/p/9481681.html 1.checkbox的使用场景,学习之后就是购物车页面的自动计算的上手示例. 做成给checkbox ...

  3. springcloud vue.js 微服务分布式 前后分离 集成代码生成器 shiro权限 activiti工作流

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  4. 微信wxid搜索用户不存在,怎么加好友?

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 根据wxid微信号找到用户的方法及周边资料大全." 最近经常会收到好友请求的消息提醒,但却不是通过搜索好友和群聊来添加的,因此研究 ...

  5. Flutter学习笔记(22)--单个子元素的布局Widget(Container、Padding、Center、Align、FittedBox、Offstage、LimitedBox、OverflowBox、SizedBox)

    如需转载,请注明出处:Flutter学习笔记(22)--单个子元素的布局Widget(Container.Padding.Center.Align.FittedBox.Offstage.Limited ...

  6. [20191126]探究等待事件的本源2.txt

    [20191126]探究等待事件的本源2.txt --//做一个测试,验证如果写入控制文件慢也会影响提交性能. 1.环境:SCOTT@book> @ ver1PORT_STRING        ...

  7. 并发编程~~~协程~~~greenlet模块, gevent模块

    一 协程 1. 协程: 单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 并发真正的核心: 切换并且保持状态. 开启协程并发的执行,自己的程序把控着C ...

  8. python 基础学习笔记(4)--字典 和 集合

    **字典:** - [ ] 列表可以存储大量的数据,但是如果数据量大的话,他的查询速度比较慢,因为列表只能顺序存储,数据与数据之间的关联性不强.所以便有了字典(dict)这种容器的数据类型,它是以{} ...

  9. python怎么连接MySQL(附源码)

    一.源码如下: import pymysql from pymysql.cursors import DictCursor # 创建数据库连接 localhost等效于127.0.0.1 conn = ...

  10. java之操作集合的工具类--Collections

    Collections是一个操作Set.List和Map等集合的工具类. Collections中提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变.对集合对象实现同步控 ...