部署 File v2 接入 S3 对象存储
单节点部署
部署 File 文件服务
-
下载镜像
- 服务器支持访问互联网
- 服务器不支持访问互联网
docker pull registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
# 离线镜像包文件下载链接,下载完成后上传到部署服务器
http://pdpublic.mingdao.com/private-deployment/offline/mingdaoyun-file-linux-amd64-2.0.0.tar.gz
# 在服务器上通过 docker load -i 命令加载离线镜像
docker load -i mingdaoyun-file-linux-amd64-2.0.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
变量值即可 - 针对自建 MinIO 对象存储默认没有
region
定义,这里值随机填写个 1 就可以 - 针对自建 MinIO 对象存储通常通过 IP 访问,
"addressingModel": 1
参数 这里就需要加上,避免 bucket 自动加在 IP 前拼接成错误的 endpoint 地址
- 针对自建 MinIO 对象存储,
-
创建 file.yaml 文件
cat > /usr/local/MDPrivateDeployment/clusterMode/file.yaml <<EOF
version: '3'
services:
file:
image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
volumes:
- /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.json
ports:
- "9000:9000"
environment:
ENV_ACCESS_KEY_FILE: storage
ENV_SECRET_KEY_FILE: 12345678910
ENV_MINGDAO_PROTO: "http"
ENV_MINGDAO_HOST: "mdy.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://file:9000"
command: ["./main", "server", "/data/storage/data"]
EOF- 变量中指定的访问地址,在部署中注意替换为实际的系统主地址
- redis 连接信息在实际部署中注意替换为实际的密码与IP
- 如多节点部署,
ENV_FILE_ID
每个实例的此变量值需要不同,如file1
,file2
,file3
等 - 注意,在 file v2 版本中,
MINIO_ACCESS_KEY
与MINIO_SECRET_KEY
变量已废弃,改为ENV_ACCESS_KEY_FILE
与ENV_SECRET_KEY_FILE
替代,来验证微服务到 file 服务之间的认证 ENV_FILE_DOMAIN
变量值与微服务配置文件中的 ENV_FILE_ENDPOINTS 内容一致,但需要增加 http://
-
创建启停脚本
cat > /usr/local/MDPrivateDeployment/clusterMode/start.sh <<EOF
docker stack deploy -c /usr/local/MDPrivateDeployment/clusterMode/file.yaml file
EOF
cat > /usr/local/MDPrivateDeployment/clusterMode/stop.sh <<EOF
docker stack rm file
EOF
chmod +x /usr/local/MDPrivateDeployment/clusterMode/start.sh
chmod +x /usr/local/MDPrivateDeployment/clusterMode/stop.sh -
初始化 swarm(如此节点已初始化过可忽略)
docker swarm init
-
启动服务
bash /usr/local/MDPrivateDeployment/clusterMode/start.sh
-
加入开机自启动
echo "bash /usr/local/MDPrivateDeployment/clusterMode/start.sh" >> /etc/rc.local
chmod +x /etc/rc.local
初始化预制文件
将 预制文件包 中的内容(mdmedia
、mdpic
、mdpub
、mdoc
4个文件夹下的数据)根据 bucketName 映射关系上传到对象存储对应的 bucket 中。
针对常见云对象存储服务,初始化时可参考文档:明道云私有部署阿里云OSS初始化说明,不同云对象存储上传文件方式基本相似。
针对本地自建 minio 对象存储,可参考下面示例步骤:
-
下载预制文件包
wget https://pdpublic.mingdao.com/private-deployment/source/1.7.0/file_init.tar.gz
-
解压预制文件包
tar xf file_init.tar.gz
-
拷贝解压出的 data 目录到 minio 容器内(如是 minio 集群环境,只拷贝到任意一个容器内即可)
docker cp data xxx:/tmp
-
进入此 minio 容器
docker exec -it xxx bash
-
添加 minio 服务别名
mc alias set myminio http://127.0.0.1:9000 mingdao 123456789
-
创建 bucket
mc mb myminio/mdmedia
mc mb myminio/mdoc
mc mb myminio/mdpic
mc mb myminio/mdpub -
上传本地预制文件到 minio 对象存储对应的 bucket 中
mc cp -r /tmp/data/mdmedia/* myminio/mdmedia
mc cp -r /tmp/data/mdoc/* myminio/mdoc
mc cp -r /tmp/data/mdpic/* myminio/mdpic
mc cp -r /tmp/data/mdpub/* myminio/mdpub
多节点部署
初始化 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.0.0
# 离线镜像包文件下载链接,下载完成后上传到部署服务器
http://pdpublic.mingdao.com/private-deployment/offline/mingdaoyun-file-linux-amd64-2.0.0.tar.gz
# 在服务器上通过 docker load -i 命令加载离线镜像
docker load -i mingdaoyun-file-linux-amd64-2.0.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` 变量值即可 - 针对自建 MinIO 对象存储默认没有
region
定义,这里值随机填写个 1 就可以 - 针对自建 MinIO 对象存储通常通过 IP 访问,
"addressingModel": 1
参数 这里就需要加上,避免 bucket 自动加在 IP 前拼接成错误的 endpoint 地址 - 针对自建 MinIO 对象存储集群环境,各 file 节点
s3-config.json
文件中bucketEndPoint
的值,可以写不同 minio 的节点地址
- 针对自建 MinIO 对象存储,
以下步骤仅在第一台节点上操作
-
创建配置文件存放目录
mkdir -p /usr/local/MDPrivateDeployment/clusterMode
-
创建 file.yaml
cat > /usr/local/MDPrivateDeployment/clusterMode/file.yaml <<EOF
version: '3'
services:
file1:
hostname: file1
image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
volumes:
- /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.json
ports:
- "9001:9000"
environment:
ENV_ACCESS_KEY_FILE: storage
ENV_SECRET_KEY_FILE: 12345678910
ENV_MINGDAO_PROTO: "http"
ENV_MINGDAO_HOST: "mdy.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: file2
image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
volumes:
- /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.json
ports:
- "9002:9000"
environment:
ENV_ACCESS_KEY_FILE: storage
ENV_SECRET_KEY_FILE: 12345678910
ENV_MINGDAO_PROTO: "http"
ENV_MINGDAO_HOST: "mdy.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: file3
image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
volumes:
- /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.json
ports:
- "9003:9000"
environment:
ENV_ACCESS_KEY_FILE: storage
ENV_SECRET_KEY_FILE: 12345678910
ENV_MINGDAO_PROTO: "http"
ENV_MINGDAO_HOST: "mdy.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: file4
image: registry.cn-hangzhou.aliyuncs.com/mdpublic/mingdaoyun-file:2.0.0
volumes:
- /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.json
ports:
- "9004:9000"
environment:
ENV_ACCESS_KEY_FILE: storage
ENV_SECRET_KEY_FILE: 12345678910
ENV_MINGDAO_PROTO: "http"
ENV_MINGDAO_HOST: "mdy.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 值
EOF- 变量中指定的访问地址,在部署中注意替换为实际的系统主地址
- redis 连接信息在实际部署中注意替换为实际的密码与IP
- 如多节点部署,
ENV_FILE_ID
每个实例的此变量值需要不同,如file1
,file2
,file3
等 - 注意,在 file v2 版本中,
MINIO_ACCESS_KEY
与MINIO_SECRET_KEY
变量已废弃,改为ENV_ACCESS_KEY_FILE
与ENV_SECRET_KEY_FILE
替代,来验证微服务到 file 服务之间的认证 ENV_FILE_DOMAIN
变量值与微服务配置文件中的 ENV_FILE_ENDPOINTS 内容一致,但需要增加 http://
-
创建启停脚本
cat > /usr/local/MDPrivateDeployment/clusterMode/start.sh <<EOF
docker stack deploy -c /usr/local/MDPrivateDeployment/clusterMode/file.yaml file
EOF
cat > /usr/local/MDPrivateDeployment/clusterMode/stop.sh <<EOF
docker stack rm file
EOF
chmod +x /usr/local/MDPrivateDeployment/clusterMode/start.sh
chmod +x /usr/local/MDPrivateDeployment/clusterMode/stop.sh -
启动服务
bash /usr/local/MDPrivateDeployment/clusterMode/start.sh
-
加入开机自启动
echo "bash /usr/local/MDPrivateDeployment/clusterMode/start.sh" >> /etc/rc.local
chmod +x /etc/rc.local
初始化预制文件
将 预制文件包 中的内容(mdmedia
、mdpic
、mdpub
、mdoc
4个文件夹下的数据)根据 bucketName 映射关系上传到对象存储对应的 bucket 中。
针对常见云对象存储服务,初始化时可参考文档:明道云私有部署阿里云OSS初始化说明,不同云对象存储上传文件方式基本相似。
针对本地自建 minio 对象存储,可参考下面示例步骤:
-
下载预制文件包
wget https://pdpublic.mingdao.com/private-deployment/source/1.7.0/file_init.tar.gz
-
解压预制文件包
tar xf file_init.tar.gz
-
拷贝解压出的 data 目录到 minio 容器内(如是 minio 集群环境,只拷贝到任意一个容器内即可)
docker cp data xxx:/tmp
-
进入此 minio 容器
docker exec -it xxx bash
-
添加 minio 服务别名
mc alias set myminio http://127.0.0.1:9000 mingdao 123456789
-
创建 bucket
mc mb myminio/mdmedia
mc mb myminio/mdoc
mc mb myminio/mdpic
mc mb myminio/mdpub -
上传本地预制文件到 minio 对象存储对应的 bucket 中
mc cp -r /tmp/data/mdmedia/* myminio/mdmedia
mc cp -r /tmp/data/mdoc/* myminio/mdoc
mc cp -r /tmp/data/mdpic/* myminio/mdpic
mc cp -r /tmp/data/mdpub/* myminio/mdpub