背景

客户需要完全高可用的需求,原先的双机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只能读文件,无法写文件。

minio高可用部署 - 图1

三机分布式方案

minio高可用部署 - 图2

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 查看容器日志,初始化时可能会有较多报错信息,不用紧张,可忽略。最后检查桶创建完毕,且桶策略正常即可。