51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

MongoDB 分片实战 GridFS

之前我们介绍过 MongoDB 分片GridFS 的工作原理,本文用 Docker 进行实战部署,并在 GridFS 上进行分片测试。

基础准备 {#基础准备}

实战目标 {#实战目标}

  1. Docker compose 配置化部署 MongoDB 服务
    • 配置 3 个 config 服务器
    • 配置 3 个 分片存储服务器
    • 配置 1 个 路由服务器
  2. 脚本启动、初始化
  3. 实现 GridFS 数据分片
  4. 添加 GridFS 数据
  5. 查看分片效果

环境准备 {#环境准备}

环境配置 {#环境配置}

  • 安装 Docker
  • 安装 mongodbsh
  • 配置 docker compose

创建 mongo 网络 {#创建-mongo-网络}

检查名为 mongo 的网络是否已经存在

如果 mongo 网络不存在,需要手动创建:

在 docker compose 文件中添加网络配置

重新启动服务

注意事项

  • 如果你正在使用多个Docker Compose文件或者与其他项目共享网络,确保所有项目都使用相同的网络名称。
  • 如果你之前已经运行了Docker Compose并且删除了网络,你可能需要先删除旧的容器和卷,然后重新创建网络。

检查时区文件 {#检查时区文件}

构建时间同步的多个 MongoDB 服务需要统一的时区信息,通过共用本机的 /etc/localtime 文件实现。

检查该文件是否存在,如果不存在则需要手动创建符号链接,以 Shanghai 时区为例:

更新系统时钟(可选操作)

验证设置

验证时区设置是否正确:

创建文件夹 {#创建文件夹}

在根目录创建这样的文件夹结构:

赋予其他用户读写权限

docker-compose 配置 {#docker-compose-配置}

服务定义 {#服务定义}

services 部分定义不同的MongoDB容器,包括分片(shard)、配置服务器(config)和路由进程(mongos)。

shard {#shard}
config {#config}
mongos {#mongos}

网络配置 {#网络配置}

docker-compose.yml 文件 {#docker-compose-yml-文件}

构建容器 {#构建容器}

用脚本执行,文件 mongo_deploy.sh

执行脚本

GridFS 分片 {#GridFS-分片}

vvd 数据库为例

mongosh 进入 mongos 容器的 mongodb

启用分片,让当前库支持分片

fs.chunks 集合分片

可选创建索引 db.fs.chunks.createIndex( { files_id : 1 , n : 1 } )

添加 GridFS 数据 {#添加-GridFS-数据}

需要进入到 mongos 里,我是这么干的:

之后为了找一个测试文件,我进到 /var/log 中,把 faillog 文件当作测试文件

这里 -d 指定数据库, -c 指定GridFS存储桶(如果未指定,默认为 fs )。

多执行几遍,权当测试文件

查看分片状态 {#查看分片状态}

回到刚刚的 mongosh,这时在 vvd 数据库中查看 collections 可以看到 fs.chunksfs.files 集合,表明 GridFS 数据添加成功:

查看数据:

查看分片状态:

可以看到添加的数据被分配到三个 mongodb 中。

GridFS 分片成功!

用户管理 {#用户管理}

之后需要手动进行用户管理:

  1. 连接到 MongoDB
  1. 创建 root 用户
  1. 核心数据库管理者,我们的 mongodb 数据库命名为 test_db
  1. 数据读取者,对 test_db 仅有只读权限:
  1. 开启访问控制

    mongodb 默认关闭访问控制,需要在创建用户后手动开启

    在 mongos 容器中执行命令:

迁移 {#迁移}

尝试了将本机 /mongodata 文件夹完整移动到服务器,并启动同样配置的分片服务,可以成功迁移数据库。

可能存在其他未知风险。

问题排查 {#问题排查}

  • 如果 容器启动后瞬间 Down 掉,可以通过 docker logs <container_id_or_name> 查看问题原因,我遇到的大多都是磁盘映射的权限问题,

    听说 777 大法百毒不侵

  • 如果 Mongodb 报很多奇怪的错误可以排查是不是版本有问题,6.0 以后mongo 会变成 mongosh

  • MongoDB 删除集合中的数据后不会立刻让出磁盘空间,需要调用:

    如果是分片数据集,则需要进入分片 mongo 中运行命令

    删除集合也可以解决问题。

参考资料 {#参考资料}



文章链接:
https://www.zywvvd.com/notes/coding/dataset/mongodb-slice-docker/mongodb-slice-docker/

赞(0)
未经允许不得转载:工具盒子 » MongoDB 分片实战 GridFS