minio高可用部署
背景
客户需要完全高可用的需求,原先的双机minio是不支持完全高可用的,所以需要部署分布式minio。
下载地址: 59.111.178.240:20280/middleware/store_distributed.tar.gz
方案说明
客户方提出的需求是三机房部署,任何一个节点挂掉,Store都要能够可读写。因此方案只能锁定在分布式Minio。
原双机主备方案
原双机Store方案是主备方案,Store1始终可读写,Store2为备,只读态,实时从Store1拉取数据。
Store的角色由部署的 ROLE进行指定,定制化的镜像内部将基于角色进行处理。
内置NGINX将始终将请求打到Store1,此时可读写;当节点1故障,内置NGINX回会将请求打到Store2,此时有数BI只能读文件,无法写文件。
三机分布式方案
3 个 Minio 实例,每个实例两块盘,由这六块盘组成分布式 Minio 集群。
Minio 镜像不再使用之前定制化的用于主备的镜像,而是使用官方镜像。相应地,mc客户端需要手动放在容器内、 mc policy需要在安装后手动执行。
Nginx 镜像及配置不做变更,出发点在于尽量减轻变更项(同样,store.sh也减少变更)。Store1存活则打到Store1,Store1不存活则打到Store2,该逻辑在三机环境依然可以满足需求。
采用单独的Swarm编排文件,而不使用 Compose,以减轻部署配置成本。
安装
Store 磁盘路径选择请在每个节点选择磁盘以存储Store文件,建立软链
/youdata_store到相应目录。该步骤在BI部署流程中也已包含,中间件和BI的部署顺序可以自行决定。如果先部署了中间件,BI部署程序中的Store目录选择可忽略,可随便写成其他新目录(因为不适用)。建立好/youata_store后,各节点创建disk文件夹:
# master节点
mkdir -p /youdata_store/disks/disk1
mkdir -p /youdata_store/disks/disk2
# slave1节点
mkdir -p /youdata_store/disks/disk3
mkdir -p /youdata_store/disks/disk4
# slave2节点
mkdir -p /youdata_store/disks/disk5
mkdir -p /youdata_store/disks/disk6
Swarm 节点加 label
无论是Store使用,还是给业务使用,三节点添加role都是必要的。双机模式是 role=master, role=slave1,三机则可以改成如下:
docker node update --label-add role=master $MASTER_NODE_ID
docker node update --label-add role=slave1 $SLAVE1_NODE_ID
docker node update --label-add role=slave2 $SLAVE2_NODE_ID
--label-add zone $NODE_ID每个节点依然可以添加,维持不变。
部署 Stack
version: '3.5'
services:
store1:
image: hub.c.163.com/yddocker/minio:2022-distributed
command: server --address :9090 --console-address :9091 http://store1/mnt/disk1 http://store1/mnt/disk2 http://store2/mnt/disk3 http://store2/mnt/disk4 http://store3/mnt/disk5 http://store3/mnt/disk6
deploy:
endpoint_mode: dnsrr
replicas: 1
placement:
constraints:
- node.labels.role == master
networks:
- minio
environment:
MINIO_ACCESS_KEY: PJ99D7K3OAFS732PS1PZ
MINIO_SECRET_KEY: +CGdFGEu4tQraicN45rFmFRL5wjaNnUF2OYUlQuQ
# MINIO_HTTP_TRACE: /trace.log
volumes:
- /youdata_store/disks/disk1:/mnt/disk1
- /youdata_store/disks/disk2:/mnt/disk2
logging:
options:
max-size: "10m"
max-file: "10"
store2:
image: hub.c.163.com/yddocker/minio:2022-distributed
command: server --address :9090 --console-address :9091 http://store1/mnt/disk1 http://store1/mnt/disk2 http://store2/mnt/disk3 http://store2/mnt/disk4 http://store3/mnt/disk5 http://store3/mnt/disk6
deploy:
endpoint_mode: dnsrr
replicas: 1
placement:
constraints:
- node.labels.role == slave1
networks:
- minio
environment:
MINIO_ACCESS_KEY: PJ99D7K3OAFS732PS1PZ
MINIO_SECRET_KEY: +CGdFGEu4tQraicN45rFmFRL5wjaNnUF2OYUlQuQ
# MINIO_HTTP_TRACE: /trace.log
volumes:
- /youdata_store/disks/disk3:/mnt/disk3
- /youdata_store/disks/disk4:/mnt/disk4
logging:
options:
max-size: "10m"
max-file: "10"
store3:
image: hub.c.163.com/yddocker/minio:2022-distributed
command: server --address :9090 --console-address :9091 http://store1/mnt/disk1 http://store1/mnt/disk2 http://store2/mnt/disk3 http://store2/mnt/disk4 http://store3/mnt/disk5 http://store3/mnt/disk6
deploy:
endpoint_mode: dnsrr
replicas: 1
placement:
constraints:
- node.labels.role == slave2
networks:
- minio
environment:
MINIO_ACCESS_KEY: PJ99D7K3OAFS732PS1PZ
MINIO_SECRET_KEY: +CGdFGEu4tQraicN45rFmFRL5wjaNnUF2OYUlQuQ
# MINIO_HTTP_TRACE: /trace.log
volumes:
- /youdata_store/disks/disk5:/mnt/disk5
- /youdata_store/disks/disk6:/mnt/disk6
logging:
options:
max-size: "10m"
max-file: "10"
networks:
minio:
external: true
name: ydswarm_youdata
如果是先搭中间件,后部署业务,可以先创建网络。
docker network create -d overlay ydswarm_youdata执行完成后,通过docker network ls检查各节点是否能看到ydswarm_youdata网络。
dsd docker-stack.minio.yaml minio
查看容器日志,整个集群初始化时会出现一段时间报错,如 Read failed. Insufficient number of drives online (*errors.errorString)等。等待一段时间后,出现以下日志表示容器初始化结束。
初始化
初始化需要等到BI部署完成后,Nginx正常启动起来,还没执行数据升级之前进行。
初始化操作同样可以使用store.sh脚本来操作。唯一需要注意的是,需要该脚本的localhost替换为
127.0.0.1或者宿主机IP。在宿主机curl localhost:9090可以通,但是
mc config host add 时使用 localhost:9090 始终有问题,换 127.0.0.1:9090 就可以。
执行脚本来执行初始化:
bash /youdata/scripts/store.sh check
该操作会:配置config、建桶、创建桶policy、测试上传下载同时,执行./mc admin info store查看状态是否都正常。
Check 执行过程中,因为会docker logs 查看容器日志,初始化时可能会有较多报错信息,不用紧张,可忽略。最后检查桶创建完毕,且桶策略正常即可。
以上内容对您是否有帮助?