mongodb 集群shard_mongodb 4.0.0 Replica Sets+Sharded Cluster集群

dba60c04c96778bfa98791a7b0d8feac.png

前言

上一篇说了下mongodb的存储原理 这一篇咱聊聊实践

目标

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

方案

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

c88c1207599ef50c7714ea8a943e4652.png

002c36e215c2c0fadf80d8f9a6c4170c.png
依上图所示我们此次集群配置如下:

三台物理机,每台物理机拥有完整的分片集群配置,都可独立运行

配置服务器:使用使用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 上。

实施

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

先规划下端口分配

d3b3f898178b9a6e9fe166dd5d0fd97b.png

文件目录

先创建一个如下的目录结果

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值