需求
功能需求:搭建MongoDB分片集群,模拟简历快照数据进行操作,具体要求如下:
(1) 如图搭建一个分片集群,要求每个分片节点中的复制集含有一个仲裁节点
(2) 使用权限控制,建立要访问的数据库lg_resume,这个账号名字是lagou_gx、密码是abc321。这个账号对数据库有读写权限
(3) 使用SpringBoot 进行访问分片集群,对lg_resume 库中的lg_resume_datas 进行增加和查询操作
实战操作
一、MongoDB在Linux的安装
- 下载社区版 MongoDB 4.1.3
去官网下载对应的MongoDB 然后上传到Linux虚拟机 - 将压缩包解压即可
tar -zxvf MongoDB-linux-x86_64-4.1.3.tgz - 启动
./bin/mongod - 指定配置文件方式的启动
./bin/mongod -f mongo.conf
配置文件样例:
dbpath=/data/mongo/
port=27017
bind_ip=0.0.0.0
fork=true
logpath = /data/mongo/MongoDB.log
logappend = true
auth=false
直接启动,窗口关闭就会结束
以配置文件启动后,就不会有太多的日志输出
MongoDB启动和参数说明
参数 说明
dbpath 数据库目录,默认/data/db
port 监听的端口,默认27017
bind_ip 监听IP地址,默认全部可以访问
fork 是否已后台启动的方式登陆
logpath 日志路径
logappend 是否追加日志
auth 是开启用户密码登陆
config 指定配置文件
mongo shell 的启动
启动mongo shell
./bin/mongo
指定主机和端口的方式启动
./bin/mongo --host=主机IP --port=端口
GUI工具 nosqlbooster4mongo-5.2.0
三、搭建复制集
什么是复制集
复制集是由一组拥有相同数据集的mongod实例做组成的集群。 复制集是一个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,secondary从 节点和投票节点。
复制集提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,保证数据的安全性。
复制集搭建
依次复制conf文件,额外添加replSet=lagouCluster的配置
主节点配置 mongo_37017.conf
# 主节点配置
dbpath=/data/mongo/data/server1
bind_ip=0.0.0.0
port=37017
fork=true
logpath=/data/mongo/logs/server1.log
replSet=lagouCluster
从节点1配置 mongo_37018.conf
dbpath=/data/mongo/data/server2
bind_ip=0.0.0.0
port=37018
fork=true
logpath=/data/mongo/logs/server2.log
replSet=lagouCluster
从节点2配置 mongo_37019.conf
dbpath=/data/mongo/data/server3
bind_ip=0.0.0.0
port=37019
fork=true
logpath=/data/mongo/logs/server3.log
replSet=lagouCluster
…仲裁节点同上,不复制了
初始化节点配置
启动四个节点 然后进入任意一个节点 运行如下命令:
var cfg ={"_id":"lagouCluster1",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"192.168.192.130:37011","priority":10},
{"_id":2,"host":"192.168.192.130:37013"},
{"_id":3,"host":"192.168.192.130:37015"},
{"_id":4,"host":"192.168.192.130:37017","arbiterOnly":true}
]
}
rs.initiate(cfg)
rs.status()
注意:仲裁节点"arbiterOnly":true
四、分片集群 Shard Cluster 搭建
为什么要分片
1.存储容量需求超出单机磁盘容量。
2.活跃的数据集超出单机内存容量,导致很多请求都要从磁盘读取数据,影响性能。
3.IOPS超出单个MongoDB节点的服务能力,随着数据的增长,单机实例的瓶颈会越来越明显。
4.副本集具有节点数量限制。
垂直扩展:增加更多的CPU和存储资源来扩展容量。
水平扩展:将数据集分布在多个服务器上。水平扩展即分片。
分片的工作原理
分片集搭建
1.配置 并启动config 节点集群
# 数据库文件位置
dbpath=config/config1
#日志文件位置
logpath=config/logs/config1.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr
节点2、3同上,配置完毕后启动配置节点
进入任意节点的mongo shell 并添加 配置节点集群 注意use admin
./bin/mongo --port 17017
use admin
var cfg ={"_id":"configsvr",
"members":[
{"_id":1,"host":"192.168.211.133:17017"},
{"_id":2,"host":"192.168.211.133:17018"},
{"_id":3,"host":"192.168.211.133:17019"}]
};
rs.initiate(cfg)
2.配置shard集群
shard1集群搭建37017到37019
dbpath=shard/shard1/shard1-37017
bind_ip=0.0.0.0
port=37017
fork=true
logpath=shard/shard1/shard1-37017.log
replSet=shard1
shardsvr=true
dbpath=shard/shard1/shard1-37018
bind_ip=0.0.0.0
port=37018
fork=true
logpath=shard/shard1/logs/shard1-37018.log
replSet=shard1
shardsvr=true
dbpath=shard/shard1/shard1-37019
bind_ip=0.0.0.0
port=37019
fork=true
logpath=shard/shard1/logs/shard1-37019.log
replSet=shard1
shardsvr=true
shard2集群、shard3集群、shard4集群 同上
启动每个mongod 然后进入其中一个进行集群配置
var cfg ={"_id":"shard1",
"protocolVersion" : 1,
"members":[
{"_id":1,"host":"192.168.211.133:37017"},
{"_id":2,"host":"192.168.211.133:37018"},
{"_id":3,"host":"192.168.211.133:37019"}
]
};
rs.initiate(cfg)
rs.status()
3.配置和启动 路由节点
route-27017.conf
port=27017
bind_ip=0.0.0.0
fork=true
logpath=route/logs/route.log
configdb=configsvr/192.168.211.133:17017,192.168.211.133:17018,192.168.211.133:17019
启动路由节点使用 mongos (注意不是mongod)
./bin/mongos -f route/route-27017.conf
4. mongos(路由)中添加分片节点
进入路由mongos添加分片信息
mongo --port 27017
sh.status()
sh.addShard("shard1/192.168.211.133:37017,192.168.211.133:37018,192.168.211.133:37019");
sh.addShard("shard2/192.168.211.133:47017,192.168.211.133:47018,192.168.211.133:47019");
sh.status()
5. 开启数据库和集合分片(指定片键)
继续使用mongos完成分片开启和分片大小设置
为数据库开启分片功能
sh.enableSharding("lagou_resume")
为指定集合开启分片功能
sh.shardCollection("lagou_resume.lagou_resume_datas",{"片键字段名如 name":索引说明})
6. 验证结果
我们插入一点数据然后查看是否有数据
use lg_resume;
for(var i=1;i<= 1000;i++){
db.lg_resume_datas.insert({"name":"test"+i, salary:(Math.random()*20000).toFixed(2)});
}
五、MongoDB安全认证
切换到admin数据库对用户的添加
use admin;
db.createUser(userDocument):用于创建 MongoDB 登录用户以及分配权限的方法
db.createUser(
{
user: "账号",
pwd: "密码",
roles: [
{ role: "角色", db: "安全认证的数据库" },
{ role: "角色", db: "安全认证的数据库" }
]
}
)
单机认证
要使用安全认证必须添加超级用户,以及针对某个库的用户
- 创建管理员
- 创建普通用户
- MongoDB 安全认证方式启动
mongod --dbpath=数据库路径 --port=端口 --auth
也可以在配置文件中 加入 auth=true
分片集群安全认证
1 开启安全认证之前 进入路由创建管理员和普通用户
2 关闭所有的配置节点 分片节点 和 路由节点
安装psmisc
yum install psmisc
安装完之后可以使用killall 命令 快速关闭多个进程
killall mongod
3 生成密钥文件 并修改权限
openssl rand -base64 756 > data/mongodb/testKeyFile.file
chmod 600 data/mongodb/keyfile/testKeyFile.file
4 配置节点集群和分片节点集群开启安全认证和指定密钥文件
auth=true
keyFile=data/mongodb/testKeyFile.file
5在路由配置文件中 设置密钥文件
keyFile=data/mongodb/testKeyFile.file
6 启动所有的配置节点 分片节点 和 路由节点 使用路由进行权限验证
可以编写一个shell 脚本 批量启动
./bin/mongod -f config/config-17017.conf
./bin/mongod -f config/config-17018.conf
./bin/mongod -f config/config-17019.conf
./bin/mongod -f shard/shard1/shard1-37017.conf
./bin/mongod -f shard/shard1/shard1-37018.conf
./bin/mongod -f shard/shard1/shard1-37019.conf
./bin/mongod -f shard/shard2/shard2-47017.conf
./bin/mongod -f shard/shard2/shard2-47018.conf
./bin/mongod -f shard/shard2/shard2-47019.conf
./bin/mongos -f route/route-27017.conf
7 Spring boot 连接安全认证的分片集群
spring.data.mongodb.username=账号
spring.data.mongodb.password=密码
#spring.data.mongodb.uri=mongodb://账号:密码@IP:端口/数据库名
8 当我们开启认证后,要想单独查询每个分片集群的数据,就必须为其创建账号