Minio分布式多节点多驱动器集群部署

news2025/3/31 5:59:17

Minio分布式多节点多驱动器集群部署

  • Minio分布式多节点多驱动器集群部署
    • 节点规划
    • 先决条件
      • 开放防火墙端口
      • 设置主机名
      • 更新域名映射文件
      • 时间同步
      • 存储要求
      • 内存要求
    • 增加虚拟机磁盘(所有机器都要执行)
    • 部署分布式 MinIO
    • 测试上传与预览
    • 测试高可用
      • MinIO 配置限制
      • 模拟单节点磁盘故障
      • 模拟两节点磁盘故障
    • 创建 MinIO 服务文件 (systemd)
      • 创建minio.service文件
      • 创建用户和组
      • 创建服务环境文件
    • 启动 MinIO 服务
    • Nginx 负载均衡
  • 参考链接

Minio分布式多节点多驱动器集群部署

官方文档地址:https://docs.min.io/docs/

集群部署文档地址:部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储

节点规划

虚拟机名称虚拟机IP主机名MAC地址磁盘挂载
centos7_01192.168.0.123minio-0100:50:56:3D:52:7C/dev/sdb /mnt/data1
centos7_02192.168.0.136minio-0200:0C:29:5B:4E:8B/dev/sdb /mnt/data1
centos7_03192.168.0.141minio-0300:0C:29:97:84:DD/dev/sdb /mnt/data1
centos7_04192.168.0.163minio-0400:50:56:23:E6:53/dev/sdb /mnt/data1

先决条件

开放防火墙端口

  • 每个节点应具有与部署中其他节点的双向网络访问权限。对于容器化或编排的基础设施,可能需要配置网络和路由组件(如入口或负载均衡器)。

  • 某些操作系统可能需要设置防火墙规则。例如,以下命令显式打开运行 firewalld 的服务器的默认 MinIO 服务器 API 端口 :9000

  • 部署中的所有 MinIO 服务器必须使用相同的监听端口,所有机器都要执行

    # MinIO 服务器 API 端口
    firewall-cmd --zone=public --add-port=9000/tcp --permanent 
    # MinIO 控制台端口
    firewall-cmd --zone=public --add-port=9001/tcp --permanent 
    # 务必重载防火墙
    firewall-cmd --reload
    

    image-20250220090823020

设置主机名

登录到每台虚拟机,通过 hostnamectl 命令文件来设置主机名

在虚拟机 centos7_01 上,设置主机名为 minio-01

sudo hostnamectl set-hostname minio-01

对其他虚拟机也进行类似的操作:

sudo hostnamectl set-hostname minio-02    # 对于 centos7_02
sudo hostnamectl set-hostname minio-03    # 对于 centos7_03
sudo hostnamectl set-hostname minio-04    # 对于 centos7_04

验证主机名设置

使用 hostname 命令检查主机名是否已正确设置:

hostname

更新域名映射文件

确保每个虚拟机能够通过主机名找到其他虚拟机,需要在每台虚拟机上添加主机名和 IP 地址的映射,执行以下命令:

echo "192.168.0.123    minio-01" >> /etc/hosts
echo "192.168.0.136    minio-02" >> /etc/hosts
echo "192.168.0.141    minio-03" >> /etc/hosts
echo "192.168.0.163    minio-04" >> /etc/hosts

image-20250219172208552

检查配置:在每台虚拟机上,使用 ping 命令检查主机名是否正确解析:

ping minio-01
ping minio-02
ping minio-03
ping minio-04

时间同步

sudo yum install   ntp       # 对于 CentOS/RHEL
sudo systemctl start ntpd      # 启动 NTP 服务
sudo systemctl enable ntpd     # 设置 NTP 服务开机启动

如果不设置可能在启动时报错:

Skewed authentication date/time:这个错误通常是由于参与 MinIO 集群的节点之间的系统时间不同步导致的。MinIO 使用请求时间戳来验证请求的有效性。如果时间不同步,MinIO 认为请求的时间是“偏移”的,从而拒绝该请求。

