31.10. Protocolo Comum de Redundância de Endereços (CARP)

Contribuído por Tom Rhodes.
Atualizado por Allan Jude .

O Protocolo Comum de Redundância de Endereços (CARP) permite que vários hosts compartilhem o mesmo endereço IP e ID de Host Virtual (VHID) para fornecer alta disponibilidade para um ou mais serviços. Isso significa que um ou mais hosts podem falhar e os outros hosts assumem o controle de modo transparente, de modo que os usuários não percebam uma falha de serviço.

Além do endereço IP compartilhado, cada host tem seu próprio endereço IP para gerenciamento e configuração. Todas as máquinas que compartilham um endereço IP têm o mesmo VHID. O VHID para cada endereço virtual de IP deve ser exclusivo no domínio de broadcast da interface de rede.

A alta disponibilidade usando o CARP é nativa no FreeBSD, embora os passos para configurá-lo variem um pouco dependendo da versão do FreeBSD. Esta seção fornece a mesma configuração de exemplo para versões anteriores, iguais ou posteriores ao FreeBSD 10.

Este exemplo configura o suporte a failover com três hosts, todos com endereços exclusivos de IP, mas que fornecem o mesmo conteúdo da web. Ele tem dois mestres diferentes chamados hosta.example.org e hostb.example.org, com um backup compartilhado chamado hostc.example.org.

O balanceamento de carga destas máquinas é feito por meio de uma configuração de DNS Round Robin. As máquinas principais e de backup são configuradas de forma idêntica, exceto por seus nomes de host e endereços de gerenciamento IP. Esses servidores devem ter a mesma configuração e executar os mesmos serviços. Quando o failover ocorre, as solicitações para o serviço no endereço IP compartilhado só podem ser respondidas corretamente se o servidor de backup tiver acesso ao mesmo conteúdo. A máquina de backup tem duas interfaces CARP adicionais, uma para cada endereço IP do servidor de conteúdo mestre. Quando ocorre uma falha, o servidor de backup selecionará o endereço IP da máquina mestre com falha.

31.10.1. Usando CARP no FreeBSD 10 e superiores

Ative o suporte para CARP na inicialização do sistema, adicionando uma entrada para o módulo do kernel carp.ko em /boot/loader.conf:

carp_load="YES"

Para carregar o módulo agora sem reiniciar:

# kldload carp

Para usuários que preferem usar um kernel personalizado, inclua a seguinte linha no arquivo de configuração do kernel personalizado e compile o kernel como descrito em Capítulo 8, Configurando o kernel do FreeBSD:

device	carp

O nome do host, o endereço IP de gerenciamento e a máscara de sub-rede, o endereço IP compartilhado e o VHID são definidos adicionando entradas ao /etc/rc.conf. Este exemplo é para o hosta.example.org:

hostname="hosta.example.org"
ifconfig_em0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_em0_alias0="inet vhid 1 pass testpass alias 192.168.1.50/32"

O próximo conjunto de entradas é para o hostb.example.org. Como ele representa um segundo mestre, ele usa um endereço IP compartilhado diferente e VHID. No entanto, as senhas especificadas com pass devem ser idênticas, pois o CARP somente ouvirá e aceitará anúncios de máquinas com a senha correta.

hostname="hostb.example.org"
ifconfig_em0="inet 192.168.1.4 netmask 255.255.255.0"
ifconfig_em0_alias0="inet vhid 2 pass testpass alias 192.168.1.51/32"

A terceira máquina, hostc.example.org, é configurada para lidar com o failover de um dos mestres. Esta máquina é configurada com dois CARP VHIDs, um para manipular o endereço IP virtual para cada um dos hosts principais. O desvio de publicidade CARP, advskew, é definida para garantir que o host de backup seja anunciado depois do mestre, pois advskew controla a ordem de precedência quando existem vários servidores de backup.

hostname="hostc.example.org"
ifconfig_em0="inet 192.168.1.5 netmask 255.255.255.0"
ifconfig_em0_alias0="inet vhid 1 advskew 100 pass testpass alias 192.168.1.50/32"
ifconfig_em0_alias1="inet vhid 2 advskew 100 pass testpass alias 192.168.1.51/32"

Ter dois CARP VHIDs configurados significa que o hostc.example.org notará se um dos servidores principais ficar indisponível. Se um mestre falhar em anunciar antes do servidor de backup, o servidor de backup selecionará o endereço IP compartilhado até que o mestre se torne disponível novamente.

Nota:

Se o servidor mestre original se tornar disponível novamente, o hostc.example.org não liberará o endereço virtual IP de volta a ele automaticamente. Para que isso aconteça, a preempção deve ser ativada. O recurso está desabilitado por padrão, ele é controlado por meio da variável sysctl(8) net.inet.carp.preempt. O administrador pode forçar o servidor de backup a retornar o endereço IP para o mestre:

# ifconfig em0 vhid 1 state backup

Quando a configuração estiver concluída, reinicie a rede ou reinicie cada um dos sistemas. A alta disponibilidade está agora ativada.

A funcionalidade CARP pode ser controlada através de diversas variáveis ​​sysctl(8) documentadas nas páginas de manual do carp(4). Outras ações podem ser acionadas a partir de eventos CARP usando devd(8).

31.10.2. Usando CARP no FreeBSD 9 e anteriores

A configuração para estas versões do FreeBSD é similar àquela descrita na seção anterior, exceto que o dispositivo CARP deve ser criado primeiro e referenciado na configuração.

Ative o suporte de tempo de inicialização para o CARP carregando o módulo do kernel if_carp.ko no /boot/loader.conf:

if_carp_load="YES"

Para carregar o módulo agora sem reiniciar:

# kldload carp

Para usuários que preferem usar um kernel personalizado, inclua a seguinte linha no arquivo de configuração do kernel personalizado e compile o kernel como descrito em Capítulo 8, Configurando o kernel do FreeBSD:

device	carp

Em seguida, em cada host, crie um dispositivo CARP:

# ifconfig carp0 create

Defina o nome do host, o endereço IP de gerenciamento, o endereço IP compartilhado e o VHID adicionando as linhas necessárias ao /etc/rc.conf. Como um dispositivo virtual CARP é usado em vez de um alias, uma máscara de subrede real /24 é usada em vez de uma /32. Aqui estão as entradas para o hosta.example.org:

hostname="hosta.example.org"
ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 1 pass testpass 192.168.1.50/24"

Em hostb.example.org:

hostname="hostb.example.org"
ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0"
cloned_interfaces="carp0"
ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24"

A terceira máquina, hostc.example.org, está configurada para lidar com o failover de qualquer um dos hosts principais:

hostname="hostc.example.org"
ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0"
cloned_interfaces="carp0 carp1"
ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24"
ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24"

Nota:

A preempção está desabilitada no kernel GENERIC do FreeBSD. Se a preempção tiver sido ativada com um kernel personalizado, o hostc.example.org poderá não liberar o endereço IP de volta ao servidor de conteúdo original. O administrador pode forçar o servidor de backup a retornar o endereço IP para o mestre com o comando:

# ifconfig carp0 down && ifconfig carp0 up

Isso deve ser feito na interface carp, que corresponde ao host correto.

Quando a configuração estiver concluída, reinicie a rede ou reinicie cada um dos sistemas. A alta disponibilidade está agora ativada.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.