Implementación de FastDFS en Linux: Sistema de Almacenamiento Distribuido

Comparativa entre FastDFS y HDFS

FastDFS y HDFS (Hadoop Distributed File System) difieren en su enfoque. FastDFS almacena archivos completos en todos los nodos de un grupo específico, proporcionando redundancia. HDFS, por otro lado, fragmenta archivos grandes en bloques más pequeños y los distribuye a través del clúster.

FastDFS está optimizado para archivos pequeños (se recomienda <500MB). HDFS está diseñado para archivos de gran tamaño (generalmente >2GB), utilizando un sistema de almacenamiento basado en bloques.

Conceptos Clave

  • Tracker (Rastreador): Servidor de coordinación que gestiona el balanceo de carga y el estado de los Storage.
  • Storage (Almacenamiento): Servidor que retiene los archivos y sus metadatos.
  • Group (Grupo): Unidad de replicación. Los servidores dentro de un mismo grupo mantienen copias idénticas de los datos. La expansión se logra añadiendo nuevos grupos.
  • Metadata (Metadatos): Información auxiliar del archivo como dimensiones, tipo, etc.

Arquitectura del Sistema FastDFS

FastDFS es un sistema de archivos distribuido de código abierto y ligero, capaz de gestionar almacenamiento, sincronización y acceso a archivos. Es particularmente adecuado para escenarios con archivos de tamaño moderado, como portales de imágenes o videos.

Componentes Principales

  • Tracker Server: Actúa como centro de coordinación. Los servidores Storage le reportan su estado periódicamente. Un clúster de Trackers es simétrico y no requiere persistencia de datos.
  • Storage Server: Organizado en grupos para replicación y escalado horizontal. Cada Storage gestiona sus directorios de datos localmente, creando una estructura jerárquica de subdirectorios para distribuir los archivos.
  • Cliente: Aplicación que utiliza la librería FastDFS para interactuar con el sistema (subir, descargar, eliminar). Un servidor de Nginx es común en los nodos de cliente para servir los archivos vía HTTP.

Estrategia de Alamcenamiento y Sincronización

La expansión del almacenamiento se realiza añadiendo nuevos grupos. Dentro de un grupo, la escritura se realiza en un solo nodo Storage y luego se sincroniza de forma asíncrona a los demás miembros mediante un binlog. La selección de un Storage para lectura considera el progreso de sincronización para evitar inconsistencias.

El ID de archivo devuelto al cliente tras la subida codifica la ubicación: nombre del grupo, ruta de disco virtual, directorios de hash y el nombre del archivo en sí.

Guía de Despliegue en CentOS

Infraestructura de Ejemplo

Para este despliegue, se utilizarán las siguientes máquinas:

Descripción          Dirección IP     Nombre de Host         Grupo
Tracker Primario     192.168.10.200   fdfs-tracker-primary
Tracker Secundario   192.168.10.201   fdfs-tracker-secondary
Storage 1            192.168.10.202   fdfs-storage-node1     group_alpha
Storage 2            192.168.10.203   fdfs-storage-node2     group_beta
Storage 3            192.168.10.204   fdfs-storage-node3     group_gamma
Cliente              192.168.10.205   fdfs-client-node

1. Instalación Base de FastDFS

Este procedimiento se realiza en todos los nodos Tracker, Storage y Cliente. A continuación se muestra un ejemplo para el nodo fdfs-tracker-primary.

# 1. Dependencias y librerías comunes
yum install -y gcc gcc-c++ make automake autoconf libtool pcre-devel zlib-devel openssl-devel
cd /usr/local/src
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz -O libfastcommon-1.0.7.tar.gz
tar zxf libfastcommon-1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh && ./make.sh install
# Crear enlaces simbólicos necesarios
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/

# 2. Instalación de FastDFS
cd /usr/local/src
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz -O fastdfs-5.05.tar.gz
tar zxf fastdfs-5.05.tar.gz
cd fastdfs-5.05
./make.sh && ./make.sh install
# Corregir rutas en los scripts de init
sed -i 's|/usr/local/bin|/usr/bin|g' /etc/init.d/fdfs_trackerd /etc/init.d/fdfs_storaged

2. Configuración del Tracker

Realizar en ambos nodos Tracker (fdfs-tracker-primary y fdfs-tracker-secondary).

# Crear directorio base y copiar configuración
mkdir -p /var/data/fastdfs/tracker
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

