Linux(CentOS7.9)MongoDB的安装配置教程3个服务器+增量备份(带脚本)


首先,作为前端的开发人员,使用 MongoDB 数据库是非常常见的,接下来是在 Linux 系统下安装和配置 MongoDB 的过程。只要按照以下步骤操作,相信你一定可以顺利完成安装。

Ⅰ、安装前的简介:
1、什么是 MongoDB 数据库? MongoDB 是用 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统。它能在高负载情况下通过添加更多节点来保证服务器性能。MongoDB 旨在为 WEB 应用提供一个可扩展的高性能数据存储解决方案。它将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。

2、什么是 Compass 工具?
Compass 是一个用于通过图形化界面操作 MongoDB 数据库的可视化工具。它既是一个软件也是一个工具,在 MongoDB 的官网上可以找到并下载。

3、什么样的结果才能证明 MongoDB 数据库安装成功?
在终端中输入命令访问 http://localhost:27017;如果在页面显示信息为:“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,就证明 MongoDB 已经安装好了,完成了安装任务。

4、为什么在安装完毕后,还需要配置本地 Linux 上的 MongoDB 服务?
因为如果每次都在指定位置运行命令会比较麻烦,所以我们需要设置一个服务,使其可以作为守护进程自动启动。这就需要我们把 MongoDB 设置为系统服务,并配置启动脚本(这通常涉及到编辑 systemd 的服务文件,设置日志和数据文件的存储路径)。
 

Ⅱ、下载并安装 MongoDB 数据库
1:操作系统安装过程忽略

2:操作系统的字符集应是中文,否则数据库的中文排序会有问题

3:操作系统的时区应是Asia/Shanghai,否则数据库的默认时区会不正确
(重复三遍)

4:所有配置文件仅列出修改部分

4:所有配置文件仅列出修改部分

4:所有配置文件仅列出修改部分
*******************************

5:假设有3台服务器,IP分别为192.168.0.131、192.168.0.132、192.168.0.133,131作为主节点,132作为从节点,133作为仲裁节点兼数据库节点

按官网文档描述,生产环境应以主机名或域名方式配置集群节点,故实际操作过程中应将这3个IP替换成对应的主机名,确保服务器之间主机名能互相识别

6:以下所有操作都以root权限执行,可以直接用root登录,也可以用sudo
正式开始
7:下载安装包在三个节点服务器都需要下载,如果是在自己搭建虚拟机测试的话可以建立一个然后克隆虚拟机(131+132+133)

curl -O https://repo.mongodb.org/yum/redhat/7/mongodb-org/6.0/x86_64/RPMS/mongodb-org-server-6.0.12-1.el7.x86_64.rpm &&\
curl -O https://downloads.mongodb.com/compass/mongodb-mongosh-2.1.1.x86_64.rpm &&\
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libzstd-1.5.5-1.el7.x86_64.rpm &&\
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-devel-5.0.1-7.el7.x86_64.rpm &&\
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-5.0.1-7.el7.x86_64.rpm &&\
curl -O https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/l/llvm5.0-libs-5.0.1-7.el7.x86_64.rpm

8:安装libzstd(131+132+133)
 

yum install -y libzstd-1.5.5-1.el7.x86_64.rpm &&\
yum install -y centos-release-scl-rh llvm5*

9:开放防火墙端口(131+132+133)

firewall-cmd --zone=public --add-port=27017/tcp --permanent &&\
firewall-cmd --zone=public --add-port=5432/tcp --permanent &&\
systemctl restart firewalld &&\
firewall-cmd --list-ports


10:安装及设置mongo集群(主从仲裁模式)
10.1安装(131+132+133)

yum install -y mongodb-org-server-6.0.12-1.el7.x86_64.rpm &&\
yum install -y mongodb-mongosh-2.1.1.x86_64.rpm

 10.2生成集群密钥(131生成后复制到132和133)
 

mkdir /etc/mongo && openssl rand -base64 749 > /etc/mongo/security.key &&\
chmod 0600 /etc/mongo/security.key && chown mongod:mongod /etc/mongo/security.key

