目录

1 副本集群

1.1 原理解释

1.2 集群搭建

1.3 Java代码

2 分片集群

2.1 原理介绍

2.2 服务器说明

2.3 集群搭建

2.3.1 环境准备

2.3.2 配置服务

2.3.3 分片服务

2.3.4 路由服务

2.4 分片集群使用-创建集合

2.5 Java代码


1 副本集群

对于中小型项目,使用副本集群就够了。

一个主,两个从库组成,主库宕机时,这两个从库都可以被选为主库。

 

当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。

1.1 原理解释

Master:代表主节点,主节点提供所有数据的CRUD服务

Backup:代表从节点,从节点不提供任何服务

Arbitration:代表仲裁节点,仲裁节点不存储任何数据,其主要作用就是当主节点挂掉以后,把那个备份节点提升为一个主节点。

1.2 集群搭建

创建容器

docker run -id --name=master_mongo  -p 27027:27017 mongo:4.4.10  --replSet mongo_clus 
docker run -id --name=backup_mongo1 -p 27028:27017 mongo:4.4.10  --replSet mongo_clus 
docker run -id --name=backup_mongo2 -p 27029:27017 mongo:4.4.10  --replSet mongo_clus

--replSet 设置副本集名称,也就是设置集群名称,必须要设置,否则没法构建集群

配置

进入master_mongo容器中

docker exec -it master_mongo /bin/bash

登录Mongo

mongo -port 27017

创建集群

cfg={
  "_id":"mongo_clus",
  members:[{
      _id:0,
      host:"192.168.***.***:27027",
      priority:2
  },{
      _id:1,
      host:"192.168.***.***:27028",
      priority:1
  },{
      _id:2,
      host:"192.168.***.***:27029",
      priority:2
  }]
}
rs.initiate(cfg)

注意修改ip地址

查看状态:

rs.status()

1.3 Java代码

MongoDB的单机版、副本集群和分片集群,在Java开发时,代码没有任何区别,区别只在于application.yml的配置不同:

#配置mongo的连接地址
spring:
  data:
    mongodb:
      # MongoDB单机版
#      uri: mongodb://192.168.***.***:27017/testdb
      # MongoDB副本集群
      uri: mongodb://192.168.***.***:27027,192.168.***.***:27028,192.168.***.***:27029/testdb

2 分片集群

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。

  为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。

    垂直扩展:增加更多的CPU和存储资源来扩展容量。

    水平扩展:将数据集分布在多个服务器上。水平扩展即分片。

2.1 原理介绍

分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。

例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。

MongoDB中数据的分片是以集合为基本单位的,集合中的数据通过片键(Shard key)被分成多部分。其实片键就是在集合中选一个键,用该键的值作为数据拆分的依据。

一般片键采用范围或哈希的方式进行分片。

2.2 服务器说明

为了保证高可用,每个服务都做了集群。

以下 路由服务配置服务2个分片服务 都是由3个节点组成,一共需要 12 个 MongoDB实例

配置服务

IP端口
192.168.* . *27061
192.168.* . *27062
192.168.*. *27063

路由服务

IP端口
192.168.*. *27071
192.168.*. *27072
192.168.*. *27073

分片服务

分片服务1分片服务2
192.168.*. *:27081192.168.*. *:27091
192.168.*. *:27082192.168.*. *:27092
192.168.*. *:27083192.168.*. *:27093

2.3 集群搭建

2.3.1 环境准备

需要给 配置服务、路由服务和2个分片服务创建映射文件的目录,所以需要先创建如下的目录:

mkdir -p /mnt/mongo_cluster/config_server1
mkdir -p /mnt/mongo_cluster/config_server2
mkdir -p /mnt/mongo_cluster/config_server3
​
mkdir -p /mnt/mongo_cluster/shard11_server
mkdir -p /mnt/mongo_cluster/shard12_server
mkdir -p /mnt/mongo_cluster/shard13_server
​
mkdir -p /mnt/mongo_cluster/shard21_server
mkdir -p /mnt/mongo_cluster/shard22_server
mkdir -p /mnt/mongo_cluster/shard23_server
​
mkdir -p /mnt/mongo_cluster/mongos_server1
mkdir -p /mnt/mongo_cluster/mongos_server2
mkdir -p /mnt/mongo_cluster/mongos_server3

