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

虚拟现实
• 阅读 2362

目标

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

方案

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

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

基于docker容器下mongodb 4.0.0 的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 上。`

实施

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

先规划下端口分配

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

文件目录

`先创建一个如下的目录结果
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-server1
docker 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-server2
docker 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-server3
docker 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-community
brew 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/shard11
docker 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/shard12
docker 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/shard13
docker 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/shard21
docker 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/shard22
docker 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/shard23
docker 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 排版

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Redis Cluster集群主从方案
RedisCluster集群主从方案本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制).附:RedisCluster集群主从方案:http://www.cnblogs.com/soul
Wesley13 Wesley13
3年前
Mysql半同步加orchestrator
Github基于Orchestrator,Consul和GLB实现高可用性目标。1.orchestrator用来运行故障监听和故障恢复。我们使用了如下图所示的一个跨数据中心的orchestrator/raft。2.Hashicorp公司的用于服务发现的Consul。使用Consul的KV存储器写入集群主节点的身份。对于每个集群,都有一套KV记录
Stella981 Stella981
3年前
Redis 集群之 Redis
Redis集群官方推荐方案RedisCluster集群rediscluster  通过分片实࣫容量扩展  通过主从复制实࣫节点的高可用  节点之间互相通信  每个节点都维护整个集群的节点信息  rediscluster把所有的物理节点映射到\016383\slotЇ,cluster负责维护node<sl
Wesley13 Wesley13
3年前
MongoDB 副本集之入门篇
前言:mongodb因为高性能、高可用性、支持分片等特性,作为非关系型数据库被大家广泛使用。其高可用性主要是体现在mongodb的副本集上面(可以简单理解为一主多从的集群),本篇文章主要从副本集介绍、本地搭建副本集、副本集读写数据这三个方面来带大家认识下mongodb副本集。一、mongodb副本集介绍—
Stella981 Stella981
3年前
Redis(1.7)Redis高可用架构(理论篇)
【0】常用架构种类  (0.1)单机Redis  (0.2)单纯的Redis主从复制  (0.3)哨兵SentinelRedis主从复制集群(实现高可用自动故障转移)  (0.4)RedisCluster分布式数据库集群  (0.5)第三方中间件Redis主从复制【1】Redis主从复制
Wesley13 Wesley13
3年前
vivo 基于原生 RabbitMQ 的高可用架构实践
一、背景说明vivo在2016年引入RabbitMQ,基于开源RabbitMQ进行扩展,向业务提供消息中间件服务。2016~2018年,所有业务均使用一个集群,随着业务规模的增长,集群负载越来越重,集群故障频发。2019年,RabbitMQ进入高可用建设阶段,完成了高可用组件MQ名字服务以及RabbitMQ集群
Stella981 Stella981
3年前
Dubbo HA 高可用
一、zookeeper宕机现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务健壮性监控中心宕掉不影响使用,只是丢失部分采样数据数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务注册中心对等集群,任意一台宕掉后,将
Stella981 Stella981
3年前
Redis、MPP、kafka 、MongDB简介
Redis:间值数据库,适合缓存用户Session会话与经常需要查的数据1.Redis集群,为什么在项目中使用集群 1.持久化,持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要左右是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失;2、复制:主从复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用
Stella981 Stella981
3年前
Mongodb集群节点故障恢复场景分析(转)
一个适当配置的Mongodb分片集群是没有单点故障。本文描述了分片集群中存在的几种不同的潜在的节点故障场景,以及Mongodb对这些节点故障是怎么处理的。1、Mongos节点宕机一个Mongos进程应该运行在每一个应用程序服务器上,这个服务器应该独占这个Mongos进程,并且通过它与分片集群来通讯。Mongos进程不是持久化的,相反,
天翼云虚拟IP地址及其在高可用集群中的应用
在很多应用场景中,需要在云平台中搭建高可用集群,就这需要用到虚拟IP地址功能。今天就来谈一谈虚拟IP地址及它的应用场景。一、高可用集群在谈虚拟IP地址前,我们先了解一下什么叫高可用集群。高可用集群(HighAvailabilityCluster),或者叫故障转移集群(FailoverCluster),它是指通过集群软件,将几台服务器组合为一个集群系统提
DevOpSec DevOpSec
2年前
自建k8s集群之负载均衡使用
自建k8s而非云环境,组件mysql类(部分有状态服务)部署在虚机里也即集群外,业务服务部署在k8s集群内。需求:集群内、集群外,业务服务和组件相互间通过负载均衡、高可用的形式连通。此需求拆解成两个问题进行解决,接着往下看。集群内:k8s集群集群外:k8s集群外的应用部署在虚拟机或物理机环境