10.3修改配置文件(131+132+133)
vi /etc/mongod.conf

systemLog:
  logRotate: rename
storage:
    directoryPerDB: true
net:
    bindIp: 0.0.0.0
security:
  authorization: enabled
  keyFile: /etc/mongo/security.key
replication:
  replSetName: "mongo-gmp-rs" 
  oplogSizeMB: 4096

10.4:重启(131+132+133) 
 

systemctl restart mongod

 10.5主节点执行集群初始化(131)
使用mongosh命令进入mongo命令行
mongosh

use admin
rs.initiate({
  _id: "mongo-gmp-rs",
  version: 1,
  members: [
    { _id: 0, host : "192.168.0.131:27017", "priority": 20 },
    { _id: 1, host : "192.168.0.132:27017", "priority": 10 },
    { _id: 2, host : "192.168.0.133:27017", arbiterOnly: true }
  ]
})

 10.6:创建管理员和gmp用户并修改写入策略(131)
集群初始化等待几秒后回车,看到mongosh提示符变成primary再继续执行,如未变成primary则继续等待再回车,直至出现primary
rs.status()为查看集群状态,密码根据实际需要修改,db.auth()第二个参数是管理员密码
 

use admin
db.createUser({user:"admin",pwd:"admin",roles:[{role:"root",db:"admin"}]})
db.auth("admin","admin")
db.createUser({user:"gmp",pwd:"gmp",roles:[{role:"dbAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"}]})
db.adminCommand({"setDefaultRWConcern" : 1,"defaultWriteConcern" : {"w" : 1}})
rs.status()

 至此mongo的安装以及集群设置完成
III:增量备份
1:增量备份介绍
MongoDB 的增量备份是指备份自上一个备份以来数据库中发生变化的数据。这种方式可以显著减少备份数据的大小,同时也减少了备份操作对系统性能的影响。在 MongoDB 中,增量备份通常依赖于 oplog(操作日志)来实现。下面是一个详细的介绍,包括增量备份的创建和还原过程。
2:增量备份的创建

  1. 确保启用了 oplog: MongoDB 的副本集自动使用 oplog 来记录数据的所有更改。如果你的数据库运行在副本集模式,oplog 会自动启用。对于单机部署,你可以通过将其转换为一个单节点的副本集来启用 oplog。

  2. 进行全量备份: 在开始进行增量备份之前,你需要有一个最近的全量备份。这个全量备份作为增量备份的基础。你可以使用 mongodump 工具来进行全量备份。
     

    mongodump --host mongodb.example.net --port 27017 --out /path/to/backup/directory
    
  3. 记录增量备份的起点: 增量备份依赖于 oplog,因此你需要知道上一次备份结束时的 oplog 位置。这可以通过查看备份结束时 oplog 的最后一条记录来确定。

  4. 创建增量备份: 当你需要创建增量备份时,你需要从上次备份结束时的 oplog 位置开始,将 oplog 中的所有新条目复制到备份位置。这可以通过 mongodump 工具和查询 oplog 集合来完成。
     

    mongodump --host mongodb.example.net --port 27017 --db local --collection oplog.rs --query '{"ts": {"$gt": Timestamp(上次备份的时间戳, 1)}}' --out /path/to/incremental/backup/directory
    

增量备份的还原

增量备份的还原过程涉及到首先还原一个全量备份,然后应用所有增量备份中记录的 oplog 条目。

1:还原全量备份: 使用 mongorestore 工具还原最近的全量备份。
 

mongorestore --host mongodb.example.net --port 27017 /path/to/backup/directory

2:接下来,你需要按照时间顺序应用每一个增量备份。这涉及到读取增量备份中的 oplog 条目,并使用 mongoreplay 工具(或通过其他方法)应用这些条目。
 

mongoreplay --host mongodb.example.net --port 27017 --replayOplog /path/to/incremental/backup/directory/local/oplog.rs.bson

