prueba de selección e implementación de la tecnología minio

Introducción

MinIO afirma ser el servidor de almacenamiento de objetos más rápido que existe. En hardware estándar, el almacenamiento de objetos puede tener velocidades de lectura/escritura de hasta 183 GB/s y 171 GB/s. El almacenamiento de objetos se puede utilizar como capa de almacenamiento principal para diversas cargas de trabajo complejas, como Spark, Presto, TensorFlow, H2O.ai y como reemplazo de Hadoop HDFS. Es decir, crear una infraestructura de alto rendimiento para el aprendizaje automático, el análisis y las cargas de trabajo de datos de aplicaciones.

Selección de tecnología (por qué elegir minio)

Lo que esta sección quiere discutir es por qué elijo minio, o en una dirección más amplia, por qué uso el almacenamiento de objetos De acuerdo con la información que encontré y mi comprensión personal, haré una introducción preliminar a continuación.

Almacenamiento de objetos frente a almacenamiento de archivos

Hay un análisis muy detallado de esta pregunta en Zhihu. Muchos grandes han escrito sus propios entendimientos. Elegiré algunas expresiones aquí: ¿Cuál es la diferencia esencial entre el almacenamiento de bloques, el almacenamiento de archivos y el almacenamiento de objetos?

  • Almacenamiento de objetos (base de datos de valores clave): la interfaz es simple. Un objeto puede considerarse como un archivo, que solo se puede escribir y leer en su totalidad. Por lo general, los archivos grandes son los principales y se requiere suficiente ancho de banda de E/S.
  • Almacenamiento en bloque (disco duro): Sus características de E/S son consistentes con los discos duros tradicionales.Un disco duro debe ser capaz de satisfacer las necesidades generales, es decir, puede manejar la lectura y escritura de archivos grandes, y también puede manejar la lectura y escritura de archivos pequeños. Pero el disco duro se caracteriza por una gran capacidad y puntos calientes evidentes. Por lo tanto, el almacenamiento en bloque puede lidiar principalmente con problemas candentes. Además, el almacenamiento en bloque requiere la latencia más baja.
  • Almacenamiento de archivos (sistema de archivos): el diseño del sistema de la interfaz que admite el almacenamiento de archivos es consistente con las características y dificultades de los sistemas de archivos locales tradicionales como Ext4. Tiene una interfaz más rica que el almacenamiento en bloque y debe considerar el soporte de directorios, atributos de archivo, etc., implementar un almacén de archivos que admita la paralelización debería ser lo más difícil. Pero sistemas como HDFS y GFS, que definen sus propios estándares, pueden definir la interfaz de acuerdo con la implementación, lo que será más fácil.

Según tengo entendido, la diferencia esencial entre el almacenamiento de archivos y el almacenamiento de objetos es que el archivo de almacenamiento de archivos distribuidos está organizado como un árbol de directorios, es decir, el formato de árbol en Linux, y el almacenamiento de objetos adopta un método de organización plano; la diferencia esencial entre los tres es usar Los "usuarios" de los datos son diferentes: los usuarios del almacenamiento de bloques son sistemas de software que pueden leer y escribir dispositivos de bloques, como los sistemas de archivos y bases de datos tradicionales; los usuarios del almacenamiento de archivos son personas físicas; los usuarios de almacenamiento de objetos son otros programas informáticos.

Para el almacenamiento en bloque, aunque el retraso es muy bajo, los datos están protegidos por medios como Raid y LVM, y el método de escritura en paralelo puede lograr un retraso de 10 ms, pero el costo es alto, lo que no favorece la conexión entre hosts. de diferentes sistemas operativos Problemas como el intercambio de datos también están en riesgo. Para el almacenamiento de archivos, el costo es bajo, los archivos se pueden compartir entre diferentes hosts y se utilizan servicios FTP y NFS, que se pueden distribuir, pero hay cuellos de botella y no se puede superar el problema de la baja eficiencia cuando aumenta la cantidad de archivos. .

