|
| 1 | +--- |
| 2 | +title: '生产环境注意事项' |
| 3 | +sidebar_position: 21 |
| 4 | +--- |
| 5 | + |
| 6 | +本文主要讲解在单机(源码和`docker`部署)生产环境下,从数据备份到故障恢复需要关注的事项。 |
| 7 | + |
| 8 | +## 一、Mongo数据备份、恢复 |
| 9 | + |
| 10 | +服务端的核心数据保存在`mongo`中,只需要对mongo数据进行备份就足以恢复大部分数据,步骤如下: |
| 11 | + |
| 12 | +1. 修改`.env`文件中的`MONGO_BACKUP_DIR`为需要保存备份文件的目录(默认备份目录为`components/backup/mongo/`),尽量选择和`components`目录不同磁盘的目录。 |
| 13 | +2. 运行`docker compose up -d`启动容器。 |
| 14 | +3. 运行`docker exec -it mongo mongodump --uri="mongodb://openIM:openIM123@localhost:27017/openim_v3" --out="/data/backup/$(date +\%Y-\%m-\%d_\%H-\%M-\%S)";`,即可完成一次当前数据的备份。 |
| 15 | + |
| 16 | +### 定时备份 |
| 17 | + |
| 18 | +如果想要实现定时备份的功能,建议使用`linux`的`Crontab`定时任务实现。例如,想要每天凌晨2时进行一次数据备份,可以参考下面的步骤: |
| 19 | + |
| 20 | +1. 创建定时脚本,例如在`/data/open-im-server/`目录下创建一个名为`backup_mongo.sh`的脚本: |
| 21 | + ```sh |
| 22 | + vim /data/open-im-server/backup_mongo.sh |
| 23 | + ``` |
| 24 | + |
| 25 | +2. 在脚本中添加如下内容: |
| 26 | + ```sh |
| 27 | + #!/bin/bash |
| 28 | + docker exec mongo mongodump --uri="mongodb://openIM:openIM123@localhost:27017/openim_v3" --out="/data/backup/$(date +\%Y-\%m-\%d_\%H-\%M-\%S)" # 备份数据 |
| 29 | + docker exec mongo sh -c 'find /data/backup/ -mindepth 1 -maxdepth 1 -type d -exec stat --format="%Y %n" {} \; | sort -n | head -n -2 | cut -d" " -f2- | xargs rm -rf' # 只保留最新两个备份 |
| 30 | + ``` |
| 31 | + |
| 32 | +3. 添加执行权限: |
| 33 | + ```bash |
| 34 | + chmod +x /data/open-im-server/backup_mongo.sh |
| 35 | + ``` |
| 36 | + |
| 37 | +4. 创建定时任务: |
| 38 | + |
| 39 | + ```sh |
| 40 | + crontab -e # 打开cron配置 |
| 41 | + # 在crontab文件中添加下面一行表示每天2时执行命令,并且只保留最新的2个备份。 |
| 42 | + 0 2 * * * /data/open-im-server/backup_mongo.sh |
| 43 | + ``` |
| 44 | + |
| 45 | + 然后在编辑器中保存并退出 `crontab` 配置(通常按 `CTRL+X`,然后按 `Y` 保存)。 |
| 46 | + |
| 47 | +5. 运行`crontab -l`命令可查看定时任务是否添加成功。 |
| 48 | + |
| 49 | +如果需要其他定时规则,修改`cron`表达式即可。 |
| 50 | + |
| 51 | +以上命令会保留的最新的两个备份,可以防止在备份的过程中出现异常导致备份数据损坏而损失数据的情况。 |
| 52 | + |
| 53 | +### 恢复备份数据 |
| 54 | + |
| 55 | +如果需要恢复备份的数据,需要进行以下步骤: |
| 56 | + |
| 57 | +1. 停止`open-im-server`服务,运行`docker compose down`删除容器。 |
| 58 | + |
| 59 | +2. 删除`components/redis/`和`components/mongodb/data/`文件夹。 |
| 60 | + |
| 61 | +3. 到备份的目录中找到需要恢复的数据的名称,将下面命令中的`your_backup_name`替换为备份数据目录名称并运行: |
| 62 | + |
| 63 | + ```sh |
| 64 | + docker exec -it mongo mongorestore --uri="mongodb://openIM:openIM123@localhost:27017/openim_v3" /data/backup/your_backup_name/openim_v3 |
| 65 | + ``` |
| 66 | + |
| 67 | +4. 运行`docker compose up -d`启动容器,启动`open-im-server`服务。 |
| 68 | + |
| 69 | +## 二、组件异常停止 |
| 70 | + |
| 71 | +1. 如果`mongo`、`redis`、`kafka`异常停止,先尝试重启服务。 |
| 72 | + |
| 73 | +2. 如果由于数据原因启动失败: |
| 74 | + |
| 75 | + - `redis`启动失败:删除`components/redis/`目录。 |
| 76 | + - `kafka`启动失败:删除`components/kafka/`目录。 |
| 77 | + - `mongo`启动失败:尝试[恢复备份数据文件](#恢复备份数据)。 |
| 78 | + |
| 79 | + 对数据进行相应操作后启动服务。 |
| 80 | + |
| 81 | +3. 如果`etcd`异常停止,需要首先关闭`open-im-server`和`chat`服务,然后重启`etcd`组件后,再启动`open-im-server`和`chat`服务。 |
| 82 | + 如果`etcd`启动失败,删除`components/etcd/`目录,再尝试启动。 |
| 83 | + |
| 84 | +## 三、潜在风险 |
| 85 | + |
| 86 | +1. 单机情况下,如果由于机器故障导致服务崩溃,则无法恢复数据。 |
| 87 | +2. 为了防止由于磁盘硬件故障导致的数据丢失,建议将`mongo`的备份目录设置为与`components`目录不同磁盘的目录下。 |
| 88 | +3. 当恢复备份数据时,会丢失备份时间之后的所有数据。备份数据的间隔如果过短,**会对性能造成较大损耗**。 |
| 89 | +4. 恢复备份数据为了保证数据一致性,需要删除`redis`中的数据,会导致**消息的未读数异常**。 |
0 commit comments