乐趣区

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

施行

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

先布局下端口调配

文件目录

` 先创立一个如下的目录后果
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 排版

退出移动版