El motivo de la aparición del almacenamiento de objetos es superar las deficiencias del almacenamiento de bloques y el almacenamiento de archivos, y promover sus respectivas ventajas. En resumen, el almacenamiento en bloque es rápido para leer y escribir, lo que no favorece el uso compartido, y el almacenamiento de archivos es lento para leer y escribir, lo que favorece el uso compartido. ¿Puede obtener una lectura y escritura rápidas, lo cual es beneficioso para compartir? De ahí el almacenamiento de objetos.

El almacenamiento de objetos se puede entender como la descomposición de un archivo en objetos para su almacenamiento. En pocas palabras, se adjuntará una parte de los metadatos al archivo de almacenamiento. Al consultar, busque los metadatos y localice el archivo. Para usar una analogía inexacta pero útil, el almacenamiento de objetos es equivalente a agregar una etiqueta descriptiva a los bloques de almacenamiento de bloques, lo que mejora la capacidad de consulta de los archivos y facilita la administración. Se puede decir que el almacenamiento de objetos combina las ventajas del almacenamiento de archivos y el almacenamiento en bloque, y es la dirección de desarrollo del almacenamiento. Es el método óptimo de almacenamiento de archivos para programas y sistemas.

Comparación de almacenamiento distribuido

Aquí se citan principalmente dos blogs, porque me es imposible probar todos los programas de código abierto, y tomé una decisión después de compararlos al principio.

Inventario de sistemas de almacenamiento de archivos distribuidos

Comparación Ceph VS MinIO de sistemas de almacenamiento distribuido

Comparación de almacenamiento distribuido:

sistema de archivos Desarrolladores lenguaje de desarrollo protocolo de código abierto Facilidad de uso escena aplicable característica defecto
GFS Google No es de código abierto
HDFS apache Java apache Instalación sencilla y documentación profesional Almacenar archivos muy grandes Lectura y escritura por lotes de grandes datos, alto rendimiento; escritura una vez, lectura muchas veces, lectura y escritura secuencial Es difícil cumplir con el acceso a datos de baja latencia a nivel de milisegundos; no admite la escritura simultánea del mismo archivo por parte de varios usuarios; no es adecuado para una gran cantidad de archivos pequeños
cefalograma Sabio Weil, UC Santa Cruz C++ LGPL Instalación sencilla y documentación profesional Archivos grandes, medianos y pequeños en un solo clúster Distribuido, sin un solo punto de dependencia, escrito en C, mejor rendimiento Basado en btrfs inmaduros, no es lo suficientemente maduro y estable, y no se recomienda su uso en entornos de producción.
TFS Alí Babá C++ GPL V2 La instalación es complicada y hay pocos documentos oficiales. Archivos pequeños en clústeres Diseñado para archivos pequeños, el rendimiento de E/S aleatorio es relativamente alto; implementa RAID suave, que mejora la capacidad de procesamiento simultáneo del sistema y la capacidad de recuperación tolerante a fallas de datos; admite intercambio en caliente activo-en espera para mejorar la disponibilidad del sistema; Proporciona función de lectura/en espera No es adecuado para el almacenamiento de archivos de gran tamaño; no es compatible con POSIX, baja versatilidad; no es compatible con la estructura de directorio personalizada y el control de permisos de archivos; descarga a través de API, hay un punto único de cuello de botella en el rendimiento; pocos documentos oficiales, altos costos de aprendizaje
Lustre SOL C GPL Complicado y muy dependiente del kernel, el kernel debe volver a compilarse leer y escribir archivos grandes Producto de nivel empresarial, muy grande, profundamente dependiente del kernel y ext3
MooseFS Núcleo Sp. zoo C GPL V3 Instalación simple, muchos documentos oficiales y una interfaz web para administración y monitoreo Leer y escribir una gran cantidad de archivos pequeños Relativamente ligero, escrito en perl, más gente lo usa en China Hay un único punto de dependencia en el servidor maestro y el rendimiento es relativamente bajo
MogileFS danga interactivo Perl GPL Utilizado principalmente en el campo web para procesar imágenes pequeñas masivas sistema de metaarchivo clave-valor; mucho más eficiente que mooseFS FUSIBLE no es compatible
FastDFS Desarrollador nacional Yu Qing C GPL V3 Instalación simple y comunidad relativamente activa. Archivos pequeños y medianos en un solo clúster El sistema no necesita ser compatible con POSIX, lo que reduce la complejidad del sistema y tiene una mayor eficiencia de procesamiento, realiza un RAID suave, que mejora la capacidad de procesamiento concurrente del sistema y la capacidad de recuperación tolerante a fallas de datos, admite archivos maestro-esclavo y extensiones personalizadas; Servicio de seguimiento maestro-esclavo, mejora la disponibilidad del sistema No es compatible con la carga reanudable, que no es adecuada para el almacenamiento de archivos de gran tamaño; no es compatible con POSIX y su versatilidad es baja; hay un gran retraso en la sincronización de archivos a través de redes públicas y es necesario implementar las estrategias de tolerancia a fallas correspondientes. aplicado; el mecanismo de sincronización no es compatible con la verificación de corrección de archivos; descarga a través de API, hay un único punto de cuello de botella de rendimiento
GlusterFS INVESTIGACIÓN Z C GPL V3 Instalación sencilla y documentación profesional Adecuado para archivos grandes, todavía hay mucho espacio para la optimización del rendimiento de archivos pequeños Sin servidor de metadatos, arquitectura de apilamiento (los módulos funcionales básicos se pueden apilar para lograr funciones potentes), con capacidad de expansión horizontal lineal; más grande que mooseFS Dado que no hay un servidor de metadatos, aumenta la carga del cliente y ocupa una cantidad considerable de CPU y memoria, sin embargo, al atravesar el directorio de archivos, la implementación es más complicada e ineficiente, y es necesario buscar en todos los nodos de almacenamiento. no se recomienda utilizar un camino más profundo
GridFS MongoDB C++ Fácil instalación Usualmente se usa para manejar archivos grandes (más de 16M) Se puede acceder a archivos parciales sin cargar todo el archivo en la memoria, manteniendo un alto rendimiento; los archivos y los metadatos se sincronizan automáticamente

