目标

使用三台物理机做数据库集群
任意一台宕机之后不会影响线上的业务运转
不会有任何的数据丢失

方案

采用的是Replica Sets+Sharded Cluster的集群
具有高可用,故障转移,分布式存储等特性


依上图所示我们此次集群配置如下:三台物理机,每台物理机拥有完整的分片集群配置,都可独立运行配置服务器:使用使用3个配置服务器确保元数据完整性。路由(mongos)进程:使用3个路由进程实现平衡,提高客户端接入性能3 个分片进程:Shard11,Shard12,Shard13 组成一个副本集,提供Sharding 中 Shard1 的功能。3 个分片进程:Shard21,Shard22,Shard23 组成一个副本集,提供Sharding 中 Shard2 的功能。

构建一个 mongoDB Sharding Cluster 需要三种角色:shard 服务器(ShardServer)、配置服务器(config Server)、路由进程(Route Process)

  • Shard 服务器

shard 服务器即存储实际数据的分片,
每个 shard 可以是一个 mongod 实例,
也可以是一组 mongod 实例构成的 Replica Sets.
为了实现每个 Shard 内部的故障 自动转换,
MongoDB 官方建议每个 shard 为一组 Replica Sets.
  • 配置服务器

为了将一个特定的 collection 存储在多个 shard 中,
需要为该 collection 指定 一个 shard key,
决定该条记录属于哪个 chunk,
配置服务器可以存储以下信息,
每个shard节点的配置信息,
每个chunk的shard key范围,
chunk在各shard 的分布情况,
集群中所有 DB 和 collection 的 sharding 配置信息。
  • 路由(mongos)进程

它是一个前端路由,客户端由此接入,
首先询问配置服务器需要到哪个 shard 上查询或保存记录,
然后连接相应的 shard 执行操作,最后将结果返回给客户端,
客户端只需要将原本发给 mongod 的查询或更新请求原封不动地发给路由进程,
而不必关心所操作的记录存储在哪个shard 上。

实施

目前我在自己电脑上搭建该环境即就一台物理机

先规划下端口分配

mongos1 mongos2 mongos3
10011 10012 10013
config1 config2 config3
10021 10022 10023
share11 share12 share13
10031 10032 10033
share21 share22 share23
10041 10042 10043

文件目录

先创建一个如下的目录结果mengfaniaodeMBP:third_software mengfanxiao$ tree mongodb/
mongodb/
├── node1
│   ├── config-server1
│   │   ├── backup
│   │   ├── config
│   │   │   └── config.conf
│   │   └── db
│   ├── mongos1
│   │   ├── backup
│   │   ├── config
│   │   │   └── config.conf
│   │   └── db
│   ├── shard11
│   │   ├── backup
│   │   ├── config
│   │   │   └── config.conf
│   │   └── db
│   └── shard21
│       ├── backup
│       ├── config
│       │   └── config.conf
│       └── db
├── node2
│   ├── config-server2
│   │   ├── backup
│   │   ├── config
│   │   │   └── config.conf
│   │   └── db
│   ├── mongos2
│   │   ├── backup
│   │   ├── config
│   │   │   └── config.conf
│   │   └── db
│   ├── shard12
│   │   ├── backup
│   │   ├── config
│   │   │   └── config.conf
│   │   └── db
│   └── shard22
│       ├── backup
│       ├── config
│       │   └── config.conf
│       └── db
└── node3├── config├── config-server3│   ├── backup│   ├── config│   │   └── config.conf│   └── db├── db├── mongos3│   ├── backup│   ├── config│   │   └── config.conf│   └── db├── shard13│   ├── backup│   ├── config│   │   └── config.conf│   └── db└── shard23├── backup├── config│   └── config.conf└── db如果3台物理机的话 把对应的node1 node2 node3复制过去即可

配置服务

配置服务1

node1/config-server1docker run --restart=always --privileged=true -p 10021:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config1 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

配置服务2

node2/config-server2docker run --restart=always --privileged=true -p 10022:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config2 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

配置服务3

node3/config-server3docker run --restart=always --privileged=true -p 10023:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config3 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

将3个配置服务关联到一起

  • 使用mongodb客户端连接

mongo 192.168.50.100:10021

这里的客户端是我在本地另外又安装了一个mongodb 我这里是mac安装mongod方式 非mac 请跳过