2.3.2 配置服务

创建容器

创建并启动 配置服务的容器。

docker run -id --name pro-file-server-config1 \
-v /mnt/mongo_cluster/config_server1/config:/etc/mongod \
-v /mnt/mongo_cluster/config_server1/db:/data/db \
--restart=always --privileged=true -p 27061:27019 mongo:4.4.10 \
--configsvr --replSet "rs-config-server" --bind_ip_all
​
docker run -id --name pro-file-server-config2 \
-v /mnt/mongo_cluster/config_server2/config:/etc/mongod \
-v /mnt/mongo_cluster/config_server2/db:/data/db \
--restart=always --privileged=true -p 27062:27019 mongo:4.4.10 \
--configsvr --replSet "rs-config-server" --bind_ip_all
​
docker run -id --name pro-file-server-config3 \
-v /mnt/mongo_cluster/config_server3/config:/etc/mongod \
-v /mnt/mongo_cluster/config_server3/db:/data/db \
--restart=always --privileged=true -p 27063:27019 mongo:4.4.10 \
--configsvr --replSet "rs-config-server" --bind_ip_all

配置Mongo

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

通过docker进入任意一台config-server配置三台服务器之间的联系

#进入pro-file-server-config1配置服务器
docker exec -it pro-file-server-config1 /bin/bash
#连接mongo 配置服务器暴露的默认端口为27019
mongo -port 27019
#执行配置内容
rs.initiate({
_id: "rs-config-server",
configsvr: true,
members: [
{ _id : 0,host : "192.168.***. ***:27061" },
{ _id : 1,host : "192.168.***. ***:27062" },
{ _id : 2,host : "192.168.***. ***:27063" }
]
});
#查看状态
rs.status()

2.3.3 分片服务

创建分片1

创建 分片服务rs-shard1-server 的容器

docker run -id --name pro-file-server-shard11 \
-v /mnt/mongo_cluster/shard11_server/config:/etc/mongod \
-v /mnt/mongo_cluster/shard11_server/db:/data/db \
-v /mnt/mongo_cluster/shard11_server/backup:/data/backup \
--restart=always --privileged=true -p 27081:27018 mongo:4.4.10 \
--shardsvr --replSet "rs-shard1-server" --bind_ip_all
​
docker run -id --name pro-file-server-shard12 \
-v /mnt/mongo_cluster/shard12_server/config:/etc/mongod \
-v /mnt/mongo_cluster/shard12_server/db:/data/db \
-v /mnt/mongo_cluster/shard12_server/backup:/data/backup \
--restart=always --privileged=true -p 27082:27018 mongo:4.4.10 \
--shardsvr --replSet "rs-shard1-server" --bind_ip_all
​
docker run -id --name pro-file-server-shard13 \
-v /mnt/mongo_cluster/shard13_server/config:/etc/mongod \
-v /mnt/mongo_cluster/shard13_server/db:/data/db \
-v /mnt/mongo_cluster/shard13_server/backup:/data/backup \
--restart=always --privileged=true -p 27083:27018 mongo:4.4.10 \
--shardsvr --replSet "rs-shard1-server" --bind_ip_all

配置分片1

通过docker进入任意一台share配置三台服务器之间的联系

#进入pro-file-server-shard11服务器
docker exec -it pro-file-server-shard11 /bin/bash
#连接mongo
mongo -port 27018
#执行配置内容
rs.initiate({
_id: "rs-shard1-server",
members: [
{ _id : 0, host : "192.168.***. ***:27081" },
{ _id : 1, host : "192.168.***. ***:27082" },
{ _id : 2, host : "192.168.***. ***:27083" }
]
});
#查看状态
rs.status()

创建分片2

分片服务rs-shard2-server