Ceph VS MinIO para comparación de sistemas de almacenamiento distribuido:


cefalograma MiniO
ventaja · Maduro · Hijastro de Red Hat, el fundador de Ceph se unió a Red Hat · Función potente · Admite miles de nodos · Admite el aumento dinámico de nodos y equilibra automáticamente la distribución de datos. · Gran capacidad de configuración, se puede ajustar para diferentes escenarios · Bajo costo de aprendizaje, instalación simple, operación y mantenimiento, y uso listo para usar · En la actualidad, el foro MinIO es muy popular y puede responder cualquier pregunta · Hay clientes java y clientes js Protección de datos : MinIO distribuido utiliza códigos de borrado para evitar el tiempo de inactividad de varios nodos y la descomposición de bits. Distributed MinIO requiere al menos 4 discos duros, y la función de codificación de borrado se introduce automáticamente utilizando Distributed MinIO. Coherencia: MinIO en modo distribuido e independiente, todas las operaciones de lectura y escritura siguen estrictamente el modelo de coherencia de lectura tras escritura. · Admite clúster de expansión de modo federado
defecto · Alto costo de aprendizaje y complicada instalación, operación y mantenimiento. · Hay las llamadas comunidades chinas de Ceph en China, instituciones privadas, inactivas, los documentos están retrasados ​​y no hay señales de actualización. · No admite el aumento dinámico de nodos. El concepto de diseño del fundador de MinIO es que es demasiado complicado aumentar dinámicamente los nodos, y se adoptarán otras soluciones para admitir la expansión en el futuro.
lenguaje de desarrollo · C · Vamos
redundancia de datos Codificación de copia y borrado · Código Reed-Solomon
consistencia · Consistencia fuerte · Consistencia fuerte
Expansión dinámica · HACHÍS · No se admite la adición de nodos dinámicos
nodo central · Almacenamiento de objetos sin centro CephFS tiene un punto central de servicio de metadatos
método de almacenamiento bloque, archivo, objeto · Almacenamiento de objetos
Actividad · Alto, la comunidad china no es muy activa · Alta, sin comunidad china
madurez · alto · medio
sistema de archivos · EXT4, XFS · EXT4, XFS
cliente C, pitón, S3 java, s3
http · 兼容S3,分段上传,断点下载 · 兼容S3,分段上传,断点下载
学习成本 · 高 · 中
开源协议 · LGPL version 2.1 · Apache v2.0
管理工具 · Ceph-admin,Ceph-mgr,zabbix插件 · web管理工具 命令行工具 mc

