MongoDb分片集群环境认证

分片集群环境

关闭已开启的集群服务(可选)

分片集群环境下的安全认证和副本集环境下基本上一样。但分片集群的服务器环境和架构较为复杂,建议在搭建分片集群的时候,直接加入安全认证和服务器间
的鉴权,如果之前有数据,可先将之前的数据备份出来,再还原回去。本文使用之前搭建好的集群服务,因此,先停止之前的集群服务停止服务的方式有两种:快速关闭和标准关闭,下面依次说明:
(1)快速关闭方法(快速,简单,数据可能会出错)
目标:通过系统的kill命令直接杀死进程:

依次杀死 mongos路由、配置副本集服务,分片副本集服务,从次节点开始。直到所有成员都离线。副本集杀的时候,建议先杀仲裁者,再杀副本节点,最后是主节点,以避免潜在的回滚。杀完要检查一下,避免有的没有杀掉。

image-20201021163859671

补充】
如果一旦是因为数据损坏,则需要进行如下操作(了解):
1)删除lock文件:

rm -f /mongodb/sharded_cluster/myshardrs01_27018/data/db/*.lock \
/mongodb/sharded_cluster/myshardrs01_27118/data/db/*.lock \
/mongodb/sharded_cluster/myshardrs01_27218/data/db/mongod.lock \
/mongodb/sharded_cluster/myshardrs02_27318/data/db/mongod.lock \
/mongodb/sharded_cluster/myshardrs02_27418/data/db/mongod.lock \
/mongodb/sharded_cluster/myshardrs02_27518/data/db/mongod.lock \
/mongodb/sharded_cluster/myconfigrs_27019/data/db/mongod.lock \
/mongodb/sharded_cluster/myconfigrs_27119/data/db/mongod.lock \
/mongodb/sharded_cluster/myconfigrs_27219/data/db/mongod.lock

2 )依次修复数据:

/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myshardrs01_27018/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myshardrs01_27118/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myshardrs01_27218/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myshardrs02_27318/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myshardrs02_27418/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myshardrs02_27518/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myconfigrs_27019/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myconfigrs_27119/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/myconfigrs_27219/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/mymongos_27017/data/db
/usr/local/mongodb/bin/mongod --repair --
dbpath=/mongodb/sharded_cluster/mymongos_27117/data/db

(2)标准的关闭方法(数据不容易出错,但麻烦):
目标:通过mongo客户端中的shutdownServer命令来依次关闭各个服务

关闭分片服务器副本集中的服务,建议依次关闭仲裁节点、副本节点、主节点。主要的操作步骤参考如下:

//客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。
mongo --port 27018
//告知副本集说本机要下线
rs.stepDown()
//#切换到admin库
use admin
//关闭服务
db.shutdownServer()

关闭配置服务器副本集的服务,建议依次关闭副本节点、主节点。主要的操作步骤参考如下:

//客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。
mongo --port 27019
//告知副本集说本机要下线
rs.stepDown()
//#切换到admin库
use admin
//关闭服务
db.shutdownServer()

关闭路由服务器的服务,建议依次关闭两个路由节点。主要的操作步骤参考如下:

//客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。
mongo --port 27017
//告知副本集说本机要下线
rs.stepDown()
//#切换到admin库
use admin
//关闭服务
db.shutdownServer()

创建副本集认证的key文件

第一步:生成一个key文件到当前文件夹中。
可以使用任何方法生成密钥文件。例如,以下操作使用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件所有者提供读取权限

image-20201021164226516

提示:
所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错:

permissions on/mongodb/replica_sets/myrs_27017/mongo.keyfile are too open

一定要保证密钥文件一致,文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置,都放到和配置文件一起的目录中。
这里将该文件分别拷贝到多个目录中:

[root@localhost ~]# echo '/mongodb/sharded_cluster/myshardrs01_27018/mongo.keyfile
> /mongodb/sharded_cluster/myshardrs01_27118/mongo.keyfile
> /mongodb/sharded_cluster/myshardrs01_27218/mongo.keyfile
> /mongodb/sharded_cluster/myshardrs02_27318/mongo.keyfile
> /mongodb/sharded_cluster/myshardrs02_27418/mongo.keyfile
> /mongodb/sharded_cluster/myshardrs02_27518/mongo.keyfile
> /mongodb/sharded_cluster/myconfigrs_27019/mongo.keyfile
> /mongodb/sharded_cluster/myconfigrs_27119/mongo.keyfile
> /mongodb/sharded_cluster/myconfigrs_27219/mongo.keyfile
> /mongodb/sharded_cluster/mymongos_27017/mongo.keyfile
> /mongodb/sharded_cluster/mymongos_27117/mongo.keyfile' | xargs -n 1 cp -v /root/mongo.keyfile
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myshardrs01_27018/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myshardrs01_27118/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myshardrs01_27218/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myshardrs02_27318/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myshardrs02_27418/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myshardrs02_27518/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myconfigrs_27019/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myconfigrs_27119/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/myconfigrs_27219/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/mymongos_27017/mongo.keyfile"
"/root/mongo.keyfile" -> "/mongodb/sharded_cluster/mymongos_27117/mongo.keyfile"

修改配置文件指定keyfile

分别编辑几个服务的mongod.conf文件,添加相关内容:
image-20201021165504760

image-20201021165406807

mongos 比mongod少了authorization:enabled的配置。原因是,副本集加分片的安全认证需要配置两方面的,副本集各个节点之间使用内部身份验证,用于内部各个mongo实例的通信,只有相同keyfile才能相互访问。所以都要开启 keyFile:
/mongodb/sharded_cluster/mymongos_27117/mongo.keyfile 。
然而对于所有的mongod,才是真正的保存数据的分片。mongos只做路由,不保存数据。所以所有的mongod开启访问数据的授权authorization:enabled。这样用户只有账号密码正确才能访问到数据。

重新启动节点

必须依次启动配置节点、分片节点、路由节点:

image-20201021165539763

注意:
这里有个非常特别的情况,就是启动顺序。先启动配置节点,再启动分片节点,最后启动路由节点。
如果先启动分片节点,会卡住,提示:

about to fork child process, waiting until server is ready for connections

这也许是个 bug。原因未知。

创建帐号和认证

客户端mongo,通过localhost登录任意一个mongos路由,

[root@localhost ~]# /usr/local/mongodb/bin/mongo --port 27017
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("e422825c-9539-46bc-b4c6-3cf9eaaf51d4") }
MongoDB server version: 4.0.10
mongos> use admin
switched to db admin
mongos> db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
Successfully added user: { "user" : "myroot", "roles" : [ "root" ] }
mongos> db.auth("myroot","123456")
1
mongos> use articledb
switched to db articledb
mongos> db.createUser({user: "bobo", pwd: "123456", roles: [{ role: "readWrite",db: "articledb" }]})
Successfully added user: {
        "user" : "bobo",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "articledb"
                }
        ]
}
mongos>  db.auth("bobo","123456")
1
mongos> exit
bye
[root@localhost ~]# /usr/local/mongodb/bin/mongo --port 27017
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("e6e05eec-4c7f-46c8-86c0-43f5529efec6") }
MongoDB server version: 4.0.10
mongos> use articledb
switched to db articledb
mongos> show collections
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
mongos> db.auth("bobo","123456")
1
mongos> use articledb
switched to db articledb
mongos> show collections
author
comment
mongos>

提示:
通过mongos添加的账号信息,只会保存到配置节点的服务中,具体的数据节点不保存账号信息,因此,分片中的账号信息不涉及到同步问题。

SpringDataMongoDB连接认证

使用用户名和密码连接到 MongoDB 服务器,你必须使用'username:password@hostname/dbname' 格式,'username'为用户名,'password' 为密码。
目标:使用用户bobo使用密码 123456 连接到MongoDB 服务上。application.yml:

mongodb://bobo:123456@180.76.159.126:27017,180.76.159.126:27117/articledb

posted @ 2020-10-21 17:14  天宇轩-王  阅读(245)  评论(0编辑  收藏  举报