MinIO

这里介绍如何在测试环境中搭建MinIO,这也是构建MinIO学习环境最基本的步骤。

1、准备实验环境

使用Oracle VM VirtualBox虚拟机,安装一个最小版本的Linux,然后添加4块虚拟盘,用于充当MinIO的虚拟盘。

实验环境如下所示:

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图1

接下来和大家简单介绍一下虚拟环境的搭建。

Step1:具体添加虚拟盘的方式:

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图2

操作路径:【设置】-【存储】,在控制SATA添加【加号】

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图3

Step2:点击【创建】,创建一块磁盘,操作如下图所示:

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图4

创建好四块磁盘后,重启服务器。

Step3:检验操作系统是否识别到磁盘

首先可以运行lsblk,执行结果如下所示:

  1. [root@localhost ~]# lsblk
  2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  3. sda 8:0 0 50G 0 disk
  4. ├─sda1 8:1 0 1G 0 part /boot
  5. └─sda2 8:2 0 49G 0 part
  6. ├─centos-root 253:0 0 45.1G 0 lvm /
  7. └─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
  8. sdb 8:16 0 10G 0 disk
  9. sdc 8:32 0 10G 0 disk
  10. sdd 8:48 0 10G 0 disk
  11. sde 8:64 0 10G 0 disk
  12. sr0 11:0 1 1024M 0 rom

根据创建文件的大小,可以看到创建的四块虚拟盘sdb、sdc、sdd、sde,但并未挂载(MOUNTPOINT为空)

但此时使用 df -h 命令,无法查看到这些盘,结果如下所示:

  1. [root@localhost ~]# df -h
  2. 文件系统 容量 已用 可用 已用% 挂载点
  3. devtmpfs 1.9G 0 1.9G 0% /dev
  4. tmpfs 1.9G 0 1.9G 0% /dev/shm
  5. tmpfs 1.9G 8.7M 1.9G 1% /run
  6. tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  7. /dev/mapper/centos-root 46G 1.3G 44G 3% /
  8. /dev/sda1 1014M 151M 864M 15% /boot
  9. tmpfs 379M 0 379M 0% /run/user/0

但使用fdisk -l 命令也能查询到四块虚拟盘信息,如下所示:

  1. [root@localhost ~]# fdisk -l
  2. 磁盘 /dev/sde10.7 GB, 10737418240 字节,20971520 个扇区
  3. Units = 扇区 of 1 * 512 = 512 bytes
  4. 扇区大小(逻辑/物理):512 字节 / 512 字节
  5. I/O 大小(最小/最佳):512 字节 / 512 字节
  6. 磁盘 /dev/sdd10.7 GB, 10737418240 字节,20971520 个扇区
  7. Units = 扇区 of 1 * 512 = 512 bytes
  8. 扇区大小(逻辑/物理):512 字节 / 512 字节
  9. I/O 大小(最小/最佳):512 字节 / 512 字节
  10. 磁盘 /dev/sdc10.7 GB, 10737418240 字节,20971520 个扇区
  11. Units = 扇区 of 1 * 512 = 512 bytes
  12. 扇区大小(逻辑/物理):512 字节 / 512 字节
  13. I/O 大小(最小/最佳):512 字节 / 512 字节
  14. 磁盘 /dev/sda53.7 GB, 53687091200 字节,104857600 个扇区
  15. Units = 扇区 of 1 * 512 = 512 bytes
  16. 扇区大小(逻辑/物理):512 字节 / 512 字节
  17. I/O 大小(最小/最佳):512 字节 / 512 字节
  18. 磁盘标签类型:dos
  19. 磁盘标识符:0x000b5407
  20. 设备 Boot Start End Blocks Id System
  21. /dev/sda1 * 2048 2099199 1048576 83 Linux
  22. /dev/sda2 2099200 104857599 51379200 8e Linux LVM
  23. 磁盘 /dev/sdb10.7 GB, 10737418240 字节,20971520 个扇区
  24. Units = 扇区 of 1 * 512 = 512 bytes
  25. 扇区大小(逻辑/物理):512 字节 / 512 字节
  26. I/O 大小(最小/最佳):512 字节 / 512 字节
  27. 磁盘 /dev/mapper/centos-root48.4 GB, 48444211200 字节,94617600 个扇区
  28. Units = 扇区 of 1 * 512 = 512 bytes
  29. 扇区大小(逻辑/物理):512 字节 / 512 字节
  30. I/O 大小(最小/最佳):512 字节 / 512 字节
  31. 磁盘 /dev/mapper/centos-swap4160 MB, 4160749568 字节,8126464 个扇区
  32. Units = 扇区 of 1 * 512 = 512 bytes
  33. 扇区大小(逻辑/物理):512 字节 / 512 字节
  34. I/O 大小(最小/最佳):512 字节 / 512 字节

