Do que falaremos:
Como implementar rapidamente o almacenamento compartido para dous servidores baseados en solucións drbd+ocfs2.
Para quen lle será útil:
O titorial será útil para os administradores do sistema e para calquera que elixa un método de implementación de almacenamento ou queira probar a solución.
Que decisións rexeitamos e por que?
Moitas veces atopámonos cunha situación na que necesitamos implementar o almacenamento compartido cun bo rendemento de lectura e escritura nun pequeno clúster web. Probamos varias opcións para implementar o almacenamento compartido para os nosos proxectos, pero poucos foron capaces de satisfacernos en varios indicadores á vez. Agora imos dicirche por que.
- Glusterfs non nos satisfizo co rendemento de lectura e escritura; houbo problemas coa lectura simultánea dun gran número de ficheiros e había unha gran carga na CPU. O problema coa lectura de ficheiros podería resolverse accedendo a eles directamente desde o ladrillo, pero isto non sempre é aplicable e xeralmente é incorrecto.
- A Ceph non lle gustou a complexidade excesiva, que pode ser prexudicial en proxectos con servidores 2-4, especialmente se o proxecto se mantén posteriormente. De novo, hai serias limitacións de rendemento que nos obrigan a construír clústeres de almacenamento separados, como sucede con glusterfs.
- Usar un servidor NFS para implementar o almacenamento compartido suscita preguntas en termos de tolerancia a fallos.
- s3 é unha excelente solución popular para unha determinada gama de tarefas, pero non é un sistema de ficheiros, o que reduce o seu alcance.
- lsyncd. Se xa comezamos a falar de "sistemas que non son de ficheiros", entón paga a pena repasar esta popular solución. Non só non é axeitado para o intercambio bidireccional (pero se realmente queres, podes), tampouco funciona de forma estable nun gran número de ficheiros. Unha boa adición a todo é que é dun só fío. A razón está na arquitectura do programa: usa inotify para supervisar os obxectos de traballo, que asigna ao inicio e durante a nova exploración. rsync úsase como medio de transferencia.
Titorial: como implementar almacenamento compartido baseado en drbd+ocfs2
Unha das solucións máis convenientes para nós foi a ligazón ocfs2+drbd. Agora dirémosche como podes implementar rapidamente o almacenamento compartido para dous servidores baseados nunha base de datos de solucións. Pero primeiro, un pouco sobre os compoñentes:
DRBD - un sistema de almacenamento da distribución estándar de Linux que permite replicar datos entre servidores en bloques. A aplicación principal é crear almacenamento tolerante a fallos.
OCFS2 - un sistema de ficheiros que proporciona un uso compartido do mesmo almacenamento por varios sistemas. Incluído na distribución de Linux e é un módulo do núcleo e ferramentas de espazo de usuario para traballar co FS. OCFS2 pódese usar non só a través de DRBD, senón tamén a través de iSCSI con conexións múltiples. No noso exemplo usamos DRBD.
Todas as accións realízanse no servidor ubuntu 18.04 nunha configuración mínima.
Paso 1. Configura DRBD:
No ficheiro /etc/drbd.d/drbd0.res describimos o noso dispositivo de bloque virtual /dev/drbd0:
resource drbd0 {
syncer { rate 1000M; }
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
startup { become-primary-on both; }
on drbd1 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.192:7789;
}
on drbd2 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.193:7789;
}
}
metadisco interno — use os mesmos dispositivos de bloque para almacenar metadatos
dispositivo /dev/drbd0 — use /dev/drbd0 como camiño ao volume drbd.
disco /dev/vdb1 - use /dev/vdb1
sincronizador {taxa 1000M; } - use ancho de banda de canle de gigabit
permitir-dúas-primarias - unha opción importante que permite aceptar cambios en dous servidores primarios
despois de sb-0pri, despois de sb-1pri, despois de sb-2pri — opcións responsables das accións do nodo cando se detecta splitbrain. Pódense atopar máis detalles na documentación.
converterse-primario-en ambos — establece os dous nodos como primarios.
No noso caso, temos dúas máquinas virtuales absolutamente idénticas, cunha rede virtual dedicada cun rendemento de 10 gigabits.
No noso exemplo, os nomes de rede de dous nodos do clúster son drbd1 e drbd2. Para un funcionamento correcto, cómpre facer coincidir os nomes e enderezos IP dos hosts en /etc/hosts.
10.10.10.192 drbd1
10.10.10.193 drbd2
Paso 2. Configurar os nós:
Nos dous servidores executamos:
drbdadm create-md drbd0
modprobe drbd
drbdadm up drbd0
cat /proc/drbd
Obtemos o seguinte:
Pode iniciar a sincronización. No primeiro nodo cómpre executar:
drbdadm primary --force drbd0
Vexamos o estado:
cat /proc/drbd
Xenial, comezou a sincronización. Agardamos ata o final e vemos a imaxe:
Paso 3. Inicia a sincronización no segundo nodo:
drbdadm primary --force drbd0
Obtemos o seguinte:
Agora podemos escribir en drbd desde dous servidores.
Paso 4. Instalar e configurar ocfs2.
Usaremos unha configuración bastante trivial:
cluster:
node_count = 2
name = ocfs2cluster
node:
number = 1
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.192
name = drbd1
node:
number = 2
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.193
name = drbd2
Hai que anotalo /etc/ocfs2/cluster.conf nos dous nodos.
Creamos un FS en drbd0 en calquera nodo:
mkfs.ocfs2 -L "testVol" /dev/drbd0
Aquí creamos un sistema de ficheiros coa etiqueta testVol en drbd0, utilizando os parámetros predeterminados.
En /etc/default/o2cb cómpre configurar (como no noso ficheiro de configuración)
O2CB_ENABLED=true
O2CB_BOOTCLUSTER=ocfs2cluster
e executar en cada nodo:
o2cb register-cluster ocfs2cluster
Despois acendemos e engadimos todas as unidades que necesitamos para executar automaticamente:
systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2
Algúns destes xa se executarán durante o proceso de configuración.
Paso 5. Engade puntos de montaxe a fstab nos dous nodos:
/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0
Directorio /media/compartido debe ser creado previamente.
Aquí usamos as opcións noauto, o que significa que o ficheiro non se montará ao inicio (prefiro montar ficheiros de rede a través de systemd) e heartbeat=local, o que significa usar o servizo heartbeat en cada nodo. Tamén hai un latido cardíaco global, que é máis axeitado para grandes clústeres.
A continuación podes montar /media/compartido e comprobar a sincronización do contido.
Feito! Como resultado, obtemos un almacenamento máis ou menos tolerante a fallos con escalabilidade e rendemento decente.
Fonte: www.habr.com