O documento descreve a configuração de alta disponibilidade utilizando o Pacemaker e o DRBD. O Pacemaker é usado para implementar failover de serviços como Apache e IP virtual entre dois nós, enquanto o DRBD replica o armazenamento entre os nós para prover alta disponibilidade dos dados.
2. “Um sistema de alta disponibilidade é aquele que utiliza
mecanismos de detecção, recuperação e mascaramento de
falhas, visando manter o funcionamento dos serviços durante o
máximo de tempo possível, inclusive no decurso de
manutenções programadas”
Definição – Alta Disponibilidade
3. “Disponibilidade refere-se a capacidade de um usuário de
determinado sistema acessar, incluir ou modificar os dados
existentes em qualquer intervalo de tempo. Caso, por qualquer
que seja o motivo, um usuário não tenha acesso, é dito então
que ele está indisponível, sendo o tempo total de
indisponibilidade conhecido pelo termo downtime.”
Definição – Disponibilidade
4. •Níveis de Disponibilidade
Geralmente, quanto maior a disponibilidade,
maior a redundância e custo das soluções: tudo
depende do tipo de serviço que se pretende
disponibilizar
5. • Infraestrutura do Cluster (CMAN, DLM, Fencing)
– Provê as principais funções para que os nós trabalhem
juntos como um cluster
– Gerenciamento dos arquivos de configuração,
gerenciamento das associações (membership), lock
management e fencing
• Gerenciamento de Serviços HA (rgmanager)
– Provê failover dos serviços de um cluster para o outro
quando o nó fica inoperante
Principais Componentes
6. • Ferramentas de Administralçao do Cluster
(pacemaker, CCS, Conga)
– Ferramentas de configuração e gerenciamento para
configurar e criar clusters
– Gerencia a alta disponibilidade para uso dos componentes
do cluster, serviços e storage
Principais Componentes
9. Instalação Cluster Ativo/Passivo
➔
Instalação do Pacemaker stack e ferramenta pcs
nos dois nós
yum install pacemaker pcs cman
➔
Inicialização do serviço e definição para iniciar no
boot do servidor
Centos 7
systemctl enable pcsd.service
systemctl start pcsd.service
systemctl enable pacemaker.service
Centos 6
/etc/init.d/pcsd start
chkconfig pcsd on
chkconfig pacemaker on
10. Instalação
➔
Depois da instalação dos pacotes, um novo
usuário chamado hacluster foi criado. Este usuário
é usado para sincronização da configuração e
gerenciamento dos serviços nos nós. É necessário
definir a mesma senha em todos os servidores
[root@node1 ~]# passwd hacluster
➔
Desativando o Firewall (esta ação só deve ser feita
no lab em sala, em implementações deve ser
realizado os ajustes nas regras do firewall)
[root@node1 ~]# iptables -F
[root@node1 ~]# chkconfig iptables off
11. Instalação
➔
Definir os servidores com IP fixo
[root@node2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=52:54:00:2D:9C:7E
TYPE=Ethernet
UUID=25d96521-de19-4957-b010-a39c0d1280e7
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.122.204
NETMASK=255.255.255.0
GATEWAY=192.168.122.1
➔
Inserir hostname no /etc/hosts
[root@node1 ~]# vim /etc/hosts
192.168.122.203 node1
192.168.122.204 node2
12. Instalação
➔
Configuração da autenticação entre os dois hosts
para que possa ser executado comandos em
apenas um dos nós.
[root@node1 ~]# pcs cluster auth node1 node2
Username: hacluster
Password:
node1: Authorized
node2: Authorized
13. Instalação
➔
Criando um novo cluster chamado cluster_apache
e sincronizado as configurações do corosync entre
os nós.
[root@node1 ~]# pcs cluster setup --start --name cluster_apache
node1 node2
node1: Updated cluster.conf...
node2: Updated cluster.conf...
Starting cluster on nodes: node1, node2...
node1: Starting Cluster...
node2: Starting Cluster...
Obs: Se receber o erro abaixo, crie nos dois nós a pasta
/etc/cluster
Error connecting to node1 - (HTTP error: 500)
Error: Unable to set cluster.conf
14. Verificando o status do Cluster
[root@node1 ~]# pcs status
Cluster name: cluster_apache
WARNING: no stonith devices and stonith-enabled is not
false
Last updated: Sun Oct 18 22:33:51 2015
Last change: Sun Oct 18 22:33:10 2015
Stack: cman
Current DC: node1 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured
0 Resources configured
Online: [ node1 node2 ]
Full list of resources:
15. Adicionando recursos: IP VIP
Se o cluster estiver online, podemos inserir os recursos no
mesmo.
Antes prescisaremos desativar o STONITH, pois em nossa
configuração não temos nenhum dispositivo para fencing.
[root@node1 ~]# pcs property set stonith-enabled=false
Adicionando um IP Virtual para nosso cluster, esse recurso
será chamado de VirtualIP
[root@node1 ~]# pcs resource create VirtualIP IPaddr2
ip=192.168.122.100 cidr_netmask=24
16. Verificando o status do Cluster
[root@node1 ~]# pcs status
Cluster name: cluster_apache
Last updated: Sun Oct 18 22:57:21 2015
Last change: Sun Oct 18 22:55:41 2015
Stack: cman
Current DC: node1 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured
1 Resources configured
Online: [ node1 node2 ]
Full list of resources:
VirtualIP (ocf::heartbeat:IPaddr2): Started node1
17. Verificando o status do Cluster
[root@node1 ~]# ip addr
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UP qlen 1000
link/ether 52:54:00:e0:dc:2a brd ff:ff:ff:ff:ff:ff
inet 192.168.122.203/24 brd 192.168.122.255 scope global
eth0
inet 192.168.122.100/24 brd 192.168.122.255 scope global
secondary eth0
inet6 fe80::5054:ff:fee0:dc2a/64 scope link
valid_lft forever preferred_lft forever
A partir de um host client ping o IP VIP do cluster
[root@node1 ~]# pcs cluster standby node1
[root@node1 ~]# pcs cluster unstandby node1
18. Adicionando recursos: Apache
Vamos inserir o apache para rodar em nosso cluster, faça
os processos abaixo nos dois nós
[root@node1 ~]# yum install httpd
O Apache Resource Agent do pacemaker utiliza a página de
status do apache para verificar a saúde do serviço. Para
ativar a página de status, siga os paços abaixo:
[root@node1 ~]# vi /etc/httpd/conf.d/status.conf
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>
19. Adicionando recursos: Apache
Inserindo o recurso no cluster
[root@node1 ~]# pcs resource create httpd
ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf
statusurl="http://127.0.0.1/server-status" op monitor
interval=20s
Onde:
create httpd - é o nome do recurso
configfile=/etc/httpd/conf/httpd.conf – é o local do
arquivo de configuração do apache
Statusurl="http://127.0.0.1/server-status" -
Caminho usado para monitorar o status do servidor web
op monitor interval=20s – Monitora o serviço a cada 20s
20. Verificando o status do Cluster
[root@node1 ~]# pcs status
Cluster name: cluster_apache
Last updated: Sun Oct 18 23:36:16 2015
Last change: Sun Oct 18 23:33:30 2015
Stack: cman
Current DC: node1 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured
2 Resources configured
Online: [ node1 node2 ]
Full list of resources:
VirtualIP (ocf::heartbeat:IPaddr2): Started node1
httpd (ocf::heartbeat:apache): Started node2
21. Adicionando recursos: Apache
Os recursos foram distribuidos entro os nós, mas tanto o IP
VIP como o Apache precisam rodar no mesmo nó.
[root@node1 ~]# pcs resource move httpd
22. Constraint
Através das constraint é possível ordenar o startup dos
serviços e definir quais recursos devem rodar juntos no
mesmo nó.
[root@node1 ~]# pcs constraint colocation add VirtualIP
httpd INFINITY
Mova apenas um recurso para o outro nó e você verá que
ambos recursos serão movidos.
[root@node1 ~]# pcs resource move httpd nome_do_nó
23. O DRBD (Distributed Replicated Block Device) consiste em um
módulo para o kernel Linux que faz o espelhamento dos dados
de um dispositivo de bloco (partições de disco) entre diferentes
servidores, interligados geralmente através de uma rede
Ethernet.
DRBD = RAID 1 via Rede
Definição -DRBD
24. ➔
Cada dispositivo de bloco envolvido na configuração do DRBD
tem um estado, que pode ser primário ou secundário.
➔
Operações de escrita feitas no primário são replicadas para o
secundário
➔
O protocolo padrão de replicação garante a sincronia e a
integridade dos dados replicados.
➔
Operações de leitura, são sempre realizadas localmente.
Funcionamento
25. ➔
O DRBD suporta três distintos modos de replicação,
permitindo três graus de sincronnização da replicação. O
➔
Protocolo A é assíncrono.
➔
As operações de escrita no nodo primário são
consideradas completas quando a escrita no disco local
termina e o pacote de replicação está no buffer TCP.
➔
Em casos de fail-over deve ocorrer perda de dados
com este protocolo.
Funcionamento
26. ➔
O Protocol B é um semi-síncrono protocolo de
replicação.
➔
Operações locais são escritas no nodo primário e são
consideradas completas quando estão escritas no diso
local e a relpicação do pacote alcançou o outro nodo
na rede.
➔
O Protocol C é sincrono por completo.
➔
Com este protocolo as operações no nodo primário são
consideradas completas quando ocorre a escrita no
nodo primário e no secundário.
Funcionamento
28. DRBD - Instalação
Nos dois nós
[root@node1 ~]# rpm --import
https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@node1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-
release-6-6.el6.elrepo.noarch.rpm
[root@node1 ~]# yum install drbd84-utils kmod-drbd84
Adicione um disco de 1Gb na máquina virtual, no meu caso
o novo dispositivo foi /dev/vdb em ambas as máquinas
29. DRBD - Configuração
Criar e configurar o arquivo de configuração abaixo nos
dois nós:
[root@node1 ~]# vim /etc/drbd.d/drbd0.res
resource drbd0 {
disk /dev/vdb1;
device /dev/drbd0;
meta-disk internal;
Protocol C;
on node1 {
address 192.168.122.203:7789;
}
on node2 {
address 192.168.122.204:7789;
}
}
30. DRBD - Configuração
Inicializando o volume /dev/drbd0 nos dois nós:
[root@node1 ~]# drbdadm create-md drbd0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success
[root@node2 ~]# drbdadm create-md drbd0
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
success
31. DRBD - Configuração
Ativando o /dev/drbd0 nos dois nós:
[root@node1 ~]# drbdadm up drbd0
[root@node2 ~]# drbdadm up drbd0
[root@node1 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70
build by phil@Build64R6, 2015-04-09 14:35:00
0: 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:1048220
O DRBD marcou os dois recursos como inconsistentes pois
ainda não foi marcado quem é o nó primário.
33. DRBD - Configuração
Após o sincronismo dos dois volumes
[root@node1 ~]# cat /proc/drbd
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by
phil@Build64R6, 2015-04-09 14:35:00
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:1048220 nr:0 dw:0 dr:1048884 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1
wo:f oos:0
Onde:
cs (connection state). Status da conexão de rede.
ro (roles). Se o nó é primeira ou secundário
ds (disk states). Status dos discos.O primeiro parâmetro representa o
disco local e depois da barra representa o nó remoto.
34. DRBD – Criando um FS no
recurso DRBD
No nó em que o DRBD estiver como primário, vamos criar
o FS. Toda ação que for feita no volume /dev/drbd0 será
replicada para o outro nó.
[root@node1 ~]# mkfs.ext3 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262055 blocks
13102 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
35. DRBD – Testando
Siga os passos abaixo a fim de testar a integridade do
volume drbd nos dois nós.
#Montando o volume /dev/drbd0 e criando conteudo dentro dele
[root@node1 ~]# mkdir /media/teste_drbd
[root@node1 ~]# mount /dev/drbd0 /media/teste_drbd/
[root@node1 ~]# touch /media/teste_drbd/node1_teste.txt
[root@node1 ~]# umount /dev/drbd0
[root@node1 ~]# drbdadm secondary drbd0
[root@node1 ~]# drbd-overview
0:drbd0/0 Connected Secondary/Secondary UpToDate/UpToDate
36. DRBD – Testando
Montando o volume DRBD no nó 2 e verificando se o
arquivo criado no nó 1 foi replicado.
[root@node2 ~]# mkdir /media/teste_drbd
[root@node2 ~]# mount /dev/drbd0 /media/teste_drbd/
mount: você precisa especificar o tipo do sistema de arquivos
O erro acima ocorreu pois o volume drbd não está como primário neste nó.
[root@node2 ~]# drbdadm primary drbd0
[root@node2 ~]# drbd-overview
0:drbd0/0 Connected Primary/Secondary UpToDate/UpToDate
[root@node2 ~]# mount /dev/drbd0 /media/teste_drbd/
[root@node2 ~]# ls /media/teste_drbd/
lost+found node1_teste.txt
Como o arquivo node1_teste.txt (criado no node1) apareceu, significa que
ele foi replicado do node1 para o node2.
37. DRBD – Integrando o FS /dev/drbd0 ao Cluster
Nosso cluster está configurado com os seguintes recursos:
– IP VIP
– Servidor Web Apache
Necessário adicionar DRBD como recurso do cluster
Desativar o DRBD da inicialização do linux
[root@node1 ~]# chkconfig drbd off
Desmontar o volume DRBD onde ele estiver montado
[root@node1 ~]# umount /dev/drbd0
[root@node2 ~]# umount /dev/drbd0
38. DRBD – Integrando o FS /dev/drbd0 ao Cluster
O PCS tem a possibilidade de enfileirar diversos comandos
para em seguida aplicá-los todos de uma vez só. Esse
recurso é possível através da CIB (Cluster Information
Base)
[root@node1 ~]# pcs cluster cib drbd_config
Através do pcs -f vamos inserir regras dentro do
drbd_cofnig. Essas regras só serão inseridas após o push
destas configurações.
[root@node1 ~]# pcs -f drbd_config resource create DrbdVol
ocf:linbit:drbd drbd_resource=drbd0 op monitor interval=60s
[root@node1 ~]# pcs -f drbd_config resource master
DrbdVolClone DrbdVol master-max=1 master-node-max=1 clone-
max=2 clone-node-max=1 notify=true
39. DRBD – Integrando o FS /dev/drbd0 ao Cluster
[root@node1 ~]# pcs -f drbd_config resource show
VirtualIP (ocf::heartbeat:IPaddr2): Started node1
httpd (ocf::heartbeat:apache): Started node1
Master/Slave Set: DrbdVolClone [DrbdVol]
Stopped: [ node1 node2 ]
Se as configurações estiverem corretas, podemos agora
inserir as configurações no Cluster
[root@node1 ~]# pcs cluster cib-push drbd_config
CIB updated
40. DRBD – Integrando o FS /dev/drbd0 ao Cluster
[root@node1 ~]# pcs status
Cluster name: cluster_apache
Last updated: Sun Oct 25 16:21:57 2015
Last change: Sun Oct 25 16:20:40 2015
Stack: cman
Current DC: node1 - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured
4 Resources configured
Online: [ node1 node2 ]
Full list of resources:
VirtualIP (ocf::heartbeat:IPaddr2): Started node1
httpd (ocf::heartbeat:apache): Started node1
Master/Slave Set: DrbdVolClone [DrbdVol]
Masters: [ node2 ]
Slaves: [ node1 ]
41. DRBD – Integrando o FS /dev/drbd0 ao Cluster
Uma vez que o DRBD já está inserido no Cluster, devemos agora
inserir um filesystem para ser montado pelo nosso cluster e definir
que ele só deve ser montado no nó primário
# Add FS
[root@node1 ~]# pcs cluster cib fs_config
[root@node1 ~]# pcs -f fs_config resource create DrbdFS
Filesystem device="/dev/drbd0" directory="/var/www/html"
fstype="ext3"
# Definindo a constraint
[root@node1 ~]# pcs -f fs_config constraint colocation add
DrbdFS DrbdVolClone INFINITY with-rsc-role=Master
[root@node1 ~]# pcs -f fs_config constraint order promote
DrbdVolClone then start DrbdFS
Adding DrbdVolClone DrbdFS (kind: Mandatory) (Options: first-
action=promote then-action=start)
42. DRBD – Integrando o FS /dev/drbd0 ao Cluster
Precisamos definir que o Apache deve rodar no mesmo nó onde o
FS estiver ativo e que o FS deve ser montado antes do inicio do
apache
[root@node1 ~]# pcs -f fs_config constraint colocation add httpd
DrbdFS INFINITY
[root@node1 ~]# pcs -f fs_config constraint order DrbdFS then
httpd
Adding DrbdFS httpd (kind: Mandatory) (Options: first-
action=start then-action=start)
43. DRBD – Integrando o FS /dev/drbd0 ao Cluster
Verificando os recursos e constraint da CIB fs_config
[root@node1 ~]# pcs -f fs_config constraint
Location Constraints:
Resource: httpd
Enabled on: node1 (score:INFINITY) (role: Started)
Ordering Constraints:
promote DrbdVolClone then start DrbdFS (kind:Mandatory)
start DrbdFS then start httpd (kind:Mandatory)
Colocation Constraints:
VirtualIP with httpd (score:INFINITY)
DrbdFS with DrbdVolClone (score:INFINITY) (with-rsc-
role:Master)
httpd with DrbdFS (score:INFINITY)
44. DRBD – Integrando o FS /dev/drbd0 ao Cluster
Verificando os recursos e constraint da CIB fs_config
[root@node1 ~]# pcs -f fs_config resource show
VirtualIP (ocf::heartbeat:IPaddr2): Started node1
httpd (ocf::heartbeat:apache): Started node1
Master/Slave Set: DrbdVolClone [DrbdVol]
Masters: [ node2 ]
Slaves: [ node1 ]
DrbdFS (ocf::heartbeat:Filesystem): Stopped
Se tudo estiver certo, podemos fazer o push das configurações
[root@node1 ~]# pcs cluster cib-push fs_config
CIB updated
45. DRBD – Integrando o FS /dev/drbd0 ao Cluster
Verificando o status
[root@node1 ~]# pcs status
2 Nodes configured
5 Resources configured
Online: [ node1 node2 ]
Full list of resources:
VirtualIP (ocf::heartbeat:IPaddr2): Started node1
httpd (ocf::heartbeat:apache): Started node1
Master/Slave Set: DrbdVolClone [DrbdVol]
Masters: [ node1 ]
Slaves: [ node2 ]
DrbdFS (ocf::heartbeat:Filesystem): Started node1
46. Testando
➔
Coloque o nó 1 em standby e observe que o a
pasa /var/www/html está vazia. No nó 2 ela
será montada com todo o conteúdo
apresentado no nó 1 antes do standby.
[root@node1 ~]# pcs cluster standby node1
➔
Faça com que o nó 1 reassuma. Verifique o
status do device /dev/drbd0 e dos dados na
pasta /var/www/html
[root@node1 ~]# pcs cluster unstandby node1