DRBD + OCFS2 + Debian Wheezy

Aqui vou Abordar a instalação e configuração do DRBD + OCFS2, aonde vamos montar um raid1 via rede e trabalhar com escrita master/master, ou seja caso um dos nodos caia ainda vamos continuar escrevendo no nodo que estiver ativo e quando o nodo que caiu voltar o drbd vai sincronizar os dados para ele ;)

  • Nome Nodo1: nodo1
  • Ip Nodo1: 172.20.0.40
  • Partição utilizada Nodo1: /dev/sdb1 dispositivo com 8 GB
  • Nome Nodo2: nodo2
  • Ip Nodo2: 172.20.0.41
  • Partição utilizada Nodo2: /dev/sdb1 dispositivo com 8 GB

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialwheezy_en para que não falte nenhum pacote ou configuração.

Vamos atualizar e fazer um upgrade do sistema nas duas maquinas

aptitude update && aptitude dist-upgrade -y

Vamos acertar o /etc/hosts deixe como abaixo nos dois nodos.

vim /etc/hosts
127.0.0.1       localhost
172.20.0.40       nodo1.douglasqsantos.com.br    nodo1
172.20.0.41       nodo2.douglasqsantos.com.br    nodo2

Agora vamos instalar o drbd e o ocfs2 faça isso nos dois nodos

aptitude install drbd8-utils  ocfs2-tools ocfs2-tools-dev -y

Agora vamos carregar os módulos faça isso nos dois nodos

modprobe cn
modprobe drbd
depmod -a

Instalação e configuração do DRBD + OCFS2

Agora vamos instalar o drbd e o ocfs2 faça isso nas duas máquinas.

aptitude install drbd8-utils  ocfs2-tools ocfs2-tools-dev -y

Agora vamos carregar os módulos faça isso nas duas máquinas.

modprobe cn
modprobe drbd
depmod -a

Vamos configurar o DRBD

Deixe o arquivo como abaixo nas duas máquinas.

vim /etc/drbd.conf
include "drbd.d/global_common.conf";
#include "drbd.d/*.res";

Execute nas duas maquinas a parte abaixo.

Vamos fazer backup do arquivo de configuração original

cp /etc/drbd.d/global_common.conf{,.bkp}

Deixe o arquivo como abaixo

vim /etc/drbd.d/global_common.conf
#/etc/drbd.conf
# Opções Globais
# Geralmente no início do arquivo. Poucas opções são definidas nesta seção.
#
global {
 usage-count yes; # Gerar status da atualização do sistema de DRBD.
}
#
# Opções comuns a mais de um recurso, quando houver. No caso de existir opções
# definidas internamente ao recurso, elas irão sobrepor as opções comuns.
common {
 protocol C; # Método de replicação. Neste caso, replicação síncrona.
}
###  ocfs2 usando 02 primários
resource r1 {
 net {
 # Permitir/habilitar dois servidores primários.
 allow-two-primaries; #Permite habilitar dois servidores primários
 #Descarta o último disco que se tornar primário em caso da quebra de 
 #consistência, quando os dois discos estiverem como secundários
 after-sb-0pri discard-younger-primary;
 #Entrar em consenso para descartar um disco após quebra de consistência
 #quando houver um disco primário. Geralmente é resolvido na opção anterior,
 #Caso contrário, irá desconectar os dois discos
 after-sb-1pri consensus;
 #Desconectar em caso de quebra de consistência quando houver dois discos primários
 after-sb-2pri disconnect;
}
 startup {
 # Iniciar os dois servidores como primários, por padrão.
 become-primary-on both;
 # Espera 20 segundos pelo segundo nodo caso ele não suba podemos subir somente 1.
 wfc-timeout 20;
 }
 syncer {
 rate 600M; #Para placas de rede de 10/100 utilizar 10M
 }
 
 on nodo1 {
 device     /dev/drbd1; # Nome do dispositivo de DRBD
 disk       /dev/sdb1; # Dispositivo de baixo nível utilizado a partição
 address    172.20.0.40:7789;  # IP:porta de conexão
 meta-disk internal; # Armazenamento das informações de dados é feito
 # dentro do dispositivo de baixo nível.
 }
 on nodo2 {
 device   /dev/drbd1;
 disk      /dev/sdb1;
 address   172.20.0.41:7789;
 meta-disk internal;
 }
}

Agora vamos preparar o disco, faça isso nos dois servidores.

fdisk /dev/sdb
O dispositivo não contém nem uma tabela de partições DOS válida nem um rótulo de disco Sun, OSF ou SGI
Building a new DOS disklabel with disk identifier 0x6aadf3ff.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
 
Aviso: a opção inválida 0x0000 da tabela de partições 4 será corrigida por gravação (w)
 
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
 switch off the mode (command 'c') and change display units to
 sectors (command 'u').
 
