Bonding para Heartbeat + Bonding para DRBD + OCFS2 + Debian Wheezy

E ai galera, aqui eu vou abordar a configuração de bonding para termos a redundância de interfaces físicas para para o serviço de HA, pois o Heartbeat vai trabalhar no bond0 e o drbd + ocfs2 vai trabalhar no bond1, aqui eu estou utilizando o algoritmo round-robin que faz o balanceamento dos dados, porém temos outros algoritmos que podemos utilizar para o mesmo fim.

Eu quero aqui ganhar disponibilidade do servidor e aumentar a performance de acesso a rede, aonde temos as vezes gargalos como no serviço do DRBD que é um raid1 via rede.

Como vai funcionar, aqui vamos agrupar 2 interfaces para montar um bond para o Heartbeat e agrupar as outras 2 interfaces para montar o bond para o DRBD, caso caia alguma das interfaces por causa de algum problema de hardware o servidor vai continuar funcionando pois temos uma interface de “Backup” trabalhando, caso as duas estejam funcionando vamos fazer o balanceamento de carga entre elas com isso melhorando a performance.

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.

O que vou utilizar:

  1. Nome Nodo1: nodo1
  2. Ip DMZ: 192.168.25.40/24 → VLAN DMZ
  3. Ip DMZ HA: 192.168.25.42/24 → VLAN DMZ
  4. Ip Dados: 172.20.0.40/24 → VLAN Dados
  5. Interfaces de rede: eth0, eth1, eth2, eth3
  6. Partição utilizada Nodo1: /dev/sdb1 dispositivo com 8 GB
  1. Nome Nodo2: nodo2
  2. Ip DMZ: 192.168.25.41/24 → VLAN DMZ
  3. Ip DMZ HA: 192.168.25.42/24 → VLAN DMZ
  4. Ip Dados: 172.20.0.41/24 → VLAN Dados
  5. Interfaces de rede: eth0, eth1, eth2, eth3
  6. Partição utilizada Nodo2: /dev/sdb1 dispositivo com 8 GB

Instalação e configuração do Bond

Agora vamos mandar atualizar os repositórios e instalar os pacotes para o bond no servidor nodo1

aptitude update && aptitude install ifenslave ethtool -y

Agora acertar a configuração dos módulos do kernel

echo "options bonding mode=0 miimon=100"  >> /etc/modprobe.d/bonding.conf

Vamos verificar se todas as interfaces estão com link

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, link ok
eth2: no autonegotiation, 1000baseT-FD flow-control, link ok
eth3: no autonegotiation, 1000baseT-FD flow-control, link ok

Agora vamos acertar a configuração de rede para o bonding

vim /etc/network/interfaces
#Interface de loopback
auto lo
iface lo inet loopback

#Interface de bonding para DMZ
auto bond0
  iface bond0 inet static
  address 192.168.25.40
  netmask 255.255.255.0
  network 192.168.25.0
  gateway 192.168.25.1
  bond-slaves eth0 eth1

#Interface de bonding para Dados
auto bond1
  iface bond1 inet static
  address 172.20.0.40
  netmask 255.255.255.0
  network 172.20.0.0
  bond-slaves eth2 eth3

Agora precisamos reiniciar o servidor

reboot

