MongoDB集群搭建(三节点副本集)

软件包安装

0、主机规划

IP地址 访问端口
10.0.0.201 27017
10.0.0.202 27018
10.0.0.203 27019

1、MongoDB安装包下载

下载地址:https://www.mongodb.com/try/download/community

版本根据需求选择,Mongodb6.0及以上的版本没有mongo命令

2、上传至服务器,并添加环境变量

  1. 将下载的安装包mongodb-linux-x86_64-rhel70-6.0.5.tgz分别上传到三台服务器/root目录下
  1. 解压安装包到指定目录,在三台服务器分别执行该命令

    tar xvf mongodb-linux-x86_64-rhel70-6.0.5.tgz -C /usr/local

  1. 修改文件夹名称,在三台服务器分别执行该命令

    mv /usr/local/mongodb-linux-x86_64-rhel70-6.0.5 /usr/local/mongodb-6.0.5

  1. 添加环境变量,在三台服务器分别执行该命令

    echo "export PATH=$PATH:/usr/local/mongodb-6.0.5/bin" >> /etc/profile

  2. 使环境变量生效,在三台服务器分别执行该命令

    source /etc/profile

3、安装MongoDB依赖包

在三台服务器分别执行该命令

复制代码
yum install -y libcurl openssl xz-libs

4、创建目录,创建各节点配置文件

  1. 创建目录,根据需求分别在三台服务器上创建目录

节点服务器1

复制代码
mkdir -p /data/mongodb/node1/{data,log,config}

节点服务器2

复制代码
mkdir -p /data/mongodb/node2/{data,log,config}

节点服务器3

复制代码
mkdir -p /data/mongodb/node3/{data,log,config}
  1. 修改配置文件

节点服务器1

复制代码
vi /data/mongodb/node1/config/node1.conf

dbpath=/data/mongodb/node1/data  #数据存放目录 
logpath=/data/mongodb/node1/log/mongodb_node1.log #日志存放目录 pidfilepath=/data/mongodb/node1/data/node1.pid #指定文件保存mongod进程的进程ID 
fork=true #后台运行 
logappend=true #以追加的方式记录日志 
bind_ip=10.0.0.201 #绑定本机
ip port=27017 #mongodb端口 
replSet=rs0 #副本集名称,同一个副本集,名称必须一致 

节点服务器2

复制代码
vi /data/mongodb/node2/config/node2.conf

dbpath=/data/mongodb/node2/data #数据存放目录 
logpath=/data/mongodb/node2/log/mongodb_node2.log #日志存放目录 pidfilepath=/data/mongodb/node2/data/node2.pid #指定文件保存mongod进程的进程ID 
fork=**true** #后台运行 
logappend=**true** #以追加的方式记录日志 
bind_ip=10.0.0.202 #绑定本机
ip port=27018 #mongodb端口 
replSet=rs0 #副本集名称,同一个副本集,名称必须一致 

节点服务器3

复制代码
vi /data/mongodb/node3/config/node3.conf

dbpath=/data/mongodb/node3/data #数据存放目录
logpath=/data/mongodb/node3/log/mongodb_node3.log #日志存放目录pidfilepath=/data/mongodb/node3/data/node3.pid#指定文件保存mongod进程的进程ID
fork=true #后台运行
logappend=true #以追加的方式记录日志
bind_ip=10.0.0.203 #设置绑定本机ipport=27019 #mongodb端口
replSet=rs0 #副本集名称,同一个副本集,名称必须一致 

5、启动节点

  1. 启动节点

节点服务器1

复制代码
mongod -f /data/mongodb/node1/config/node1.conf

节点服务器2

复制代码
mongod -f /data/mongodb/node2/config/node2.conf

节点服务器3

复制代码
mongod -f /data/mongodb/node3/config/node3.conf
  1. 查看节点是否启动

    ps aux | grep mongo

6、安装 MongoDB Shell

因为Mongodb6.0及以上的版本没有mongo命令,所有无法使用mongo命令连接数据库