a、切换brew安装库

brew tap mongodb/brew

b、安装mongodb社区版

brew install mongodb-community

c、启动、停止

brew services start mongodb-communitybrew services stop mongodb-community
  • 初始化配置

rs.initiate({_id: "rs-file-server-config-server",configsvr: true,members: [{ _id : 0,host : "192.168.50.100:10021" },{ _id : 1,host : "192.168.50.100:10022" },{ _id : 2, host : "192.168.50.100:10023" }]
});注意这里一定要用服务器ip 不要用127.0.0.1
  • 查看配置结果

rs.status()

分片服务集群1

分片服务share11

cd node1/shard11docker run --restart=always --privileged=true -p 10031:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard11 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard1-server" --bind_ip_all

分片服务share12

cd node2/shard12docker run --restart=always --privileged=true -p 10032:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard12 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard1-server" --bind_ip_all

分片服务share13

cd node1/shard13docker run --restart=always --privileged=true -p 10033:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard13 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard1-server" --bind_ip_all

将分片服务11、12、13关联起来 作为分片服务集群1

  • mongodb客户端连接11

mongo 127.0.0.1:10031
  • 配置

rs.initiate({_id: "rs-file-server-shard1-server",members: [{ _id : 0, host : "192.168.50.100:10031" },{ _id : 1, host : "192.168.50.100:10032" },{ _id : 2, host : "192.168.50.100:10033" }]
});

分片备份服务集群2

分片服务share21

cd node1/shard21docker run --restart=always --privileged=true -p 10041:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard21 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard2-server" --bind_ip_all

分片服务share22

node2/shard22docker run --restart=always --privileged=true -p 10042:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard22 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard2-server" --bind_ip_all

分片服务share23

cd node3/shard23docker run --restart=always --privileged=true -p 10043:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard23 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard2-server" --bind_ip_all

关联下share21、share22、share23

  • 通过客户端连接

mongo 127.0.0.1:10041
  • 配置

rs.initiate({_id: "rs-file-server-shard2-server",members: [{ _id : 0, host : "192.168.50.100:10041" },{ _id : 1, host : "192.168.50.100:10042" },{ _id : 2, host : "192.168.50.100:10043" }]
});

mongod服务

安装mongos1

docker run --restart=always --privileged=true -p 10011:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos1 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

安装mongos2

docker run --restart=always --privileged=true -p 10012:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos2 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

安装mongos3

docker run --restart=always --privileged=true -p 10013:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos3 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

配置

  • mongodb客户端连接

mongo 127.0.0.1:10011
  • 配置

sh.addShard("rs-file-server-shard1-server/192.168.50.100:10031,192.168.50.100:10032,192.168.50.100:10033")sh.addShard("rs-file-server-shard2-server/192.168.50.100:10041,192.168.50.100:10042,192.168.50.100:10043")

测试

  • mongodb客户端连接

mongo 127.0.0.1:10011
  • 创建分片数据库test

sh.enableSharding("test")
  • 将collection加入分片并设置分片字段

sh.shardCollection("test.user", {"_id": "hashed" })
  • 插入1000条数据

a、切换分片库

use test

b、循环插入

for (i = 1; i <= 1000; i=i+1){db.user.insert({'userIndex': 1})}
  • 确认数据

a、查看备份库 每个备份库都是1000

插入完成之后可以在
127.0.0.1:10011,127.0.0.1:10012,127.0.0.1:10013
三台数据库下分别看到test数据库中名为user的Collection拥有一千条数据,
使用以下代码查询记录数db.getCollection('user').find({}).count()结果为1000

b、查看分片库 每个分片库之和为1000

现在可以连接到
127.0.0.1:10031,127.0.0.1:10041上使用以上命令查询记录数,
会发现两个数据库的记录数只和正好是1000
  • springboot连接

在application.yml配置即可访问mogos数据库:spring:data :mongodb :uri: mongodb://127.0.0.1:10011,127.0.0.1:10012,127.0.0.1:10013/test

参考文档

https://blog.csdn.net/quanmaoluo5461/article/details/85164588

本文使用 mdnice 排版