那如何将四块虚拟盘挂载到文件系统呢?

Step4:创建分区、格式化磁盘,并挂载到文件

具体命令如下:

  1. [root@localhost ~]# fdisk /dev/sdb
  2. 欢迎使用 fdisk (util-linux 2.23.2)。
  3. 更改将停留在内存中,直到您决定将更改写入磁盘。
  4. 使用写入命令前请三思。
  5. Device does not contain a recognized partition table
  6. 使用磁盘标识符 0x2bb131bd 创建新的 DOS 磁盘标签。
  7. 命令(输入 m 获取帮助):m
  8. 命令操作
  9. a toggle a bootable flag
  10. b edit bsd disklabel
  11. c toggle the dos compatibility flag
  12. d delete a partition
  13. g create a new empty GPT partition table
  14. G create an IRIX (SGI) partition table
  15. l list known partition types
  16. m print this menu
  17. n add a new partition,创建一个分区
  18. o create a new empty DOS partition table
  19. p print the partition table
  20. q quit without saving changes
  21. s create a new empty Sun disklabel
  22. t change a partition's system id
  23. u change display/entry units
  24. v verify the partition table
  25. w write table to disk and exit
  26. x extra functionality (experts only)
  27. 命令(输入 m 获取帮助):n
  28. Partition type:
  29. p primary (0 primary, 0 extended, 4 free)
  30. e extended
  31. Select (default p): p
  32. 分区号 (1-4,默认 1):1
  33. 起始 扇区 (2048-20971519,默认为 2048):
  34. 将使用默认值 2048
  35. Last 扇区, +扇区 or +size{K,M,G} (2048-20971519,默认为 20971519):
  36. 将使用默认值 20971519
  37. 分区 1 已设置为 Linux 类型,大小设为 10 GiB
  38. 命令(输入 m 获取帮助):w
  39. The partition table has been altered!
  40. Calling ioctl() to re-read partition table.
  41. 正在同步磁盘。
  42. ## 这里格式为ext4,如果是新搭建MinIO集群,文件存储系统强烈推荐使用xfs,对应的命令:mkfs.xfs /dev/sdb
  43. [root@localhost ~]# mkfs.ext4 /dev/sdb
  44. mke2fs 1.42.9 (28-Dec-2013)
  45. /dev/sdb is entire device, not just one partition!
  46. 无论如何也要继续? (y,n) y
  47. 文件系统标签=
  48. OS type: Linux
  49. 块大小=4096 (log=2)
  50. 分块大小=4096 (log=2)
  51. Stride=0 blocks, Stripe width=0 blocks
  52. 655360 inodes, 2621440 blocks
  53. 131072 blocks (5.00%) reserved for the super user
  54. 第一个数据块=0
  55. Maximum filesystem blocks=2151677952
  56. 80 block groups
  57. 32768 blocks per group, 32768 fragments per group
  58. 8192 inodes per group
  59. Superblock backups stored on blocks:
  60. 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
  61. Allocating group tables: 完成
  62. 正在写入inode表: 完成
  63. Creating journal (32768 blocks): 完成
  64. Writing superblocks and filesystem accounting information: 完成
  65. [root@localhost ~]# mkdir /data1
  66. # 注释:挂载到文件系统 /data1
  67. [root@localhost ~]# mount -t ext4 /dev/sdb /data1
  68. [root@localhost ~]# df -h
  69. 文件系统 容量 已用 可用 已用% 挂载点
  70. devtmpfs 1.9G 0 1.9G 0% /dev
  71. tmpfs 1.9G 0 1.9G 0% /dev/shm
  72. tmpfs 1.9G 8.7M 1.9G 1% /run
  73. tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  74. /dev/mapper/centos-root 46G 1.3G 44G 3% /
  75. /dev/sda1 1014M 151M 864M 15% /boot
  76. tmpfs 379M 0 379M 0% /run/user/0
  77. /dev/sdb 9.8G 37M 9.2G 1% /data1