注意事项

  • 备份频率:根据数据变更的频率和容忍的数据丢失量来决定增量备份的频率。
  • 监控存储空间:虽然增量备份比全量备份节省空间,但随着时间的推移,增量备份也会占用大量的存储空间。定期监控和维护备份存储空间是很重要的。
  • 安全性:确保备份数据的安全性,使用加密和安全的传输方式来存储和移动备份文件。
  • 测试还原过程:定期测试备份的还原过程是确保数据可恢复性的关键。

正片开始******************************************************************************************

1.full_bakup.sh(全量备份脚本)在这之前需要建立一个时间戳文件full_backup_timestamp.txt用来记录和更新全量备份的时间戳

#!/bin/bash

# 全备份脚本

# MongoDB 认证信息和备份目录
USERNAME="$MONGO_USER"
PASSWORD="$MONGO_PASS"
OUT_DIR="/mnt/hgfs/sharing/full"

# 执行全备份
mongodump --host localhost --port 27017 --username $USERNAME --password $PASSWORD --authenticationDatabase admin --db gmpmongodb --out $OUT_DIR/$(date +%F-%H%M%S)
# 调用 get_last_op_timestamp.sh 脚本来更新时间戳
/mnt/hgfs/sharing/get_last_op_timestamp.sh

2:get_last_op_timestamp.sh(获取最后时间戳)

#!/bin/bash

# 确保环境变量已经设置
if [ -z "$MONGO_USER" ] || [ -z "$MONGO_PASS" ]; then
  echo "MongoDB 用户名或密码环境变量未设置。"
  exit 1
fi

# 连接到 MongoDB 并获取最后操作的时间戳
LAST_OP_TS=$(mongosh --host localhost --port 27017 --username "$MONGO_USER" --password "$MONGO_PASS" --authenticationDatabase admin --quiet --eval 'db = db.getSiblingDB("local"); db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts')

# 使用 awk 提取时间戳秒数
LAST_OP_TS_SECONDS=$(echo $LAST_OP_TS | awk '{print substr($3, 1, length($3)-1)}')

# 将时间戳秒数写入文件
echo $LAST_OP_TS_SECONDS > /mnt/hgfs/sharing/full_backup_timestamp.txt

echo "最后操作时间戳已保存到: /mnt/hgfs/sharing/full_backup_timestamp.txt"

3:incremental_backup.sh(增量备份脚本)
 

#!/bin/bash

# 增量备份脚本

# MongoDB 认证信息和备份目录
USERNAME="$MONGO_USER"
PASSWORD="$MONGO_PASS"
OUT_DIR="/mnt/hgfs/sharing/incremental"

# 读取上次备份的时间戳
LAST_T=$(cat /mnt/hgfs/sharing/full_backup_timestamp.txt)
LAST_I=1

# 执行增量备份,包括具体的时间戳以避免覆盖
mongodump --host localhost --port 27017 --username $USERNAME --password $PASSWORD --authenticationDatabase admin --db local --collection oplog.rs --query "{\"ts\": {\"\$gt\": {\"\$timestamp\": {\"t\": $LAST_T, \"i\": $LAST_I}}}}" --out $OUT_DIR/$(date +%F-%H%M%S)

# 调用 get_last_op_timestamp.sh 脚本来更新时间戳
/mnt/hgfs/sharing/get_last_op_timestamp.sh

4:restore_backup.sh(增量恢复脚本)
 

#!/bin/bash

# MongoDB 认证信息
USERNAME="$MONGO_USER"
PASSWORD="$MONGO_PASS"
AUTH_DB="admin"
HOST="localhost"
PORT="27017"

# 全量和增量备份目录
FULL_BACKUP_DIR="/mnt/hgfs/sharing/full"
INCREMENTAL_BACKUP_DIR="/mnt/hgfs/sharing/incremental"

# 检查备份目录是否存在
if [ ! -d "$FULL_BACKUP_DIR" ]; then
    echo "Full backup directory does not exist."
    exit 1
fi

if [ ! -d "$INCREMENTAL_BACKUP_DIR" ]; then
    echo "Incremental backup directory does not exist."
    exit 1
