OpenIM 的升级方案的设计
OpenIM 升级面对的几个挑战:
- 平常版本的小幅度变化(v3.3 -> v3.4):脚本,配置文件的变化
- 重要版本的大幅度变化(v3.4 -> v3.5):Mongo 数据库替换掉 Mysql
- 环境变量没办法保存
- 集群部署没办法无感知
- 源码脚本部署面临配置文件和脚本的问题
- DATA_DIR 变量对应的依赖中间件的数据和配置存储路径不一致
RFC:
sk 说的 docker compose 的可能借鉴改进地方
(1)-f 分开 组件的 其他的; 密码相关通过环境变量传递,不通过配置文件设置; 同一个变量多个组件使用,就通过环境变量; (2)脚本 config都作为镜像一部分; (3)config 映射出来可以进行修改; (4)config增加版本号,程序启动时检测版本号,如果不一致则失败; (5)使用env.example , config.example;
参考 livekit rocketchat mattermost部署
linux (1)去掉configy.yaml和.env ,通过make init生成configy.yaml .env; (2)make init做个提示,是否覆盖已有的config.yaml、env; (3)make init以后,建议单独修改.env或者某个配置文件; (4)共享的变量,通过环境变量,程序优先读取环境变量; 升级 (1)git pull ; 不会冲突; export barnch 3.5; (2)make update; 覆盖.env.sample 自己对比.env和env.smaple(包含老的.env和新的模板) configy.yaml 和 config.yaml.sample合并; 变成新的.env和configy.yaml (3)up -d
个人想法
docker compose 一般是做测试,或者 allinone 体验的,比较希望它功能定位比较简单。
- 升级 docker compose ,提供默认的参数选项
- 注意现有的 .env 自动生成的,可以通过这种方式抛弃掉,对源码来说不需要,Windows 部署的话只需要
- 改进现有的文档体系,尤其是环境变量的文档,地址是 https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/environment.md 详细说明各种配置方法
- make init 提供一个选择性覆盖的选项
docker compose down:
docker-compose down
:docker-compose down
命令用于停止并删除 Docker Compose 配置文件中定义的所有服务和相关容器、网络以及卷。- 它会执行以下操作:
- 停止运行中的服务容器。
- 移除相关的容器、网络和数据卷。
- 如果定义了
--volumes
选项,它会删除数据卷(包括持久化数据),否则数据卷会保留在本地文件系统上。
- 通常用于彻底清理 Docker Compose 环境,包括删除数据。
docker-compose stop
:docker-compose stop
命令用于停止 Docker Compose 配置文件中定义的所有服务的运行,但不会删除相关的容器、网络或数据卷。- 它会执行以下操作:
- 停止运行中的服务容器。
- 保留相关的容器、网络和数据卷,以便稍后可以使用
docker-compose start
或docker-compose up
重新启动服务。
- 通常用于临时停止服务,而不希望删除相关资源。
OpenIM Docker 仓库只是用来提供测试的
目录结构设定约束,考虑用分支来
提供的部署方案
所有的部署(除开 Kubernetes 但又不例外:compose 作为测试)都是依赖中间件的,所以中间件层作为通用层方案会简单很多。
+----------------------------------+
| 生态层 (Ecology) |
|----------------------------------|
| Prometheus Grafana |
| chat opnkf ... |
+----------------------------------+
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
| | | | | | | | | | |
+----------------------------------+
| Server 层 (Server) |
|----------------------------------|
| IM 通信服务端 ... |
| ... ... |
+----------------------------------+
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
| | | | | | | | | | |
+----------------------------------+
| 中间件层 (Middleware) |
|----------------------------------|
| MySQL Redis MongoDB |
| Kafka ZooKeeper (其他) ... |
+----------------------------------+
- 源码快速部署体验 OpenIM (非稳定)
- 源码使用 System 生产部署 OpenIM (稳定)
- Docker 的方式部署 OpenIM(不建议生产)
- Kubernetes 的部署
- Sealos 快捷部署
- Debian 发布部署
- RHEL 8 发布部署
- 根据 https://github.com/OpenIMSDK/Open-IM-Server/releases 探索更多的部署指南
设计图:
1. Linux 部署方案
Linux 是最常见的服务器操作系统,支持多种包管理器。
a. 基于 Debian/Ubuntu (使用 .deb 包)
- 使用
dpkg
或apt
安装.deb
文件。 - 配置 MySQL 或兼容数据库。
- 设置必要的依赖和环境变量。
b. 基于 Red Hat/CentOS (使用 .rpm 包)
- 使用
rpm
或yum
/dnf
安装.rpm
文件。 - 类似地配置数据库和依赖项。
c. 基于 Arch Linux (使用 .pkg.tar.zst 包)
- 使用
pacman
安装.pkg.tar.zst
文件。 - 配置数据库和其他依赖。
d. 基于 Alpine Linux (使用 .apk 包)
- 在适用于轻量级部署的 Alpine Linux 上使用
apk
安装.apk
文件。 - 设置数据库和环境。
2. Windows 部署方案
Windows 也是一个流行的选择,尤其是在企业环境中。
a. 使用 .zip 包
- 解压缩
.zip
文件到指定目录。 - 安装和配置 Windows 版本的 MySQL 数据库。
- 设置环境变量和任何必要的 Windows 服务。
3. macOS 部署方案
虽然 macOS 服务器不如 Linux 和 Windows 那么常见,但它在某些开发环境中仍有其用武之地。
a. 使用 .tar.gz 包
- 解压
.tar.gz
文件。 - 在 macOS 上安装和配置 MySQL 或兼容数据库。
- 配置相关的环境变量和服务。
提供的升级方案
当你从一个主要版本更新到另一个主要版本时,重要的是要遵循顺序路径,不要跳过任何中间主要版本。
这是因为每个主要版本都是一个重大更改,跳过中间版本可能会导致兼容性问题或意外行为。
例如,如果要将工作区从版本1.x.x更新到版本4.x.x,则应遵循以下路径:1.x.x -> 2.x.x -> 3.x.x -> 4.x.x。
例如 OpenIM 的 V3.4 到 V3.5 有重大的变化和更新,那么 OpenIM 的更新应该是 V3.0 -> V3.4 -> V3.5
数据迁移:获取到 .env
文件中的 cat .env| grep DATA_DIR
的路径,copy 这个路径备份,然后设置新的环境变量:
export DATA_DIR="$(cat .env| grep DATA_DIR)"
OpenIM Docker 代码复用
方便维护 openim-docker ,使用自动化管理 openim-docker
目录结构:
+ docker-compose.yaml
+ openim-server/
+ openim-chat
去掉了 .env
文件,针对 windows 用户的话使用 线上的 env.example
并且修改默认的变量。
初始化使用:
make init
❯ make init
===========> Initializing openim server project
Read more configuration information: https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/environment.md
File /tmp/open-im-server/config/prometheus.yml already exists. Overwrite? (Y/N): y
Overwriting /tmp/open-im-server/config/prometheus.yml. Previous configuration will be lost.
⌚ Working with template file: /tmp/open-im-server/deployments/templates/prometheus.yml to /tmp/open-im-server/config/prometheus.yml...
yFile /tmp/open-im-server/config/alertmanager.yml already exists. Overwrite? (Y/N):y
Overwriting /tmp/open-im-server/config/alertmanager.yml. Previous configuration will be lost.
⌚ Working with template file: /tmp/open-im-server/deployments/templates/alertmanager.yml to /tmp/open-im-server/config/alertmanager.yml...
File /tmp/open-im-server/.env already exists. Overwrite? (Y/N): y
Overwriting /tmp/open-im-server/.env. Previous configuration will be lost.
⌚ Working with template file: /tmp/open-im-server/deployments/templates/env_template.yaml to /tmp/open-im-server/.env...
File /tmp/open-im-server/config/config.yaml already exists. Overwrite? (Y/N): y
Overwriting /tmp/open-im-server/config/config.yaml. Previous configuration will be lost.
⌚ Working with template file: /tmp/open-im-server/deployments/templates/openim.yaml to /tmp/open-im-server/config/config.yaml...
[success 1129 17:45:42] ==> ✨ All configuration files have been successfully generated!
生成。
OpenIM Docker 部署和升级指南
部署方案
Docker Compose 简化部署
Docker Compose 通常用于测试或一体化体验。它提供了一个简单的部署方法,适用于快速启动和初步探索 OpenIM。
- 默认参数选项:Docker Compose 配置应包含默认的环境变量和参数设置,确保新手用户可以轻松部署。
- 文档改进:重点改进环境变量的文档,确保用户可以轻松找到并理解每个配置的作用。参考文档:OpenIM Environment Variables。
- 初始化选项:
make init
命令提供覆盖现有配置的选项,使用户能够灵活处理配置更改。
Linux, Windows, macOS 部署
提供了基于不同操作系统的部署方法,包括使用相应的包管理器(如 dpkg, rpm, pacman, apk)来安装和配置 OpenIM。
升级方案
顺序路径升级
当从一个主版本升级到另一个主版本时,应遵循顺序路径,逐渐升级每一个主版本。例如,从 v3.0 升级到 v3.5 应按 v3.0 -> v3.4 -> v3.5 的顺序进行。
数据迁移
重要的是备份
DATA_DIR
目录下的数据。可以通过执行以下命令来定位和备份这些数据:export DATA_DIR="$(cat .env | grep DATA_DIR)" # 备份 DATA_DIR 目录
代码复用和自动化
为了简化 OpenIM Docker 的维护,采用自动化工具和脚本来管理 docker-compose 配置和相关文件。
初始化和配置
使用
make init
命令来初始化项目,这将根据模板生成必要的配置文件。该过程为用户提供了覆盖现有文件的选项,确保新配置不会意外覆盖关键设置。例如:
make init # 按提示操作,生成或更新配置文件
安装和升级步骤
- 安装 OpenIM
- 克隆或下载 OpenIM Docker 仓库。
- 运行
make init
初始化配置文件。 - 使用
docker-compose up -d
启动服务。
- 升级 OpenIM
- 停止当前运行的 OpenIM 服务。
- 拉取或下载最新的 OpenIM Docker 代码。
- 执行
make init
,选择性地覆盖配置文件。 - 使用
docker-compose up -d
重新启动服务。
以前的都需要手动去迁移设置,以后的全部自动化
镜像版本设定:
镜像版本以后用的是 latest 或者是 某一个 具体的版本,可以选择性的设置镜像版本
默认使用的就是 latest
openim-docker 添加 CICD 和自动化的测试逻辑
放弃 openim-chat 的逻辑,只做自己的逻辑的自动化
新的版本对应数据迁移:
- 移除 mysql 镜像,在第一次部署的时候再没有 mysql
- 升级的时候,脚本中通过二进制对 mysql 数据镜像迁移。
初始化只做一次,第二次覆盖提醒
升级:
- 文档驱动为主,自动化为辅助
- 使用 make update 去升级配置
- 读取 分支名
- 读取到指定config
- 然后配置迁移
今后的升级逻辑:
make update
快速升级要求:
- 锁定配置
- 锁定脚本
kubernetes 升级
通过 GitOps 去实践升级