Files
iotlcm/docs/deploy/split.md
T
MiFaZhan b4944d7c21 docs: 部署手册镜像地址改为单仓库格式 iotlcm/iotlcm:<服务名>-<版本>
官方仓库把全部镜像放在同一个镜像仓库 iotlcm/iotlcm 下,靠 tag 区分服务:

  .../iotlcm/iotlcm:mysql-8.0
  .../iotlcm/iotlcm:iotlcm-admin-svr-v1.0.4
  .../iotlcm/iotlcm:iotlcm-app-server-v1.0.2

改动页面:
- prerequisites:镜像仓库章节重写,补充命名空间/镜像仓库/tag 三层结构说明,
  不再提 library/ 命名空间
- configuration:镜像地址示例与 tag 规则表
- build-image:构建命令、命名规则表、基础组件同步脚本、验证命令同步改
- offline:离线镜像清单
- split:分离部署示例

已构建通过,6 个相关页面均可访问。
2026-10-30 09:15:42 +08:00

5.6 KiB
Raw Blame History

title, description, outline
title description outline
分离部署 中间件独立部署,业务服务单独一台或多台 deep

分离部署

把 MySQL、Redis、RabbitMQ、Consul 放到独立主机或使用云托管,业务服务单独部署。

适用场景

  • 数据库已有云托管实例(RDS、云 Redis、云 MQ)
  • 中间件已有独立集群,不希望在业务机上再跑一套
  • 业务机配置较低,不适合同时承载数据库

部署结构

┌─────────────────────┐        ┌──────────────────────┐
│  中间件主机 / 云服务  │        │      业务主机         │
│                     │        │                      │
│  MySQL     :3306    │◄───────┤  admin-svr   :8008   │
│  Redis     :6379    │        │  admin-ui    :80     │
│  RabbitMQ  :5672    │        │  openapi     :8000   │
│  Consul    :8500    │        │  app-server  :8010   │
│                     │        │  worker-svr          │
└─────────────────────┘        │  upstream-chan/-proxy│
                               └──────────────────────┘

一、准备中间件

在中间件侧完成(云托管通常已就绪):

组件 需准备
MySQL 建库 db_iotlcm、执行 schema/ 脚本、建应用账号 u_iotlcm
Redis 开启认证,记录地址与口令
RabbitMQ 建用户与 vhost,记录地址与口令
Consul 单机模式即可,记录地址

初始化数据库

在能连到目标 MySQL 的机器上执行:

# 按文件名顺序执行全部脚本
for f in schema/0*.sql; do
  echo "执行 $f"
  mysql -h <MySQL地址> -uroot -p<口令> < "$f"
done

::: warning .sh 脚本需单独执行 schema/04-users.sh 与 schema/05-reset-passwords.sh 依赖环境变量,不能直接重定向执行:

MYSQL_ROOT_PASSWORD='<口令>' MYSQL_APP_PASSWORD='<应用口令>' \
  MYSQL_HOST=<地址> bash schema/04-users.sh

:::

二、准备业务机 Compose

复制 docker-compose.yml,删除四个中间件服务(mysql、redis、rabbitmq、consul),并移除各处 depends_on 对它们的引用。

# docker-compose.app.yml
services:
  admin-svr:
    image: '${REGISTRY}/iotlcm/iotlcm:iotlcm-admin-svr-${TAG}'
    # ... 保留 ports / volumes / environment
    # 删除 depends_on 中对 mysql/redis/rabbitmq 的依赖

::: tip 网络要求 业务机必须能访问中间件主机的对应端口。若有防火墙,放行:

  • 业务机 → 中间件:3306、6379、5672、8500
  • 外部 → 业务机:仅反向代理端口(80 / 443) :::

三、修改配置指向外部地址

这是本节最关键的一步。所有配置里以服务名书写的地址都要改成实际地址。

admin-svr

database:
  default:
    link: "mysql:u_iotlcm:<口令>@tcp(<MySQL地址>:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai"

redis:
  default:
    address: "<Redis地址>:6379"
    pass: "<Redis口令>"

rabbitmq:
  dsn: "amqp://<用户>:<口令>@<RabbitMQ地址>:5672/"

openapi

同上三处:database.default.link、redis.default.address、rabbitmq.dsn。

worker-svr

同上三处。注意 tsdb.tdengine.dsn 若使用 TDengine 也要改为实际地址。

app-server

改 database.default.link 与 redis.default。

upstream-chan / upstream-proxy

registry:
  type: "consul"
  address: "<Consul地址>:8500"

同时改 database.default.link 与 redis.default。

服务互访地址

若业务服务分散在多台机器,admin-svr、worker-svr、app-server 配置里的上游地址也要改:

upstream:
  proxy:
    address: "<upstream-proxy所在主机>:8510"
  gateway:
    address: "<upstream-chan所在主机>:8110"

upstream-proxy 的 gateway.address 同理。

::: danger 最容易出的错 只改数据库地址,忘了改 upstream-proxy:8510、upstream-chan:8110 这类服务名。症状是服务能启动、数据库也通,但批次执行、智能诊断全部超时。 :::

四、启动

# 按需修改 docker-compose.app.yml 的镜像地址、端口与口令
cp -r config.example config
vi config/*/config.yaml              # 按上节改为外部地址

docker compose -f docker-compose.app.yml up -d

此时 docker-compose.yml 中的 MYSQL_*、REDIS_PASSWORD、RABBITMQ_PASSWORD 不再用于启动中间件容器,但仍作为配置中的变量来源,取值要与中间件实际口令一致。

五、验证

docker compose -f docker-compose.app.yml ps

# 数据库连通性
docker compose -f docker-compose.app.yml exec admin-svr sh -c 'nc -zv <MySQL地址> 3306'
docker compose -f docker-compose.app.yml exec admin-svr sh -c 'nc -zv <Redis地址> 6379'

# Redis 认证
docker compose -f docker-compose.app.yml exec admin-svr sh -c 'redis-cli -h <地址> -a "<口令>" ping'

# 服务日志
docker compose -f docker-compose.app.yml logs --tail=50 admin-svr

浏览器登录管理端,确认能查卡、能发起业务办理。

六、注意事项

项 说明
网络延迟 业务机到中间件的延迟建议 < 5ms。跨地域部署会造成批次执行明显变慢
连接池 外部数据库延迟较高时,适当调大 database.default.maxIdle 与 maxOpen
备份 分离后数据库备份由中间件侧负责,本仓的 backup.sh 需调整连接参数
时钟 各机器需开启 NTP 同步,否则全量同步的时间窗口判断会出错