MongoDB 分片复制集集群搭建

一、系统环境与集群架构

系统&软件 版本
VMware Workstation 15 Pro
CentOS 7.6.1810
MongoDB 4.4.4

准备:将 mongodb-linux-x86_64-rhel70-4.4.4.tgz 导入 /home 并完成解压

tar -zxvf mongodb-linux-x86_64-rhel70-4.4.4.tgz
mv mongodb-linux-x86_64-rhel70-4.4.4 mongodb

集群架构图

MongoDB 分片复制集集群搭建_第1张图片

二、你可能遇到的问题

1、初始化集群时报错:“Our set name did not match that of the request target, requestTarget:192.168.32.102:27019”

MongoDB 分片复制集集群搭建_第2张图片

出现这个问题的原因可能是因为 27019 这个节点的配置文件中 replSet 属性的值与集群 _id 的值不同所导致的。

2、从节点查询数据报错:“not master and slaveOk=false” 如图所示:

MongoDB 分片复制集集群搭建_第3张图片

执行如下命令即可

rs.secondaryOk()

3、开启密码校验后 Spring Boot 连接 MongoDB 报错:Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName=(但是在命令行里进行用户验证和操作数据库没问题)

出现用户可以在路由服务器登录并成功校验身份后可对数据库进行添加、删除、查询数据等操作,但是用 Spring Boot 代码连接就报错的现象。很有可能是因为你在创建当前普通用户时没有执行切换数据库命令(use 数据库名)。所以处理这个问题的方式可以是用管理员身份登录,将原先用户删除,然后切换数据库再重新创建用户即可。

三、配置节点集群搭建

1、启动配置节点

配置节点集群:用以存储 MongoDB 路由集群配置信息

# 配置节点数据存放路径
mkdir -p /data/mongo/config1
mkdir /data/mongo/config2
mkdir /data/mongo/config3

/home/mongodb/bin 路径下创建第一个配置节点的配置文件:config-17017.cfg

# 数据库文件位置
dbpath=/data/mongo/config1
#日志文件位置
logpath=/data/mongo/config1/config.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17017
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr

启动第一个配置节点

./mongod -f mongo_17017.cfg

MongoDB 分片复制集集群搭建_第4张图片
/home/mongodb/bin 路径下创建第二个配置节点的配置文件:config-17018.cfg

# 数据库文件位置
dbpath=/data/mongo/config2
#日志文件位置
logpath=/data/mongo/config2/config.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17018
# 表示是一个配置服务器
configsvr=true
#配置服务器副本集名称
replSet=configsvr

启动第二个配置节点

./mongod -f mongo_17018.cfg

/home/mongodb/bin 路径下创建第三个配置节点的配置文件:config-17019.cfg

# 数据库文件位置
dbpath=/data/mongo/config3
# 日志文件位置
logpath=/data/mongo/config3/config.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
bind_ip=0.0.0.0
port = 17019
# 表示是一个配置服务器
configsvr=true
# 配置服务器副本集名称
replSet=configsvr

启动第三个配置节点

./mongod -f mongo_17019.cfg

2、创建配置节点集群

进入任意 MongoDB 节点, 并创建配置节点集群。

# 连接 17017 节点
./mongo --port 17017
# 切换至 admin 数据库
use admin
# 创建集群配置信息
var cfg ={"_id":"configsvr",
    "members":[
    {"_id":1,"host":"192.168.32.102:17017"},
    {"_id":2,"host":"192.168.32.102:17018"},
    {"_id":3,"host":"192.168.32.102:17019"}]
};
# 初始化集群配置
rs.initiate(cfg)

MongoDB 分片复制集集群搭建_第5张图片

四、分片节点集群搭建

1、启动第一个分片集群节点

# 分片节点数据存放路径
mkdir -p /data/mongo/server1
mkdir /data/mongo/server2
mkdir /data/mongo/server3
mkdir /data/mongo/server4

/home/mongodb/bin 路径下创建第一个节点的配置文件:mongo_27016.cfg