在使用同样的命令将 /dev/sdc、/dev/sdd、/dev/sde创建分区并挂载到/data2,/data3,/data4。

最后的执行效果如下:

  1. [root@localhost ~]# df -h
  2. 文件系统 容量 已用 可用 已用% 挂载点
  3. devtmpfs 1.9G 0 1.9G 0% /dev
  4. tmpfs 1.9G 0 1.9G 0% /dev/shm
  5. tmpfs 1.9G 8.7M 1.9G 1% /run
  6. tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  7. /dev/mapper/centos-root 46G 1.3G 44G 3% /
  8. /dev/sda1 1014M 151M 864M 15% /boot
  9. tmpfs 379M 0 379M 0% /run/user/0
  10. /dev/sdb 9.8G 37M 9.2G 1% /data1
  11. /dev/sdc 9.8G 37M 9.2G 1% /data2
  12. /dev/sdd 9.8G 37M 9.2G 1% /data3
  13. /dev/sde 9.8G 37M 9.2G 1% /data4

至此,实验环境准备完成。

2、部署MinIO

MinIO支持三种部署架构:

  • Single-Node Single-Drive (SNSD or “Standalone”) 单节点单驱动器
  • Single-Node Multi-Drive (SNMD or “Standalone Multi-Drive”) 单节点多驱动器,伪分布式,能使用纠错码等生产特性。
  • Multi-Node Multi-Drive (MNMD or “Distributed”) 多节点多驱动器,即分布式部署架构,强烈推荐用于生产环境。

由于测试资源有限,本文采用Single-Node Multi-Drive进行搭建。

SNMD部署架构支持驱动器(磁盘)的容错。生产环境强烈推荐使用MNMD架构。

2.1 安装前准备

MinIO强烈推荐直连的JBOD阵列,xfs格式的磁盘以获得最佳性能。

DAS (Direct-Attached Storage)与网络存储(NAS、SAN、NFS)相比具有显著的性能和一致性优势。

使用非xfs文件系统(ext4、btrfs、zfs)的部署往往具有较低的性能,同时ext4等文件存储对单个目录下的文件有个数限制,容易影响可用性。

Minio天生具有分布式存储的优势,并且内部采用纠删码,RAID或类似技术反而不能提供额外的弹性或可用性优势,而且通常会降低系统性能。

请确保服务器池中的所有节点使用相同类型(NVMe、SSD或HDD)的驱动器,并且容量相同。MinIO不区分驱动器类型,也不能从混合存储类型中获益。此外。MinIO将每个驱动器的大小限制为部署中最小的驱动器所拥有的容量。例如,如果部署有15个10TB驱动器和1个1TB驱动器,MinIO将每个驱动器的容量限制为1TB。

MinIO需要使用展开符号{x…y}用来表示Server Pool中每一个节点的一组磁盘驱动器,并且要求Server Pool中所有节点的磁盘驱动器序列相同。MinIO还要求物理驱动器的顺序在重新启动时保持不变,这样给定的挂载点总是指向相同的格式化驱动器。

2.2 如何一步一步安装MinIO

Step1:根据不同的操作系统与CPU架构,下载对应的安装包

例如当前虚拟机是amd,下载对应的RPM包,命令如下:

  1. wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230313194617.0.0.x86_64.rpm -O minio.rpm
  2. sudo dnf install minio.rpm

通过该命令安装后,有关MinIO相关文件:

  • /usr/local/bin/ MinIO 可执行文件所在的目录,该目录下就只有一个可执行文件 minio。
  • /etc/systemd/system/minio.service MinIO系统服务文件
  • /etc/default/minio MinIO环境变量文件