Comando (m para ajuda): p
 
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cilindros of 16065  - 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6aadf3ff
 
Dispositivo Boot      Start         End      Blocks   Id  System
 
Comando (m para ajuda): n
Comando - ação
 e   estendida
 p   partição primária (1-4)
p
Número da partição (1-4): 1
Primeiro cilindro (1-1044, default 1): ENTER
Using default value 1
Last cilindro, +cilindros or +size{K,M,G} (1-1044, default 1044): ENTER
Using default value 1044
 
Comando (m para ajuda): w
A tabela de partições foi alterada!
 
Chamando ioctl() para reler tabela de partições.
Sincronizando discos.

Agora vamos zerar as partições tem que ser executado nos dois servidores.

dd if=/dev/zero of=/dev/sdb1 bs=1M count=128

Execute este comando nos dois servidores antes de passar para o próximo comando.

drbdadm -- --discard-my-data connect r1
  --==  Thank you for participating in the global usage survey  ==--
The server's response is:

you are the 156th user to install this version

Onde r1 é o nome do nosso dispositivo, que no arquivo de configuração do drbd está como resource r1.

Execute este comando nos dois servidores antes de passar para o próximo comando.

drbdadm create-md r1
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

Execute este comando nos dois servidores antes de passar para o próximo comando.

drbdadm attach r1

Execute este comando nos dois servidores antes de passar para o próximo comando.

drbdadm connect r1

Pronto, agora podemos iniciar o drbd, inicie-o nos dois servidores com o seguinte comando:

/etc/init.d/drbd start
[....] Starting DRBD resources:[ s(r1) ]1: State change failed: (-2) Need access to UpToDate data
Command '/sbin/drbdsetup 1 primary' terminated with exit code 17
1: State change failed: (-2) Need access to UpToDate data
Command '/sbin/drbdsetup 1 primary' terminated with exit code 17
1: State change failed: (-2) Need access to UpToDate data
Command '/sbin/drbdsetup 1 primary' terminated with exit code 17
1: State change failed: (-2) Need access to UpToDate data
Command '/sbin/drbdsetup 1 primary' terminated with exit code 17
1: State change failed: (-2) Need access to UpToDate data
Command '/sbin/drbdsetup 1 primary' terminated with exit code 17
. ok

Podemos observar como está a situação do nosso dispositivo drbd com o seguinte comando.

cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: F937DCB2E5D83C6CCE4A6C9 

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:8387292

Se em “Connected st” estiver como !Primary/Primary, está tudo ok, porém se estiver como !Secondary/Secondary temos que forçar os dispositivos a passarem para primary e temos mais uma situação quanto ao dispositivo Unknown, normalmente é quando um dos servidores não está operante por problemas de rede ou de configuração do arquivo do drbd. Então muita atenção a esses detalhes.

Vamos levar em consideração que só estamos com o problema que os dois servidores estão como secondary, resolvemos com o seguinte comando. Este comando tem que ser rodado nos dois servidores.

drbdadm -- --overwrite-data-of-peer primary r1

Agora vamos monitorar novamente.

cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: F937DCB2E5D83C6CCE4A6C9 

 1: cs:SyncTarget ro:Primary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:1037696 dw:1037696 dr:0 al:0 bm:63 lo:1 pe:7510 ua:0 ap:1 ep:1 wo:f oos:7349596
  [=>..................] sync'ed: 12.5% (7176/8188)Mfinish: 0:03:34 speed: 34,252 (35,780) want: 614,400 K/sec

Agora é só esperar eles sincronizarem os dados, isso depende da placa de rede, da velocidade do disco e do tamanho do disco, fora os processos do drbd, se você notar muita lentidão em algum desses fatores, veja se não é bom fazer algum upgrade.

Para acompanhar a sincronização pode utilizar o seguinte comando:

cat /proc/drbd

Agora depois de sincronizados

cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: F937DCB2E5D83C6CCE4A6C9 

 1: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
    ns:8387316 nr:0 dw:0 dr:8387980 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Agora vamos configurar o OCFS2

Vamos configurar o cluster para o ocfs2. Tem que ser configurado nos dois servidores.

vim /etc/ocfs2/cluster.conf
node:
 ip_port = 7777
 ip_address = 172.20.0.40
 number = 0
 name = nodo1
 cluster = ocfs2
 
node:
 ip_port = 7777
 ip_address = 172.20.0.41
 number = 1
 name = nodo2
 cluster = ocfs2
 
cluster:
 node_count = 2
 name = ocfs2

Agora vamos configurar o o2cb para ser habilitado tem que ser configurado nos dois servidores.

sed -i 's/O2CB_ENABLED=false/O2CB_ENABLED=true/g' /etc/default/o2cb

Agora é so restartar o serviço nos dois servidores.

Vamos reiniciar o o2cb

