minio 分布式

方案设计

需要5台服务器,一台nginx用作分发请求,4台minio服务器,每个minio服务器上至少2个盘。在这个方法中,我使用了lvm的缓存,在同种固态盘的情况下,可以使读性能提高数倍到十倍,使写性能提高2到5倍

1.1 数据保护
  • 分布式 Minio 采用纠删码来防范多个节点宕机和位衰减。

  • 分布式 Minio 至少需要 4 个节点(4台服务器),使用分布式 Minio 就 自动引入了纠删码功能。

  • 纠删码是一种恢复丢失和损坏数据的数学算法, Minio 采用 Reed-Solomon code 将对象拆分成 N/2 数据和 N/2 奇偶校验块。 这就意味着如果是 12 块盘,一个对象会被分成 6 个数据块、6 个奇偶校验块,你可以丢失任意 6 块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。

  • 纠删码的工作原理和 RAID 或者复制不同,像 RAID6 可以在损失两块盘的情况下不丢数据,而 Minio 纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且 Minio 纠删码是作用在对象级别,可以一次恢复一个对象,而RAID 是作用在卷级别,数据恢复时间很长。 Minio 对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio 纠删码的设计目标是为了性能和尽可能的使用硬件加速。

  • 位衰减又被称为数据腐化 Data Rot、无声数据损坏 Silent Data Corruption ,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接故障还危险。 所以 Minio 纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。

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

  • 例如,一个 8 节点的 Minio 集群,每个节点一块盘,就算 4 个节点宕机,这个集群仍然是可读的,不过需要 5 个节点才能写数据。

1.3 限制
  • 分布式 Minio 单租户存在最少 4 个盘最多 16 个盘的限制(受限于纠删码)。这种限制确保了 Minio 的简洁,同时仍拥有伸缩性。如果你需要搭建一个多租户环境,你可以轻松的使用编排工具(Kubernetes)来管理多个Minio实例。

  • 注意,只要遵守分布式 Minio 的限制,可以组合不同的节点和每个节点几块盘。比如,可以使用 2 个节点,每个节点 4 块盘,也可以使用 4 个节点,每个节点两块盘,诸如此类。

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

服务器规划

|---------------|--------|-----------|
| 192.168.50.21 | minio1 | Centos7.9 |
| 192.168.50.22 | minio2 | Centos7.9 |
| 192.168.50.23 | minio3 | Centos7.9 |
| 192.168.50.24 | minio4 | Centos7.9 |
| 192.168.50.25 | nginx | Centos7.9 |

磁盘规划

|-----|-----|----|
| sda | ssd | 2T |
| sdb | ssd | 2T |
| sdc | hdd | 9T |
| sdd | hdd | 9T |
| sde | hdd | 9T |

ssd 做缓存,hdd做主存,配置cache加速

每台存储服务器都要执行

bash 复制代码
pvcreate /dev/sda  /dev/sdb /dev/sdc /dev/sdd /dev/sde
vgcreate vg /dev/sda  /dev/sdb /dev/sdc /dev/sdd /dev/sde

lvcreate -n data -L 27T vg /dev/sdc  /dev/sdd /dev/sde
lvcreate -n cache -L 3480G vg  /dev/sda /dev/sdb
lvcreate -n meta -L 6G vg /dev/sde
lvconvert --type cache-pool --poolmetadata vg/meta vg/cache
lvconvert --type cache --cachepool vg/cache --cachemode writeback vg/data

mkfs.ext4 /dev/vg/data
mkdir /minio

blkid /dev/vg/data

echo 'UUID="9d8e2fdc-cea6-445f-b8fe-00acab0bc0a5" /minio ext4 defaults 0 1' >> /etc/fstab

配置minio

每台存储服务器都要执行

minio二进制执行文件下载地址 https://dl.min.io/server/minio/release/linux-amd64/minio

bash 复制代码
$mkdir /minio && cd /minio
$wget https://dl.min.io/server/minio/release/linux-amd64/minio
$vim /minio/run.sh
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=minio123.

/minio/minio server server --address :9000 --console-address :9001
http://192.168.50.21/minio/data \
http://192.168.50.22/minio/data \
http://192.168.50.23/minio/data \
http://192.168.50.24/minio/data 


$vim /usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/minio/run/
ExecStart=/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

配置nginx

bash 复制代码
    # 负载均衡
    upstream minio-api {
        server 192.168.50.21:9000 weight=1;
        server 192.168.50.22:9000 weight=1;
        server 192.168.50.23:9000 weight=1;
        server 192.168.50.24:9000 weight=1;
    }

    # 负载均衡
    upstream minio-console {
        server 192.168.50.21:9001 weight=1;
        server 192.168.50.22:9001 weight=1;
        server 192.168.50.23:9001 weight=1;
        server 192.168.50.24:9001 weight=1;
    }
    
#配置api负载均衡
    server {
        # 监听端口
        listen       9000;
        
        # 服务器域名(主机头)
        server_name  localhost;
        ignore_invalid_headers off;
        # Allow any size file to be uploaded.
        # Set to a value such as 1000m; to restrict file size to a specificvalue
        client_max_body_size 0;
        # Disable buffering
        proxy_buffering off;
        proxy_request_buffering off;
        # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。
        location / {
            proxy_pass http://minio-api;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_connect_timeout 300;
            # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            chunked_transfer_encoding off;
          }
    }

#配置console负载均衡
    server {
        # 监听端口
        listen       9001;
        
        # 服务器域名(主机头)
        server_name  localhost;

        # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。
        location / {
            proxy_pass http://minio-console;
        }
    }
相关推荐
国科安芯6 小时前
ASL706S:让 MCU 不再“失忆跑飞“的守护芯片
分布式·单片机·嵌入式硬件·安全·fpga开发·架构
阿无,8 小时前
RabbitMQ面试题
分布式·rabbitmq
盛世宏博智慧档案10 小时前
全国100个分布式机房环境温湿度智能监测系统建设方案
分布式·机房·温湿度
六bring个六11 小时前
分布式设备连接对端失败问题分析
分布式·分布式软总线
天涯明月199317 小时前
ray深度研究报告
大数据·人工智能·分布式·ray
Rain的Java大神之路1 天前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
大菠萝爱上小西瓜2 天前
【大数据实战】Spark 2.2.2 完全分布式集群搭建
大数据·分布式·spark
肠畔码农2 天前
深度解析 RocketMQ 消费端限流与重平衡(Rebalance):分布式队列分配与流控防雪崩本质
分布式·rocketmq
海兰2 天前
【 Kafka进阶3】Apache Kafka 分布式事件流平台:架构原理与微服务解耦机制简要分析
分布式·架构·kafka
麻瓜记录Jackson2 天前
深入剖析 ZooKeeper 分布式 互斥锁:Curator 之 InterProcessMutex 源码全解(附图解)
java·spring boot·分布式·后端·zookeeper·java-zookeeper