首先,作为前端的开发人员,使用 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:增量备份的创建
确保启用了 oplog: MongoDB 的副本集自动使用 oplog 来记录数据的所有更改。如果你的数据库运行在副本集模式,oplog 会自动启用。对于单机部署,你可以通过将其转换为一个单节点的副本集来启用 oplog。
进行全量备份: 在开始进行增量备份之前,你需要有一个最近的全量备份。这个全量备份作为增量备份的基础。你可以使用
mongodump
工具来进行全量备份。
mongodump --host mongodb.example.net --port 27017 --out /path/to/backup/directory
记录增量备份的起点: 增量备份依赖于 oplog,因此你需要知道上一次备份结束时的 oplog 位置。这可以通过查看备份结束时 oplog 的最后一条记录来确定。
创建增量备份: 当你需要创建增量备份时,你需要从上次备份结束时的 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