一、介绍
1. Shard(分片)
- 功能: 存储实际的数据副本。每个 shard 是一个 MongoDB 副本集,副本集内部可以有多个节点,以确保数据的高可用性和容错能力。
- 数据分布: 数据在 shards 之间按分片键(shard key)进行分配。分片键决定了数据的分布策略。通常,分片键应该选择一个具有高选择性的字段,以便将数据均匀地分布在多个 shards 上。
2. Config Servers(配置服务器)
- 功能: 存储集群的元数据和配置数据,包括 sharding 配置、分片键范围、数据库和集合的分片状态等。
- 部署: 配置服务器通常由三个节点组成,以确保配置数据的高可用性。它们使用一致性协议(如 Raft 协议)来确保数据的一致性和持久性。
3. Query Routers (mongos)
- 功能: 处理客户端请求,并将请求路由到适当的 shard。它们充当集群的入口点。
- 部署: 一个 MongoDB Sharding Cluster 可以有多个 mongos 实例,以提供负载均衡和高可用性。客户端连接到 mongos 实例,而不是直接连接到 shards 或配置服务器。
4. Sharding Process(分片过程)
- 选择分片键: 选择一个字段作为分片键,该字段的值将决定数据的分布。
- 数据分片: 数据在不同的 shards 之间进行分配。数据按分片键的范围进行分割(范围分片)或按哈希进行分片(哈希分片),以实现负载均衡。
- 数据迁移: 当负载不均衡时,可以将数据从一个 shard 迁移到另一个 shard,以重新平衡负载。
5. 优点
- 水平扩展: 可以通过增加更多的 shards 来处理更大的数据量和更高的并发负载。
- 高可用性: 每个 shard 是一个副本集,提供数据冗余和故障恢复能力。
- 负载均衡: 分片可以帮助均衡负载,避免单个节点的瓶颈。
6. 挑战
- 复杂性: 需要管理和维护多个组件,包括 shards、配置服务器和 mongos 实例。
- 性能: 查询性能可能会受到跨多个 shards 的操作影响,特别是在涉及多个 shards 的复杂查询和聚合操作时。
- 数据迁移: 在集群扩展或负载调整时,数据迁移可能会影响系统性能。
7. 典型应用场景
- 大数据处理: 适用于需要存储和处理大量数据的应用,如社交媒体、日志分析和大数据分析平台。
- 高并发访问: 适用于访问量大、请求并发度高的应用场景,如在线游戏和电子商务平台。
二、集群规划
1.服务器配置
hostname | system | ip | mongodb_version | mongosh_version | cpu | memory | disk |
mongo-msc | centos7 | 192.168.44.190 | 6.0.16 | 2.3.0 | 4C | 4G | 40G |
2.实例端口规划
共十个端口(38017~38026) | |
configserver | 38018-38020 |
shard | sh1(38021~38023) |
sh2(38024~38026) | |
mongos | 38017 |
三、安装mongodb和mongosh
mongodb下载网址:https://www.mongodb.com/try/download/community-edition/releases/archive
mongosh下载网址:MongoDB Shell Download | MongoDB
安装教程网址:http://t.csdnimg.cn/UJ3Ww
四、搭建集群
1.shard复制集配置
(1)创建数据目录
mkdir -p /mongodb/38021/{conf,data,log}
mkdir -p /mongodb/38022/{conf,data,log}
mkdir -p /mongodb/38023/{conf,data,log}
mkdir -p /mongodb/38024/{conf,data,log}
mkdir -p /mongodb/38025/{conf,data,log}
mkdir -p /mongodb/38026/{conf,data,log}
(2)配置文件
①sh1配置文件
cat > /mongodb/38021/conf/mongod.conf << EOF
systemLog:
destination: file
path: /mongodb/38021/log/mongod.log
logAppend: true
storage:
dbPath: /mongodb/38021/data
journal:
enabled: true
directoryPerDB: true
#engineConfig: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 38021
bindIp: 0.0.0.0
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
EOF
cp /mongodb/38021/conf/mongod.conf /mongodb/38022/conf/
cp /mongodb/38021/conf/mongod.conf /mongodb/38023/conf/
sed -i 's/38021/38022/g' /mongodb/38022/conf/mongod.conf
sed -i 's/38021/38023/g' /mongodb/38023/conf/mongod.conf
②sh2配置文件
cat > /mongodb/38024/conf/mongod.conf << EOF
systemLog:
destination: file
path: /mongodb/38024/log/mongod.log
logAppend: true
storage:
dbPath: /mongodb/38024/data
journal:
enabled: true
directoryPerDB: true
#engineConfig: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 38024
bindIp: 0.0.0.0
replication:
oplogSizeMB: 2048
replSetName: sh2
sharding:
clusterRole: shardsvr
EOF
cp /mongodb/38024/conf/mongod.conf /mongodb/38025/conf/
cp /mongodb/38024/conf/mongod.conf /mongodb/38026/conf/
sed -i 's/38024/38025/g' /mongodb/38025/conf/mongod.conf
sed -i 's/38024/38026/g' /mongodb/38026/conf/mongod.conf
(3)、启动38021~38026实例
# 启动
mongod -f /mongodb/38021/conf/mongod.conf
mongod -f /mongodb/38022/conf/mongod.conf
mongod -f /mongodb/38023/conf/mongod.conf
mongod -f /mongodb/38024/conf/mongod.conf
mongod -f /mongodb/38025/conf/mongod.conf
mongod -f /mongodb/38026/conf/mongod.conf
# 关闭
mongod -f /mongodb/38021/conf/mongod.conf --shutdown
mongod -f /mongodb/38022/conf/mongod.conf --shutdown
mongod -f /mongodb/38023/conf/mongod.conf --shutdown
mongod -f /mongodb/38024/conf/mongod.conf --shutdown
mongod -f /mongodb/38025/conf/mongod.conf --shutdown
mongod -f /mongodb/38026/conf/mongod.conf --shutdown
(4)搭建sh1、sh2复制集
①sh1搭建复制集
# 连接38021实例
mongosh --port 38021
# 搭建sh1复制集
rs.initiate({
_id: "sh1",
members: [
{ _id: 0, host: "192.168.44.190:38021" },
{ _id: 1, host: "192.168.44.190:38022" },
{ _id: 2, host: "192.168.44.190:38023" }
]
})
②sh2搭建复制集
# 连接38024实例
mongosh --port 38024
# 搭建sh2复制集
rs.initiate({
_id: "sh2",
members: [
{ _id: 0, host: "192.168.44.190:38024" },
{ _id: 1, host: "192.168.44.190:38025" },
{ _id: 2, host: "192.168.44.190:38026" }
]
})
2.configserver配置
(1)创建数据目录
mkdir -p /mongodb/38018/{conf,data,log}
mkdir -p /mongodb/38019/{conf,data,log}
mkdir -p /mongodb/38020/{conf,data,log}
(2)配置文件
cat > /mongodb/38018/conf/mongod.conf << EOF
systemLog:
destination: file
path: /mongodb/38018/log/mongod.log
logAppend: true
storage:
dbPath: /mongodb/38018/data
journal:
enabled: true
directoryPerDB: true
#engineConfig: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 38018
bindIp: 0.0.0.0
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
EOF
cp /mongodb/38018/conf/mongod.conf /mongodb/38019/conf/
cp /mongodb/38018/conf/mongod.conf /mongodb/38020/conf/
sed -i 's/38018/38019/g' /mongodb/38019/conf/mongod.conf
sed -i 's/38018/38020/g' /mongodb/38020/conf/mongod.conf
(3)启动38018-38020实例
# 启动实例
mongod -f /mongodb/38018/conf/mongod.conf
mongod -f /mongodb/38019/conf/mongod.conf
mongod -f /mongodb/38020/conf/mongod.conf
# 关闭实例
mongod -f /mongodb/38018/conf/mongod.conf --shutdown
mongod -f /mongodb/38019/conf/mongod.conf --shutdown
mongod -f /mongodb/38020/conf/mongod.conf --shutdown
(4)搭建复制集
# 连接到38018实例
mongosh --port 38018
# 搭建config复制集
rs.initiate({
_id: "configReplSet",
members: [
{ _id: 0, host: "192.168.44.190:38018" },
{ _id: 1, host: "192.168.44.190:38019" },
{ _id: 2, host: "192.168.44.190:38020" }
]
})
3.mongos节点配置
(1)创建数据目录
mkdir -p /mongodb/38017/{conf,log}
(2)配置文件
cat > /mongodb/38017/conf/mongos.conf << EOF
systemLog:
destination: file
path: /mongodb/38017/log/mongod.log
logAppend: true
processManagement:
fork: true
net:
port: 38017
bindIp: 0.0.0.0
sharding:
clusterRole: configReplSet/192.168.44.190:38018,192.168.44.190:38019,192.168.44.190:38020
EOF
(3)启动mongos
# 启动mongos
mongos -f /mongodb/38017/conf/mongod.conf
# 关闭mongos
mongosh --port 38017
db.shutdownServer()
4.分片集群操作
(1)连接到mongos的admin库
mongosh --port 38017
use admin
(2)添加分片
db.runCommand({
addshard:"sh1/192.168.44.190:38021", //这里是sh1复制集的主节点
name:"sh1"
})
db.runCommand({
addshard:"sh2/192.168.44.190:38024", //这里是sh2复制集的主节点
name:"sh2"
})
(3)检查分片集群状态
# 连接到mongos的admin库
mongo --port 38017
# 查看整体状态
sh.status();
如上图所示,则恭喜你mongodb sharding cluster 搭建成功