目录
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.*. *:27081 | 192.168.*. *:27091 |
192.168.*. *:27082 | 192.168.*. *:27092 |
192.168.*. *:27083 | 192.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