多节点
初始化 Docker Swarm 集群
-
在第一台节点上执行 swarm 初始化命令
docker swarm init# 初始化命令执行后会输出 join 命令,后面需要在其他三节点上运行# 当服务器上有多个IP地址时,可以使用 --advertise-addr 参数指定其他节点用来连接到当前管理节点的IP和端口# docker swarm init --advertise-addr 192.168.1.11 -
分别在其他节点上运行 join 命令,加入 swarm 集群
docker swarm join --token xxxxxxxx# 如遗忘 token ,可在第一台 init 的服务器上通过以下命令查看:# docker swarm join-token worker -
查看节点并记录下来各节点ID
docker node ls
部署 File 文件服务
以下步骤各服务器都需要操作
-
下载镜像
- 服务器支持访问互联网
- 服务器不支持访问互联网
docker pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.1.0# 离线镜像包文件下载链接,下载完成后上传到部署服务器https://pdpublic.mingdao.com/private-deployment/offline/mingdaoyun-file-linux-amd64-2.1.0.tar.gz# 在服务器上通过 docker load -i 命令加载离线镜像docker load -i mingdaoyun-file-linux-amd64-2.1.0.tar.gz -
创建数据目录
mkdir -p /data/file/volume/{cache,data,fetchtmp,multitmp,tmp} -
创建配置文件存放目录
mkdir -p /usr/local/MDPrivateDeployment/clusterMode/config -
创建对接存储的
s3-config.json文件 ,模板如下cat > /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json << EOF{"mode": 1,"accessKeyID": "your_accessKey","secretAccessKey": "your_secretKey","bucketEndPoint": "http://192.168.0.11:9011","bucketName": {"mdmedia": "mdmedia","mdpic": "mdpic","mdpub": "mdpub","mdoc": "mdoc"},"region": "1","addressingModel": 1}EOF-
对接自建 MinIO 对象存储
- 将 accessKeyID 与 secretAccessKey 分别替换为 MinIO 服务环境变量
MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的对应值。 - 将 bucketEndPoint 改成 MinIO 服务的访问地址
- MinIO 默认未定义 region,此处可随意填写,例如设置为 "1"。
- MinIO 通常通过 IP 地址 访问,因此需设置 "addressingModel": 1,以防止系统在 endpoint 前自动拼接 bucket 名导致访问异常。
- 将 accessKeyID 与 secretAccessKey 分别替换为 MinIO 服务环境变量
-
对接云厂商对象存储(如阿里云 OSS、腾讯云 COS、AWS S3 等)
- 按照云厂商提供的 AccessKey 配置 accessKeyID 与 secretAccessKey。
- 将 bucketEndPoint 与 bucketName 映射关系,改成实际的对象存储信息。
- 根据实际部署区域填写 region 参数。
- 使用云厂商对象存储时,请删除 "addressingModel" 参数,以确保连接方式正确。
-
以下步骤仅在第一台节点上操作
-
创建配置文件存放目录
mkdir -p /usr/local/MDPrivateDeployment/clusterMode -
创建 file.yaml
cat > /usr/local/MDPrivateDeployment/clusterMode/file.yaml <<EOFversion: '3'services:file1:hostname: file1image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.1.0volumes:- /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime- /data/file/volume:/data/storage- /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.jsonports:- "9001:9000"environment:ENV_ACCESS_KEY_FILE: storageENV_SECRET_KEY_FILE: 12345678910ENV_MINGDAO_PROTO: "http"ENV_MINGDAO_HOST: "hap.domain.com"ENV_MINGDAO_PORT: "80"# Redis 主从模式ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"# Redis 哨兵模式#ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"#ENV_REDIS_SENTINEL_MASTER: "mymaster"#ENV_REDIS_SENTINEL_PASSWORD: "password"ENV_FILECACHE_EXPIRE: "false"ENV_FILE_ID: "file1"ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"command: ["./main", "server", "/data/storage/data"]deploy:placement:constraints:- node.id == xxxxxxxxxxxxxxxx # File Node01的 node.id 值file2:hostname: file2image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.1.0volumes:- /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime- /data/file/volume:/data/storage- /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.jsonports:- "9002:9000"environment:ENV_ACCESS_KEY_FILE: storageENV_SECRET_KEY_FILE: 12345678910ENV_MINGDAO_PROTO: "http"ENV_MINGDAO_HOST: "hap.domain.com"ENV_MINGDAO_PORT: "80"# Redis 主从模式ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"# Redis 哨兵模式#ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"#ENV_REDIS_SENTINEL_MASTER: "mymaster"#ENV_REDIS_SENTINEL_PASSWORD: "password"ENV_FILECACHE_EXPIRE: "false"ENV_FILE_ID: "file2"ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"command: ["./main", "server", "/data/storage/data"]deploy:placement:constraints:- node.id == xxxxxxxxxxxxxxxx # File Node02的 node.id 值file3:hostname: file3image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.1.0volumes:- /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime- /data/file/volume:/data/storage- /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.jsonports:- "9003:9000"environment:ENV_ACCESS_KEY_FILE: storageENV_SECRET_KEY_FILE: 12345678910ENV_MINGDAO_PROTO: "http"ENV_MINGDAO_HOST: "hap.domain.com"ENV_MINGDAO_PORT: "80"# Redis 主从模式ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"# Redis 哨兵模式#ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"#ENV_REDIS_SENTINEL_MASTER: "mymaster"#ENV_REDIS_SENTINEL_PASSWORD: "password"ENV_FILECACHE_EXPIRE: "false"ENV_FILE_ID: "file3"ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"command: ["./main", "server", "/data/storage/data"]deploy:placement:constraints:- node.id == xxxxxxxxxxxxxxxx # File Node03的 node.id 值file4:hostname: file4image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.1.0volumes:- /usr/share/zoneinfo/Etc/GMT-8:/etc/localtime- /data/file/volume:/data/storage- /usr/local/MDPrivateDeployment/clusterMode/config/s3-config.json:/usr/local/file/s3-config.jsonports:- "9004:9000"environment:ENV_ACCESS_KEY_FILE: storageENV_SECRET_KEY_FILE: 12345678910ENV_MINGDAO_PROTO: "http"ENV_MINGDAO_HOST: "hap.domain.com"ENV_MINGDAO_PORT: "80"# Redis 主从模式ENV_FILE_CACHE: "redis://:123456@192.168.10.13:6379"# Redis 哨兵模式#ENV_REDIS_SENTINEL_ENDPOINTS: "192.168.10.13:26379,192.168.10.14:26379,192.168.10.15:26379"#ENV_REDIS_SENTINEL_MASTER: "mymaster"#ENV_REDIS_SENTINEL_PASSWORD: "password"ENV_FILECACHE_EXPIRE: "false"ENV_FILE_ID: "file4"ENV_FILE_DOMAIN: "http://file1:9001,http://file2:9002,http://file3:9003,http://file4:9004"command: ["./main", "server", "/data/storage/data"]deploy:placement:constraints:- node.id == xxxxxxxxxxxxxxxx # File Node04的 node.id 值EOFENV_ACCESS_KEY_FILE与ENV_SECRET_KEY_FILE为 file 服务的访问认证信息,请在实际部署时设置为高强度口令。ENV_MINGDAO_PROTO、ENV_MINGDAO_HOST、ENV_MINGDAO_PORT用于配置 HAP 系统访问主地址,需与 HAP 微服务中ENV_ADDRESS_MAIN环境变量的协议、主机及端口保持一致。- Redis 连接信息请根据实际部署环境替换为正确的 IP 地址与密码。
ENV_FILECACHE_EXPIRE用于设置 缩略图缓存过期策略,"false"表示不过期(默认),"true"表示定期自动清理缓存。- 多节点部署时,每个实例的
ENV_FILE_ID需保持唯一,例如file1、file2、file3等。 ENV_FILE_DOMAIN需配置为所有 file 节点的实际访问地址,并在前方添加协议前缀(如http://),如多个地址则使用 逗号分隔。
-
创建启停脚本
cat > /usr/local/MDPrivateDeployment/clusterMode/start.sh <<EOFdocker stack deploy -c /usr/local/MDPrivateDeployment/clusterMode/file.yaml file --detach=falseEOFcat > /usr/local/MDPrivateDeployment/clusterMode/stop.sh <<EOFdocker stack rm fileEOFchmod +x /usr/local/MDPrivateDeployment/clusterMode/start.shchmod +x /usr/local/MDPrivateDeployment/clusterMode/stop.sh -
启动服务
bash /usr/local/MDPrivateDeployment/clusterMode/start.sh -
检查服务状态
docker stack ps filedocker ps -a | grep file -
部署完成后,将 预制文件 上传至 MinIO 对象存储