想在命令行连接数据库,需要给三台服务器安装MongoDB shell

  1. 下载安装包

    wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz

  1. 解压

    tar -xvf /root/mongosh-1.6.0-linux-x64.tgz -C /usr/local/

  1. 重命名

    mv /usr/local/mongosh-1.6.0-linux-x64 /usr/local/mongosh

  1. 添加环境变量

    echo "export PATH=$PATH:/usr/local/mongosh/bin" >> /etc/profile

  2. 使环境变量生效

    source /etc/profile

7、连接节点

  1. 连接第一个节点

    mongosh 10.0.0.201:27017

  1. 副本集初始化

    rs0:PRIMARY> rs.initiate()

  2. 添加副本节点

    rs0:PRIMARY> rs.add("10.0.0.202:27018") rs0:PRIMARY> rs.add("10.0.0.203:27019")

  3. 查看副本节点状态

    rs0:PRIMARY> rs.status()

  1. 查看同步进度oplog信息

返回一个汇总的各 Secondary 同步延迟信息

复制代码
rs0:PRIMARY> rs.printSecondaryReplicationInfo()

返回oplog 大小、保留时长、 起始时间等信息

复制代码
rs0:PRIMARY> rs.printReplicationInfo()

8、创建用户

创建超级管理员用户

复制代码
rs0:PRIMARY> use admin 
rs0:PRIMARY> db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]}) 
rs0:PRIMARY> db.auth("root","root")

创建库管理员

复制代码
rs0:PRIMARY> use admin 
rs0:PRIMARY> db.createUser({user:"admin",pwd:"admin",roles:[{role:"userAdminAnyDatabase",db:"admin"}]}) rs0:PRIMARY> db.auth("admin","123456")

9、创建KeyFile文件

keyfile是mongodb副本集的实例之间的权限认证,如果keyfile文件内容不同,那么该实例添加到副本集的时候,会出现不可达的状态

将主节点中的keyfile文件拷贝到复制集其他从节点服务器中,路径地址对应mongo.conf配置文件中的kevFile字段地址,并设置kevfile权限为600

注意: 创建keyFile前,需要先停掉复制集中所有主从节点的mongod服务,然后再创建,否则有可能出现服务启动不了的情况。

  1. 停止Mongodb服务

节点服务器2

复制代码
mongod --shutdown --config /data/mongodb/node2/config/node2.conf

节点服务器3

复制代码
mongod --shutdown --config /data/mongodb/node3/config/node3.conf

节点服务器1

复制代码
mongod --shutdown --config /data/mongodb/node1/config/node1.conf
  1. 在主节点创建keyfile文件,拷贝到另外两个节点(注意拷贝后也要改权限)

    openssl rand -base64 666 > /usr/local/mongodb-6.0.5/keyfile

  2. 设置kevfile权限为600

    chmod 600 /usr/local/mongodb-6.0.5/keyfile

10.更新节点配置文件并重启服务

  1. 主节点添加

    vi /data/mongodb/node1/config/node1.conf

添加以下内容:

复制代码
auth=true oplogSize=100 keyFile=/usr/local/mongodb-6.0.5/keyfile

2. 另外两个节点添加

复制代码
vi /data/mongodb/node2/config/node2.conf  vi /data/mongodb/node3/config/node3.conf

添加以下内容:

复制代码
oplogSize=100 keyFile=/usr/local/mongodb-6.0.5/keyfile

3. 重启服务

先停两个SECONDARY节点,再停PRIMARY节点

SECONDARY节点1

复制代码
mongod --shutdown --config /data/mongodb/node3/config/node3.conf

SECONDARY节点2

复制代码
mongod --shutdown --config /data/mongodb/node3/config/node3.conf

PRIMARY节点

复制代码
mongod --shutdown --config /data/mongodb/node3/config/node3.conf

先启动PRIMARY节点,再启动两个SECONDARY节点

PRIMARY节点

复制代码
mongod -f /data/mongodb/node1/config/node1.conf

SECONDARY节点1

复制代码
mongod -f /data/mongodb/node2/config/node2.conf

SECONDARY节点2

复制代码
mongod -f /data/mongodb/node3/config/node3.conf

11、设置开机自启服务

添加mongodb服务配置文件

复制代码
vi /lib/systemd/system/mongodb.service

添加以下字段