基于docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群相关推荐

  1. docker容器下mongodb 4.0.0 的Replica Sets+Sharded Cluster集群

    https://segmentfault.com/a/1190000023144572

  2. Docker容器下Redis/ES/RabbitMQ/MongoDB/FastDFS启动命令总结

    docker 部署etcd Etcd:一个分布式的k-v存储服务 Etcd官网https://etcd.io/ etcd安装 1. 拉取bitnami/etcd镜像 docker pull bitna ...

  3. CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)

    文章目录 Redis简介 什么是redis redis的优点 Redis集群都有哪些模式 主从复制(Master-Slave Replication) 哨兵模式(Sentinel) Redis官方 C ...

  4. Android基于Docker容器的双系统多开实现和自动化部署

    GitHub:https://github.com/Pangu-Immortal 本文技术涉及基于Docker容器的移动端双系统实现系统及方法,所述系统包括相互连接的内核层及应用程序层,其中,应用程序 ...

  5. 【云原生】第十一篇--基于Docker容器DevOps应用方案

    基于Docker容器DevOps应用方案 企业业务代码发布系统 一.企业业务代码发布方式 1.1 传统方式 1.2 容器化方式 二.企业业务代码发布逻辑图 三.企业业务代码发布工具及流程图 3.1 工 ...

  6. 广告业务系统 之 敏捷交付 —— “基于 Docker 容器同机部署”

    文章目录 广告业务系统 之 敏捷交付 -- "基于 Docker 容器同机部署" 服务 Docker 构建及部署 代码支持 服务打包&构建 服务部署 广告业务系统 之 敏捷 ...

  7. 基于Docker容器安装nginx

    基于Docker容器安装nginx (1)在Docker仓库中搜索Nginx镜像 docker search nginx (2)从Docker仓库中下载Nginx镜像 docker pull dock ...

  8. 基于Docker容器的HEXO博客

    基于Docker容器的HEXO博客 介绍 hexo是一个基于Node.js 快速.简洁且高效的博客框架. Hexo 支持 GitHub Flavored Markdown 的所有功能,甚至可以整合 O ...

  9. 【VMware vSAN 7.0】5.4.2 创建 vSAN 集群

    [VMware vSAN 7.0]5.4.2 创建 vSAN 集群-我们有软硬件解决方案 IT干货 2021-03-31 10:19:32 123 收藏 1 分类专栏: 1.服务器虚拟化集群方案 文章 ...

最新文章

  1. jQuery 事件对象的属性
  2. opencv中imgproc库中函数详解(1)
  3. ffmpeg的新东东:AVFilter
  4. CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光
  5. java 学习基础知识点拾遗 导航页
  6. dojo中chart参数
  7. 什么时候用DFS,什么时候用BFS?(DFS和BFS的特点和异同)
  8. 固高GTS控制卡功能介绍2:NewWatch功能
  9. 基于SSM实现的房屋租赁系统【附源码】(毕设)
  10. cocos2dx lua 反编译(20170417增加补充说明)(转)
  11. linux下查看设备的接口,linux 查看sdio接口有哪些设备?
  12. grldr(GRUB,grub4dos)使用方法简介
  13. 有中英文摘要的LaTeX中文模板!!!超实用
  14. Quorum 机制(分布式系统)
  15. linux决定文件大小的函数,Linux 通过lseek()来实现文件大小的设置
  16. 阿里云 免费领服务器 具体步骤
  17. nohup命令解决SpringBoot/java -jar命令启动项目运行一段时间自动停止问题
  18. alwayson的同步提交和异步提交
  19. 使用AlphaBlend函数实现位图半透明绘制
  20. 西安财经大学信息计算机科学怎咋,中清研 -西安财经大学信息学院

热门文章

  1. 汉诺塔的递归实现,看完就懂了
  2. Perl中的正则表达式
  3. CentOS安装Redis、PHPredis扩展及Redis配置文件详解
  4. 为 IDES471 激活中文
  5. ORA-00600:[kclchkinteg_2]及[kjmsm_epc]内部错误一例
  6. 三大超算军团加速布局 中科曙光E级超算预研项目正式启动
  7. 微软公司将在英国开设三个数据中心
  8. 解析弱电安防监控管理系统的安装技术重点
  9. Spring学习笔记002 - AOP
  10. 懒与馋的平衡:餐饮O2O市场广阔,发展不易