小丑的个人博客

记录精彩的学习过程

  menu
19 文章
0 浏览
1 当前访客
ღゝ◡╹)ノ❤️

Minio部署

官网 https://www.minio.org.cn/

中文网 https://www.minio.org.cn/

安装前准备:

参考文档:部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储

系统建议:RHEL8+ 或者Ubuntu 1804+

所有节点的硬件配置,需要一致。

系统参数优化

系统内核优化,其他优化选项参考内核优化资源限制,下面的内核优化是对minio订制的,如果机器有其他用处,需要酌情修改

- hosts: minio
  tasks:
  - name: 优化网络参数
    sysctl:
      name: "{{ item.name }}"
      value: "{{ item.value }}"
      state: present
    with_items:
      - { name: 'net.core.somaxconn', value: '100000' } 
      - { name: 'net.ipv4.tcp_max_syn_backlog', value: '65535' }
      - { name: 'net.ipv4.tcp_max_tw_buckets', value: '50000' }
      - { name: 'net.ipv4.tcp_tw_reuse', value: '1' }
      - { name: 'net.ipv4.tcp_fin_timeout', value: '30' }
      - { name: 'net.ipv4.tcp_keepalive_time', value: '3600' }
  

  - name: 优化文件描述符限制
    sysctl:
      name: "{{ item.name }}"
      value: "{{ item.value }}"
      state: present
    with_items:
    #  - { name: 'fs.file-max', value: '1000000' }
      - { name: 'fs.aio-max-nr', value: '1048576' }

  - name: 优化内存使用
    sysctl:
      name: "{{ item.name }}"
      value: "{{ item.value }}"
    with_items:
      - { name: 'vm.swappiness', value: '0' }
      - { name: 'vm.max_map_count', value: '262144' }
      - { name: 'vm.dirty_ratio', value: '20' }
      - { name: 'vm.dirty_background_ratio', value: '5' }

  #- name: 优化磁盘IO
  #  sysctl:
  #    name: "{{ item.name }}"
  #    value: "{{ item.value }}"  
  #  with_items:
  #    - { name: 'kernel.sched_autogroup_enabled', value: '0' }
  #    - { name: 'kernel.sched_migration_cost_ns', value: 5000 }

  - name:  Persist sysctl parameters 
    shell: |
      sysctl -p

执行以上操作,可能出现报错,多次执行可以设置成功,未知原因。

设置时间同步

必须时间同步

apt install chrony -y

设置主机名

创建服务器池时,MinIO 需要使用扩展表示法来表示主机顺序 。因此,MinIO 需要使用按顺序编号的主机名.例如xxx1.example.com

设置host解析

如果有内网dns服务器,也可以不用设置hosts

各个节点之间是用主机名访问的,这一步必须设置

cat >> /etc/hosts <<'EOF'
172.16.11.81 minio1.example.com
172.16.11.82 minio2.example.com
172.16.11.83 minio3.example.com
172.16.11.84 minio4.example.com
EOF

磁盘准备

官方建议使用xfs格式的磁盘
每个服务器使用相同类型(ssd,hdd或者nvme)和相同容量的磁盘

Minio使用扩展表示法来表示顺序,因此,需要确保重启以后磁盘顺便不能变。所以在格式化的时候,最好设置磁盘label,fstab文件使用LABEL挂载磁盘

mkfs.xfs /dev/sdb -L DISK1
mkfs.xfs /dev/sdc -L DISK2


mkdir /mnt/disk{1,2}/minio

vim /etc/fstab
LABEL=DISK1  /mnt/disk1/minio  xfs   defaults,noatime 0 2
LABEL=DISK2  /mnt/disk2/minio  xfs   defaults,noatime 0 2

示例脚本

格式化磁盘的示例脚本

---
- hosts: minio-store1
  remote_user: root
  tasks:
  - name: copy  format.sh
    script: '/workdir/lotus-ops/scripts/minio-format.sh'
    async: 0
    poll: 10
    register: result
  - name: logs
    debug: var=result['stdout_lines']

删除所有分区脚本

#!/bin/bash
i=1
if [[ $(grep LABEL /etc/fstab |wc -l) -gt 10 ]];then
        echo "检查是否已经格式化"
        exit 7
fi

lsblk |grep 14.6T | grep disk >> /root/disk.txt

if [[ $(lsblk |grep 14.6T | grep disk |wc -l) -eq 36 ]];then
        lsblk |grep 14.6T | grep disk|while read disk a b c d;do
        sgdisk --zap-all /dev/$disk
                let i++
        done
fi

reboot  # 大多数机器需要重启才能生效
cat /workdir/lotus-ops/scripts/minio-format.sh
#!/bin/bash
i=1 # 下面DISK?的数字
disk_number=24
disk_size=9.1T  # 这里的大小主要用来当做关键字使用
if [[ $(grep LABEL /etc/fstab |wc -l) -gt 1 ]];then
        echo "检查是否已经格式化" # 如果fstab文件有挂载就认为已经格式化过了
        exit 7
fi

if [[ -f /root/disk.txt ]];then
        rm -f  /root/disk.txt
fi
lsblk |grep ${disk_size} | grep disk >> /root/disk.txt

