【MongoDB】分片部署和应用实践全过程

基本概念

  • Router(mongos): 数据库集群请求的入口
  • Config Servers(replica set) 存储数据库的元数据,如路由,分片的配置
  • Share : 数据库拆分分片

具体操作

  • 配置主机名:
vi /etc/hosts
192.168.0.222 m1
192.168.0.111 m2
192.168.0.113 m3
  • 安装目录为:/opt/mongodb/cluster
  • 创建目录和日志目录:
    • mkdir -p /opt/mongodb/cluster/{config,mongos,shard1,shard2,shard3}/{data,logs}
    • 通过tree mongodb 查看目录结构
  • 安装依赖包:
    • yum install -y libcurl openssl xz-libs
  • 下载mongodb下载包,并解压到mongodb目录下
    • wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.21-rc0.tgz -P /tmp
    • tar -zxvf mongodb-linux-x86_64-rhel70-5.0.21-rc0.tgz -C /opt/mongodb --strip=1
  • chown -R mmongo:mmongo /opt/mongodb 设置mongodb的文件权限给mmongo用户
  • 安装rsync软件用于后续的文件分发
    • yum install -y rsync
  • 安装mongo 进行mongod的连接
    • 一般来说,在高版本的mongo使用的是mongosh,而不是之前的mongo了
    • 具体的链接:https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-debian-tarball/
  • 启动mongo进程
    • ./mongod xxx
  • 连接mongo进程
    • mongosh

分片集群部署规划

在这里插入图片描述

  • 部署说明:
    • configServer配置服务器建议部署为包含3个成员的副本集模式
    • shard分片请使用至少包含三个成员的副本集。
    • mongos没有副本集概念,一般来说一台机器部署一份就可以了,当然,如果机器上部署了多个项目,需要用不同的分片,那就部署多个,mongos是实际的业务连接的点,算是业务和数据库之间的桥梁
    • 本次部署使用3台服务器,部署3个mongos、3个configServer、以及3个分片,每个分片包含3个成员,都分布在不同服务器上。
  • 部署架构图:
    在这里插入图片描述
    • 此处需要说明的是:本次的所有的设置主都是在节点1上,因为复制集是先在节点1启动的,各个节点的优先级都是一样的

前期准备如下

  • mkdir -p /opt/mongodb/cluster/{config,mongos,shard1,shard2,shard3}/{data,logs}
  • 创建mmongodb的用户:
    • useradd -g mongod mongod
  • 配置mongod的目录权限
    • chown -R mongod:mongod /opt/mongodb
  • 设置configServer的配置,配置如下:
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/cluster/config/logs/mongod.log

# Where and how to store data.
storage:
  dbPath: /opt/mongodb/cluster/config/data

# how the process runs
processManagement:
  fork: true
  pidFilePath: /opt/mongodb/cluster/config/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27018
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
#security:
#operationProfiling:

replication:
  replSetName: config

sharding:
  clusterRole: configsvr
  • 设置shard1,2,3 分片的配置文件,分配设置各自的路径和端口号
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/cluster/shard1/logs/mongod.log # shard1的地址

# Where and how to store data.
storage:
  dbPath: /opt/mongodb/cluster/shard1/data  # shard1的地址

# how the process runs
processManagement:
  fork: true
  pidFilePath: /opt/mongodb/cluster/shard1/mongod.pid  # shard1的地址
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27019   # shard1的监听端口号
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


#security:

#operationProfiling:

replication:
  replSetName: shard1   # 设置复制集的名字

sharding:
  clusterRole: shardsvr     # 设置分片的名字
  • 设置mongos的配置
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /opt/mongodb/cluster/mongos/logs/mongod.log


# how the process runs
processManagement:
  fork: true
  pidFilePath: /opt/mongodb/cluster/mongos/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


#security:

#operationProfiling:

#replication:

sharding:
  configDB: config/0.0.0.0:27018,0.0.0.0:27018,0.0.0.0:27018  # 设置分片的config文件
  • 将上面的config,mongos,shard的配置分发到三台机器上
    • rsync -avzp /opt/mongodb/cluster 192.168.92.82:/opt/mongodb/ # 当使用rsync的时候可以保留文件目录权限

config服务启动

  • 启动并初始化configserver,三个节点都要一起全部启动
    • mongod -f ./cluster/config/mongod.conf
  • 连接第一个节点的config连接
    • mongo --port 27018
  • 设置config的副本集
config=  {
    _id: "config",
    configsvr: true,
    members: [
      { _id : 0, host : "192.168.25.125:27018" },    # 根据实际情况设置ip和端口号
      { _id : 1, host : "192.168.25.126:27018" },
      { _id : 2, host : "192.168.25.127:27018" }
    ]
  }
rs.initiate(config)
  • 查看节点状态 rs.status()
  • 通过查看,所有的三个节点都是second的node,过一会就会有primary node节点产生,这个因为初始化之后需要选择一个主节点的信息
  • 可以通过查看日志了解他们的选主节点的逻辑,如果查看??后续补充

shard分片服务启动,依次启动三台机器的分片服务

  • 三个节点都要执行
    • mongod -f ./cluster/shard1/mongod.conf
    • mongod -f ./cluster/shard2/mongod.conf
    • mongod -f ./cluster/shard3/mongod.conf
  • 依次设置每个分片的复制集初始化,shard1,shard2,shard3
    • 此处的设置就是复制集的设计,可以根据需要重新设计权重等情况,设置复制集也是一门技术活,此处只是为了展示整个的过程,所以其他的因素都没有考虑