/etc/init.d/o2cb restart
ls: cannot access /config: No such file or directory
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading stack plugin "o2cb": OK
Loading filesystem "ocfs2_dlmfs": OK
Creating directory '/dlm': OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Setting cluster stack "o2cb": OK
Starting O2CB cluster ocfs2: OK

Agora vamos reiniciar o ocfs2

/etc/init.d/ocfs2 restart
Stopping Oracle Cluster File System (OCFS2) OK

Agora é so criar o sistema de arquivos ocfs2 no drbd, precimos fazer isso somente em um dos dois servidores

Opções: -C (indicado acima de 128K para grandes arquivos) -b (indicado 4K) -N qtd de nodos -L label para o a partição

mkfs.ocfs2 -b 4K -C 128K -N 2 -L ocfs2 /dev/drbd1
mkfs.ocfs2 1.4.4
Cluster stack: classic o2cb
Label:
Features: sparse backup-super unwritten inline-data strict-journal-super
Block size: 4096 (12 bits)
Cluster size: 4096 (12 bits)
Volume size: 8586858496 (2096401 clusters) (2096401 blocks)
Cluster groups: 65 (tail covers 32017 clusters, rest cover 32256 clusters)
Extent allocator size: 4194304 (1 groups)
Journal size: 67108864
Node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files:
done
Writing superblock: done
Writing backup superblock: 2 block(s)
Formatting Journals: done
Growing extent allocator: done
Formatting slot map: done
Writing lost+found: done
mkfs.ocfs2 successful

Agora é so montar a partição

Vamos criar um diretório para o OCFS2 nos dois servidores e vamos montar.

mkdir /ocfs2 
mount.ocfs2 /dev/drbd1 /ocfs2/ 

Vamos agora verificar as nossas partições

df -Th
Sist. Arq.                                             Tipo       Tam  Usad Dispon. Uso% Montado em
rootfs                                                 rootfs    323M  212M     94M  70% /
udev                                                   devtmpfs   10M     0     10M   0% /dev
tmpfs                                                  tmpfs      38M  420K     37M   2% /run
/dev/disk/by-uuid/86265303-3a06-49db-aa1b-49088580a1cb ext4      323M  212M     94M  70% /
tmpfs                                                  tmpfs     5,0M  4,0K    5,0M   1% /run/lock
tmpfs                                                  tmpfs     167M     0    167M   0% /run/shm
/dev/sda9                                              ext4      2,8G   69M    2,6G   3% /home
/dev/sda8                                              ext4      234M  6,1M    216M   3% /tmp
/dev/sda5                                              ext4      2,8G  1,1G    1,6G  40% /usr
/dev/sda6                                              ext4      1,4G  339M    971M  26% /var
/dev/drbd1                                             ocfs2     8,0G  151M    7,9G   2% /ocfs2

Como podemos ver temos a nossa partição montada com ocfs2

Agora podemos deixar isso na inicialização do sistema

vim /etc/fstab
[...]
/dev/drbd1 /ocfs2 ocfs2 _netdev,defaults,noatime 0 0

Agora vamos ajustar a ordem de inicialização dos serviços no dois servidores

Agora temos que acertar o o2cb nos dois nodos, o cabeçalho tem que ficar como abaixo, por que nas ultimas versões o drbd não ta funcionando corretamente no runlevel S

vim /etc/init.d/o2cb
#!/bin/bash
# init fragment for O2CB.
#
# chkconfig: 2345 24 20
# description: Load O2CB cluster services at system boot.
#
### BEGIN INIT INFO
# Provides: o2cb
# Required-Start: $network $syslog drbd
# Should-Start:
# Required-Stop: $network $syslog drbd
# Default-Start:2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Load O2CB cluster services at system boot.
# Description: Load O2CB cluster services at system boot.
### END INIT INFO

Agora temos que acertar o ocfs2 nos dois nodos, o cabeçalho tem que ficar como abaixo, por que nas ultimas versões o drbd não ta funcionando corretamente no runlevel S

vim /etc/init.d/ocfs2
#! /bin/bash
# Copyright (c) 2005 Oracle
# All rights reserved.
#
# chkconfig: 2345 25 19
# description: Mount OCFS2 volumes at boot.
#
### BEGIN INIT INFO
# Provides: ocfs2
# Required-Start: $local_fs $network o2cb
# Required-Stop: $local_fs $network o2cb
# X-UnitedLinux-Should-Start:
# X-UnitedLinux-Should-Stop:
# X-Stop-After: sendsigs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Mount OCFS2 volumes at boot.
# Description:  Mount OCFS2 volumes at boot.
### END INIT INFO

Agora temos que recarregar as configuração de inicialização dos serviços

Vamos tirar os serviços da inicialização primeiro

insserv -r -v ocfs2
insserv -r -v o2cb
insserv -r -v drbd