API: github.com/minio/minio/cmd.registerDistErasureRouters.(*Manager).Handler.func1
Time: 01:24:46 UTC 02/20/2025
RequestID: 1825C62382628C3B
RemoteHost: 192.168.0.141
Host: minio-04:9000
Error: auth 192.168.0.141:37916: Skewed authentication date/time (*fmt.wrapError)
       5: internal/logger/logonce.go:118:logger.(*logOnceType).logOnceIf()
       4: internal/logger/logonce.go:149:logger.LogOnceIf()
       3: internal/grid/connection.go:59:grid.gridLogOnceIf()
       2: internal/grid/manager.go:172:cmd.registerDistErasureRouters.(*Manager).Handler.func1()
       1: net/http/server.go:2220:http.HandlerFunc.ServeHTTP()

存储要求

官方文档:存储要求

  1. 使用本地存储(DAS)
    • 优先选择直连存储(DAS),避免使用网络存储(NAS、SAN、NFS)。
    • 推荐使用闪存(NVMe、SSD)存储“热”数据。
  2. 文件系统格式
    • 使用 XFS 格式化的驱动器,MinIO 官方推荐并测试 XFS。
    • 不支持或不推荐使用 EXT4、BTRFS、ZFS 等其他文件系统。
  3. 驱动器类型一致性
    • 每个存储池中的驱动器类型必须一致(如全部 NVMe 或全部 SSD)。
    • 混合驱动器类型会导致性能问题,MinIO 会将所有驱动器视为性能最低的类型。
  4. 驱动器大小一致性
    • 每个存储池中的驱动器容量必须一致。
    • MinIO 会将所有驱动器的可用容量限制为池中最小的驱动器容量。
  5. 顺序驱动器挂载
    • 使用顺序挂载路径(如 /mnt/drive-1/mnt/drive-2 等)。
    • 支持 Go 扩展符号 {x...y} 表示顺序驱动器系列。
  6. 重启后保持挂载
    • 使用 /etc/fstab(Linux)或等效工具确保驱动器在重启后保持挂载和映射一致。
  7. 独占访问
    • MinIO 需要对驱动器进行独占访问,其他进程或工具不应直接操作驱动器上的数据。

内存要求

  1. 内存预分配
    • RELEASE.2024-01-28T22-35-53Z 版本开始,MinIO 在启动时预分配 2GiB 系统内存。
  2. 最低内存要求
    • 每个节点至少需要 32GiB 内存。
    • 更多内存分配建议可参考 MinIO 官方文档。

增加虚拟机磁盘(所有机器都要执行)

(如果非虚拟机可不关注本节内容)

注意:在MinIO集群部署中,需要将其强制性安装在独占的磁盘分区,而不能在根目录下建立目录。例如,在 /opt/data1 等位置建立目录文件夹代替。如果试图在 /home/data 等目录下创建目录,可能会遇到如下错误提示:Error: Drive /home/data is part of root drive, will not be used (*errors.errorString)。因此务必在系统已挂载的磁盘下建立 data 目录。

先停止 VM 主机,进入设置中添加新硬盘,直接默认下一步输入磁盘大小,选择将虚拟磁盘存储为单个文件,然后下一步即可

QQ_1739957843505

QQ_1739957928720

image-20250219173954462

image-20250219174111321

查看分区

# 显示所有使用和未使用的分区大小与簇信息
fdisk -l 
# 显示所有使用和未使用的分区
lsblk

image-20250219174403356

硬盘挂载

# 格式化磁盘
mkfs.ext4 -F /dev/sdb  
# 创建一个挂载指向目录
mkdir /mnt/data1  
# 挂载到指向的目录
mount /dev/sdb /mnt/data1  

image-20250219174628504

设置开机自动挂载

echo '/dev/sdb /mnt/data1 ext4 defaults 0 0' >> /etc/fstab

然后其他三台机器执行相同操作!

然后其他三台机器执行相同操作!

然后其他三台机器执行相同操作!

部署分布式 MinIO

依次给每台机器执行以下命令,执行下载minio并赋权的操作

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

每台机器启动测试

export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=miniostorage
nohup minio server --config-dir /etc/minio --address ":9000" --console-address ":9001" \
http://minio-01/mnt/data1 http://minio-02/mnt/data1 \
http://minio-03/mnt/data1 http://minio-04/mnt/data1 > minio_server.log 2>&1 &

