--- title: 分离部署 description: 中间件独立部署,业务服务单独一台或多台 outline: deep --- # 分离部署 把 MySQL、Redis、RabbitMQ、Consul 放到独立主机或使用云托管,业务服务单独部署。 ## 适用场景 - 数据库已有云托管实例(RDS、云 Redis、云 MQ) - 中间件已有独立集群,不希望在业务机上再跑一套 - 业务机配置较低,不适合同时承载数据库 ## 部署结构 ```text ┌─────────────────────┐ ┌──────────────────────┐ │ 中间件主机 / 云服务 │ │ 业务主机 │ │ │ │ │ │ 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 的机器上执行: ```bash # 按文件名顺序执行全部脚本 for f in schema/0*.sql; do echo "执行 $f" mysql -h -uroot -p<口令> < "$f" done ``` ::: warning `.sh` 脚本需单独执行 `schema/04-users.sh` 与 `schema/05-reset-passwords.sh` 依赖环境变量,不能直接重定向执行: ```bash MYSQL_ROOT_PASSWORD='<口令>' MYSQL_APP_PASSWORD='<应用口令>' \ MYSQL_HOST=<地址> bash schema/04-users.sh ``` ::: ## 二、准备业务机 Compose 复制 `docker-compose.yml`,删除四个中间件服务(`mysql`、`redis`、`rabbitmq`、`consul`),并移除各处 `depends_on` 对它们的引用。 ```yaml # 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 ```yaml database: default: link: "mysql:u_iotlcm:<口令>@tcp(:3306)/db_iotlcm?charset=utf8mb4&parseTime=True&loc=Asia%2FShanghai" redis: default: address: ":6379" pass: "" rabbitmq: dsn: "amqp://<用户>:<口令>@: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 ```yaml registry: type: "consul" address: ":8500" ``` 同时改 `database.default.link` 与 `redis.default`。 ### 服务互访地址 若业务服务分散在多台机器,`admin-svr`、`worker-svr`、`app-server` 配置里的上游地址也要改: ```yaml upstream: proxy: address: ":8510" gateway: address: ":8110" ``` `upstream-proxy` 的 `gateway.address` 同理。 ::: danger 最容易出的错 只改数据库地址,忘了改 `upstream-proxy:8510`、`upstream-chan:8110` 这类服务名。症状是服务能启动、数据库也通,但批次执行、智能诊断全部超时。 ::: ## 四、启动 ```bash # 按需修改 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` 不再用于启动中间件容器,但仍作为配置中的变量来源,**取值要与中间件实际口令一致**。 ## 五、验证 ```bash docker compose -f docker-compose.app.yml ps # 数据库连通性 docker compose -f docker-compose.app.yml exec admin-svr sh -c 'nc -zv 3306' docker compose -f docker-compose.app.yml exec admin-svr sh -c 'nc -zv 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 同步,否则全量同步的时间窗口判断会出错 |