单服务器部署mongodb数据库三节点集群详细教程

参考链接: CentOS7.4搭建基于用户认证的MongoDB4.0三节点副本集集群详细文档 - xshrim - 博客园

注意:

多服务器和单服务器各项配置和操作略有不同,需要区分清楚,

本教程使用的是mongodb 4.2.11版本。

测试的服务器配置为 1核CPU,2G内存 40G ssd硬盘 的阿里云服务器,系统为CentOS 7.9版本

目录

第一步, 创建目录结构

第二步, 安装数据库及配置环境

第三步, 创建和部署配置文件mongod.conf

第四步, 执行启动命令,启动三个数据库(无用户登录认证)

第五步, 配置集群.

第六步, 添加用户

第七步,关闭数据库

第八步,生成keyFile

第九步,修改mongod.conf文件,取消注释信息

第十步,再次启动三个节点的数据库,开启用户登录认证

第十一步,再次登录数据库,验证创建的用户是否正常

第十二步,远程连接数据库

第一步, 创建目录结构。

节点规划:

节点名

节点用途

节点IP

节点端口

集群名称

node01

主节点(PRIMARY)

127.0.0.1

27017

mongodbData

node02

从节点(SECONDARY)

127.0.0.1

27018

mongodbData

node03

仲裁节点(ARBITER)

127.0.0.1

27019

mongodbData

数据库安装目录:(3个节点)

目录

用途

/website/mongodbData 

//这里是集群目录,也是存放下载安装包的目录

/website/mongodbData/node01

//主节点(PRIMARY)目录

/website/mongodbData/node01

//从节点(SECONDARY)目录

/website/mongodbData/node01

//仲裁节点(ARBITER)目录

目录规划:node01(节点名)目录下需要创建以下三个子目录,三个节点(node01、node02、node03)都需要创建:

目录

用途

/node01/data

Mongo集群数据文件目录

/node01/logs

Mongo集群系统日志目录

/node01/conf

Mongo集群配置文件目录

第二步, 安装数据库及配置环境。

三节点mongodb安装及配置均需要执行以下操作步骤:

1

下载

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.12.tgz

2

解压

tar -zxvf mongodb-linux-x86_64-rhel70-4.4.12.tgz

3

安装

mv mongodb-linux-x86_64-rhel70-4.4.12 /usr/local/share/mongodb

4

环境配置

echo 'export PATH=/usr/local/share/mongodb/bin:$PATH' >> /etc/profile

5

使配置生效

source /etc/profile

6

查看安装情况

mongo --version

如果打印以下信息泽成功:

MongoDB shell version v4.2.11
  git version: ea38428f0c6742c7c2c7f677e73d79e17a2aab96
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
  allocator: tcmalloc
modules: none
build environment:
    distmod: rhel70
distarch: x86_64
target_arch: x86_64

第三步, 创建和部署配置文件mongod.conf

注意1:三个节点下的mongod.conf除了路径与端口不同,其它都一样。

端口

所在上级目录

27017

node01

27018

node02

27019

node03

注意2:security部分和setParameter部分的参数,用于启用集群用户认证, 需要先注释掉, 等集群搭建完成再启用。也就是在未创建完成密钥之前注释。即是几个#号后面是注释的内容。

#security:
#    keyFile: "/website/mongodbData/node01/conf/access.key"
#    authorization: enabled
#setParameter:
#    authenticationMechanisms: SCRAM-SHA-1

完整的mongod.conf文件(这个是XX项目数据库的设置)内容如下: 

systemLog:
    destination: file
    path: "/website/mongodbData/node01/logs/mongod.log"
    logAppend: true
storage:
    dbPath: "/website/mongodbData/node01/data"
    journal:
        enabled: true
processManagement:
    fork: true
    pidFilePath: "/website/mongodbData/mongod.pid"
net:
    bindIpAll: true
    port: 27017
#security:
#    keyFile: "/website/mongodbData/node01/conf/access.key"
#    authorization: enabled
#setParameter:
#    authenticationMechanisms: SCRAM-SHA-1
replication:
    oplogSizeMB: 500
    replSetName: mongodbData

注意的错误情况