config={
    _id: "shard1",
    members: [
      { _id : 0, host : "192.168.25.125:27019" },
      { _id : 1, host : "192.168.25.126:27019" },
      { _id : 2, host : "192.168.25.127:27019" }
    ]
  }
rs.initiate(config)
  • 查看各个分片复制集的节点状态: rs.status()

启动并初始化mongos

  • 3个节点分别启动如下的脚本
  • mongos ./cluster/mongos/mongod.conf
  • 连接第一个节点的mongos
  • mongo --port 27017
  • 进入mongo的shell,设置分片信息
sh.addShard( "shard1/192.168.220.138:27019,192.168.220.138:27019,192.168.220.138:27019")
sh.addShard( "shard2/192.168.220.138:27020,192.168.220.138:27020,192.168.220.138:27020")
sh.addShard( "shard3/192.168.220.138:27021,192.168.220.138:27021,192.168.220.138:27021")

  • 查看mongos的状态: sh.status() ,注意这里是sh,不是rs哦

至此,分片集群部署完成,执行数据分片操作

为数据库启动分片

  • 连接到mongos服务器
  • mongo --port 27017
  • 执行如下的命令:
use testdb
sh.enableSharding("testdb")   # 为这个数据库创建分片
sh.shardCollection("testdb.order", {"_id": "hashed"})   # 为order数据集创建分片的域
  • 验证分片情况
use testdb

for (i = 1; i <= 1000; i=i+1){
    db.order.insert({'price': 1})
}
  • 查看插入的数量
    • db.order.find().count() # 输出会是1000
  • 分别查看shard1,shard2,shard3的数量,可以看到已经被拆开存储到三个库中去了
  • 查看config服务的数据,可以看到chunks库中,保存了分片的情况

脚本化处理

  • 自启动mongos并添加分片和设置数据集的分片处理,使用脚本实现mongos的分片设计,不用手动的输入整个的操作
  • 如何关闭整个的mongo的集群呢?用脚本的方式实现

遇到的问题

  • 在关闭config节点的时候,使用指令如下:use admin; db.shutdownServer() 报错信息是:“shutdown must run from localhost when running db without auth”,
    • 参考网页:https://www.mongodb.com/docs/manual/reference/method/db.shutdownServer/,使用db.shutdownServer()也是不可行的,增加了force和timeoutSecs 也是不行
    • 调了一下绑定的ip之后,发现config服务已经启动不了了,好像用root账号能够启动成功,用mmongo账号就不行,切账户导致的问题??可能是因为root账号和mmongo账户互相切换,切换错误了,导致了数据库启动的异常
    • 最终的原因是因为我启动的时候设置的是机器的对外ip地址,所以,用ip地址登录了之后是不能关闭mongo分片的,我修改成了0.0.0.0 ,既可以了,这种设计是为了安全起见,只能是具有本机权限或者被授权的auth用户才能关闭mongo库
  • rs.initiate(config) “errmsg” : “replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.25.130:27018 failed with Error connecting to 192.168.25.130:27018 :: caused by :: No route to host” 错误
    • 因为192.168.25.130 这台服务器设置了防火墙策略,所以不能联通成功,关闭防火墙或者放开27018端口即可
  • 启动share1的时候 ,报错了,报错信息是:
    about to fork child process, waiting until server is ready for connections.
    forked process: 9738
    ERROR: child process failed, exited with 100
    To see additional information in this output, start without the “–fork” option。
    • 通过查看share1下的log日志得知,是配置错误导致,存储data的路径写错了导致,修改正确后启动正常
    • grep -rl bindIp /opt/mongodb/cluster/ | xargs sed -i ‘s#dbPath: /opt/mongodb/cluser#dbPath: /opt/mongodb/cluster#g’ 使用此命令批量替换了错误的配置表信息
  • 在mongos上插入了数据之后,进入到任何一个shard1节点看不到数据,从mongos上来看,其实数据已经写入并进行了分片
    • 原因:今日的节点错误了,不是shard1的节点,而是config的节点,进入shard的节点之后就正常了,可以看到已经分片了

参考网页

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MongoDB分片部署是通过将数据分布在多个服务器上来实现水平扩展的一种方式。下面是MongoDB分片部署的一般步骤: 1. 安装和配置MongoDB:在每个分片服务器上安装并配置MongoDB,确保它们可以相互通信。 2. 配置路由器(mongos):MongoDB分片集群需要一个路由器来处理客户端请求并将数据路由到正确的分片。在其中一个服务器上启动mongos进程,并将其配置为连接到分片服务器和配置服务器。 3. 配置配置服务器(config servers):配置服务器存储了整个集群的元数据信息,包括分片键和分片信息。至少需要3个配置服务器来保证高可用性。在每个配置服务器上启动mongod进程,并将它们组成一个复制集。 4. 创建分片集合(sharded collection):选择一个分片键,该键将用于将数据划分到不同的分片中。通过创建一个分片集合来启用分片功能,并指定要用作分片键的字段。 5. 添加分片(shard):将每个分片服务器添加到集群中。可以使用“sh.addShard()”命令将分片服务器添加到路由器中。 6. 启用分片集合:使用“sh.enableSharding()”命令启用分片集合,并指定要分片数据库和集合。 7. 设定初始的分片数据位置(optional):可以使用“sh.shardCollection()”命令手动指定初始的分片数据位置。 完成上述步骤后,MongoDB集群就可以进行分片部署了。在添加更多数据时,MongoDB会自动将数据根据分片键路由到正确的分片上。 请注意,以上是一般的步骤,具体的配置可能会因环境和需求而有所不同。建议在进行分片部署前仔细阅读MongoDB官方文档,并根据实际情况进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值