# Editar /etc/fdfs/tracker.conf
base_path=/var/data/fastdfs/tracker
# Estrategia de selección de grupo (0: Round-robin, 2: Mayor espacio libre)
store_lookup=2

# Iniciar el servicio
/etc/init.d/fdfs_trackerd start
chkconfig fdfs_trackerd on
# Verificar: netstat -nltp | grep 22122

3. Configuración del Storage

Configurar cada nodo Storage asignándole su grupo correspondiente.

# Ejemplo para fdfs-storage-node1 (group_alpha)
mkdir -p /var/data/fastdfs/storage
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

# Editar /etc/fdfs/storage.conf
group_name=group_alpha
port=23000
base_path=/var/data/fastdfs/storage
store_path0=/var/data/fastdfs/storage
tracker_server=192.168.10.200:22122
tracker_server=192.168.10.201:22122

# Iniciar y habilitar al inicio
/etc/init.d/fdfs_storaged start
chkconfig fdfs_storaged on
# Verificación posterior con: fdfs_monitor /etc/fdfs/storage.conf

4. Prueba de Subida de Archivos

En el nodo cliente, configurar y realizar pruebas.

mkdir -p /var/data/fastdfs/client
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

# Editar /etc/fdfs/client.conf
base_path=/var/data/fastdfs/client
tracker_server=192.168.10.200:22122
tracker_server=192.168.10.201:22122

# Subir un archivo de prueba
echo "Contenido de prueba" > /tmp/mi_archivo.txt
FILE_ID=$(fdfs_upload_file /etc/fdfs/client.conf /tmp/mi_archivo.txt)
echo "ID del archivo subido: $FILE_ID"
# Salida esperada: group_alpha/M00/00/00/wKhSg10P_fSAdEXAMPLE.txt

5. Integración con Nginx para Acceso HTTP

Instalar Nginx con el módulo FastDFS en los nodos Storage para resolver retrasos de sincronización.

# Dependencias y módulo
yum install -y nginx
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.16.tar.gz -O fastdfs-nginx-module-1.16.tar.gz
tar zxf fastdfs-nginx-module-1.16.tar.gz
# Compilar Nginx con el módulo
cd nginx-1.x.x
./configure --add-module=../fastdfs-nginx-module-1.16/src
make && make install

# Configurar el módulo
cp fastdfs-nginx-module-1.16/src/mod_fastdfs.conf /etc/fdfs/
# Editar /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.10.200:22122
tracker_server=192.168.10.201:22122
group_name=group_alpha  # Cambiar según el nodo
url_have_group_name = true
store_path0=/var/data/fastdfs/storage

# Crear symlink y configurar Nginx
ln -s /var/data/fastdfs/storage/data /var/data/fastdfs/storage/data/M00
# Añadir bloque de servidor en nginx.conf
location ~/group([0-9])/M00 {
    ngx_fastdfs_module;
}

6. Balanceo de Carga y Proxy en los Trackers

Instalar Nginx en los Trackers para proveer una URL de acceso unificada y balanceada.

# Configurar upstreams apuntando a los Storage por grupo
upstream storage_pool_alpha {
    server 192.168.10.202:8888;
}
upstream storage_pool_beta {
    server 192.168.10.203:8888;
}
upstream storage_pool_gamma {
    server 192.168.10.204:8888;
}

# Configurar servidor proxy
server {
    listen 8000;
    location /group_alpha/M00 {
        proxy_pass http://storage_pool_alpha;
    }
    location /group_beta/M00 {
        proxy_pass http://storage_pool_beta;
    }
    location /group_gamma/M00 {
        proxy_pass http://storage_pool_gamma;
    }
}

# Para alta disponibilidad del acceso, configurar Keepalived entre ambos Trackers con una IP virtual (VIP).

7. Comandos Útiles del Cliente FastDFS

  • Subir: fdfs_upload_file /etc/fdfs/client.conf /ruta/local/archivo
  • Descargar: fdfs_download_file /etc/fdfs/client.conf ID_ARCHIVO
  • Eliminar: fdfs_delete_file /etc/fdfs/client.conf ID_ARCHIVO
  • Información: fdfs_file_info /etc/fdfs/client.conf ID_ARCHIVO
  • Monitorear clúster: fdfs_monitor /etc/fdfs/client.conf
  • Gestionar nodos: Para eliminar un nodo defectuoso: fdfs_monitor /etc/fdfs/client.conf delete group1 IP_NODO

Etiquetas: FastDFS linux almacenamiento distribuido Nginx balanceo de carga

Publicado el 6-4 23:51