创建mongod.conf文件时,一定要注意文件内容是否按照上面每一行的空格严格编写,如果不是,则容易出现错误。

第二个问题是 data 还有 logs 文件没有创建

mongod.conf文件存放相关目录如下:

/website/mongodbData/node01/conf/mongod.conf

/website/mongodbData/node02/conf/mongod.conf

/website/mongodbData/node03/conf/mongod.conf

第四步, 执行启动命令,启动三个数据库(无用户登录认证)。

相关目录与mongod.conf也放置好后,依次执行以下三个启动命令:

注意:此时是无验证的启动,暴露全部的数据库给任意登录的用户进程操作,非常危险,所以第八步开始,用于配置和启用有用户登录的认证

mongod -f /website/mongodbData/node01/conf/mongod.conf
&&
mongod -f /website/mongodbData/node02/conf/mongod.conf
&&
mongod -f /website/mongodbData/node03/conf/mongod.conf

注意的错误情况

执行 命令时出现以下情况,是因为可能确实data文件夹和logs文件夹,增加后解决

about to fork child process, waiting until server is ready for connections.
forked process: 21988
ERROR: child process failed, exited with 1
To see additional information in this output, start without the "--fork" option.

注意报错的地方2:

下面报这个错误是因为conf配置表的空格问题

Unrecognized option: path
try 'mongod --help' for more information

第五步, 配置集群

进入其中一个节点(主节点)的mongo控制台, 配置集群(务必保证节点防火墙关闭或开放mongo服务端口).

仅在一个节点执行命令进入mongo控制台:   mongo 127.0.0.1:27017

方法:

1

生成集群配置变量并加入3个节点配置

cfg = {_id: 'mongodbData', members: [{_id: 1, host: '127.0.0.1:27017'},{_id: 2, host: '127.0.0.1:27018'},{_id: 3, host: '127.0.0.1:27019', arbiterOnly: true}]}

2

根据变量配置集群

rs.initiate(cfg)

3

查看集群是否配置成功

先执行 rs.isMaster()  设置主节点,再执行rs.status() 查看状态


注意,如果是出行20717 变成从节点,而20718变成主节点,需要进入到当前主节点20718

先执行 rs.freeze(120) 进行冻结,
再执行 rs.stepDown(120) 进行降级

然后进入20717 执行 rs.isMaster()  然后等待120秒,再执行rs.status() 查看状态 看看是否恢复主节点,因为在偶然出行使用一段时间后,发现数据库自动关闭,然后主从数据库颠倒的情况。


4

退出shell

同时按下Ctrl+C

第六步, 添加用户

集群配置完成后, 仍然在主节点的mongo控制台中添加三个用户:数据库管理员, 集群管理员和访问特定数据库的用户.

仅在一个节点执行命令进入mongo控制台: mongo 127.0.0.1:27017

1

使用内置的admin库

use admin

2

创建数据库管理员