Agora vamos listar as nossas interfaces para verificar se subiu o bond e os endereços ips

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          inet end.: 192.168.25.40  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe3f:b0b8/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:12604 errors:0 dropped:0 overruns:0 frame:0
          TX packets:265 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:1088563 (1.0 MiB)  TX bytes:42992 (41.9 KiB)

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          inet end.: 172.20.0.40  Bcast:172.20.0.4155  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:feff:cd7c/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:12260 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:1050542 (1.0 MiB)  TX bytes:440 (440.0 B)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:6478 errors:0 dropped:0 overruns:0 frame:0
          TX packets:132 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:563560 (550.3 KiB)  TX bytes:22857 (22.3 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:6126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:133 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:525003 (512.6 KiB)  TX bytes:20135 (19.6 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:6134 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:525539 (513.2 KiB)  TX bytes:278 (278.0 B)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:6126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:525003 (512.6 KiB)  TX bytes:162 (162.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:168 (168.0 B)  TX bytes:168 (168.0 B)

O bonding para o nodo1 já está ok agora vamos configurar o nodo2

Agora vamos mandar atualizar os repositórios e instalar os pacotes para o bond no servidor nodo2

aptitude update && aptitude install ifenslave ethtool -y

Agora acertar a configuração dos módulos do kernel

echo "options bonding mode=0 miimon=100"  >> /etc/modprobe.d/bonding.conf

Vamos verificar se todas as interfaces estão com link

mii-tool 
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok
eth1: no autonegotiation, 1000baseT-FD flow-control, link ok
eth2: no autonegotiation, 1000baseT-FD flow-control, link ok
eth3: no autonegotiation, 1000baseT-FD flow-control, link ok

Agora vamos acertar a configuração de rede para o bonding

vim /etc/network/interfaces
#Interface de loopback
auto lo
iface lo inet loopback

#Interface de bonding para DMZ
auto bond0
  iface bond0 inet static
  address 192.168.25.41
  netmask 255.255.255.0
  network 192.168.25.0
  gateway 192.168.25.1
  bond-slaves eth0 eth1

#Interface de bonding para Dados
auto bond1
  iface bond1 inet static
  address 172.20.0.41
  netmask 255.255.255.0
  network 172.20.0.0
  bond-slaves eth2 eth3

Agora precisamos reiniciar o servidor

reboot

Agora vamos listar as nossas interfaces para verificar se subiu o bond e os endereços ips

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:e4:58:4b  
          inet end.: 192.168.25.41  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fee4:584b/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:1204 errors:0 dropped:0 overruns:0 frame:0
          TX packets:75 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:105536 (103.0 KiB)  TX bytes:9338 (9.1 KiB)

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:d2:4e:60  
          inet end.: 172.20.0.41  Bcast:172.20.0.4155  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fed2:4e60/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:1109 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:92286 (90.1 KiB)  TX bytes:258 (258.0 B)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:e4:58:4b  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:649 errors:0 dropped:0 overruns:0 frame:0
          TX packets:38 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:59308 (57.9 KiB)  TX bytes:3903 (3.8 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:e4:58:4b  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:555 errors:0 dropped:0 overruns:0 frame:0
          TX packets:37 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:46228 (45.1 KiB)  TX bytes:5435 (5.3 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:d2:4e:60  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:555 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:46182 (45.0 KiB)  TX bytes:180 (180.0 B)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:d2:4e:60  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:554 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:46104 (45.0 KiB)  TX bytes:78 (78.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Vamos testar agora a conectividade entre os dois

Vamos mandar pingar do nodo1 para o nodo2

ping -c 3 192.168.25.41
PING 192.168.25.41 (192.168.25.41) 56(84) bytes of data.
64 bytes from 192.168.25.41: icmp_req=1 ttl=64 time=1.85 ms
64 bytes from 192.168.25.41: icmp_req=2 ttl=64 time=0.528 ms
64 bytes from 192.168.25.41: icmp_req=3 ttl=64 time=0.867 ms

--- 192.168.25.41 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.528/1.083/1.855/0.563 ms

Agora vamos mandar pingar do nodo2 para o srv1

ping -c 3 172.20.0.40
PING 172.20.0.40 (172.20.0.40) 56(84) bytes of data.
64 bytes from 172.20.0.40: icmp_req=1 ttl=64 time=4.31 ms
64 bytes from 172.20.0.40: icmp_req=2 ttl=64 time=0.590 ms
64 bytes from 172.20.0.40: icmp_req=3 ttl=64 time=0.425 ms

--- 172.20.0.40 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.425/1.777/4.318/1.798 ms

Agora que o bond está pronto vamos configurar o Heartbeat para garantirmos um ip virtual compartilhado entre os servidores que é o que o cliente vai utilizar para acessar os serviços, este ip sempre vai estar o servidor que for definido como master e caso ele caia por algum motivo o servidor slave vai assumir este ip e o cliente nem vai notar que esta trabalhando em outro servidor.

Vamos acertar o arquivo de hosts, deixe o arquivo como o abaixo nos dois servidores.

vim /etc/hosts
127.0.0.1     localhost
192.168.25.40   nodo1.douglasqsantos.com.br   nodo1
192.168.25.41   nodo2.douglasqsantos.com.br   nodo2

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Instalação e configuração do Heartbeat

Agora vamos instalar o heartbeat no nodo2

aptitude update && aptitude dist-upgrade -y &&  apt-get install heartbeat heartbeat-dev -y

Agora vamos acertar a configuração do heartbeat

vim /etc/ha.d/ha.cf
#informe os nomes dos computadores que formam a replicação(deve ser igual a saída do comando "uname -n
node nodo1
node nodo2

#qual a interface vai ser usada para comunicação
mcast bond0 225.0.0.1 694 1 0

#Fazer com que a máquina principal receba seus serviços quando retornar a ativa
auto_failback on

#arquivos de log
debugfile /var/log/ha-debug
logfile /var/log/ha-log

#freqüência, em segundos, da verificação das máquinas
keepalive 1

#tempo mínimo para declarar a outra máquina como morta
deadtime 5

Agora vamos acertar a configurção do nosso ip compartilhado pelo heartbeat

vim /etc/ha.d/haresources
nodo1 IPaddr::192.168.25.42/24/bond0/192.168.25.255

Explicando o arquivo acima

  1. nodo1: nome do servidor master
  2. IPaddr::192.168.25.42/24: ip que vai ser compartilhado pelo Heartbeat
  3. bond0: Interface que vai receber o ip compartilhado pelo Heartbeat
  4. 192.168.25.40: Endereço de broadcast

Agora vamos acertar o arquivo com a senha de autenticação entre os heartbeats

vim /etc/ha.d/authkeys
auth 3
3 md5 h34rt64t

Agora vamos acertar as permissões do arquivo de senha

chmod 600 /etc/ha.d/authkeys

Agora vamos instalar o heartbeat no nodo2

aptitude update && aptitude dist-upgrade -y &&  apt-get install heartbeat heartbeat-dev -y

Agora vamos acertar a configuração do heartbeat

vim /etc/ha.d/ha.cf
#informe os nomes dos computadores que formam a replicação(deve ser igual a saída do comando "uname -n
node nodo1
node nodo2

#qual a interface vai ser usada para comunicação
mcast bond0 225.0.0.1 694 1 0

#Fazer com que a máquina principal receba seus serviços quando retornar a ativa
auto_failback on

#arquivos de log
debugfile /var/log/ha-debug
logfile /var/log/ha-log

#freqüência, em segundos, da verificação das máquinas
keepalive 1

#tempo mínimo para declarar a outra máquina como morta
deadtime 5

Agora vamos acertar a configurção do nosso ip compartilhado pelo heartbeat

vim /etc/ha.d/haresources
nodo1 IPaddr::192.168.25.42/24/bond0/192.168.25.255

Agora vamos acertar o arquivo com a senha de autenticação entre os heartbeats

vim /etc/ha.d/authkeys
auth 3
3 md5 h34rt64t

Agora vamos acertar as permissões do arquivo de senha

chmod 600 /etc/ha.d/authkeys

Agora vamos reiniciar o heartbeat nos dois servidores

/etc/init.d/heartbeat restart

Agora no servidor master o nodo1 vamos consultar os endereços ips

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          inet end.: 192.168.25.40  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe01:188b/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:1752 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5212 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:158015 (154.3 KiB)  TX bytes:570257 (556.8 KiB)

bond0:0   Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          inet end.: 192.168.25.42  Bcast:192.168.25.255  Masc:255.255.255.0
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:ee:57:19  
          inet end.: 172.20.0.40  Bcast:172.20.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:feee:5719/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:7460 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:10690103 (10.1 MiB)  TX bytes:1166 (1.1 KiB)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:1609 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2608 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:133736 (130.6 KiB)  TX bytes:297866 (290.8 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:143 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2604 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:24279 (23.7 KiB)  TX bytes:272391 (266.0 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:ee:57:19  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:7301 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:10662206 (10.1 MiB)  TX bytes:676 (676.0 B)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:ee:57:19  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:159 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:27897 (27.2 KiB)  TX bytes:490 (490.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Agora no servidor slave o nodo2 vamos consultar os endereços ips

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          inet end.: 192.168.25.41  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe66:da85/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:8980 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5054 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:10828183 (10.3 MiB)  TX bytes:522381 (510.1 KiB)

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:88:e4:3e  
          inet end.: 172.20.0.41  Bcast:172.20.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe88:e43e/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:1145 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:181901 (177.6 KiB)  TX bytes:1208 (1.1 KiB)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:8451 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2528 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:10745822 (10.2 MiB)  TX bytes:269228 (262.9 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:529 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2526 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:82361 (80.4 KiB)  TX bytes:253153 (247.2 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:88:e4:3e  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:602 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:96508 (94.2 KiB)  TX bytes:532 (532.0 B)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:88:e4:3e  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:543 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:85393 (83.3 KiB)  TX bytes:676 (676.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Como pode ser notado temos o ip 192.168.25.42/24 no servidor nodo1 que é o master, agora vamos fazer um teste vamos deslitar o servidor nodo1

telinit 0

Agora no servidor nodo2 vamos consultar os endereços ips

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          inet end.: 192.168.25.41  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe66:da85/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:9428 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5219 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:10917368 (10.4 MiB)  TX bytes:557322 (544.2 KiB)

bond0:0   Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          inet end.: 192.168.25.42  Bcast:192.168.25.255  Masc:255.255.255.0
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:88:e4:3e  
          inet end.: 172.20.0.41  Bcast:172.20.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe88:e43e/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:1697 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:297655 (290.6 KiB)  TX bytes:1208 (1.1 KiB)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:8690 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2611 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:10791189 (10.2 MiB)  TX bytes:287254 (280.5 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:66:da:85  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:738 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2608 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:126179 (123.2 KiB)  TX bytes:270068 (263.7 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:88:e4:3e  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:878 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:154385 (150.7 KiB)  TX bytes:532 (532.0 B)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:88:e4:3e  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:819 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:143270 (139.9 KiB)  TX bytes:676 (676.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Note que o endereço ip 192.168.25.42/24 já foi atribuido ao servidor nodo2 pois ele é o slave, então caso o cliente esteja conectado em algum serviço ele não vai notar quando trocar de servidor.

Agora vamos ligar novamente o servidor nodo1

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          inet end.: 192.168.25.40  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe01:188b/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:215 errors:0 dropped:0 overruns:0 frame:0
          TX packets:162 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:32945 (32.1 KiB)  TX bytes:21158 (20.6 KiB)

bond0:0   Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          inet end.: 192.168.25.42  Bcast:192.168.25.255  Masc:255.255.255.0
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:ee:57:19  
          inet end.: 172.20.0.40  Bcast:172.20.0.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:feee:5719/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:159 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:30302 (29.5 KiB)  TX bytes:368 (368.0 B)

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:162 errors:0 dropped:0 overruns:0 frame:0
          TX packets:82 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:22260 (21.7 KiB)  TX bytes:9839 (9.6 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:01:18:8b  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:53 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:10685 (10.4 KiB)  TX bytes:11319 (11.0 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:ee:57:19  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:79 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:15112 (14.7 KiB)  TX bytes:168 (168.0 B)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:ee:57:19  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:15190 (14.8 KiB)  TX bytes:200 (200.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Note que o ip compartilhado voltou para o servidor nodo1 pois definimos ele como master, a primeira parte já esta ok que era garantir um ip compartilhado que vai ser utilizado pelo cliente.

Pense que no servidor nodo1 temos um site rodando e este site está tambem no servidor nodo2, com isso o cliente vai acessar o http://192.168.25.42 e vai para o servidor master disponível que em nosso caso vai ser o nodo1, caso o master caia o cliente vai acessar as páginas que estão no servidor nodo2 e nem vai sentir que ele está acessando outro servidor ;)

Mas note que ainda temos um problema, os dados tem que ser sincronizados manualmente entre os servidores por isso que vamos utilizar agora o DRBD + OCFS2 que vai trabalhar como um raid1 via rede espelhando os dados em tempo real, então caso seja alterado um arquivo qualquer na partição do drbd o outro servidor já vai ter acesso a essas novas informações, aqui vou utilizar o ocfs2 que é um sistema de arquivos distribuido aonde podemos trabalhar com os nodos sendo !master/master ou seja qualquer um dos servidores podem alterar qualquer arquivo e esse arquivo vai aparecer alterado para a outra ponta.

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:

drbdadm connect r1
root@nodo1 /etc/drbd.d # /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

PLUS

Pense que você precisa fazer o HA de um servidor de FW por exemplo, o que tem de diferente poderia me perguntar. Pense nas interfaces de rede temos no mínimo 2 interfaces uma WAN e uma LAN neste caso precisariamos configurar o heartbeat para atribuir endereços virtuais para as duas interfaces.

Vamos a um exemplo, vou utilizar as interfaces de bond mesmo

Agora vamos instalar o heartbeat no nodo2

aptitude update && aptitude dist-upgrade -y &&  apt-get install heartbeat heartbeat-dev -y

Agora vamos acertar a configuração do heartbeat

vim /etc/ha.d/ha.cf
#informe os nomes dos computadores que formam a replicação(deve ser igual a saída do comando "uname -n
node nodo1
node nodo2

#qual a interface vai ser usada para comunicação
mcast bond0 225.0.0.1 694 1 0
mcast bond1 225.0.0.1 694 1 0

#Fazer com que a máquina principal receba seus serviços quando retornar a ativa
auto_failback on

#arquivos de log
debugfile /var/log/ha-debug
logfile /var/log/ha-log

#freqüência, em segundos, da verificação das máquinas
keepalive 1

#tempo mínimo para declarar a outra máquina como morta
deadtime 5

Agora vamos acertar a configurção do nosso ip compartilhado pelo heartbeat

vim /etc/ha.d/haresources
nodo1 IPaddr::192.168.25.42/24/bond0/192.168.25.255
nodo1 IPaddr::172.20.0.27/24/bond1/172.20.0.405

Explicando o arquivo acima

  1. nodo1: nome do servidor master
  2. IPaddr::192.168.25.42/24: ip que vai ser compartilhado pelo Heartbeat
  3. bond0: Interface que vai receber o ip compartilhado pelo Heartbeat
  4. 192.168.25.40: Endereço de broadcast

Agora vamos acertar o arquivo com a senha de autenticação entre os heartbeats

vim /etc/ha.d/authkeys
auth 3
3 md5 h34rt64t

Agora vamos acertar as permissões do arquivo de senha

chmod 600 /etc/ha.d/authkeys

Agora vamos instalar o heartbeat no nodo2

aptitude update && aptitude dist-upgrade -y &&  apt-get install heartbeat heartbeat-dev -y

Agora vamos acertar a configuração do heartbeat

vim /etc/ha.d/ha.cf
#informe os nomes dos computadores que formam a replicação(deve ser igual a saída do comando "uname -n
node nodo1
node nodo2

#qual a interface vai ser usada para comunicação
mcast bond0 225.0.0.1 694 1 0
mcast bond1 225.0.0.1 694 1 0

#Fazer com que a máquina principal receba seus serviços quando retornar a ativa
auto_failback on

#arquivos de log
debugfile /var/log/ha-debug
logfile /var/log/ha-log

#freqüência, em segundos, da verificação das máquinas
keepalive 1

#tempo mínimo para declarar a outra máquina como morta
deadtime 5

Agora vamos acertar a configurção do nosso ip compartilhado pelo heartbeat

vim /etc/ha.d/haresources
nodo1 IPaddr::192.168.25.42/24/bond0/192.168.25.255
nodo1 IPaddr::172.20.0.27/24/bond0/172.20.0.405

Agora vamos acertar o arquivo com a senha de autenticação entre os heartbeats

vim /etc/ha.d/authkeys
auth 3
3 md5 h34rt64t

Agora vamos acertar as permissões do arquivo de senha

chmod 600 /etc/ha.d/authkeys

Agora vamos reiniciar o heartbeat nos dois servidores

/etc/init.d/heartbeat restart

Agora vamos consultar as interfaces no servidor nodo1.

ifconfig
bond0     Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          inet end.: 192.168.25.40  Bcast:192.168.25.255  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:fe3f:b0b8/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:28239 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1356 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:2576871 (2.4 MiB)  TX bytes:464634 (453.7 KiB)

bond0:0   Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          inet end.: 192.168.25.42  Bcast:192.168.25.255  Masc:255.255.255.0
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1

bond1     Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          inet end.: 172.20.0.40  Bcast:172.20.0.405  Masc:255.255.255.0
          endereço inet6: fe80::a00:27ff:feff:cd7c/64 Escopo:Link
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1
          RX packets:204376 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36125 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:230398360 (219.7 MiB)  TX bytes:9571891 (9.1 MiB)

bond1:0   Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          inet end.: 172.20.0.27  Bcast:172.20.0.405  Masc:255.255.255.0
          UP BROADCASTRUNNING MASTER MULTICAST  MTU:1500  Métrica:1

eth0      Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:14227 errors:0 dropped:0 overruns:0 frame:0
          TX packets:684 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:1300809 (1.2 MiB)  TX bytes:246914 (241.1 KiB)

eth1      Link encap:Ethernet  Endereço de HW 08:00:27:3f:b0:b8  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:14012 errors:0 dropped:0 overruns:0 frame:0
          TX packets:672 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:1276062 (1.2 MiB)  TX bytes:217720 (212.6 KiB)

eth2      Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:190049 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18077 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:229048128 (218.4 MiB)  TX bytes:4820003 (4.5 MiB)

eth3      Link encap:Ethernet  Endereço de HW 08:00:27:ff:cd:7c  
          UP BROADCASTRUNNING SLAVE MULTICAST  MTU:1500  Métrica:1
          RX packets:14327 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18048 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:1000 
          RX bytes:1350232 (1.2 MiB)  TX bytes:4751888 (4.5 MiB)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACKRUNNING  MTU:16436  Métrica:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Aqui o que é preciso mudar são as interfaces caso não trabalhe com o bond e os endereços ips ;)

Referências