多实例部署mongodb分片集群架构(mongodb sharding cluster)

一、介绍

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(分片过程)

  1. 选择分片键: 选择一个字段作为分片键,该字段的值将决定数据的分布。
  2. 数据分片: 数据在不同的 shards 之间进行分配。数据按分片键的范围进行分割(范围分片)或按哈希进行分片(哈希分片),以实现负载均衡。
  3. 数据迁移: 当负载不均衡时,可以将数据从一个 shard 迁移到另一个 shard,以重新平衡负载。

5. 优点

  • 水平扩展: 可以通过增加更多的 shards 来处理更大的数据量和更高的并发负载。
  • 高可用性: 每个 shard 是一个副本集,提供数据冗余和故障恢复能力。
  • 负载均衡: 分片可以帮助均衡负载,避免单个节点的瓶颈。

6. 挑战

  • 复杂性: 需要管理和维护多个组件,包括 shards、配置服务器和 mongos 实例。
  • 性能: 查询性能可能会受到跨多个 shards 的操作影响,特别是在涉及多个 shards 的复杂查询和聚合操作时。
  • 数据迁移: 在集群扩展或负载调整时,数据迁移可能会影响系统性能。

7. 典型应用场景

  • 大数据处理: 适用于需要存储和处理大量数据的应用,如社交媒体、日志分析和大数据分析平台。
  • 高并发访问: 适用于访问量大、请求并发度高的应用场景,如在线游戏和电子商务平台。

二、集群规划

 1.服务器配置

hostnamesystemipmongodb_versionmongosh_versioncpumemorydisk
mongo-msccentos7192.168.44.1906.0.162.3.04C4G40G

2.实例端口规划

共十个端口(38017~38026)
configserver38018-38020
shardsh1(38021~38023)
sh2(38024~38026)
mongos38017

三、安装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 搭建成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值