安装前准备:
参考文档:部署 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"
日常管理
下载客户端
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