Agora vamos colocar eles na inicialização novamente

insserv -f -v drbd
insserv -f -v o2cb
insserv -f -v ocfs2

Agora vamos reiniciar os servidores para testarmos se vai ser montado o drbd na inicialização

init 6

Depois da inicialização nodo1

Vamos ver o uptime do servidor

uptime
 14:46:21 up 0 min,  1 user,  load average: 0,12, 0,03, 0,01

Agora vamos listar as partições

df -Th
Sist. Arq.                                             Tipo       Tam  Usad Dispon. Uso% Montado em
rootfs                                                 rootfs    323M  212M     94M  70% /
udev                                                   devtmpfs   10M     0     10M   0% /dev
tmpfs                                                  tmpfs      38M  360K     37M   1% /run
/dev/disk/by-uuid/86265303-3a06-49db-aa1b-49088580a1cb ext4      323M  212M     94M  70% /
tmpfs                                                  tmpfs     5,0M  4,0K    5,0M   1% /run/lock
tmpfs                                                  tmpfs     167M     0    167M   0% /run/shm
/dev/sda9                                              ext4      2,8G   69M    2,6G   3% /home
/dev/sda8                                              ext4      234M  6,1M    216M   3% /tmp
/dev/sda5                                              ext4      2,8G  1,1G    1,6G  40% /usr
/dev/sda6                                              ext4      1,4G  340M    970M  26% /var
/dev/drbd1                                             ocfs2     8,0G  151M    7,9G   2% /ocfs2

Depois da inicialização nodo2

Vamos ver o uptime do servidor

uptime
 14:47:31 up 1 min,  1 user,  load average: 0,10, 0,06, 0,03

Agora vamos verificar as partições

df -Th
Sist. Arq.                                             Tipo       Tam  Usad Dispon. Uso% Montado em
rootfs                                                 rootfs    323M  212M     94M  70% /
udev                                                   devtmpfs   10M     0     10M   0% /dev
tmpfs                                                  tmpfs      38M  344K     37M   1% /run
/dev/disk/by-uuid/86265303-3a06-49db-aa1b-49088580a1cb ext4      323M  212M     94M  70% /
tmpfs                                                  tmpfs     5,0M  4,0K    5,0M   1% /run/lock
tmpfs                                                  tmpfs     167M     0    167M   0% /run/shm
/dev/sda9                                              ext4      2,8G   69M    2,6G   3% /home
/dev/sda8                                              ext4      234M  6,1M    216M   3% /tmp
/dev/sda5                                              ext4      2,8G  1,1G    1,6G  40% /usr
/dev/sda6                                              ext4      1,4G  341M    969M  27% /var
/dev/drbd1                                             ocfs2     8,0G  151M    7,9G   2% /ocfs2

Caso de algum problema na inicialização como um dos dois servidores não ficar como primary temos podemos resolver da seguinte maneira

Primeiro vamos mandar desmontar as partições montadas com o ocfs2 nos dois servidores

umount /ocfs2

Agora vamos mandar reiniciar o drbd nos dois servidores

/etc/init.d/drbd restart

Agora vamos forçar a utilização dos dois nodos primary

drbdadm -- --overwrite-data-of-peer primary r1

Agora é so remontar as partições novamente nos dois servidores

mount.ocfs2 /dev/drbd1 /ocfs2/

Erros de sincronismo

Exemplo de erro de sincronismo dos discos, aonde perdemos a consistencia dos dados, com isso vamos precisar acertar este erro.

cat /proc/drbd 
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757 
 
 1: cs:StandAlone ro:Secondary/Unknown ds:Outdated/DUnknown   r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:258100

No nodo2 vamos mandar ele desconsiderar os dados que ele já tem e resincronizar com o nodo1

drbdadm -- --discard-my-data connect r1

Agora vamos verificar a sincronismo.

cat /proc/drbd 
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757 
 
 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----
    ns:0 nr:293128 dw:287336 dr:0 al:0 bm:19 lo:1448 pe:35179 ua:1448 ap:0 ep:1 wo:b oos:207647312
  [>....................] sync'ed:  0.2% (202780/203060)M
  finish: 1:00:10 speed: 57,464 (57,464) K/sec

Assim que terminar este processo precisamos somente forçar os dois como primary da seguinte forma

drbdadm -- --overwrite-data-of-peer primary r1

O discos ainda sincronizando e forçados como primary.

cat /proc/drbd 
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757 
 
 1: cs:SyncSource ro:Primary/Primary ds:UpToDate/Inconsistent C r----
    ns:22204456 nr:0 dw:0 dr:22211888 al:0 bm:1356 lo:40 pe:1833 ua:1797 ap:0 ep:1 wo:b oos:185737536
  [=>..................] sync'ed: 10.7% (181384/203060)M
  finish: 0:55:40 speed: 55,560 (47,940) K/sec

Referências