fi

# 选择全备份进行恢复
echo "Available full backups:"
select FULL_BACKUP in $(ls $FULL_BACKUP_DIR | sort -V); do
    if [ -n "$FULL_BACKUP" ]; then
        echo "You have selected the full backup from: $FULL_BACKUP"
        FULL_BACKUP_PATH="$FULL_BACKUP_DIR/$FULL_BACKUP/"
        echo "Restoring from full backup path: $FULL_BACKUP_PATH"
        if ! mongorestore --drop --host $HOST --port $PORT --username $USERNAME --password $PASSWORD --authenticationDatabase $AUTH_DB "$FULL_BACKUP_PATH"; then
            echo "Failed to restore full backup."
            exit 1
        fi
        break
    else
        echo "Invalid selection. Please try again."
    fi
done

# 确认用户是否想要继续恢复增量备份
echo "Do you want to restore an incremental backup? (yes/no)"
read -r CONTINUE_RESTORE
if [[ "$CONTINUE_RESTORE" != "yes" ]]; then
    echo "Incremental restore skipped. Restore process is complete."
    exit 0
fi

# 列出所有增量备份
echo "Available incremental backups after the full backup: $FULL_BACKUP"
INCREMENTAL_BACKUPS=($(ls $INCREMENTAL_BACKUP_DIR | sort -V))
SELECTED_INCREMENTAL_BACKUP=""
COUNTER=1
INCREMENTAL_BACKUP_MENU=()
for INCREMENTAL_BACKUP in "${INCREMENTAL_BACKUPS[@]}"; do
    if [[ "$INCREMENTAL_BACKUP" > "$FULL_BACKUP" ]]; then
        INCREMENTAL_BACKUP_MENU+=("$INCREMENTAL_BACKUP")
        echo "$COUNTER) $INCREMENTAL_BACKUP"
        let COUNTER=COUNTER+1
    fi
done

# 选择增量备份进行恢复
echo "Please select the incremental backup to restore up to (type the number):"
read -r INCREMENTAL_CHOICE
INCREMENTAL_CHOICE=$((INCREMENTAL_CHOICE-1))

if [ $INCREMENTAL_CHOICE -ge 0 ] && [ $INCREMENTAL_CHOICE -lt ${#INCREMENTAL_BACKUP_MENU[@]} ]; then
    SELECTED_INCREMENTAL_BACKUP="${INCREMENTAL_BACKUP_MENU[$INCREMENTAL_CHOICE]}"
    echo "You have selected the incremental backup: $SELECTED_INCREMENTAL_BACKUP"
    # 应用所有增量备份,直到选择的备份
    for ((i=0; i<=$INCREMENTAL_CHOICE; i++)); do
        backup="${INCREMENTAL_BACKUP_MENU[$i]}"
        echo "Applying incremental backup: $backup"
        INCREMENTAL_BACKUP_PATH="$INCREMENTAL_BACKUP_DIR/$backup/local/"
        # 确保oplog.rs.bson存在
        if [ ! -f "$INCREMENTAL_BACKUP_PATH/oplog.rs.bson" ]; then
            echo "oplog.rs.bson not found in $INCREMENTAL_BACKUP_PATH"
            exit 1
        fi
        if ! mongorestore --host $HOST --port $PORT --username $USERNAME --password $PASSWORD --authenticationDatabase $AUTH_DB --oplogReplay "$INCREMENTAL_BACKUP_PATH/oplog.rs.bson"; then
            echo "Failed to apply incremental backup: $backup"
            exit 1
        fi
    done
    echo "All selected incremental backups have been applied."
else
    echo "Invalid selection for incremental backup."
    exit 1
fi

echo "Restore process is complete."

自此增量备份结束,我的脚本都有很详细明确的回显命令,和很多可选参数,简单易上手,有什么我呢提可以问我,第一次发博客不太懂。请多多指教
附上一个我使用的ai,3.5的,我的脚本就是在他的帮助下写出来的。 AIchatOS

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值