分布式存储MINIO高可用架构

 

官方文档

中文文档:http://docs.minio.org.cn/docs/ 英文文档:https://docs.min.io/

  • MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非 常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而 一个对象文件可以是任意大小,从几kb到最大5T不等。
  • MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。 官网:https://min.io/ http://www.minio.org.cn/ 对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服 务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成 本。 对于中小型企业,如果不选择存储上云,那么 Minio 是个不错的选择,麻雀虽小,五脏俱全。当然 Minio 除了直接作为对象存储使用,还可以作为云上对象存储服务的网关层,无缝对接到 Amazon S3、 MicroSoft Azure。 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产 品。

Minio优点

  • 部署简单: 一个single二进制文件即是一切,还可支持各种平台。 minio支持海量存储,可按zone扩展(原zone不受任何影响),支持单个对象最大5TB; 兼容Amazon S3接口,充分考虑开发人员的需求和体验
  • 低冗余且磁盘损坏高容忍,标准且最高的数据冗余系数为2(即存储一个1M的数据对象,实际占用 磁盘空间为2M)。但在任意n/2块disk损坏的情况下依然可以读出数据(n为一个纠删码集合(Erasure Coding Set)中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。 读写性能优异

MinIO的基础概念

  • Object:存储到 Minio 的基本对象,如文件、字节流,Anything…
  • Bucket:用来存储 Object 的逻辑空间。每个 Bucket 之间的数据是相互隔离的。对于客户端而 言,就相当于一个存放文件的顶层文件夹。
  • Drive:即存储数据的磁盘,在 MinIO 启动时,以参数的方式传入。Minio 中所有的对象数据都会 存储在 Drive 里。
  • Set :即一组 Drive 的集合,分布式部署根据集群规模自动划分一个或多个 Set ,每个 Set 中的 Drive 分布在不同位置。一个对象存储在一个 Set 上。(For example: {1…64} is divided into 4 sets each of size 16.) 一个对象存储在一个Set上 一个集群划分为多个Set 一个Set包含的Drive数量是固定的,默认由系统根据集群规模自动计算得出 一个SET中的Drive尽可能分布在不同的节点上

Linux主机部署

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mkdir -p /mnt/data
./minio server /mnt/data

在这里插入图片描述

http://10.10.0.435815/

指定端口,用户名密码

export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
./minio server /mnt/data/ --console-address ":5000"

在这里插入图片描述

创建Bucket01,上传文件。

在这里插入图片描述

容器启动

docker run -d -p 9000:9000 -p 5000:5000 --name minio \
  -v /mnt/data:/data \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=12345678" \
   minio/minio server /data --console-address ":5000" 

纠删码

Minio使用纠刪码 erasure code 和校验码checksum来保护数据免受硬件故障和无声数据损坏。即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。 纠删码是一种恢复丢失和损坏数据的数学算法,Minio 采用 Reed Solomon code将对象拆分成N/2数据和N/2 奇偶校验块,这就意味着如果是12块盘,一个对象会被分成6个数据块,6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。

挂载8个盘

docker run -d -p 9000:9000 -p 5000:5000 --name minio \
  -v /mnt/data1:/data1 \
  -v /mnt/data2:/data2 \
  -v /mnt/data3:/data3 \
  -v /mnt/data4:/data4 \
  -v /mnt/data5:/data5 \
  -v /mnt/data6:/data6 \
  -v /mnt/data7:/data7 \
  -v /mnt/data8:/data8 \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=12345678" \
   minio/minio server /data{1..8} --console-address ":5000" 

新建Bucket,上传文件

在这里插入图片描述

分布式存储可靠常用方法

分布式存储,很关键的点在于数据的可靠性,即保证数据的完整不丢失,不损坏,只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。

  • 冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本备份的多少,决定了 数据可靠性的高低,这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高,可靠性是允许丢失其中一 份数据,当前已有很多分布式系统是采用此种方式实现,如 Hadoop 的文件系统 (3个副本),Redis 的集群,MySQL 的主备模式等。

  • 校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和(checksum)进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如TCP协议;二是恢复还原, 通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的RAID 技术,纠删码(Erasure Code) 技术等。MinlO采用的就是纠删码技术。

分布式Minio优势

数据保护

  • 分布式Minio采用纠删码来防范多个节点宕机和位衰减bit rot。
  • 分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。

高可用

单机Minio服务存在单点故障,相反,如果是一个有块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。

例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服务器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。

一致性

Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。

分布式集群高可用架构

Docker

wget https://raw.githubusercontent.com/minio/minio/master/docs/orchestration/docker-compose/docker-compose.yaml
wget https://raw.githubusercontent.com/minio/minio/master/docs/orchestration/docker-compose/nginx.conf
docker-compose pull
docker-compose up

主机部署

防止单点故障

在这里插入图片描述

在这里插入图片描述

每个节点都做

将minio移动到/usr/local/bin

vim /usr/local/bin/minio.sh
umount /dev/sdb
umount /dev/sdc
rm -rf /mnt/data*
mkfs.ext4 /dev/sdb
mkfs.ext4 /dev/sdc
mkdir -p /mnt/data{1..2}
mount /dev/sdb /mnt/data1
mount /dev/sdc /mnt/data2
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
nohup minio server  --console-address ":5000"  http://10.0.2.1{0..1}/mnt/data{1..2} &
bash minio.sh

在这里插入图片描述 重新启动脚本 在这里插入图片描述 nginx四层负载均衡

worker_processes  2;
events {
    worker_connections  2048;
}
stream {
    log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
    access_log /usr/local/nginx/logs/minio-access.log main;
    upstream minio {
        server 10.0.2.4:5000 max_fails=1 fail_timeout=10s; 
        server 10.0.2.5:5000 max_fails=1 fail_timeout=10s; 
        server 10.0.2.6:5000 max_fails=1 fail_timeout=10s; 
    }
    server {
        listen 15000;
        proxy_pass minio;
    }
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
listen  80;
server_name www.yutao.co;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id NGINX_MASTER
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    #非抢占模式
    interface enp0s3
    virtual_router_id 51
    priority 100
    advert_int 1
    mcast_src_ip 10.0.2.4
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP
    virtual_ipaddress {
        10.0.2.50
    }
       track_script {
        check_nginx
    }

}
! Configuration File for keepalived
global_defs {
    router_id NGINX_BACKUP
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface enp0s3     
    virtual_router_id 51         
    priority 90       
    advert_int 1
    mcast_src_ip 10.0.2.5   
    authentication {    
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        10.0.2.50
    }
     track_script {
        check_nginx
    }    
}
! Configuration File for keepalived
global_defs {
    router_id NGINX_BACKUP
}
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface enp0s3 
    virtual_router_id 51     
    priority 80     
    advert_int 1       
    mcast_src_ip 10.0.2.6
        authentication {    
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        10.0.2.50
    } 
     track_script {
        check_nginx
    }   
} 
cat <<EOF > /etc/keepalived/check_nginx.sh 
#!/bin/bash
count=$(pidof nginx|wc -l)
if (($count==0));then
	systemctl stop keepalived