docker run -id --name pro-file-server-shard21 \
-v /mnt/mongo_cluster/shard21_server/config:/etc/mongod \
-v /mnt/mongo_cluster/shard21_server/db:/data/db \
-v /mnt/mongo_cluster/shard21_server/backup:/data/backup \
--restart=always --privileged=true -p 27091:27018 mongo:4.4.10 \
--shardsvr --replSet "rs-shard2-server" --bind_ip_all
​
docker run -id --name pro-file-server-shard22 \
-v /mnt/mongo_cluster/shard22_server/config:/etc/mongod \
-v /mnt/mongo_cluster/shard22_server/db:/data/db \
-v /mnt/mongo_cluster/shard22_server/backup:/data/backup \
--restart=always --privileged=true -p 27092:27018 mongo:4.4.10 \
--shardsvr --replSet "rs-shard2-server" --bind_ip_all
​
docker run -id --name pro-file-server-shard23 \
-v /mnt/mongo_cluster/shard23_server/config:/etc/mongod \
-v /mnt/mongo_cluster/shard23_server/db:/data/db \
-v /mnt/mongo_cluster/shard23_server/backup:/data/backup \
--restart=always --privileged=true -p 27093:27018 mongo:4.4.10 \
--shardsvr --replSet "rs-shard2-server" --bind_ip_all

配置分片2

通过docker进入任意一台share2 配置三台服务器之间的联系

#进入pro-file-server-shard21服务器
docker exec -it pro-file-server-shard21 /bin/bash
#连接mongo
mongo -port 27018
#执行配置内容
rs.initiate({
_id: "rs-shard2-server",
members: [
{ _id : 0, host : "192.168.***. ***:27091" },
{ _id : 1, host : "192.168.***. ***:27092" },
{ _id : 2, host : "192.168.***. ***:27093" }
]
});
#查看状态
rs.status()

2.3.4 路由服务

创建容器

创建并启动 路由服务 的容器

docker run -id --name pro-file-server-mongos1 \
-v /mnt/mongo_cluster/mongos_server1/config:/etc/mongod \
-v /mnt/mongo_cluster/mongos_server1/db:/data/db \
--restart=always --privileged=true -p 27071:27017 --entrypoint mongos mongo:4.4.10 \
--configdb rs-config-server/192.168.***. ***:27061,192.168.***. ***:27062,192.168.***. ***:27063 \
--bind_ip_all
​
docker run -id --name pro-file-server-mongos2 \
-v /mnt/mongo_cluster/mongos_server2/config:/etc/mongod \
-v /mnt/mongo_cluster/mongos_server2/db:/data/db \
--restart=always --privileged=true -p 27072:27017 --entrypoint mongos mongo:4.4.10 \
--configdb rs-config-server/192.168.***. ***:27061,192.168.***. ***:27062,192.168.***. ***:27063 \
--bind_ip_all
​
docker run -id --name pro-file-server-mongos3 \
-v /mnt/mongo_cluster/mongos_server3/config:/etc/mongod \
-v /mnt/mongo_cluster/mongos_server3/db:/data/db \
--restart=always --privileged=true -p 27073:27017 --entrypoint mongos mongo:4.4.10 \
--configdb rs-config-server/192.168.***. ***:27061,192.168.***. ***:27062,192.168.***. ***:27063 \
--bind_ip_all

配置Mongo

通过docker进入任意一台mongos配置三台服务器之间的联系

#进入pro-file-server-mongos1服务器
docker exec -it pro-file-server-mongos1 /bin/bash
#连接mongo
mongo -port 27017
#执行配置内容
sh.addShard("rs-shard1-server/192.168.***. ***:27081,192.168.***. ***:27082,192.168.***. ***:27083");
sh.addShard("rs-shard2-server/192.168.***. ***:27091,192.168.***. ***:27092,192.168.***. ***:27093");

2.4 分片集群使用-创建集合

#mongodb客户端连接
mongo 192.168.***. ***:27071
​
#创建分片数据库test
sh.enableSharding("testdb")
​
#将collection加入分片并设置分片字段
sh.shardCollection("testdb.person", {"_id": "hashed" })

2.5 Java代码

MongoDB的单机版、副本集群和分片集群,在Java开发时,代码没有任何区别,区别只在于application.yml的配置不同:

#配置mongo的连接地址
spring:
  data:
    mongodb:
      # MongoDB单机版
#      uri: mongodb://192.168.***. ***:27017/testdb
      # MongoDB副本集群
#      uri: mongodb://192.168.***. ***:27027,192.168.***. ***:27028,192.168.***. ***:27029/testdb
      # MongoDB分片集群
      uri: mongodb://192.168.***. ***:27071,192.168.***. ***:27072,192.168.***. ***:27073/testdb

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