个人理解

第一张表中,针对中小文件作为主要区分分布式存储的特征,以及还有具有web界面与便于安装这两者具有简化操作的功能能判断是否足够友好,相对而言我觉得简单易用的是MooseFS,MogileFS,FastDFS,GlusterFS;除了fastdfs,其它三款我好像了解也不是很多,但单说fastdfs,可能作为单节点来说,确实很不错,操作用其它语言api来讲也还行,反正根据我之前搭建的过程来讲,没有编译C++的东西复杂,但多节点听说就很复杂了,而且我看B站上的视频讲得也很长,顿时就有了种不想看的感觉,emmm。

第二张表中,可以很明显的看到,ceph各方面都比minio优秀,但是它的缺点尤其明显,太过于复杂和难于管理,我也有针对ceph看过相关资料,ceph是一款面向团队的产品,它的高度自动化带来遍历的同时,系统的运行状态不完全在管理员控制之下,系统中会有若干自动触发而不是管理员触发的操作,这需要运维团队针对这些可能出现的情况进行预案以及适应。但我仅仅一个人,别说运行起这个东西,就算真运行起来了,我感觉也会自己把自己坑死,emmm。。

所以minio毫不意外的成为了我的选择,即最开头引言的最后一句话,“为机器学习、分析和应用程序数据工作负载构建高性能基础架构”。因为我本身工作涉及视频图像算法,上面这句话是在GitHub中作为minio的第一段介绍中强调,我感觉如果对业务足够敏感,对于身兼PPT技术的大佬来讲,这一句话瞬间能醍醐灌顶。为啥?这star量,加上开头这句话,这不就是PPT素材嘛,甚至都不用考虑能不能用。别给我扯什么分布式,高可用,云原生,老夫敲代码就是一把梭(滑稽),最主要呢,还是得老板开心,老板开心我就很开心,虽然疫情挺严重,还是得过个好年的,emmm。。。

minio部署与测试

minio的单节点部署

关于部署这一块,作为用go语言所写的底层,minio展现出了非常强大的跨系统以及兼容性,我之前是用了两台非docker下部署了集群,还不错,操作很简单。但因为写本篇的时候是在家,刚好试试在之前买的腾讯云部署。

docker pull minio/minio
mkdir -p /data/minio/config
mkdir -p /data/minio/data

docker run -p 9000:9000 -p 9090:9090 --net=host --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minioadmin" -e "MINIO_SECRET_KEY=xxx" -v /data/minio/data:/data -v /data/minio/config:/root/.minio minio/minio server /data --console-address ":9090" -address ":9000"

minio的本地部署与docker部署都很简单,上面secret_key是密码,填写完运行即启动了minio,不过上面命令需要注意的是docker安装完后会有三种网络模式,-p使用的是bridge模式,而–net=host使用的是host模式,并且host模式优先级强于前者,所以上面-p指定的端口是无效的,因为网络默认绑定宿主机了。我也是去看了下别人运行的命令,不过有些确实没啥必要。

没报错启动后,我们就能输入localhost:9090进入登录界面,登录成功后如下图:
在这里插入图片描述
我这里因为刚部署上去,加了一个bucket,并丢了几张图上去,bucket应该不用多说,对象存储s3存储单元都叫这个。minio的操作界面非常友好了,基本小白都能懂,然后我原先还没发现,它能显示的格式是真的多,连webp这种小众格式还有PDF都能看:

第一张图片显示不出时显示的文字
第二张图片显示不出时显示的文字

PDF还内置双页打开,如果不是窗口太小,都能拿来划水了。。同样,之前用公司搭的上传了部分视频,如果玩过音视频的可能知道,视频编码格式有非常多种,web端最能接受的是avc1,而其它格式在网页端很难直接播放,但minio就我测试来看,似乎很强。这里就不再演示了,更多的可以去官网直接看它对此做的改进。

minio上传与下载

minio上传测试:

import logging
from minio import Minio
from minio.error import S3Error

logging.basicConfig(
    level=logging.INFO,
    filename='test.log',
    filemode='a',
    format='%(asctime)s %(name)s %(levelname)s--%(message)s'
)

# 确定要上传的文件
file_name = "self_introduction.m4a"
file_path = "/home/video/{}".format(file_name)


def upload_file():
    # 创建一个客户端
    minioClient = Minio(
        'IP:Port',
        access_key='xxxx',
        secret_key='xxxx',
        secure=False
    )

    # 判断桶是否存在
    check_bucket = minioClient.bucket_exists("pdf")
    if not check_bucket:
        minioClient.make_bucket("pdf")
    try:
        # logging.info("start upload file")
        print("start upload file")
        minioClient.fput_object(bucket_name="pdf", object_name="data/{}".format(file_name),
                                file_path=file_path)
        # logging.info("file {0} is successfully uploaded".format(file_name))
        print("file {0} is successfully uploaded".format(file_name))
    except FileNotFoundError as err:
        logging.error('upload_failed: '+ str(err))
    except S3Error as err:
        logging.error("upload_failed:", err)


if __name__ == '__main__':
    upload_file()


在这里插入图片描述

网页上可以看到为:
在这里插入图片描述

minio下载测试:

import logging
from minio import Minio
from minio.error import S3Error

logging.basicConfig(
    level=logging.INFO,
    filename='test.log',
    filemode='a',
    format='%(asctime)s %(name)s %(levelname)s--%(message)s'
)

# 要下载文件
file_name = "self_introduction.m4a"
file_path = "G:\\360Downloads\\img\\{}".format(file_name)


def download_file():
    # 创建一个客户端
    minioClient = Minio(
        'IP:Port',
        access_key='xxxx',
        secret_key='xxxx',
        secure=False
    )
	
    try:
        minioClient.fget_object(
            bucket_name="pdf",
            object_name="data/{}".format(file_name),
            file_path=file_path
        )
        logging.info("file '{0}' is successfully download".format(file_name))
    except S3Error as err:
        logging.error("download_failed:", err)

if __name__ == '__main__':
    download_file()

这里就不再举例,关于批量上传 or 下载,可以加个for循环,以及去官网查看更多的api,GitHub地址为:

https://github.com/minio/minio-py

当然官网也有api的介绍,这里推荐的官网也英文版本的,虽然它有中文,不过毕竟不是官方在维护,有所滞后,所以能看懂英文还是推荐英文。

minio纠删码技术

这里算是分布式的高可用应用场景,这里我了解不深,根据官网的说法来讲,docker是按如下方式启动:

docker run -p 9000:9000 --name minio \
  -v /mnt/data1:/data1 \
  -v /mnt/data2:/data2 \
  -v /mnt/data3:/data3 \
  -v /mnt/data4:/data4 \
  -v /mnt/data5:/data5 \
  -v /mnt/data6:/data6 \
  -v /mnt/data7:/data7 \
  -v /mnt/data8:/data8 \
  minio/minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8

然后就能随意插拔小于等于一半阵列数量的硬盘,它会采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块,来保证数据安全。关于里面是啥逻辑我不知道,但就我试验情况,我两台使用此方式启动,其中一台reboot,另一台开始错误日志起飞,可能这算是一种预警,然后恢复数据倒没观察,因为本身玩也没多久,还算一个预案,只能说还行。未完待续,后续如果有测试出其它问题会进行补充。

Supongo que te gusta

Origin blog.csdn.net/submarineas/article/details/122468225
Recomendado
Clasificación