# 数据库文件位置
dbpath=/data/mongo/server1
# 端口号
port=27016
# 可以连接本机的IP
bind_ip=0.0.0.0
# 后台运行
fork=true
# 日志文件地址
logpath=/data/mongo/server1/MongoDB_27016.log
logappend=true
# 配置服务器副本集名称
replSet=MyCluster1
# 表示是一个分片服务器
shardsvr=true

启动第一个节点

./mongod -f mongo_27016.cfg

/home/mongodb/bin 路径下创建第二个节点的配置文件:mongo_27017.cfg

# 数据库文件位置
dbpath=/data/mongo/server2
# 端口号
port=27017
# 可以连接本机的IP
bind_ip=0.0.0.0
# 后台运行
fork=true
# 日志文件地址
logpath=/data/mongo/server2/MongoDB_27017.log
logappend=true
# 配置服务器副本集名称
replSet=MyCluster1
# 表示是一个分片服务器
shardsvr=true

启动第二个节点

./mongod -f mongo_27017.cfg

/home/mongodb/bin 路径下创建第三个节点的配置文件:mongo_27018.cfg

# 数据库文件位置
dbpath=/data/mongo/server3
# 端口号
port=27018
# 可以连接本机的IP
bind_ip=0.0.0.0
# 后台运行
fork=true
# 日志文件地址
logpath=/data/mongo/server3/MongoDB_27018.log
logappend=true
# 配置服务器副本集名称
replSet=MyCluster1
# 表示是一个分片服务器
shardsvr=true

启动第三个节点

./mongod -f mongo_27018.cfg

/home/mongodb/bin 路径下创建第四个节点的配置文件:mongo_27019.cfg

# 数据库文件位置
dbpath=/data/mongo/server4
# 端口号
port=27019
# 可以连接本机的IP
bind_ip=0.0.0.0
# 后台运行
fork=true
# 日志文件地址
logpath=/data/mongo/server4/MongoDB_27019.log
logappend=true
# 配置服务器副本集名称
replSet=MyCluster1
# 表示是一个分片服务器
shardsvr=true

启动第四个节点

./mongod -f mongo_27019.cfg

2、创建配置节点集群

进入任意 MongoDB 节点, 并创建配置节点集群。

# 连接 27017 节点
./mongo --port 27017
# 创建集群配置信息 (arbiterOnly 属性表示该节点为:仲裁节点)
var cfg ={"_id":"MyCluster1",
	"protocolVersion" : 1,
	"members":[
		{"_id":1,"host":"192.168.32.102:27017"},
		{"_id":2,"host":"192.168.32.102:27018"},
		{"_id":3,"host":"192.168.32.102:27019"},
		{"_id":4,"host":"192.168.32.102:27016","arbiterOnly":true}
	]
}
# 初始化集群配置
rs.initiate(cfg)

3、启动其他分片集群节点

其他分片集群节点与第一个分片集群节点的创建方式相同,只需要修改 MongoDB 的端口和数据文件、日志文件、集群副本名称即可。这里将进行省略。

Tips

1、数据库文件和日志文件存放路径必须手动创建否则 MongoDB 将启动失败。

2、编写集群的配置时一定要注意变量 cfg_id 属性的值与服务器配置文件中 replSet 属性值的一致性。

五、路由节点创建

1、启动路由节点

# 路由节点数据存放路径
mkdir -p /data/mongo/router1
mkdir /data/mongo/router2
mkdir /data/mongo/router3

/home/mongodb/bin 路径下创建路由节点的配置文件:mongo_20000.cfg

# 端口
port=20000
bind_ip=0.0.0.0
# 后台运行
fork=true
# 日志存放路径
logpath=/data/mongo/router/MongoDB_20000.log
logappend=true
# 路由配置存放路径
configdb=configsvr/192.168.32.102:17017,192.168.32.102:17018,192.168.32.102:17019