复制代码
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/mongodb-6.0.5/bin/mongod --config /data/mongodb/node2/config/node2.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb-6.0.5/bin/mongod --shutdown --config /data/mongodb/node2/config/node2.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

重载配置文件

复制代码
systemctl daemon-reload

设置mongodb.service权限

复制代码
chmod 754 /lib/systemd/system/mongodb.service

系统mongodb.service操作命令

复制代码
#启动服务
systemctl start mongodb.service
#关闭服务
systemctl stop mongodb.service
#开机启动
systemctl enable mongodb.service
#重启服务
systemctl restart mongodb.service

12、MongoDB副本集测试

在从节点的mongodb查看是否完成复制

  1. 在主节点的Mongodb上创建test并插入集合aaa

    rs0 [direct: primary] test> db.aaa.insert({AccountID:1,UserName:"123",password:"123456"})

  1. 查看是否创建

    rs0 [direct: primary] test> show tables
    rs0 [direct: primary] test> db.aaa.find()

  1. 查看副节点是否同步

    mongosh 10.0.0.202:27018

    rs0 [direct: secondary] test> use test
    rs0 [direct: secondary] test> show tables
    rs0 [direct: secondary] test> db.aaa.find()

复制代码
mongosh 10.0.0.203:27019

rs0 [direct: secondary] test> use test 
rs0 [direct: secondary] test> show tables
rs0 [direct: secondary] test> db.aaa.find()

主从替换

通过模拟主节点宕机来检验主从替换,以通过杀死指令杀死主进程来达到宕机效果

当主节点宕机后访问27018(从节点)端口,可以看到该端口对应的mongodb变成了主节点,以及当执行rs.status()命令时,显示27017端口的mongodb的状态为不可达/健康

  1. 主节点状态
  1. 从节点状态
  1. 宕掉主节点

    [root@localhost ~]# systemctl stop mongodb.service

  2. 登录从节点查看状态

    rs0 [direct: secondary] test> rs.status()

  3. 主节点宕机后的状态

  1. 从节点的状态

13、报错解决

1、报错:命令列表数据库需要身份验证

复制代码
MongoServerError: command listDatabases requires authentication

解决方案:认证用户

复制代码
rs0 [direct: primary] test> use admin switched to db admin
rs0 [direct: primary] admin> db.auth("root","123456")

2、报错:

复制代码
MongoServerError: not primary and secondaryOk=false - consider using db.getMongo().setReadPref() or readPreference in the connection string

mongodb默认是从主节点读写数据的,副本节点上不允许读

复制代码
rs0 [direct: secondary] test> show dbs;
2023-04-028T22:50:43.712+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not master and slaveOk=false",
        "code" : 13435,
        "codeName" : "NotMasterNoSlaveOk"
} :

解决方案:

复制代码
rs0 [direct: secondary] test> rs.slaveOk()
#当执行这条命令时会有一个警告,意思是这条参数可能在以后的版本弃用了,将会用 secondaryOk()代替
rs0 [direct: secondary] test> rs.secondaryOk()
相关推荐
sun00770043 分钟前
mysql索引底层原理
数据库·mysql
workflower3 小时前
MDSE和敏捷开发相互矛盾之处:方法论本质的冲突
数据库·软件工程·敏捷流程·极限编程
Tony小周4 小时前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
lifallen4 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
TDengine (老段)4 小时前
TDengine 数据库建模最佳实践
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Elastic 中国社区官方博客5 小时前
Elasticsearch 字符串包含子字符串:高级查询技巧
大数据·数据库·elasticsearch·搜索引擎·全文检索·lucene
Gauss松鼠会5 小时前
GaussDB应用场景全景解析:从金融核心到物联网的分布式数据库实践
数据库·分布式·物联网·金融·database·gaussdb
守城小轩5 小时前
Chromium 136 编译指南 - Android 篇:开发工具安装(三)
android·数据库·redis
尽兴-6 小时前
如何将多个.sql文件合并成一个:Windows和Linux/Mac详细指南
linux·数据库·windows·sql·macos
小小不董6 小时前
深入理解oracle ADG和RAC
linux·服务器·数据库·oracle·dba