如果是使用二进制文件直接安装,其实就是要创建如上三个文件。

Step2:创建systemd系统服务文件

如果是基于rpm或者deb包进行安装的话,会自动创建systemd系统服务文件,如果是二级制安装模式,就需要自动创建该文件,文件的全路径为/etc/systemd/system/minio.service,具体的内容如下:

  1. [Unit]
  2. Description=MinIO
  3. Documentation=https://min.io/docs/minio/linux/index.html
  4. Wants=network-online.target
  5. After=network-online.target
  6. AssertFileIsExecutable=/usr/local/bin/minio
  7. [Service]
  8. WorkingDirectory=/usr/local
  9. User=minio-user
  10. Group=minio-user
  11. ProtectProc=invisible
  12. EnvironmentFile=-/etc/default/minio
  13. ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
  14. ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
  15. # Let systemd restart this service always
  16. Restart=always
  17. # Specifies the maximum file descriptor number that can be opened by this process
  18. LimitNOFILE=65536
  19. # Specifies the maximum number of threads this process can create
  20. TasksMax=infinity
  21. # Disable timeout logic and wait until process is stopped
  22. TimeoutStopSec=infinity
  23. SendSIGKILL=no
  24. [Install]
  25. WantedBy=multi-user.target
  26. # Built for ${project.name}-${project.version} (${project.name})

默认情况下MinIO使用minio-user用户与minio-user用户组启动MinIO进程,故需要创建对应的用户与组,具体命令如下:

  1. [root@localhost bin]# groupadd -r minio-user
  2. [root@localhost bin]# useradd -M -r -g minio-user minio-user
  3. # 主要是将minio需要用到的磁盘驱动器设置为 minio-user:minio-user
  4. [root@localhost bin]# chown minio-user:minio-user /data1 /data2 /data3 /data4

Step3:创建环境变量

默认需要创建 /etc/default/minio 文件,用于设置minio相关的环境变量(配置项)。关于MinIO的配置详细说明可以参考官方网站:https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-single-node-multi-drive.html#id6

例如创建的最小化配置文件如下:

  1. # MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
  2. # This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
  3. # Omit to use the default values 'minioadmin:minioadmin'.
  4. # MinIO recommends setting non-default values as a best practice, regardless of environment.
  5. MINIO_ROOT_USER=myminioadmin
  6. MINIO_ROOT_PASSWORD=minio-secret-key-change-me
  7. # MINIO_VOLUMES sets the storage volumes or paths to use for the MinIO server.
  8. # The specified path uses MinIO expansion notation to denote a sequential series of drives between 1 and 4, inclusive.
  9. # All drives or paths included in the expanded drive list must exist *and* be empty or freshly formatted for MinIO to start successfully.
  10. MINIO_VOLUMES="/data{1...4}"
  11. # MINIO_SERVER_URL sets the hostname of the local machine for use with the MinIO Server.
  12. # MinIO assumes your network control plane can correctly resolve this hostname to the local machine.
  13. # Uncomment the following line and replace the value with the correct hostname for the local machine.
  14. #MINIO_SERVER_URL="http://minio.example.net"

其中MINIO_VOLUMES参数用于指定MinIO集群的磁盘,这里由于是单节点,所有省略了HOSTNAME。

Step4:启动MinIO

通过在节点上使用如下命令启动MinIO(如果分布式环境下,分别在不同节点执行该命令)。

  1. systemctl start minio.service

命令执行后,可以使用如下命令查看minio是否启动成功

  1. systemctl status minio.service

该命令运行的截图如下所示:

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图5

其中Active(running)表示运行正常,并且可以看到Console的地址,可以在浏览器中输入console地址,打开MinIO内置的控制台:

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图6

用户名、密码是配置在MinIO环境变量配置文件中,输入用户名、密码即可登录。

当然MinIO也提供了对应mc 客户端命令访问服务端,关于运维命令,将会在后续文章介绍。

并基于MinIO Console成功创建了Bucket并成功上传了文件,效果如下图所示:

Linux中构建4块虚拟盘来搭建分布式MinIO集群 - 图7