{"id":2368,"date":"2026-04-24T01:27:17","date_gmt":"2026-04-24T01:27:17","guid":{"rendered":"https:\/\/dsantana.uas.edu.mx\/?p=2368"},"modified":"2026-04-24T02:32:16","modified_gmt":"2026-04-24T02:32:16","slug":"practica-drbd-en-debian-13-4-replicacion-de-volumen-paso-a-paso","status":"publish","type":"post","link":"https:\/\/dsantana.uas.edu.mx\/index.php\/2026\/04\/24\/practica-drbd-en-debian-13-4-replicacion-de-volumen-paso-a-paso\/","title":{"rendered":"Pr\u00e1ctica DRBD en Debian 13.4: Replicaci\u00f3n de Volumen Paso a Paso"},"content":{"rendered":"\n<figure class=\"wp-block-image aligncenter size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/dsantana.uas.edu.mx\/wp-content\/uploads\/2026\/04\/Practica-DRBD-en-Debian-134-Replicacion-de-Volume.png\" alt=\"\" class=\"wp-image-2373\" srcset=\"https:\/\/dsantana.uas.edu.mx\/wp-content\/uploads\/2026\/04\/Practica-DRBD-en-Debian-134-Replicacion-de-Volume.png 1024w, https:\/\/dsantana.uas.edu.mx\/wp-content\/uploads\/2026\/04\/Practica-DRBD-en-Debian-134-Replicacion-de-Volume-300x300.png 300w, https:\/\/dsantana.uas.edu.mx\/wp-content\/uploads\/2026\/04\/Practica-DRBD-en-Debian-134-Replicacion-de-Volume-150x150.png 150w, https:\/\/dsantana.uas.edu.mx\/wp-content\/uploads\/2026\/04\/Practica-DRBD-en-Debian-134-Replicacion-de-Volume-768x768.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Contexto:<\/strong> Esta pr\u00e1ctica configura <strong>DRBD<\/strong> (<em>Distributed Replicated Block Device<\/em>) en dos nodos (denominados <strong>nodo-a<\/strong> y <strong>nodo-b<\/strong>) con Debian 13.4, para replicar un volumen de datos entre ambos en tiempo real. Cada nodo cuenta con una partici\u00f3n adicional (p.ej. <code>\/dev\/sdb1<\/code>) de tama\u00f1o id\u00e9ntico destinada a DRBD. El objetivo es lograr un <em>\u00abRAID-1 de red\u00bb<\/em>: cualquier cambio en el nodo Primario se replicar\u00e1 al Secundario de forma continua, manteniendo ambas copias sincronizadas. DRBD es un <strong>m\u00f3dulo del kernel de Linux<\/strong> que se ubica entre el planificador de I\/O (parte inferior) y el sistema de archivos (parte superior), actuando como controlador de un <strong>dispositivo de bloque virtual<\/strong>. Esto significa que las aplicaciones leen y escriben datos sin saber que, en la capa de bloques, esos datos est\u00e1n siendo duplicados por red en otro servidor \u2014 la replicaci\u00f3n es <strong>transparente<\/strong> para ellas.<\/p>\n\n\n\n<p>A continuaci\u00f3n se explica <strong>cada paso en detalle<\/strong>, indicando <em>qu\u00e9 se hace, por qu\u00e9 se hace y qu\u00e9 ocurre internamente<\/em> en la pila de I\/O de Linux (aplicaci\u00f3n \u2192 sistema de archivos \u2192 dispositivo DRBD \u2192 disco \u2192 red), junto con <strong>verificaciones, advertencias y errores comunes<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 1: Instalaci\u00f3n de DRBD en ambos nodos<\/h2>\n\n\n\n<p><strong>Qu\u00e9 se hace:<\/strong> Se instala el paquete de utilidades de DRBD en los dos servidores. En Debian, el paquete se denomina <code>drbd-utils<\/code> y contiene las herramientas de espacio de usuario (<code>drbdadm<\/code>, <code>drbdsetup<\/code>, <code>drbdmeta<\/code>) necesarias para configurar y manejar DRBD. En Debian, la porci\u00f3n de m\u00f3dulo de DRBD se distribuye con los kernels de Debian, por lo que instalar <code>drbd-utils<\/code> generalmente es suficiente sin compilar nada adicional. El comando es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update &amp;&amp; sudo apt install -y drbd-utils<\/code><\/pre>\n\n\n\n<p>Esto se ejecuta en <strong>nodo-a y nodo-b<\/strong>. La opci\u00f3n <code>-y<\/code> auto-confirma la instalaci\u00f3n. Se instalan las herramientas de administraci\u00f3n que se comunican con el m\u00f3dulo del kernel para configurar y administrar los recursos DRBD.<\/p>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> DRBD tiene dos componentes: un m\u00f3dulo en el kernel (el <em>driver<\/em> de bloque replicado, con n\u00famero mayor de dispositivo <strong>147<\/strong>) y herramientas en <em>user-space<\/em> para su administraci\u00f3n. Sin instalar <code>drbd-utils<\/code>, no tendr\u00edamos los comandos necesarios para crear metadatos, levantar recursos ni monitorear el estado de la replicaci\u00f3n.<\/p>\n\n\n\n<p><strong>Internamente (capa afectada):<\/strong> Aqu\u00ed solo a\u00f1adimos software; <strong>a\u00fan no cambia nada en la pila de I\/O<\/strong>. Tras la instalaci\u00f3n, el m\u00f3dulo kernel estar\u00e1 disponible para cargarse al usarlo m\u00e1s adelante, y las herramientas de administraci\u00f3n quedar\u00e1n listas.<\/p>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ejecutar <code>drbdadm --version<\/code> para confirmar que la herramienta est\u00e1 disponible.<\/li>\n\n\n\n<li>Verificar que el m\u00f3dulo se pueda cargar: <code>modinfo drbd<\/code> debe mostrar informaci\u00f3n del m\u00f3dulo.<\/li>\n\n\n\n<li>Comprobar el estado del servicio: <code>systemctl status drbd<\/code>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Errores comunes:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><td>Repositorios o red<\/td><td><code>apt<\/code> falla al descargar paquetes<\/td><td>Verificar conexi\u00f3n a internet y que <code>\/etc\/apt\/sources.list<\/code> tenga repositorios v\u00e1lidos<\/td><\/tr><tr><td>Permisos insuficientes<\/td><td>Error de permisos al instalar<\/td><td>Ejecutar como root o con <code>sudo<\/code><\/td><\/tr><tr><td>M\u00f3dulo kernel ausente (entorno virtual)<\/td><td><code>modprobe drbd<\/code> falla con \u00abModule not found\u00bb<\/td><td>En kernels virtuales, instalar <code>linux-modules-extra-$(uname -r)<\/code> <\/td><\/tr><tr><td>Versiones distintas entre nodos<\/td><td>Error de protocolo al conectar nodos<\/td><td>Asegurar que ambos nodos tengan la misma versi\u00f3n de <code>drbd-utils<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 2: Preparaci\u00f3n del disco o partici\u00f3n en cada nodo<\/h2>\n\n\n\n<p><strong>Qu\u00e9 se hace:<\/strong> Se designa un <strong>dispositivo de bloque dedicado<\/strong> en cada servidor para la replicaci\u00f3n. En producci\u00f3n se suele usar un disco entero; en laboratorio, una <strong>partici\u00f3n<\/strong> (p.ej. <code>\/dev\/sdb1<\/code>). Es fundamental que esta partici\u00f3n: <strong>(a)<\/strong> tenga el <strong>mismo tama\u00f1o<\/strong> en ambos nodos, y <strong>(b)<\/strong><strong>no est\u00e9 montada<\/strong> ni en <code>\/etc\/fstab<\/code>. La verificaci\u00f3n se realiza con:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lsblk -f<\/code><\/pre>\n\n\n\n<p>Este comando lista los dispositivos de bloque. Debe confirmarse que <code>\/dev\/sdb1<\/code> existe en ambos nodos, que <strong>no tenga punto de montaje<\/strong> asignado y que su tama\u00f1o sea id\u00e9ntico.<\/p>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> DRBD replica bloques de datos <em>crudos<\/em>. Necesitamos almacenamiento dedicado que DRBD controlar\u00e1 exclusivamente. Ambas particiones deben ser de tama\u00f1o id\u00e9ntico para que la r\u00e9plica funcione correctamente. DRBD soporta cualquier dispositivo de bloque soportado por Linux: partici\u00f3n o disco duro completo, RAID por software, LVM o EVMS.<\/p>\n\n\n\n<p><strong>Internamente (capa afectada):<\/strong> Solo preparamos la <strong>capa de almacenamiento f\u00edsico<\/strong> (el nivel m\u00e1s bajo de la pila I\/O). No hemos configurado DRBD ni hay tr\u00e1fico de red a\u00fan.<\/p>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirmar que la partici\u00f3n <strong>no est\u00e9 en <code>\/etc\/fstab<\/code><\/strong> para que no se monte en reinicios.<\/li>\n\n\n\n<li>Ejecutar <code>mount | grep sdb1<\/code> \u2192 no debe mostrar nada.<\/li>\n\n\n\n<li>Verificar tama\u00f1os: <code>lsblk -b \/dev\/sdb1<\/code> en cada nodo \u2192 deben coincidir.<\/li>\n<\/ul>\n\n\n\n<p><strong>Errores comunes:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><td>Partici\u00f3n montada<\/td><td><code>drbdadm create-md<\/code> falla al bloquear dispositivo<\/td><td>Desmontar con <code>umount<\/code> y verificar que ning\u00fan proceso la use (<code>lsof \/dev\/sdb1<\/code>)<\/td><\/tr><tr><td>Tama\u00f1o inconsistente<\/td><td>DRBD ajusta al menor, dejando espacio desperdiciado<\/td><td>Reparticionar al mismo tama\u00f1o antes de continuar<\/td><\/tr><tr><td>Confundir disco y partici\u00f3n<\/td><td>Apuntar a <code>\/dev\/sdb<\/code> cuando debe ser <code>\/dev\/sdb1<\/code><\/td><td>Verificar con <code>lsblk<\/code> y usar exactamente la ruta que aparece en la configuraci\u00f3n<\/td><\/tr><tr><td>Datos previos en la partici\u00f3n<\/td><td>Advertencia de destrucci\u00f3n de datos al inicializar<\/td><td>Si los datos no son necesarios, confirmar; si lo son, respaldarlos primero<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 3: Configuraci\u00f3n b\u00e1sica del recurso DRBD (<code>\/etc\/drbd.d\/web.res<\/code>)<\/h2>\n\n\n\n<p><strong>Qu\u00e9 se hace:<\/strong> Se crea un archivo de configuraci\u00f3n que define el <em>recurso DRBD<\/em> (el nombre l\u00f3gico de la pareja de discos replicados). El archivo <code>\/etc\/drbd.d\/web.res<\/code> debe ser <strong>id\u00e9ntico en ambos nodos<\/strong>y contiene:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>resource webdata {\n    protocol    C;\n\n    on nodo-a {\n        device      \/dev\/drbd0;\n        disk        \/dev\/sdb1;\n        address     192.168.1.10:7789;\n        meta-disk   internal;\n    }\n\n    on nodo-b {\n        device      \/dev\/drbd0;\n        disk        \/dev\/sdb1;\n        address     192.168.1.11:7789;\n        meta-disk   internal;\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Explicaci\u00f3n l\u00ednea por l\u00ednea<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>resource webdata { ... }<\/code><\/strong> \u2014 Nombre l\u00f3gico del recurso. Se usar\u00e1 en todos los comandos posteriores (<code>drbdadm up webdata<\/code>, etc.). El archivo de configuraci\u00f3n suele llevar el nombre del recurso (<code>web.res<\/code>) por claridad.<\/li>\n\n\n\n<li><strong><code>protocol C;<\/code><\/strong> \u2014 Selecciona la <strong>replicaci\u00f3n s\u00edncrona completa<\/strong>: la escritura se confirma a la aplicaci\u00f3n <strong>solo despu\u00e9s de que ambos nodos hayan persistido los datos en disco<\/strong>. De los tres protocolos disponibles (A, B, C), el Protocolo C ofrece la <strong>m\u00e1xima protecci\u00f3n ante p\u00e9rdida de datos<\/strong>: si el Primario falla, el Secundario tiene garantizadamente toda la informaci\u00f3n. El costo es mayor latencia de escritura (incluye retardo de red + I\/O remoto del secundario), pero en una LAN local este impacto es aceptable. <strong>\u00bfPor qu\u00e9 Protocolo C en el laboratorio?<\/strong> Porque estamos en red local de baja latencia, el rendimiento (<em>throughput<\/em>) es en gran medida independiente del protocolo elegido, y queremos demostrar la m\u00e1xima garant\u00eda de consistencia que DRBD ofrece.<\/li>\n<\/ul>\n\n\n\n<p><strong>Comparativa r\u00e1pida de protocolos:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Protocolo<\/th><th>Tipo<\/th><th>Confirmaci\u00f3n de escritura<\/th><th>Riesgo ante fallo del Primary<\/th><\/tr><tr><th><strong>A<\/strong> (As\u00edncrono)<\/th><td>Tras disco local + paquete en <em>buffer<\/em> TCP<\/td><td>Posible p\u00e9rdida de las actualizaciones m\u00e1s recientes <\/td><td><\/td><\/tr><tr><th><strong>B<\/strong> (Semis\u00edncrono)<\/th><td>Tras disco local + recepci\u00f3n en memoria remota<\/td><td>Datos normalmente seguros; riesgo si ambos nodos fallan simult\u00e1neamente<\/td><td><\/td><\/tr><tr><th><strong>C<\/strong> (S\u00edncrono) \u2705<\/th><td>Tras disco local <strong>+ disco remoto<\/strong><\/td><td><strong>Cero p\u00e9rdida de datos<\/strong> <\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bloques <code>on nodo-a { ... }<\/code> y <code>on nodo-b { ... }<\/code><\/strong> \u2014 Definen las propiedades de cada extremo. El nombre dentro de <code>on &lt;nombre&gt;<\/code><strong>debe coincidir exactamente<\/strong> con el nombre de host del nodo (resultado de <code>uname -n<\/code> o <code>hostname<\/code>). Si no coincide, DRBD no sabr\u00e1 qu\u00e9 configuraci\u00f3n aplicar en cada m\u00e1quina.\n<ul class=\"wp-block-list\">\n<li><strong><code>device \/dev\/drbd0;<\/code><\/strong> \u2014 Nombre del dispositivo <strong>virtual<\/strong> que DRBD crear\u00e1. DRBD asigna el n\u00famero mayor <strong>147<\/strong> a sus dispositivos de bloque. Este <code>\/dev\/drbd0<\/code> ser\u00e1 el que montemos y usemos como si fuera un disco local.<\/li>\n\n\n\n<li><strong><code>disk \/dev\/sdb1;<\/code><\/strong> \u2014 Ruta del dispositivo <strong>f\u00edsico<\/strong> de respaldo (la partici\u00f3n preparada en el Paso 2). DRBD actuar\u00e1 como capa intermedia entre este disco y el sistema de archivos.<\/li>\n\n\n\n<li><strong><code>address &lt;IP:puerto&gt;;<\/code><\/strong> \u2014 Direcci\u00f3n IP y puerto TCP para la comunicaci\u00f3n de replicaci\u00f3n. Por defecto, DRBD utiliza los puertos TCP <strong>7788<\/strong> en adelante. En esta configuraci\u00f3n elegimos el puerto 7789, que es igualmente v\u00e1lido. <strong>Ambos extremos deben usar el mismo puerto<\/strong> para un recurso dado. Es recomendable usar una <strong>red dedicada<\/strong> para el tr\u00e1fico de replicaci\u00f3n por volumen y seguridad, ya que el tr\u00e1fico entre espejos DRBD <strong>no est\u00e1 cifrado<\/strong> por defecto; para un intercambio seguro se recomienda una VPN.<\/li>\n\n\n\n<li><strong><code>meta-disk internal;<\/code><\/strong> \u2014 Indica que los <strong>metadatos de DRBD<\/strong> (bitmaps de sincronizaci\u00f3n, identificadores de generaci\u00f3n, etc.) se almacenar\u00e1n <strong>dentro de la misma partici\u00f3n de datos<\/strong>, reservando un peque\u00f1o espacio al final de <code>\/dev\/sdb1<\/code>. Ejemplo: si el dispositivo crudo tiene <strong>1024 MB<\/strong>, el dispositivo DRBD dispondr\u00e1 de solo <strong>1023 MB<\/strong> para datos, con aproximadamente <strong>70 KB<\/strong> reservados para metadatos.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> Esta configuraci\u00f3n define <em>c\u00f3mo<\/em> se conectar\u00e1 y comportar\u00e1 el recurso replicado: qu\u00e9 disco local usar, a qu\u00e9 compa\u00f1ero conectarse por red, con qu\u00e9 garant\u00edas de sincronizaci\u00f3n y d\u00f3nde guardar los metadatos internos.<\/p>\n\n\n\n<p><strong>Internamente (capa afectada):<\/strong> Solo se modifica la <strong>capa de configuraci\u00f3n<\/strong> (espacio de usuario). Todav\u00eda no se han creado dispositivos ni comunicaciones de red. Estamos preparando la \u00abhoja de ruta\u00bb que DRBD seguir\u00e1.<\/p>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tras copiar el archivo a <strong>ambos nodos<\/strong>, ejecutar <code>drbdadm dump all<\/code> para verificar que DRBD interpreta la configuraci\u00f3n sin errores de sintaxis.<\/li>\n\n\n\n<li>Confirmar que los nombres de host coinciden: ejecutar <code>uname -n<\/code> en cada nodo y verificar que corresponda con la secci\u00f3n <code>on &lt;nombre&gt;<\/code>.<\/li>\n\n\n\n<li>Verificar conectividad de red: <code>ping 192.168.1.11<\/code> desde nodo-a (y viceversa).<\/li>\n\n\n\n<li>Verificar que el puerto <strong>7789\/tcp<\/strong> no est\u00e9 bloqueado por firewall (<code>iptables -L<\/code> o <code>nft list ruleset<\/code>).<\/li>\n<\/ul>\n\n\n\n<p><strong>Errores comunes \/ Advertencias:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><td>Error de sintaxis en <code>.res<\/code><\/td><td><code>drbdadm<\/code> indica n\u00famero de l\u00ednea con error<\/td><td>Revisar corchetes, puntos y coma, y ortograf\u00eda<\/td><\/tr><tr><td>Nombre de host incorrecto<\/td><td><em>\u00abNo valid configuration found for this host\u00bb<\/em><\/td><td><code>uname -n<\/code> debe coincidir con la secci\u00f3n <code>on &lt;nombre&gt;<\/code> en el archivo<\/td><\/tr><tr><td>Archivo no copiado al segundo nodo<\/td><td>Segundo nodo queda en <code>StandAlone<\/code>, no reconoce recurso<\/td><td>Copiar con <code>scp<\/code> el archivo .res al otro nodo<\/td><\/tr><tr><td>Puerto bloqueado por firewall<\/td><td>Los nodos no conectan (<code>cs:Timeout<\/code>)<\/td><td>Abrir el puerto TCP configurado en ambos nodos<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 4: Inicializar el recurso DRBD en ambos nodos (metadatos y arranque)<\/h2>\n\n\n\n<p>Se ejecutan <strong>dos comandos en cada nodo<\/strong>: primero se crean los metadatos, luego se activa el recurso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comando 4.1 \u2014 Crear metadatos: <code>drbdadm create-md webdata<\/code><\/h3>\n\n\n\n<p>Este comando inicializa el <strong>\u00e1rea de metadatos<\/strong> de DRBD en el dispositivo de respaldo (<code>\/dev\/sdb1<\/code>). Al ejecutarlo, si la partici\u00f3n contiene datos previos, DRBD mostrar\u00e1 una advertencia y pedir\u00e1 confirmaci\u00f3n expl\u00edcita (debe escribirse la palabra completa <code>yes<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>About to create a new drbd meta data block on \/dev\/sdb1.\n  ==&gt; This might destroy existing data! &lt;==\nDo you want to proceed? &#91;need to type 'yes' to confirm] yes\nCreating meta data...\ninitialising activity log\nNOT initialized bitmap\nNew drbd meta data block successfully created.<\/code><\/pre>\n\n\n\n<p><code>create-md<\/code> escribe estructuras de control al final de la partici\u00f3n: un <em>bitmap<\/em> de seguimiento de bloques modificados, un <em>activity log<\/em> para la consistencia de escrituras y campos como el UUID del conjunto de datos. <strong>Solo se ejecuta una vez, antes del primer uso del recurso.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comando 4.2 \u2014 Activar recurso: <code>drbdadm up webdata<\/code><\/h3>\n\n\n\n<p>Este comando adjunta el dispositivo de bloque real al driver DRBD y <strong>levanta el dispositivo virtual<\/strong><code>\/dev\/drbd0<\/code> en cada nodo. Efect\u00faa internamente la carga de la configuraci\u00f3n del recurso, el <em>attach<\/em> del disco y el intento de conexi\u00f3n al nodo par.<\/p>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> Sin los metadatos, DRBD no podr\u00eda rastrear qu\u00e9 bloques han sido modificados para la replicaci\u00f3n diferencial. Sin <code>drbdadm up<\/code>, el dispositivo virtual no existe y los nodos no se comunican. Este paso pone en marcha el motor de DRBD.<\/p>\n\n\n\n<p><strong>Internamente (capas afectadas):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>create-md:<\/em> act\u00faa sobre la <strong>capa de disco f\u00edsico<\/strong>, escribiendo la secci\u00f3n de metadatos.<\/li>\n\n\n\n<li><em>up:<\/em> involucra la <strong>capa de red<\/strong> (DRBD inicia la comunicaci\u00f3n TCP entre los nodos en el puerto 7789) y la creaci\u00f3n del <strong>dispositivo de bloque virtual<\/strong> <code>\/dev\/drbd0<\/code> en la capa de bloques local.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Estado esperado tras <code>drbdadm up<\/code> en ambos nodos:<\/strong> Al no haber definido a\u00fan un Primario, ambos nodos quedan como <strong>Secondary\/Secondary<\/strong> con discos <strong>Inconsistent\/Inconsistent<\/strong>. Esta salida es normal y esperada en una configuraci\u00f3n nueva:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>0: cs:Connected  ro:Secondary\/Secondary  ds:Inconsistent\/Inconsistent  C<\/code><\/pre>\n\n\n\n<p>Esto indica: nodos <strong>conectados<\/strong> (cs:Connected), ambos en rol <strong>Secundario<\/strong> (ninguno es Primario), y discos <strong>inconsistentes<\/strong> (DRBD no sabe cu\u00e1l tiene datos v\u00e1lidos porque falta la sincronizaci\u00f3n inicial).<\/p>\n<\/blockquote>\n\n\n\n<p>En DRBD 9 con <code>drbdadm status<\/code>, la salida equivalente tiene un formato m\u00e1s legible:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>webdata role:Secondary\n  disk:Inconsistent\n  nodo-b role:Secondary\n    disk:Inconsistent<\/code><\/pre>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dispositivo virtual creado: <code>ls -l \/dev\/drbd*<\/code> \u2192 debe existir <code>\/dev\/drbd0<\/code>.<\/li>\n\n\n\n<li><code>lsblk<\/code> \u2192 debe listar un dispositivo <code>drbd0<\/code> de tama\u00f1o ligeramente inferior al de <code>sdb1<\/code>.<\/li>\n\n\n\n<li>Conexi\u00f3n de red: <code>cat \/proc\/drbd<\/code> o <code>drbdadm status<\/code> \u2192 <code>cs:Connected<\/code>.<\/li>\n\n\n\n<li>Ambos en Secondary con Inconsistent \u2192 correcto, se resolver\u00e1 en el siguiente paso.<\/li>\n<\/ul>\n\n\n\n<p><strong>Errores comunes:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><td>No confirmar <code>yes<\/code> en create-md<\/td><td>Comando se aborta sin cambios<\/td><td>Relanzar y escribir la palabra completa <code>yes<\/code> (no \u00aby\u00bb, no Enter solo)<\/td><\/tr><tr><td>Solo un nodo ejecut\u00f3 <code>up<\/code><\/td><td>Estado <code>WFConnection<\/code> (esperando al par)<\/td><td>Ejecutar <code>drbdadm up webdata<\/code> tambi\u00e9n en el otro nodo<\/td><\/tr><tr><td>M\u00f3dulo no cargado<\/td><td>Error <em>\u00abcan&#8217;t open device\u00bb<\/em><\/td><td>Ejecutar <code>modprobe drbd<\/code> manualmente antes de <code>drbdadm up<\/code><\/td><\/tr><tr><td>Firewall bloquea puerto<\/td><td><code>cs:Timeout<\/code> o <code>Connecting<\/code> persistente<\/td><td>Verificar y abrir el puerto TCP 7789 en ambos nodos<\/td><\/tr><tr><td>Dispositivo inexistente<\/td><td>Error al adjuntar disco<\/td><td>Verificar que la ruta <code>\/dev\/sdb1<\/code> es correcta con <code>lsblk<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 5: Forzar un nodo Primario (sincronizaci\u00f3n inicial)<\/h2>\n\n\n\n<p><strong>Qu\u00e9 se hace:<\/strong> Designamos a <strong>nodo-a<\/strong> como Primario para arrancar la replicaci\u00f3n inicial. En <strong>nodo-a<\/strong> se ejecuta:<\/p>\n\n\n\n<p>drbdadm &#8212; &#8211;overwrite-data-of-peer primary webdata<\/p>\n\n\n\n<p>La construcci\u00f3n con doble guion <code>--<\/code> indica a <code>drbdadm<\/code> que pase la opci\u00f3n <code>--overwrite-data-of-peer<\/code> al comando subyacente <code>drbdsetup<\/code>. Esta opci\u00f3n le dice a DRBD: <em>\u00abPromociona este nodo a Primary, considerando que <strong>mis datos<\/strong> son la copia buena y sobreescribiendo la del peer\u00bb<\/em>. <strong>Se debe ejecutar una sola vez, solo en el nodo elegido como fuente, y solo durante la configuraci\u00f3n inicial del recurso<\/strong>.<\/p>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> DRBD necesita saber qu\u00e9 lado tiene los datos \u00abcorrectos\u00bb para comenzar a replicar. La gu\u00eda oficial de LINBIT advierte: <em>\u00abSi se realiza la sincronizaci\u00f3n inicial en la direcci\u00f3n equivocada, se perder\u00e1n esos datos. Proceda con precauci\u00f3n\u00bb<\/em>. En una configuraci\u00f3n nueva con discos vac\u00edos, la elecci\u00f3n es arbitraria; pero <strong>en producci\u00f3n, si un nodo ya tuviera datos valiosos, se debe elegir ese como Primario inicial<\/strong>.<\/p>\n\n\n\n<p>Sin esta orden, ning\u00fan nodo se dejar\u00e1 promover a Primario: DRBD rechaza el cambio con el error <em>\u00abState change failed: (-2) Need access to UpToDate data\u00bb<\/em>, protegi\u00e9ndonos contra la promoci\u00f3n de un nodo sin datos v\u00e1lidos.<\/p>\n\n\n\n<p><strong>Internamente (capas afectadas):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nodo-a pasa a estado <strong>Primary<\/strong> con acceso de lectura\/escritura a <code>\/dev\/drbd0<\/code>. Nodo-b permanece <strong>Secondary<\/strong> (solo lectura, sin exponer <code>\/dev\/drbd0<\/code> al sistema de archivos).<\/li>\n\n\n\n<li>DRBD inicia la <strong>sincronizaci\u00f3n completa<\/strong>: nodo-a se convierte en <code>SyncSource<\/code> y nodo-b en <code>SyncTarget<\/code>. Nodo-a env\u00eda <strong>todos los bloques de datos<\/strong> de su partici\u00f3n v\u00eda red al nodo-b, que los almacena en su propio <code>\/dev\/sdb1<\/code>.<\/li>\n\n\n\n<li>Hasta completarse, el estado de los discos es <strong>UpToDate\/Inconsistent<\/strong> (Primario actualizado, Secundario a\u00fan incompleto). Al finalizar (100%), ambos quedar\u00e1n <strong>UpToDate\/UpToDate<\/strong>.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Dato importante:<\/strong> Seg\u00fan la documentaci\u00f3n oficial de LINBIT, <em>\u00absu dispositivo DRBD est\u00e1 totalmente operativo incluso antes de que la sincronizaci\u00f3n inicial haya terminado (aunque con rendimiento ligeramente reducido). Si se parti\u00f3 de discos vac\u00edos, ya es posible crear un sistema de archivos en el dispositivo\u00bb<\/em>. No obstante, para esta pr\u00e1ctica de laboratorio es recomendable esperar al 100% para confirmar que todo funciona antes de continuar.<\/p>\n<\/blockquote>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong> Observar el progreso de la sincronizaci\u00f3n con cualquiera de estos m\u00e9todos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>cat \/proc\/drbd<\/code><\/strong> \u2014 muestra el porcentaje de avance y velocidad. Ejemplo t\u00edpico durante la sincronizaci\u00f3n:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><code>0: cs:SyncSource ro:Primary\/Secondary ds:UpToDate\/Inconsistent C\n&#91;&gt;....................] sync'ed: 0.4% (1048508\/1048508)K\nfinish: 0:43:41 speed: 0 (0) K\/sec<\/code><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>watch -n1 cat \/proc\/drbd<\/code><\/strong> \u2014 refresca el estado cada segundo para ver el progreso en tiempo real. Presionar <code>Ctrl+C<\/code> para detener la observaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>drbdadm status webdata<\/code><\/strong> \u2014 formato DRBD 9 m\u00e1s legible.<\/li>\n<\/ul>\n\n\n\n<p><strong>El estado final esperado al completar la sincronizaci\u00f3n:<\/strong><\/p>\n\n\n\n<p>0: cs:Connected ro:Primary\/Secondary ds:UpToDate\/UpToDate C<\/p>\n\n\n\n<p>Donde <code>UpToDate\/UpToDate<\/code> confirma que <strong>ambos nodos tienen datos id\u00e9nticos<\/strong> y el recurso est\u00e1 totalmente operativo.<\/p>\n\n\n\n<p><strong>Errores comunes \/ Advertencias:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><td>Omitir este paso<\/td><td>No se puede formatear ni montar: <em>\u00abNeed access to UpToDate data\u00bb<\/em><\/td><td>Ejecutar el comando de promoci\u00f3n con <code>--overwrite-data-of-peer<\/code><\/td><\/tr><tr><td>Par\u00e1metros mal escritos<\/td><td>Error de sintaxis o rechazo<\/td><td>Verificar exactamente: <code>-- --overwrite-data-of-peer<\/code> (doble guion, espacio, doble guion + opci\u00f3n)<\/td><\/tr><tr><th>Ejecutar en <strong>ambos<\/strong> nodos<\/th><td><strong>Split-brain<\/strong>: dos primarios divergentes \u2192 DRBD corta la conexi\u00f3n<\/td><td><strong>Nunca<\/strong> ejecutar la promoci\u00f3n forzada en m\u00e1s de un nodo. Si ocurri\u00f3, se requiere resoluci\u00f3n manual de split-brain<\/td><\/tr><tr><td>Sincronizaci\u00f3n muy lenta<\/td><td>Progreso bajo (K\/sec)<\/td><td>Verificar velocidad de red entre nodos; considerar configurar <code>syncer { rate &lt;velocidad&gt;; }<\/code> en el archivo de recursos<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 6: Crear el sistema de archivos en el dispositivo DRBD (nodo Primario)<\/h2>\n\n\n\n<p><strong>Qu\u00e9 se hace:<\/strong> Con el recurso sincronizado (UpToDate\/UpToDate) y en rol Primary en nodo-a, se formatea <code>\/dev\/drbd0<\/code> con ext4:<\/p>\n\n\n\n<p>sudo mkfs.ext4 \/dev\/drbd0<\/p>\n\n\n\n<p>Este comando se ejecuta <strong>solo en el nodo Primario (nodo-a), una \u00fanica vez<\/strong>. Crea las estructuras del sistema de archivos ext4 (<em>superbloque<\/em>, tabla de inodos, mapas de bits, etc.) sobre el dispositivo de bloque replicado.<\/p>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> Necesitamos un sistema de archivos para almacenar ficheros de forma estructurada. Ext4 es una elecci\u00f3n est\u00e1ndar en Linux. DRBD presenta <code>\/dev\/drbd0<\/code> como un disco convencional al sistema, por lo que <code>mkfs.ext4<\/code> funciona igual que sobre cualquier disco local. En configuraciones <em>single-primary<\/em> como la nuestra, se usan sistemas de archivos convencionales (ext4, XFS). Un sistema de archivos de cl\u00faster (GFS2, OCFS2) solo se necesitar\u00eda en configuraciones <em>dual-primary<\/em>, ya que DRBD <strong>no puede agregar capacidad activo-activo<\/strong> a sistemas de archivos que no la poseen nativamente.<\/p>\n\n\n\n<p><strong>Internamente (capas afectadas):<\/strong> El comando act\u00faa a nivel de <strong>capa de sistema de archivos<\/strong> sobre el <strong>dispositivo de bloque virtual DRBD<\/strong>. Los cambios producidos por <code>mkfs<\/code> son interceptados por DRBD en nodo-a, que los <strong>replica por red<\/strong> a nodo-b en tiempo real. Al finalizar, <strong>ambos discos f\u00edsicos contienen una copia id\u00e9ntica del sistema de archivos ext4<\/strong> reci\u00e9n creado, aunque nodo-b no puede acceder a esos datos todav\u00eda (permanece en rol Secondary).<\/p>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>mkfs.ext4<\/code> produce una salida indicando que las estructuras de ext4 fueron creadas (cantidad de bloques, inodos, etc.).<\/li>\n\n\n\n<li>Confirmar: <code>blkid \/dev\/drbd0<\/code> en nodo-a \u2192 debe mostrar <code>TYPE=\"ext4\"<\/code> con un UUID asignado.<\/li>\n\n\n\n<li><code>file -s \/dev\/drbd0<\/code> en nodo-a \u2192 debe indicar \u00abLinux rev 1.0 ext4 filesystem\u00bb.<\/li>\n<\/ul>\n\n\n\n<p><strong>Errores comunes \/ Advertencias:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><td>Ejecutar en nodo Secundario<\/td><td>Error de permisos o dispositivo ocupado<\/td><td>Ejecutar <strong>solo<\/strong> en el nodo que est\u00e1 en rol Primary<\/td><\/tr><tr><th>Formatear <strong><code>\/dev\/sdb1<\/code><\/strong> en vez de <strong><code>\/dev\/drbd0<\/code><\/strong><\/th><td>\u26a0\ufe0f <strong>Cr\u00edtico<\/strong>: datos escritos fuera de DRBD, nodo-b no recibe nada \u2192 inconsistencia permanente<\/td><td><strong>Toda operaci\u00f3n debe hacerse sobre <code>\/dev\/drbdX<\/code><\/strong>, nunca sobre el dispositivo crudo, ya que DRBD usa la \u00faltima parte del dispositivo crudo para metadatos y el acceso directo causar\u00e1 datos inconsistentes<\/td><\/tr><tr><th>Formatear en <strong>ambos<\/strong> nodos<\/th><td>Innecesario y peligroso \u2192 se necesitar\u00eda re-promover al otro nodo, rompiendo la sincron\u00eda<\/td><td>Formatear <strong>solo una vez, en el Primary<\/strong>. El Secondary ya tiene la r\u00e9plica a nivel de bloque<\/td><\/tr><tr><td>Usar un FS de cl\u00faster (GFS2\/OCFS2) sin dual-primary<\/td><td>Error o comportamiento inesperado<\/td><td>En modo single-primary, usar ext4 o XFS es lo correcto<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 7: Montar el sistema de archivos replicado <strong>solo en el nodo Primario activo<\/strong><\/h2>\n\n\n\n<p><strong>Qu\u00e9 se hace:<\/strong> En <strong>nodo-a<\/strong> (Primary) se monta el nuevo sistema de archivos ext4 en el directorio de destino:<\/p>\n\n\n\n<p>sudo mount \/dev\/drbd0 \/var\/www\/html<\/p>\n\n\n\n<p>Tras esto, el directorio <code>\/var\/www\/html<\/code> en nodo-a queda respaldado por el dispositivo DRBD replicado. <strong>En nodo-b no se monta nada<\/strong>: su DRBD sigue en modo Secondary.<\/p>\n\n\n\n<p><strong>Por qu\u00e9 se hace:<\/strong> Montar el dispositivo permite que las aplicaciones (p.ej. un servidor Apache) utilicen el sistema de archivos replicado. <strong>Solo el Primario<\/strong> monta el sistema de archivos en configuraciones activo\/pasivo, ya que un dispositivo DRBD en rol <em>Secondary<\/em><strong>proh\u00edbe completamente el acceso<\/strong>, tanto de lectura como de escritura. La raz\u00f3n de prohibir incluso la lectura es la necesidad de mantener la coherencia de cach\u00e9, que ser\u00eda imposible si un recurso secundario fuera accesible de cualquier forma.<\/p>\n\n\n\n<p><strong>Internamente (capas afectadas):<\/strong> Montar implica que la <strong>capa de sistema de archivos<\/strong> (ext4) entra en juego sobre el <strong>dispositivo de bloque DRBD<\/strong> en nodo-a. Las escrituras realizadas por las aplicaciones producen operaciones de I\/O sobre <code>\/dev\/drbd0<\/code>. DRBD en nodo-a intercepta cada escritura y la env\u00eda por la <strong>red<\/strong> a nodo-b (que la persiste en su disco local), manteniendo la sincronizaci\u00f3n en tiempo real. Las <strong>lecturas<\/strong> se atienden <strong>localmente<\/strong> desde el disco de nodo-a, sin latencia de red adicional.<\/p>\n\n\n\n<p><strong>Verificaci\u00f3n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>mount | grep drbd0<\/code> o <code>df -h<\/code> en nodo-a \u2192 debe mostrar <code>\/dev\/drbd0<\/code> montado en <code>\/var\/www\/html<\/code> con el tama\u00f1o y espacio disponible correspondientes.<\/li>\n\n\n\n<li>Crear un archivo de prueba para confirmar la replicaci\u00f3n: Shellecho \u00abHola DRBD\u00bb &gt; \/var\/www\/html\/prueba.txt<br>Mostrar m\u00e1s l\u00edneas Aunque el archivo <strong>no ser\u00e1 visible<\/strong> en nodo-b (porque no tiene montado el sistema de archivos), los datos <strong>ya se encuentran replicados a nivel de bloque<\/strong>. Para comprobarlo, se realizar\u00eda un cambio de roles manual (fuera del alcance de esta pr\u00e1ctica) y se verificar\u00eda que el archivo aparece al montar en el otro nodo.<\/li>\n\n\n\n<li>Estado de DRBD tras montar y escribir: <code>cat \/proc\/drbd<\/code> \u2192 debe seguir mostrando <code>Connected, Primary\/Secondary, UpToDate\/UpToDate<\/code>. <\/li>\n<\/ul>\n\n\n\n<p><strong>Errores comunes \/ Advertencias:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Problema<\/th><th>S\u00edntoma<\/th><th>Soluci\u00f3n<\/th><\/tr><tr><th>\u26a0\ufe0f <strong>Montar en AMBOS nodos con ext4<\/strong><\/th><td><strong>Corrupci\u00f3n de datos garantizada<\/strong>: ext4 no soporta acceso concurrente multi-nodo<\/td><td><strong>Jam\u00e1s<\/strong> montar el FS en el nodo Secondary con un FS convencional<\/td><\/tr><tr><td>Intentar montar en nodo Secondary<\/td><td>Error de permisos \/ dispositivo inaccesible<\/td><td>Montar <strong>solo<\/strong> en el nodo en rol Primary<\/td><\/tr><tr><td>Directorio destino no existe<\/td><td>Error \u00abmount point does not exist\u00bb<\/td><td>Crear el directorio previamente: <code>mkdir -p \/var\/www\/html<\/code><\/td><\/tr><tr><td>Montar manualmente y luego usar Pacemaker<\/td><td>Conflicto entre el montaje manual y el gestor de cl\u00faster<\/td><td>Si se planea usar Pacemaker (siguiente fase), <strong>no montar manualmente<\/strong> \u2014 Pacemaker se encargar\u00e1 de controlar montaje\/desmontaje<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Tabla resumen: Comando \u2192 Funci\u00f3n \u2192 Verificaci\u00f3n \u2192 Error frecuente<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th><strong>Paso<\/strong><\/th><th><strong>Comando<\/strong><\/th><th><strong>Qu\u00e9 hace<\/strong><\/th><th><strong>Verificaci\u00f3n<\/strong><\/th><th><strong>Error frecuente<\/strong><\/th><\/tr><tr><td>1<\/td><td><code>apt install -y drbd-utils<\/code><\/td><td>Instala herramientas de administraci\u00f3n DRBD<\/td><td><code>drbdadm --version<\/code><\/td><td>M\u00f3dulo kernel ausente en entorno virtual<\/td><\/tr><tr><td>2<\/td><td><code>lsblk -f<\/code><\/td><td>Identifica y verifica la partici\u00f3n libre<\/td><td>Sin punto de montaje, tama\u00f1o id\u00e9ntico en ambos nodos<\/td><td>Partici\u00f3n montada o tama\u00f1o distinto<\/td><\/tr><tr><td>3<\/td><td><code>nano \/etc\/drbd.d\/web.res<\/code><\/td><td>Define el recurso, protocolo, nodos, IPs y metadatos<\/td><td><code>drbdadm dump all<\/code> sin errores<\/td><td>Nombre de host no coincide con <code>uname -n<\/code><\/td><\/tr><tr><td>4a<\/td><td><code>drbdadm create-md webdata<\/code><\/td><td>Inicializa metadatos DRBD en el disco<\/td><td>Mensaje <em>\u00absuccessfully created\u00bb<\/em><\/td><td>No escribir <code>yes<\/code> completo al confirmar<\/td><\/tr><tr><td>4b<\/td><td><code>drbdadm up webdata<\/code><\/td><td>Levanta <code>\/dev\/drbd0<\/code> y conecta con el par<\/td><td><code>cat \/proc\/drbd<\/code> \u2192 <code>cs:Connected<\/code><\/td><td>Ejecutar solo en un nodo \u2192 <code>WFConnection<\/code><\/td><\/tr><tr><td>5<\/td><td><code>drbdadm -- --overwrite-data-of-peer primary webdata<\/code><\/td><td>Promociona a Primary e inicia sincronizaci\u00f3n inicial<\/td><td><code>UpToDate\/UpToDate<\/code> tras completar<\/td><td>Error <em>\u00abNeed access to UpToDate data\u00bb<\/em> si se omite la opci\u00f3n<\/td><\/tr><tr><td>6<\/td><td><code>mkfs.ext4 \/dev\/drbd0<\/code><\/td><td>Crea sistema de archivos ext4 sobre el volumen replicado<\/td><td><code>blkid \/dev\/drbd0<\/code> \u2192 <code>TYPE=\"ext4\"<\/code><\/td><td>Formatear <code>\/dev\/sdb1<\/code> en vez de <code>\/dev\/drbd0<\/code><\/td><\/tr><tr><td>7<\/td><td><code>mount \/dev\/drbd0 \/var\/www\/html<\/code><\/td><td>Monta el FS replicado en el directorio de datos<\/td><td><code>df -h<\/code> muestra <code>\/dev\/drbd0<\/code> montado<\/td><td>Intentar montar en el nodo Secondary<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Nota sobre la arquitectura por capas y el flujo completo<\/h2>\n\n\n\n<p>Para recapitular c\u00f3mo la pila de I\/O de Linux opera tras completar todos los pasos, la gu\u00eda oficial de LINBIT describe la posici\u00f3n de DRBD mediante su \u00abFigure 1: DRBD&#8217;s position within the Linux I\/O stack\u00bb: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  Aplicaci\u00f3n (Apache, MySQL, etc.)\n         \u2193 lectura\/escritura de archivos\n  Sistema de archivos (ext4)\n         \u2193 operaciones de bloque\n  DRBD (\/dev\/drbd0)  \u2190\u2014\u2014\u2192  Red TCP\/IP (puerto 7789)  \u2190\u2014\u2014\u2192  DRBD remoto (\/dev\/drbd0)\n         \u2193                                                          \u2193\n  Disco f\u00edsico (\/dev\/sdb1)                                 Disco f\u00edsico (\/dev\/sdb1)\n      &#91;nodo-a: Primary]                                     &#91;nodo-b: Secondary]\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Escritura:<\/strong> La aplicaci\u00f3n escribe \u2192 ext4 traduce a operaci\u00f3n de bloque \u2192 DRBD intercepta, escribe en disco local <strong>y simult\u00e1neamente<\/strong> env\u00eda por red al secundario \u2192 con Protocolo C, la escritura se confirma solo cuando <strong>ambos<\/strong> discos han persistido los datos.<\/li>\n\n\n\n<li><strong>Lectura:<\/strong> Se atiende <strong>localmente<\/strong> desde el disco de nodo-a, sin latencia de red.<\/li>\n\n\n\n<li><strong>Failover:<\/strong> Si nodo-a falla, un gestor de cl\u00faster (Pacemaker, que se configurar\u00e1 en una pr\u00e1ctica posterior) promueve a nodo-b a Primary, monta el FS y arranca los servicios. DRBD provee la replicaci\u00f3n de datos, pero <strong>no gestiona la conmutaci\u00f3n de servicios ni la supervisi\u00f3n de nodos<\/strong> \u2014 eso corresponde al gestor de cl\u00faster.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 a\u00fan no usamos Pacemaker?<\/h2>\n\n\n\n<p>En esta pr\u00e1ctica se configur\u00f3 DRBD de forma <strong>manual<\/strong> (promoci\u00f3n manual del Primary, montaje manual). En un entorno de producci\u00f3n real, esto es insuficiente: si nodo-a falla, nadie promover\u00e1 autom\u00e1ticamente a nodo-b. Para eso se integra DRBD con <strong>Pacemaker<\/strong> (gestor de recursos de cl\u00faster) usando <strong>Corosync<\/strong> (capa de comunicaci\u00f3n). Pacemaker automatiza:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Monitorear la salud de los nodos.<\/li>\n\n\n\n<li>Promover el Secondary a Primary si el Primary falla.<\/li>\n\n\n\n<li>Montar el sistema de archivos.<\/li>\n\n\n\n<li>Arrancar el servicio (Apache, etc.).<\/li>\n\n\n\n<li>Mover la IP virtual al nuevo nodo activo.<\/li>\n<\/ol>\n\n\n\n<p>La configuraci\u00f3n de Pacemaker\/Corosync con DRBD ser\u00e1 objeto de la <strong>siguiente pr\u00e1ctica<\/strong>. La documentaci\u00f3n oficial de LINBIT cubre expl\u00edcitamente esta integraci\u00f3n, incluyendo configuraciones avanzadas con LVM, GFS, OCFS2 y el software DRBD Reactor como alternativa m\u00e1s sencilla de configurar. Primero se debe dominar la base (DRBD manual) para entender qu\u00e9 hace Pacemaker \u00abpor debajo del cap\u00f3\u00bb.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Puntos clave para el estudiante<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">\u26a0\ufe0f NUNCA montar en ambos nodos con ext4<\/h4>\n\n\n\n<p>Un dispositivo DRBD en rol&nbsp;<strong>Secondary<\/strong>&nbsp;proh\u00edbe completamente el acceso (ni lectura ni escritura) para mantener la coherencia de cach\u00e9. Montar un FS convencional en ambos nodos simult\u00e1neamente causar\u00eda&nbsp;<strong>corrupci\u00f3n de datos inmediata<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\u26a0\ufe0f NUNCA operar sobre el disco crudo<\/h4>\n\n\n\n<p>Todas las operaciones (formatear, montar, leer, escribir) deben hacerse sobre&nbsp;<code>\/dev\/drbd0<\/code>, nunca sobre&nbsp;<code>\/dev\/sdb1<\/code>. DRBD usa la \u00faltima parte del dispositivo crudo para metadatos; acceder directamente al disco subyacente&nbsp;<strong>causar\u00e1 datos inconsistentes<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udd11 DRBD replica bloques, no archivos<\/h4>\n\n\n\n<p>DRBD opera en la&nbsp;<strong>capa de bloques<\/strong>&nbsp;del kernel,&nbsp;<strong>debajo del sistema de archivos<\/strong>. No \u00absabe\u00bb qu\u00e9 archivos contiene el volumen \u2014 replica cada bloque modificado de forma transparente. Esto lo hace agn\u00f3stico de la carga de trabajo: sirve igual para bases de datos, servidores web o m\u00e1quinas virtuales.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">\ud83d\udcca Protocolo C = m\u00e1xima seguridad<\/h4>\n\n\n\n<p>En Protocolo C, cada escritura se confirma a la aplicaci\u00f3n&nbsp;<strong>solo despu\u00e9s de que ambos nodos hayan persistido los datos en disco<\/strong>. Esto garantiza&nbsp;<strong>cero p\u00e9rdida de datos<\/strong>&nbsp;ante failover, a cambio de mayor latencia por escritura (retardo de red + I\/O del segundo nodo).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contexto: Esta pr\u00e1ctica configura DRBD (Distributed Replicated Block Device) en dos nodos (denominados nodo-a y nodo-b) con Debian 13.4, para replicar un volumen de datos entre ambos en tiempo real. Cada nodo cuenta con una partici\u00f3n adicional (p.ej. \/dev\/sdb1) de tama\u00f1o id\u00e9ntico destinada a DRBD. El objetivo es lograr un \u00abRAID-1 de red\u00bb: cualquier cambio en el nodo Primario se replicar\u00e1 al Secundario de forma continua, manteniendo ambas copias sincronizadas. DRBD es un m\u00f3dulo del kernel de Linux que se ubica entre el planificador de I\/O (parte inferior) y el sistema de archivos (parte superior), actuando como controlador de un dispositivo de bloque virtual. Esto significa que las aplicaciones leen y escriben datos sin saber que, en la capa de bloques, esos datos est\u00e1n siendo duplicados por red en otro servidor \u2014 la replicaci\u00f3n es transparente para ellas. A continuaci\u00f3n se explica cada paso en detalle, indicando qu\u00e9 se hace, por qu\u00e9 se hace y qu\u00e9 ocurre internamente en la pila de I\/O de Linux (aplicaci\u00f3n \u2192 sistema de archivos \u2192 dispositivo DRBD \u2192 disco \u2192 red), junto con verificaciones, advertencias y errores comunes. Paso 1: Instalaci\u00f3n de DRBD en ambos nodos Qu\u00e9 se hace: Se instala el paquete de utilidades de DRBD en los dos servidores. En Debian, el paquete se denomina drbd-utils y contiene las herramientas de espacio de usuario (drbdadm, drbdsetup, drbdmeta) necesarias para configurar y manejar DRBD. En Debian, la porci\u00f3n de m\u00f3dulo de DRBD se distribuye con los kernels de Debian, por lo que instalar drbd-utils generalmente es suficiente sin compilar nada adicional. El comando es: Esto se ejecuta en nodo-a y nodo-b. La opci\u00f3n -y auto-confirma la instalaci\u00f3n. Se instalan las herramientas de administraci\u00f3n que se comunican con el m\u00f3dulo del kernel para configurar y administrar los recursos DRBD. Por qu\u00e9 se hace: DRBD tiene dos componentes: un m\u00f3dulo en el kernel (el driver de bloque replicado, con n\u00famero mayor de dispositivo 147) y herramientas en user-space para su administraci\u00f3n. Sin instalar drbd-utils, no tendr\u00edamos los comandos necesarios para crear metadatos, levantar recursos ni monitorear el estado de la replicaci\u00f3n. Internamente (capa afectada): Aqu\u00ed solo a\u00f1adimos software; a\u00fan no cambia nada en la pila de I\/O. Tras la instalaci\u00f3n, el m\u00f3dulo kernel estar\u00e1 disponible para cargarse al usarlo m\u00e1s adelante, y las herramientas de administraci\u00f3n quedar\u00e1n listas. Verificaci\u00f3n: Errores comunes: Problema S\u00edntoma Soluci\u00f3n Repositorios o red apt falla al descargar paquetes Verificar conexi\u00f3n a internet y que \/etc\/apt\/sources.list tenga repositorios v\u00e1lidos Permisos insuficientes Error de permisos al instalar Ejecutar como root o con sudo M\u00f3dulo kernel ausente (entorno virtual) modprobe drbd falla con \u00abModule not found\u00bb En kernels virtuales, instalar linux-modules-extra-$(uname -r) Versiones distintas entre nodos Error de protocolo al conectar nodos Asegurar que ambos nodos tengan la misma versi\u00f3n de drbd-utils Paso 2: Preparaci\u00f3n del disco o partici\u00f3n en cada nodo Qu\u00e9 se hace: Se designa un dispositivo de bloque dedicado en cada servidor para la replicaci\u00f3n. En producci\u00f3n se suele usar un disco entero; en laboratorio, una partici\u00f3n (p.ej. \/dev\/sdb1). Es fundamental que esta partici\u00f3n: (a) tenga el mismo tama\u00f1o en ambos nodos, y (b)no est\u00e9 montada ni en \/etc\/fstab. La verificaci\u00f3n se realiza con: Este comando lista los dispositivos de bloque. Debe confirmarse que \/dev\/sdb1 existe en ambos nodos, que no tenga punto de montaje asignado y que su tama\u00f1o sea id\u00e9ntico. Por qu\u00e9 se hace: DRBD replica bloques de datos crudos. Necesitamos almacenamiento dedicado que DRBD controlar\u00e1 exclusivamente. Ambas particiones deben ser de tama\u00f1o id\u00e9ntico para que la r\u00e9plica funcione correctamente. DRBD soporta cualquier dispositivo de bloque soportado por Linux: partici\u00f3n o disco duro completo, RAID por software, LVM o EVMS. Internamente (capa afectada): Solo preparamos la capa de almacenamiento f\u00edsico (el nivel m\u00e1s bajo de la pila I\/O). No hemos configurado DRBD ni hay tr\u00e1fico de red a\u00fan. Verificaci\u00f3n: Errores comunes: Problema S\u00edntoma Soluci\u00f3n Partici\u00f3n montada drbdadm create-md falla al bloquear dispositivo Desmontar con umount y verificar que ning\u00fan proceso la use (lsof \/dev\/sdb1) Tama\u00f1o inconsistente DRBD ajusta al menor, dejando espacio desperdiciado Reparticionar al mismo tama\u00f1o antes de continuar Confundir disco y partici\u00f3n Apuntar a \/dev\/sdb cuando debe ser \/dev\/sdb1 Verificar con lsblk y usar exactamente la ruta que aparece en la configuraci\u00f3n Datos previos en la partici\u00f3n Advertencia de destrucci\u00f3n de datos al inicializar Si los datos no son necesarios, confirmar; si lo son, respaldarlos primero Paso 3: Configuraci\u00f3n b\u00e1sica del recurso DRBD (\/etc\/drbd.d\/web.res) Qu\u00e9 se hace: Se crea un archivo de configuraci\u00f3n que define el recurso DRBD (el nombre l\u00f3gico de la pareja de discos replicados). El archivo \/etc\/drbd.d\/web.res debe ser id\u00e9ntico en ambos nodosy contiene: Explicaci\u00f3n l\u00ednea por l\u00ednea Comparativa r\u00e1pida de protocolos: Protocolo Tipo Confirmaci\u00f3n de escritura Riesgo ante fallo del Primary A (As\u00edncrono) Tras disco local + paquete en buffer TCP Posible p\u00e9rdida de las actualizaciones m\u00e1s recientes B (Semis\u00edncrono) Tras disco local + recepci\u00f3n en memoria remota Datos normalmente seguros; riesgo si ambos nodos fallan simult\u00e1neamente C (S\u00edncrono) \u2705 Tras disco local + disco remoto Cero p\u00e9rdida de datos Por qu\u00e9 se hace: Esta configuraci\u00f3n define c\u00f3mo se conectar\u00e1 y comportar\u00e1 el recurso replicado: qu\u00e9 disco local usar, a qu\u00e9 compa\u00f1ero conectarse por red, con qu\u00e9 garant\u00edas de sincronizaci\u00f3n y d\u00f3nde guardar los metadatos internos. Internamente (capa afectada): Solo se modifica la capa de configuraci\u00f3n (espacio de usuario). Todav\u00eda no se han creado dispositivos ni comunicaciones de red. Estamos preparando la \u00abhoja de ruta\u00bb que DRBD seguir\u00e1. Verificaci\u00f3n: Errores comunes \/ Advertencias: Problema S\u00edntoma Soluci\u00f3n Error de sintaxis en .res drbdadm indica n\u00famero de l\u00ednea con error Revisar corchetes, puntos y coma, y ortograf\u00eda Nombre de host incorrecto \u00abNo valid configuration found for this host\u00bb uname -n debe coincidir con la secci\u00f3n on &lt;nombre&gt; en el archivo Archivo no copiado al segundo nodo Segundo nodo queda en StandAlone, no reconoce recurso Copiar con scp el archivo .res al otro nodo Puerto bloqueado por firewall Los nodos no conectan (cs:Timeout) Abrir el puerto TCP configurado en ambos nodos Paso 4: Inicializar el recurso DRBD en ambos nodos (metadatos y arranque) Se ejecutan<\/p>\n","protected":false},"author":1,"featured_media":2373,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[134,16,5,12,1,10,6],"tags":[],"class_list":["post-2368","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-clusters","category-debian","category-docencia","category-linux","category-sin-categoria","category-sistemas-operativos","category-talleres"],"_links":{"self":[{"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/posts\/2368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/comments?post=2368"}],"version-history":[{"count":4,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/posts\/2368\/revisions"}],"predecessor-version":[{"id":2376,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/posts\/2368\/revisions\/2376"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/media\/2373"}],"wp:attachment":[{"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/media?parent=2368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/categories?post=2368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dsantana.uas.edu.mx\/index.php\/wp-json\/wp\/v2\/tags?post=2368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}