if [[ $(wc -l /root/disk.txt |awk '{print $1}') -eq ${disk_number} ]];then # 如果磁盘数量等于规划中的数量,开始执行格式化
        while read disk a b c d;do # 只想要第一列数据
                mkdir -p /mnt/disk$i/minio  # 创建目录用于挂载
                mkfs.xfs -f  /dev/$disk -L DISK$i  # 格式化硬盘,添加label标签
                echo LABEL=DISK$i /mnt/disk$i/minio  xfs defaults,noatime 0 0 >> /etc/fstab # 写入fstab文件,用于机器重启后自动挂载
                let i++
        done < /root/disk.txt
fi

开始部署:

以下操作在ubuntu2002和ubuntu2204上运行正常,其他版本没有测试。

下载安装包

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230102094009.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb

创建service文件

deb或者rpm安装的,service文件不需要手动创建

cat > /etc/systemd/system/minio.service << 'EOF'
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local

User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

# Let systemd restart this service always
Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})
EOF

完成后设置

用户设置

安装完成后,创建minio-user用户,或者把service里的User,Group改成root

如果是创建了minio-user用户,需要把minio的挂载目录属主和属组设置为minio-user。

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2 /mnt/disk3 /mnt/disk4

修改服务器环境文件

vim /etc/default/minio

root@minio-1:~# cat /etc/default/minio
# 设置MinIO启动时使用的主机和卷
# The command uses MinIO expansion notation {x...y} to denote a
# sequential series.
#
# The following example covers four MinIO hosts
# with 4 drives each at the specified hostname and drive locations.
# The command includes the port that each MinIO server listens on
# (default 9000)

# 描述服务器的物理位置,这个可以随便设置aaaa也可以
MINIO_REGION_NAME="cn-hn-zz"

# minio的存储目录,注意括号里是3个点
MINIO_VOLUMES="http://minio{1...4}.example.com:9000/mnt/disk{1...2}/minio"

# Set all MinIO server options
#
# The following explicitly sets the MinIO Console listen address to
# port 9001 on all network interfaces. The default behavior is dynamic
# port selection.

# 下面的命令显式地设置MinIO控制台监听地址为,在所有网络接口上端口9001。缺省行为是动态的
MINIO_OPTS="--console-address :9001"

# Set the root username. This user has unrestricted permissions to
# perform S3 and administrative API operations on any resource in the
# deployment.
#
# Defer to your organizations requirements for superadmin user name.

# Minio访问的管理员账号
MINIO_ROOT_USER=minioadmin

# Set the root password
#
# Use a long, random, unique string that meets your organizations
# requirements for passwords.

# ROOT_USER的访问密码
MINIO_ROOT_PASSWORD=minioadmin

# Set to the URL of the load balancer for the MinIO deployment
# This value *must* match across all MinIO servers. If you do
# not have a load balancer, set this value to to any *one* of the
# MinIO hosts in the deployment as a temporary measure.
# 这里可以设置任何一台机器,或者使用负载均衡服务器地址也行,要求所有机器的这个设置相同。
MINIO_SERVER_URL="http://minio.example.com:9000"

MINIO_STORAGE_CLASS_STANDARD=EC:2
MINIO_STORAGE_CLASS_RRS=EC:2

# 如果部署多个minio集群,这个job_id一定要设置,不然prometheus监控会混乱
MINIO_PROMETHEUS_JOB_ID=minio-store2
MINIO_PROMETHEUS_URL="http://10.10.200.2:9090"

EC计算器 MinIO | Erasure Code Calculator

日常管理

下载客户端

wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc

使用别名

事实上设置别名修改的是~/.mc/config.json文件

mc alias set myminio http://127.0.0.1:9000 minioadmin minioadmin
mc admin info myminio

mino缩容

root@store-8-163:~# mc admin decommission status myminio
┌─────┬───────────────────────────────────────────────┬────────────────────────┬────────┐
│ ID  │ Pools                                         │ Capacity               │ Status │
│ 1st │ http://node{163...178}.io..disk{1...36}/minio │6PiB(used)/7.2PiB(total)│ Active │
│ 2nd │ http://node{179...194}.io..disk{1...36}/minio │7TiB(used)/7.2PiB(total)│ Active │
└─────┴───────────────────────────────────────────────┴────────────────────────┴────────┘

退出是永久性的,中途不能停止

mc admin decommission start myminio/ http://node{163...178}.io..disk{1...36}/minio

查看退出过程

root@store-8-163:~# mc admin decommission status myminio
┌─────┬───────────────────────────────────────────────┬────────────────────────┬──────────┐
│ ID  │ Pools                                         │ Capacity               │ Status   │
│ 1st │ http://node{163...178}.io..disk{1...36}/minio │6PiB(used)/7.2PiB(total)│ Draining │
│ 2nd │ http://node{179...194}.io..disk{1...36}/minio │7TiB(used)/7.2PiB(total)│ Active   │
└─────┴───────────────────────────────────────────────┴────────────────────────┴──────────┘
mc admin decommission status myminio http://node{163...178}.io..disk{1...36}/minio

完成以后,在/etc/default/minio中删除MINIO_VOLUMES的值

其他工具

minio兼容s3的api。
日常可以用s3cmd s5cmd等工具

监控

接入prometheus监控

vim /etc/default/minio

MINIO_PROMETHEUS_URL="http://10.10.200.2:9090"

# Prometheus可以不通过验证访问MinIO集群
MINIO_PROMETHEUS_AUTH_TYPE=public 

# 生成prometheus配置
mc admin prometheus generate myminio

标题:Minio部署
作者:harbor
地址:https://5212345.cn/articles/2023/11/13/1699861505654.html