db.createUser({user:"root",pwd:"root_jY_2021",roles:[{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]})

3

创建集群管理员

db.createUser({user:"suroot",pwd:"suroot_jY_2021",roles:[{role:"clusterAdmin",db:"admin"},{role:"clusterManager",db:"admin"},{role:"clusterMonitor",db:"admin"}]})

4

切换到testdb数据库,(不用事先创建)

use testdb

5

创建特定库的特定用

db.createUser({user:"test",pwd:"test",roles:[{role:"readWrite",db:"testdb"},{role:"dbAdmin",db:"testdb"},{role:"userAdmin",db:"testdb"}]})

6

切换到admin数据库

use admin

7

查看创建的用户

db.system.users.find()

8

退出shell

同时按下Ctrl+C

注意事项:

  1. MongoDB的用户和数据库是绑定的, 必须指定某个用户归属于哪个数据库, 即在roles字段的每个role中指定db字段.
  2. 数据库管理员通常需要具有读写,管理任意数据库和管理任意用户的role, 后续可以登录此用户进行数据库和用户的增删改查.
  3. 集群管理员通常需要具有集群管理和集群监控的role, 只有集群管理员可以关闭集群.
  4. 普通用户根据用途不同可以对特定或者多个数据库拥有各种不同的role, 本例中的test用户既可以读写testdb库, 同时也是testdb库的管理员.
  5. 主节点上添加的用户应该能够在从节点上查询到(需要先键入rs.slaveOk()命令).

第七步,关闭数据库

用户添加完成后需要关闭所有节点(先关闭仲裁和从节点, 再关闭主节点, 避免主节点切换):

关闭三个节点,按顺序执行执行:

1-1

进入仲裁节点执行命令

mongo 127.0.0.1:27019

1-2

进入数据库

use admin

1-3

关闭mongo后台进程

db.shutdownServer()

1-4

退出shell

同时按下Ctrl+C

2-1

进入从节点执行命令

mongo 127.0.0.1:27018

2-2

进入数据库

use admin

2-3

关闭mongo后台进程

db.shutdownServer()

2-4

退出shell

同时按下Ctrl+C

3-1

进入主节点执行命令

mongo 127.0.0.1:27017

3-2

进入数据库

use admin

3-3

关闭mongo后台进程

db.shutdownServer()

3-4

退出shell

同时按下Ctrl+C

第八步,生成keyFile

keyFile的长度必须在6-1024个字符之间。keyFile的用途是作为所有mongod后台进程允许加入集群的凭证, 所有集群中的节点共用一个keyFile, 避免其他mongod非法加入集群):

仅在一个节点执行(本机执行),步骤如下:

1

生成keyFile并放入node01(主节点)

openssl rand -base64 756 > /website/mongodbData/node01/conf/access.key

2

设置keyFile文件为只读

chmod 400 /website/mongodbData/node01/conf/access.key

3

将keyFile复制到node02(从节点)

cp /website/mongodbData/node01/conf/access.key /website/mongodbData/node02/conf/

4

将keyFile复制到node03(仲裁节点)

cp /website/mongodbData/node01/conf/access.key /website/mongodbData/node03/conf/

第九步,修改mongod.conf文件,取消注释信息

完成后取消三个节点mongod.conf文件中security与setParameter部分的注释,然后重新启动即是带权限的方式了,之前的都是没有权限的启动

security:
    keyFile: "/website/mongodbData/node01/conf/access.key"
  authorization: enabled
setParameter:
    authenticationMechanisms: SCRAM-SHA-1

第十步,再次启动三个节点的数据库,开启用户登录认证

依次启动主节点, 从节点和仲裁节点的mongod后台进程:

mongod -f /website/mongodbData/node01/conf/mongod.conf
&&
mongod -f /website/mongodbData/node02/conf/mongod.conf
&&
mongod -f /website/mongodbData/node03/conf/mongod.conf

第十一步,再次登录数据库,验证创建的用户是否正常

进入主节点执行命令:  mongo 127.0.0.1:27017

操作一:

1

使用内置的admin数据库

use admin

2

使用数据库管理员认证

db.auth('root', 'root_jY_2021')

3

退出shell

同时按下Ctrl+C

操作二:

1

使用内置的admin数据库

use admin

2

切换到集群管理员用户

db.auth('root', 'root_jY_2021')

3

查看创建的用户

db.auth('suroot', 'suroot_jY_2021')

4

退出shell

同时按下Ctrl+C

操作三:

1

切换到testdb数据库

use testdb

2

切换到切换到test用户

db.auth('test', 'test')

3

退出shell

同时按下Ctrl+C

至此, 单服务器下基于用户认证的MongoDB4.2.11三节点副本集集群环境已经搭建完成,下面连接数据库.

第十二步,远程连接数据库:

方法一:

使用Studio 3T可视化工具远程连接(超级管理员)配置如下,只需要连接单节点

方法二:

let MongoClient=require('mongodb').MongoClient;
let mongoUrl="mongodb://root:root_jY_2021@xx.xx.xx.xx:27017/admin";
MongoClient.connect(mongoUrl,{ useNewUrlParser: true,useUnifiedTopology: true }, async function(err, pt_clientObj) {
       
if(err) {console.error("发生错误",err);}
       
let client = pt_clientObj.db();
       
console.log("连接成功");
});


 

Logo

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

更多推荐