访问登录页面

image-20250220103641941

登录成功界面

image-20250220103748110

监控页面

image-20250220110402480

测试上传与预览

image-20250220105858604

image-20250220110020242

预览上传的文件

image-20250220110512879

测试高可用

MinIO 配置限制

规格
每个集群的最大服务器数量无限制
最小服务器数量1
当服务器数量为 1 时,每台服务器的最小磁盘数量1(仅适用于 SNSD 部署,该配置不提供额外的可靠性或可用性)
当服务器数量为 2 或更多时,每台服务器的最小磁盘数量1
每台服务器的最大磁盘数量无限制
读取限制(Read Quorum)一半节点 (N/2)
写入限制(Write Quorum)一半节点+1 (N/2)+1

模拟单节点磁盘故障

通过关闭一个节点的minio服务器来验证数据的高可用性。比如,在 minio-01 上停止 MinIO 服务:

[root@minio-01 bin]# ps -ef|grep minio
root      13064 117867  0 10:28 pts/2    00:00:04 minio server --config-dir /etc/minio --address :9000 --console-address :9001 http://minio-01/mnt/data1 http://minio-02/mnt/data1 http://minio-03/mnt/data1 http://minio-04/mnt/data1
root      51956 117867  0 11:11 pts/2    00:00:00 grep --color=auto minio
[root@minio-01 bin]# kill -9 13064
  • 读取

    image-20250220111851879

  • 写入

    image-20250220134747191

模拟两节点磁盘故障

minio-02 上也停止 MinIO 服务:

[root@minio-02 bin]# ps -ef|grep minio
root      62535   1603  0 13:45 pts/0    00:00:02 minio server --config-dir /etc/minio --address :9000 --console-address :9001 http://minio-01/mnt/data1 http://minio-02/mnt/data1 http://minio-03/mnt/data1 http://minio-04/mnt/data1
root      76433   1603  0 14:00 pts/0    00:00:00 grep --color=auto minio
[root@minio-02 bin]# kill -9 62535
  • 读取

    此时的访问和下载功能仍能正常服务

    纠删集是支持 MinIO 纠删码的多个磁盘组成的一个组。纠删码提供了高可用性、可靠性和冗余性,确保在 MinIO 部署中存储的数据的安全性。MinIO 将对象划分为多个数据块——称为分片(shards),并将它们均匀分布在纠删集中的每个磁盘上。即使某个磁盘发生故障,MinIO 也可以继续无缝地处理读取和写入请求。在最高冗余级别下,尽管部署中最多丢失一半的磁盘,MinIO 仍然可以以最小的性能影响继续提供读取请求

    image-20250220112124168

  • 写入

    写入失败:Error: Resource requested is unwritable, please reduce your request rate

    在 MinIO 中,写入定数(Write Quorum)通常要求集群中超过一半的节点是健康的。例如,如果有 4 个节点,写入定数通常是 3。也就是说,至少需要 3 个节点可用才能进行写入操作。如果有 2 个节点宕机,剩下的 2 个节点就无法满足写入写入定数,导致写入请求被拒绝

    image-20250220112308119

创建 MinIO 服务文件 (systemd)

对于手动安装(例如二进制安装),需要在 ==/usr/lib/systemd/system/==手动创建这个文件

创建minio.service文件

