DRBD + OCFS2 + Debian Squeeze
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: debian25
- Ip Nodo1: 10.101.0.25
- Partição utilizada Nodo1: /dev/sdb1 dispositivo com 8 GB
- Nome Nodo2: debian26
- Ip Nodo2: 10.101.0.26
- 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/confinicialsqueeze_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 10.101.0.25 debian25.douglasqsantos.com.br debian25 10.101.0.26 debian26.douglasqsantos.com.br debian26
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
Vamos configurar o DRBD
Deixe o arquivo como abaixo nos dois nodos
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 debian25 { device /dev/drbd1; # Nome do dispositivo de DRBD disk /dev/sdb1; # Dispositivo de baixo nível utilizado a partição address 10.101.0.25:7789; # IP:porta de conexão meta-disk internal; # Armazenamento das informações de dados é feito # dentro do dispositivo de baixo nível. } on debian26 { device /dev/drbd1; disk /dev/sdb1; address 10.101.0.26:7789; meta-disk internal; } }
Agora vamos preparar o disco, faça isso nos dois nodos
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 nodos
dd if=/dev/zero of=/dev/sdb1 bs=1M count=128
Execute este comando nos dois nodos 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 6260th 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 nodos 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 nodos antes de passar para o próximo comando.
drbdadm attach r1
Execute este comando nos dois nodos antes de passar para o próximo comando.
drbdadm connect r1
Pronto, agora podemos iniciar o drbd, inicie-o nos dois nodos com o seguinte comando:
/etc/init.d/drbd start Starting DRBD resources:[ s(r1) ]1: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk Command '/sbin/drbdsetup 1 primary' terminated with exit code 17 1: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk Command '/sbin/drbdsetup 1 primary' terminated with exit code 17 1: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk Command '/sbin/drbdsetup 1 primary' terminated with exit code 17 1: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk Command '/sbin/drbdsetup 1 primary' terminated with exit code 17 1: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk Command '/sbin/drbdsetup 1 primary' terminated with exit code 17
Podemos observar como está a situação do nosso dispositivo drbd com o seguinte comando.
cat /proc/drbd version: 8.3.7 (api:88/proto:86-91) srcversion: EE47D8BF18AC166BE219757 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:b oos:8385604
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.7 (api:88/proto:86-91) srcversion: EE47D8BF18AC166BE219757 1: cs:SyncTarget ro:Primary/Primary ds:Inconsistent/UpToDate C r---- ns:0 nr:1368684 dw:1368672 dr:12 al:0 bm:83 lo:1 pe:10097 ua:0 ap:1 ep:1 wo:b oos:7016932 [=====>.................] sync'ed: 16.4% (6852/8188)M finish: 0:01:04 speed: 109,344 (97,760) 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:
watch cat /proc/drbd Every 2,0s: cat /proc/drbd Mon May 7 11:20:16 2012 version: 8.3.7 (api:88/proto:86-91) srcversion: EE47D8BF18AC166BE219757 1: cs:SyncTarget ro:Primary/Primary ds:Inconsistent/UpToDate C r---- ns:0 nr:4177692 dw:4176928 dr:80 al:0 bm:254 lo:24 pe:16500 ua:23 ap:1 ep:1 wo:b oos:4208676 [====================>...........] sync'ed: 49.9% (4108/8188)M finish: 0:00:47 speed: 89,128 (90,800) K/sec
Agora depois de sincronizados
cat /proc/drbd version: 8.3.7 (api:88/proto:86-91) srcversion: EE47D8BF18AC166BE219757 1: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r---- ns:8385660 nr:0 dw:0 dr:8385860 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
Agora vamos configurar o OCFS2
Vamos configurar o cluster para o ocfs2. Tem que ser configurado nos dois nodos.
vim /etc/ocfs2/cluster.conf node: ip_port = 7777 ip_address = 10.101.0.25 number = 0 name = debian25 cluster = ocfs2 node: ip_port = 7777 ip_address = 10.101.0.26 number = 1 name = debian26 cluster = ocfs2 cluster: node_count = 2 name = ocfs2
Agora vamos configurar o o2cb tem que ser configurado nos dois nodos.
sed -i 's/O2CB_ENABLED=false/O2CB_ENABLED=true/g' /etc/default/o2cb
Agora é so restartar o serviço nos dois nodos.
/etc/init.d/o2cb restart && /etc/init.d/ocfs2 restart
Agora é so criar o sistema de arquivos ocfs2 no drbd, precimos fazer isso somente em um dos dois nodos
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 nodos e vamos montar.
mkdir /ocfs2 mount.ocfs2 /dev/drbd1 /ocfs2/
Vamos agora verificar as nossas partições
df -Th Sist. Arq. Tipo Size Used Avail Use% Montado em /dev/sda1 ext3 323M 147M 160M 48% / tmpfs tmpfs 249M 0 249M 0% /lib/init/rw udev tmpfs 244M 168K 244M 1% /dev tmpfs tmpfs 249M 0 249M 0% /dev/shm /dev/sda9 ext3 2,8G 69M 2,6G 3% /home /dev/sda8 ext3 234M 6,1M 216M 3% /tmp /dev/sda5 ext3 2,8G 639M 2,0G 24% /usr /dev/sda6 ext3 1,4G 273M 1,1G 21% /var /dev/drbd1 ocfs2 8,0G 279M 7,8G 4% /ocfs2
Como podemos ver temos a nossa partição montada com ocfs2
Agora podemos deixar isso na inicialização do sistema nos dois nodos
echo "/dev/drbd1 /ocfs2 ocfs2 _netdev,defaults 0 0" >> /etc/fstab
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: $local_fs $network $syslog drbd # Required-Stop: $local_fs $network $syslog drbd # Should-Start: # Required-Stop: # 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 $syslog o2cb # Required-Stop: $local_fs $network $syslog o2cb # X-UnitedLinux-Should-Start: # X-UnitedLinux-Should-Stop: # 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 dois nodos para testarmos se vai ser montado o drbd na inicialização
init 6
Depois da inicialização nodo1
uptime 15:22:11 up 0 min, 1 user, load average: 0.26, 0.07, 0.02 df -Th Sist. Arq. Tipo Size Used Avail Use% Montado em /dev/sda1 ext3 323M 147M 160M 48% / tmpfs tmpfs 249M 0 249M 0% /lib/init/rw udev tmpfs 244M 168K 244M 1% /dev tmpfs tmpfs 249M 0 249M 0% /dev/shm /dev/sda9 ext3 2,8G 69M 2,6G 3% /home /dev/sda8 ext3 234M 6,1M 216M 3% /tmp /dev/sda5 ext3 2,8G 639M 2,0G 24% /usr /dev/sda6 ext3 1,4G 273M 1,1G 21% /var /dev/drbd1 ocfs2 8,0G 151M 7,9G 2% /ocfs2
Depois da inicialização nodo2
uptime 15:22:13 up 0 min, 1 user, load average: 0.21, 0.12, 0.04 df -Th Sist. Arq. Tipo Size Used Avail Use% Montado em /dev/sda1 ext3 323M 147M 160M 48% / tmpfs tmpfs 249M 0 249M 0% /lib/init/rw udev tmpfs 244M 168K 244M 1% /dev tmpfs tmpfs 249M 0 249M 0% /dev/shm /dev/sda9 ext3 2,8G 69M 2,6G 3% /home /dev/sda8 ext3 234M 6,1M 216M 3% /tmp /dev/sda5 ext3 2,8G 639M 2,0G 24% /usr /dev/sda6 ext3 1,4G 273M 1,1G 21% /var /dev/drbd1 ocfs2 8,0G 151M 7,9G 2% /ocfs2
Caso de algum problema na inicialização como um dos dois nodos não ficar como primary temos podemos resolver da seguinte maneira
Primeiro vamos mandar desmontar as partições montadas com o ocfs2 nos dois nodos
umount /ocfs2
Agora vamos mandar reiniciar o drbd nos dois nodos
/etc/init.d/drbd restart
Agora vamos forçar a utilização dos dois nodos
drbdadm -- --overwrite-data-of-peer primary r1
Agora é so remontar as partições novamente nos dois nodos
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
Agora precisamos mandar reiniciar o o2cb e o ocfs2
/etc/init.d/o2cb restart && /etc/init.d/ocfs2 restart