启动路由节点使用 mongos (注意不是 mongod

./bin/mongos -f mongo_20000.cfg

3、配置分片信息

# 进入 MongoDB 路由节点
./mongo --port 20000
# 添加数据分片节点
sh.addShard("MyCluster1/192.168.32.102:27017,192.168.32.102:27018,192.168.32.102:27019");
sh.addShard("MyCluster2/192.168.32.102:37017,192.168.32.102:37018,192.168.32.102:37019");
sh.addShard("MyCluster3/192.168.32.102:47017,192.168.32.102:47018,192.168.32.102:47019");
sh.addShard("MyCluster4/192.168.32.102:57017,192.168.32.102:57018,192.168.32.102:57019");
# 查看分片配置状态
sh.status()

MongoDB 分片复制集集群搭建_第6张图片

4、开启数据库和集合分片

继续使用 mongos 完成分片开启和分片大小设置

# 为指定数据库开启分片功能
sh.enableSharding("supreme")
# 为指定集合开启分片功能 
sh.shardCollection("supreme.sir",{"name": "hashed"})

MongoDB 分片复制集集群搭建_第7张图片

5、向集合中插入数据测试

use supreme;
for(var i=1;i<= 1000;i++){
    db.sir.insert({"name":"test"+i,
    salary:(Math.random()*20000).toFixed(2)});
}

六、安全认证配置

数据库内置的角色

角色 描述
read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
dbOwner 库拥有者权限,即readWrite、dbAdmin、userAdmin角色的合体
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用,超级账号,超级权限

各个类型用户对应的角色

用户类型 角色
数据库用户角色 read、readWrite
数据库管理角色 dbAdmin、dbOwner、userAdmin
集群管理角色 clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色 backup、restore
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色 root
间接或直接提供系统超级用户的访问 dbOwner 、userAdmin、userAdminAnyDatabase

1、创建用户并停止所有节点实例

# 登录路由节点
./mongo --port 20000
# 创建用户  user: 用户名  pwd:密码  roles:角色(可配置多个)  role:对指定数据库角色权限  db:数据库名
# 创建超级管理员用户
use admin
db.createUser({
	user: "root",
	pwd: "root",
	roles: [{role: "root", db: "admin"}]
})
# 创建普通用户(注意:一定要切换数据库)
use supreme
db.createUser({
	user: "sir",
	pwd: "supreme",
	roles: [{role: "readWrite", db: "supreme"}]
})
# 退出
exit
# 关闭所有 MongoDB 实例
# 安装psmisc
yum install psmisc
# 安装完之后可以使用killall 命令 快速关闭多个进程
killall mongod
killall mongos
# 检查 MongoDB 进程(如果有进程没有马上结束那就就等一会,禁止使用 kill -9)
ps -aux|grep monog
kill 进程PID

MongoDB 分片复制集集群搭建_第8张图片

2、生成秘钥文件并配置

# 生成秘钥文件 (当前目录为 /home/mongodb/bin)
openssl rand -base64 756 > keyFile.file
# 修改秘钥文件权限
chmod 600 keyFile.file
# 为配置节点集群和分片节点集群开启安全认证和指定密钥文件 17017、17018、17019、27016、27017……
vim mongo_17017.cfg

添加如下内容:

auth=true
keyFile=keyFile.file

最后再重新挨个启动 MongoDB 就可以了

/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_17017.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_17018.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_17019.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_27016.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_27017.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_27018.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_27019.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_37016.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_37017.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_37018.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_37019.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_47016.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_47017.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_47018.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_47019.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_57016.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_57017.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_57018.cfg
/home/mongodb/bin/mongod -f /home/mongodb/bin/mongo_57019.cfg
/home/mongodb/bin/mongos -f /home/mongodb/bin/mongo_20000.cfg

3、目录结构

MongoDB 分片复制集集群搭建_第9张图片

源码

源码下载(免费)

---------------------------------------- 真正能让你走远的是自律、积极和勤奋。----------------------------------------

你可能感兴趣的:(#,进阶之路,MongoDB,复制集,集群,搭建,分片)