[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

# MinIO RELEASE.2023-05-04T21-44-30Z adds support for Type=notify (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=)
# This may improve systemctl setups where other services use `After=minio.server`
# Uncomment the line to enable the functionality
# Type=notify

# 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})

创建用户和组

创建 minio-user 用户和组,并将 MinIO 使用的磁盘路径的所有权赋予该用户

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown -R minio-user:minio-user /mnt/data1

创建服务环境文件

环境文件 /etc/default/minio 用于存储 MinIO 启动时所需的环境变量。以下是该文件的内容说明:

MINIO_VOLUMES="http://minio-01/mnt/data1 http://minio-02/mnt/data1 http://minio-03/mnt/data1 http://minio-04/mnt/data1"
MINIO_OPTS="--console-address :9001"
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=miniostorage

然后通知 systemd 重新加载其配置文件

sudo systemctl daemon-reload

启动 MinIO 服务

执行以下命令启动 MinIO 服务:

sudo systemctl start minio.service

检查 MinIO 服务状态:

# 查看其状态
sudo systemctl status minio.service

# 查看相关日志
journalctl -f -u minio.service

这些命令将启动 MinIO 服务,并查看其状态和日志。MinIO 服务可能在启动初期显示一些非关键的警告,通常警告是暂时的,会在部署完全上线后自动解决。

设置 MinIO 在启动时自动启动

sudo systemctl enable minio.service

这将确保在主机重启时,MinIO 服务会自动启动。

Nginx 负载均衡

应用程序通常不应管理这些连接,因为对部署拓扑的任何更改都需要应用程序更新。 生产环境应部署负载均衡器或类似的网络控制平面组件来管理与 MinIO 部署的连接。 可以部署 NGINX 负载均衡器,以对部署中的可用节点执行“最少连接”或“循环”负载均衡。

image-20250221100450070

负载均衡器将请求路由到部署中的任何节点。 接收节点处理此后的任何节点间请求。

主机名IP 地址MinIO数据访问端口MinIO控制台端口
minio-01192.168.0.123http://192.168.0.123:9000http://192.168.0.123:9001
minio-02192.168.0.136http://192.168.0.136:9000http://192.168.0.136:9001
minio-03192.168.0.141http://192.168.0.141:9000http://192.168.0.141:9001
minio-04192.168.0.163http://192.168.0.163:9000http://192.168.0.163:9001

在另一台机器192.168.0.237新增nginx配置文件 /etc/nginx/conf.d/minio_proxy.conf

# MinIO 集群控制台
upstream console {
    ip_hash;
    server 192.168.0.123:9001;
    server 192.168.0.136:9001;
    server 192.168.0.141:9001;
    server 192.168.0.163:9001;
}

# MinIO 管理端口
upstream minio {
    ip_hash;
    server 192.168.0.123:9000;
    server 192.168.0.136:9000;
    server 192.168.0.141:9000;
    server 192.168.0.163:9000;
}

# 控制台访问配置(端口 9001)
server {
    listen       9001;
    server_name  192.168.0.73;  # 设置为 Nginx 服务器的 IP 或域名

    access_log  /var/log/nginx/minio_console.access.log main;
    error_log   /var/log/nginx/minio_console.error.log debug;

    location / {
        proxy_pass http://console;

        # 添加了 WebSocket 支持
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "upgrade";
        proxy_next_upstream     http_500 http_502 http_503 http_504 error timeout invalid_header;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

# 数据访问配置(端口 9000)
server {
    listen       9000;
    server_name  192.168.0.73;  # 设置为 Nginx 服务器的 IP 或域名

    access_log  /var/log/nginx/minio.access.log main;
    error_log   /var/log/nginx/minio.error.log debug;

    location / {
        proxy_pass http://minio;

        # 添加了 WebSocket 支持
        proxy_http_version      1.1;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "upgrade";
        proxy_next_upstream     http_500 http_502 http_503 http_504 error timeout invalid_header;
        proxy_set_header        Host $http_host;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

访问测试 http://192.168.0.237:9001/ minio/miniostorage

image-20250221103450885

image-20250221110216826

参考链接

  1. 部署 MinIO:多节点多驱动器 — 适用于 Linux 的 MinIO 对象存储
  2. ubuntu部署minio集群_ubuntu minio-CSDN博客
  3. 【解决】使用Nginx给minio做代理转发 进入管理界面查看桶一直显示loading问题_nginx 代理 minio websocket-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【信号量】

信号量 目录操作系统信号信号的默认处理动作示例解释信号的捕获与处理使用 signal 函数使用 sigaction 函数 信号的阻塞 信号的生命周期1. 信号产生2. 信号在进程中注册3. 信号在进程中注销4. 信号处理main 7 signal命令含义使用场景手册页包含的关键信息1. 信号概述2. 信号列表…

一篇文章学懂Vuex

一、基于VueCli自定义创建项目 233 344 二、Vuex 初始准备 建项目的时候把vuex勾选上就不用再yarn add vuex3了 store/index.js // 这里面存放的就是vuex相关的核心代码 import Vuex from vuex import Vue from vue// 插件安装 Vue.use(Vuex)// 创建仓库(空仓库…

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

图像处理篇---图像处理中常见参数

文章目录 前言一、分贝(dB)的原理1.公式 二、峰值信噪比(PSNR, Peak Signal-to-Noise Ratio)1.用途2.公式3.示例 三、信噪比(SNR, Signal-to-Noise Ratio)1.用途2.公式3.示例 四、动态范围(Dyna…

【Java】—— 二叉树

一、树型结构 树形结构是一种重要的数据结构,它类似于现实生活中的树的结构,由结点和边构成。树形结构具有以下特点: 树形结构是一种层次化的结构,由根结点、内部结点和叶子结点组成。根结点是树的顶部结点,没有父结点…

机场导航系统有哪些功能?精准定位与高效路径规划技术深度剖析

本文专为关注机场服务优化、乘客体验提升的IT技术员及航空业同仁而写。将深入探讨机场室内导航系统的核心功能,旨在解决乘客在机场内部定位、路径规划、服务寻找等方面的痛点。如需获取机场导航系统解决方案可前往文章最下方获取,如有项目合作及技术交流…

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上) 一、引言 1.1 研究背景与意义 在科技飞速发展的当下,医疗 AI 作为人工智能技术与医疗领域深度融合的产物,正引领着医疗行业的深刻变革。近年来,医疗 AI 在疾病诊断、药物研发、健康管理等诸多方面取得了显著进展,…

STM32-智能小车项目

项目框图 ST-link接线 实物图: 正面: 反面: 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技(688031.SH)正式发布DeepSeek全场景解决方案,全面覆盖个人用户、企业客户及行业场景需求,为用户提供从个人到企业、从云端到本地的全方位AI应用支持,为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理 在当今竞争激烈的商业环境中,《全星质量管理 QMS 软件系统》脱颖而出,展现出了显著且无可比拟的应用优势。 首先,《全星质量管理 QMS 软件系统》犹如一张严密的质量管控大网…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

C++Qt学习笔记——实现一个串口通信界面

CQt学习笔记——实现一个串口通信界面 一.界面二、项目结构三、头文件1. 文件头部2. 类定义3. 构造函数和析构函数4. 成员函数5. 成员变量 四、代码解析ReceiveAeraInit 函数解析SerialHelper 构造函数解析1. 为什么有两个 SerialHelper?2. 为什么用 :: 和 :&#x…

Word(2010)排版技巧

设置标题样式 选择需要设置的标题 如下图所示。选择文字后,点击对应的样式即可设置。 设置标题格式 设置字体格式 设置段落格式 显示所有样式 标题样式展示 建议 建议新建一个正文样式,可以命名为正文1,因为所有的样式参考的“样式基准…

一.Vue中的条件渲染

1.在<head>中引用 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2.在<body>中写入 <div id"app"><p><a v-if "user.usernameadmin"href"#">编辑</a><a …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

【HeadFirst系列之HeadFirstJava】第6天之认识Java的API:解锁高效开发的钥匙

认识Java的API&#xff1a;解锁高效开发的钥匙 在《Head First Java》的第六章节中&#xff0c;作者深入探讨了Java的API&#xff08;Application Programming Interface&#xff09;&#xff0c;并强调了它在Java开发中的重要性。Java API 是Java开发工具包&#xff08;JDK&a…

4 - AXI GPIO按键控制LED实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过调用PL端AXI GPIO IP核&#xff0c;使用中断机制&#xff0c;实现PL端按键控制 PS端LED的功能。 2 系统框图 3 软件设计 注意事项&#xff1a; AXI GPIO IP核是双沿触发中断&#xff0c;不可设置&…

题海拾贝:扫雷

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Deepseek本地部署小实践(c盘)

目录 前言 一、安装ollama 二、打开终端执行run 三、可视化 前言 小鲸鱼出来以后看到很多大佬本地部署AI&#xff0c;自己也想试一试&#xff0c;第一次部署AI&#xff0c;选了一个简单的办法&#xff0c;实践一下&#xff0c;写得比较粗糙。 一、安装ollama 先简单的介绍…