else
    systemctl start keepalived
fi
EOF
chmod +x /etc/keepalived/check_nginx.sh
systemctl start keepalived
systemctl enable keepalived
systemctl status keepalived

开机自启动

cat <<EOF>> /etc/rc.local
mount /dev/sdb /mnt/data1
mount /dev/sdc /mnt/data2
/usr/local/bin/minio.sh
EOF
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/sbin

关停机器验证vip漂移,不影响用户使用

在这里插入图片描述 在这里插入图片描述

统一入口

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对等扩容

首先,MinIO的极简设计理念使得MinIO分布式集群并不支持向集群中添加单个节点并进行自动调节的扩容方式,这是因为加入单个节点后所引发的数据均衡以及纠删组划分等问题会为整个集群带来复杂的调度和处理过程,并不利于维护。因此,MinIO提供了一种对等扩容的方式,即要求增加的节点数和磁盘数均需与原集群保持对等。

例如原集群包含4个节点4块磁盘,则在扩容时必须同样增加4个节点4块磁盘(或为其倍数),以便系统维持相同的数据冗余SLA,从而极大地降低扩容的复杂性。如上例,在扩容后,MinIO集群并不会对全部的8个节点进行完全的数据均衡,而是将原本的4个节点视作一个区域,新加入的4节点视作另一区域,当有新对象上传时,集群将依据各区域的可用空间比例确定存放区域,在各区域内仍旧通过哈希算法确定对应的纠删组进行最终的存放。此外,集群进行一次对等扩容后,还可依据扩容规则继续进行对等扩容,但出于安全性考虑,集群的最大节点数一般不得超过32个。

对等扩容的优点在于配置操作简单易行,通过一条命令即可完成扩容(注意:推荐使用连续的节点IP,并参照MinIO官网在扩容命令中使用{})。而对等扩容的局限性在于:①扩容需重启;②扩容存在限制,集群节点数一般不超过32个,这是由于MinIO集群通过分布式锁保证强一致性,若集群节点数过大,维护强一致性将带来性能问题。

export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=12345678
nohup minio server  --console-address ":5000"  http://10.0.2.1{0..1}/mnt/data{1..2} \
                                               http://10.0.2.{4..6}/mnt/data{1..2} &

image