MongoDB除了副本集以外,还支持分片集群。分片可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
1.1 概念
分片(有时候也叫分区)是一种跨多台机器分布数据的方法,是指将数据拆分,将其分散到不同的机器上,处理更多的负载。
分片有两种解决方案:垂直扩展和水平扩展。
垂直扩展:增加更多的CPU和存储资源来扩展容量。
水平扩展:将数据集分布在多个服务器上。水平扩展就是分片
为什么使用分片
- 复制所有的写入操作到主节点
- 延迟的敏感数据会在主节点查询
- 单个副本集限制在12个节点
- 当请求量巨大时会出现内存不足。
- 本地磁盘不足
- 垂直扩展需要更多的钞能力
1.2 分片包含的组件
上图中主要有如下所述三个主要组件:
- Shard:
分片,用于存储实际的数据块,实际生产环境中一个分片可以由多个副本集承担,防止主机单点故障 - Config Server:
配置服务器。存储几群的元数据和配置。从MongoDB3.4开始,配置服务器必须是副本集 - Query Routers:
路由,mongos充当查询路由器,在客户端和分片集群之间提供接口
本次课程的目标是搭建一个由两个个分片节点副本集+一个配置节点副本集+两个路由节点的集群,总共11个服务节点
1.3 搭建分片节点副本集
Linux系统安装Mongodb
Linux部署MongoDB操作和Windows差不多
官网下载Linux版的tgz包,上传到Linux目录中,解压到当前目录
tar -xvf mongodb-linux-x86_64-4.0.19.tgz
移动解压后的文件夹到指定目录
mv mongodb-linux-x86_64-4.0.19 /usr/local/mongodb
新建数据目录和日志目录
# 数据存储目录
mkdir -p /mongodb/data/db
# 日志存储目录
mkdir -p /mongodb/log
新建配置文件,并修改内容
vi /mongodb/mongod.conf
配置文件内容
systemLog:
# MongoDB日志输出到文件
destination: file
# 日志文件路径
path: "/mongodb/log/mongod.log"
# 当mongod实例重新启动时,将新条目附加到现有日志文件的末尾
logAppend: true
storage:
# mongod实例存储数据的目录
dbPath: "/mongodb/data/db"
journal:
# 启用或禁用持久性日志
enabled: true
processManagement:
# 启用在后台运行
fork: true
net:
# 这里是个坑,只能配置0.0.0.0或者本机ip。网上很多教程都是复制粘贴,很不负责任。如果需要限制ip访问,请使用云服务器的安全组
bindIp: 0.0.0.0
# 绑定的端口,默认是27017
port: 27017
启动服务
/usr/local/mongodb/bin/mongod -f /mongodb/mongod.conf
启动后显示successfully,如果没有就说明配置文件有问题,启动失败了。
[root@iZ2zebq96d1zohii1vadzqZ mongodb]# /usr/local/mongodb/bin/mongod -f /mongodb/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1526
child process started successfully, parent exiting
查看服务是否启动成功
ps -aux|grep mongod
Linux下关闭MongoDB步骤(极不建议使用kill强制杀死进程,这样数据会存在损坏)
# 客户端登录服务
mongo --port 27017
# 切换到admin库
use admin
# 关闭服务
db.shutdownServer()
1.3.1 第一套shard副本集
使用 172.18.87.20
服务器,启动3个MongoDB服务
准备存放数据和日志的目录
mkdir -p /mongodb/sharded_cluster/myshardrs01_27017/log
mkdir -p /mongodb/sharded_cluster/myshardrs01_27017/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs01_27117/log
mkdir -p /mongodb/sharded_cluster/myshardrs01_27117/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs01_27217/log
mkdir -p /mongodb/sharded_cluster/myshardrs01_27217/data/db
新建配置文件
vim /mongodb/sharded_cluster/myshardrs01_27017/mongod.conf
myshardrs01_27017配置内容
systemLog:
#日志输出为文件
destination: file
#日志文件的路径
path: "/mongodb/sharded_cluster/myshardrs01_27017/log/mongod.log"
#mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#数据目录。
dbPath: "/mongodb/sharded_cluster/myshardrs01_27017/data/db"
journal:
#启用持久性日志
enabled: true
processManagement:
#启用守护进程模式。
fork: true
#指定进程ID的文件位置
pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27017/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: 0.0.0.0
#绑定的端口
port: 27017
replication:
#副本集的名称
replSetName: myshardrs01
sharding:
#分片角色,shard
clusterRole: shardsvr
myshardrs01_27117配置内容
vim /mongodb/sharded_cluster/myshardrs01_27117/mongod.conf
systemLog:
#日志输出为文件
destination: file
#日志文件的路径
path: "/mongodb/sharded_cluster/myshardrs01_27117/log/mongod.log"
#mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#数据目录。
dbPath: "/mongodb/sharded_cluster/myshardrs01_27117/data/db"
journal:
#启用持久性日志
enabled: true
processManagement:
#启用守护进程模式。
fork: true
#指定进程ID的文件位置
pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27117/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: 0.0.0.0
#绑定的端口
port: 27117
replication:
#副本集的名称
replSetName: myshardrs01
sharding:
#分片角色,shard
clusterRole: shardsvr
myshardrs01_27217配置内容
vim /mongodb/sharded_cluster/myshardrs01_27217/mongod.conf
systemLog:
#日志输出为文件
destination: file
#日志文件的路径
path: "/mongodb/sharded_cluster/myshardrs01_27217/log/mongod.log"
#mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#数据目录。
dbPath: "/mongodb/sharded_cluster/myshardrs01_27217/data/db"
journal:
#启用持久性日志
enabled: true
processManagement:
#启用守护进程模式。
fork: true
#指定进程ID的文件位置
pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27217/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: 0.0.0.0
#绑定的端口
port: 27217
replication:
#副本集的名称
replSetName: myshardrs01
sharding:
#分片角色,shard
clusterRole: shardsvr
启动三个服务
/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27017/mongod.conf
/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27117/mongod.conf
/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27217/mongod.conf
初始化副本集
连接任意一个节点
/usr/local/mongodb/bin/mongo --host 172.18.87.20 --port 27017
初始化副本集(如果副本集名称有问题,记得修改名称)
rs.initiate()
记得一定要回车一下,不然不是主节点
# 导出配置到config
#这一句如果不写会报错[js] ReferenceError: config is not defined
config = rs.conf()
# 设置第1个节点的优先级是10
config.members[0].host="172.18.87.20:27017"
# 重载配置
rs.reconfig(config)
添加副本节点
rs.add("172.18.87.20:27117")
添加仲裁节点
rs.addArb("172.18.87.20:27217")
退出第一台服务器
myshardrs01:PRIMARY> exit
1.3.2 第二套shard副本集
使用 172.17.238.236
服务器,启动3个MongoDB服务
准备存放数据和日志的目录
mkdir -p /mongodb/sharded_cluster/myshardrs02_27017/log
mkdir -p /mongodb/sharded_cluster/myshardrs02_27017/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs02_27117/log
mkdir -p /mongodb/sharded_cluster/myshardrs02_27117/data/db
mkdir -p /mongodb/sharded_cluster/myshardrs02_27217/log
mkdir -p /mongodb/sharded_cluster/myshardrs02_27217/data/db
新建配置文件
vim /mongodb/sharded_cluster/myshardrs02_27017/mongod.conf
myshardrs02_27017配置内容
systemLog:
#日志输出为文件
destination: file
#日志文件的路径
path: "/mongodb/sharded_cluster/myshardrs02_27017/log/mongod.log"
#mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#数据目录。
dbPath: "/mongodb/sharded_cluster/myshardrs02_27017/data/db"
journal:
#启用持久性日志
enabled: true
processManagement:
#启用守护进程模式。
fork: true
#指定进程ID的文件位置
pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27017/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: 0.0.0.0
#绑定的端口
port: 27017
replication:
#副本集的名称
replSetName: myshardrs02
sharding:
#分片角色,shard
clusterRole: shardsvr
myshardrs02_27117配置内容
vim /mongodb/sharded_cluster/myshardrs02_27117/mongod.conf
systemLog:
#日志输出为文件
destination: file
#日志文件的路径
path: "/mongodb/sharded_cluster/myshardrs02_27117/log/mongod.log"
#mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#数据目录。
dbPath: "/mongodb/sharded_cluster/myshardrs02_27117/data/db"
journal:
#启用持久性日志
enabled: true
processManagement:
#启用守护进程模式。
fork: true
#指定进程ID的文件位置
pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27117/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: 0.0.0.0
#绑定的端口
port: 27117
replication:
#副本集的名称
replSetName: myshardrs02
sharding:
#分片角色,shard
clusterRole: shardsvr
myshardrs02_27217配置内容
vim /mongodb/sharded_cluster/myshardrs02_27217/mongod.conf
systemLog:
#日志输出为文件
destination: file
#日志文件的路径
path: "/mongodb/sharded_cluster/myshardrs02_27217/log/mongod.log"
#mongod实例重新启动时,会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#数据目录。
dbPath: "/mongodb/sharded_cluster/myshardrs02_27217/data/db"
journal:
#启用持久性日志
enabled: true
processManagement:
#启用守护进程模式。
fork: true
#指定进程ID的文件位置
pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27217/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: 0.0.0.0
#绑定的端口
port: 27217
replication:
#副本集的名称
replSetName: myshardrs02
sharding:
#分片角色,shard
clusterRole: shardsvr
启动三个服务
/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27017/mongod.conf
/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27117/mongod.conf
/usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27217/mongod.conf
初始化副本集
连接任意一个节点
/usr/local/mongodb/bin/mongo --host 172.18.86.119 --port 27017
初始化副本集(如果副本集名称有问题,记得修改名称)
rs.initiate()
记得一定要回车一下,不然不是主节点
# 导出配置到config
#这一句如果不写会报错[js] ReferenceError: config is not defined
config = rs.conf()
# 设置第1个节点的优先级是10
config.members[0].host="172.18.86.119:27017"
# 重载配置
rs.reconfig(config)
添加副本节点
rs.add("172.18.86.119:27117")
添加仲裁节点
rs.addArb("172.18.86.119:27217")