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 体验的,比较希望它功能定位比较简单。

  1. 升级 docker compose ,提供默认的参数选项
    1. 注意现有的 .env 自动生成的,可以通过这种方式抛弃掉,对源码来说不需要,Windows 部署的话只需要
  2. 改进现有的文档体系,尤其是环境变量的文档,地址是 https://github.com/openimsdk/open-im-server/blob/main/docs/contrib/environment.md 详细说明各种配置方法
  3. make init 提供一个选择性覆盖的选项

docker compose down:

  1. docker-compose down
    • docker-compose down 命令用于停止并删除 Docker Compose 配置文件中定义的所有服务和相关容器、网络以及卷。
    • 它会执行以下操作:
      • 停止运行中的服务容器。
      • 移除相关的容器、网络和数据卷。
      • 如果定义了--volumes选项,它会删除数据卷(包括持久化数据),否则数据卷会保留在本地文件系统上。
    • 通常用于彻底清理 Docker Compose 环境,包括删除数据。
  2. docker-compose stop
    • docker-compose stop 命令用于停止 Docker Compose 配置文件中定义的所有服务的运行,但不会删除相关的容器、网络或数据卷。
    • 它会执行以下操作:
      • 停止运行中的服务容器。
      • 保留相关的容器、网络和数据卷,以便稍后可以使用 docker-compose startdocker-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 探索更多的部署指南

设计图:

Dopenim

1. Linux 部署方案

Linux 是最常见的服务器操作系统,支持多种包管理器。

a. 基于 Debian/Ubuntu (使用 .deb 包)

  • 使用 dpkgapt 安装 .deb 文件。
  • 配置 MySQL 或兼容数据库。
  • 设置必要的依赖和环境变量。

b. 基于 Red Hat/CentOS (使用 .rpm 包)

  • 使用 rpmyum/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 部署和升级指南

部署方案

  1. Docker Compose 简化部署

    Docker Compose 通常用于测试或一体化体验。它提供了一个简单的部署方法,适用于快速启动和初步探索 OpenIM。

    • 默认参数选项:Docker Compose 配置应包含默认的环境变量和参数设置,确保新手用户可以轻松部署。
    • 文档改进:重点改进环境变量的文档,确保用户可以轻松找到并理解每个配置的作用。参考文档:OpenIM Environment Variablesopen in new window
    • 初始化选项make init 命令提供覆盖现有配置的选项,使用户能够灵活处理配置更改。
  2. Linux, Windows, macOS 部署

    提供了基于不同操作系统的部署方法,包括使用相应的包管理器(如 dpkg, rpm, pacman, apk)来安装和配置 OpenIM。

升级方案

  1. 顺序路径升级

    当从一个主版本升级到另一个主版本时,应遵循顺序路径,逐渐升级每一个主版本。例如,从 v3.0 升级到 v3.5 应按 v3.0 -> v3.4 -> v3.5 的顺序进行。

  2. 数据迁移

    重要的是备份 DATA_DIR 目录下的数据。可以通过执行以下命令来定位和备份这些数据:

    export DATA_DIR="$(cat .env | grep DATA_DIR)"
    # 备份 DATA_DIR 目录
    
  3. 代码复用和自动化

    为了简化 OpenIM Docker 的维护,采用自动化工具和脚本来管理 docker-compose 配置和相关文件。

  4. 初始化和配置

    使用 make init 命令来初始化项目,这将根据模板生成必要的配置文件。该过程为用户提供了覆盖现有文件的选项,确保新配置不会意外覆盖关键设置。

    例如:

    make init
    # 按提示操作,生成或更新配置文件
    

安装和升级步骤

  1. 安装 OpenIM
    • 克隆或下载 OpenIM Docker 仓库。
    • 运行 make init 初始化配置文件。
    • 使用 docker-compose up -d 启动服务。
  2. 升级 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 去实践升级