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

avatar
作者
筋斗云
阅读量:1


首先,作为前端的开发人员,使用 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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!