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

目标

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

方案

采用的是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 上。 复制代码

实施

目前我在本身电脑上搭建该环境即就一台物理机node

先规划下端口分配

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-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 请跳过web

a、切换brew安装库spring

brew tap mongodb/brew
复制代码

b、安装mongodb社区版mongodb

brew install mongodb-community
复制代码

c、启动、中止docker

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 复制代码

将分片服务十一、十二、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 复制代码

关联下share2一、share2二、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、循环插入springboot

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、查看分片库 每一个分片库之和为1000app

如今能够链接到
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 排版

相关文章
相关标签/搜索