<!-- review: finished -->

<a id="cluster-setup"></a>

# Configuração de Cluster Angie

Este guia descreve o processo de criação de um cluster Angie tolerante a falhas
com sincronização automática de configuração
e failover de endereço IP virtual.

<a id="cluster-preparation"></a>

## Preparando Nós do Cluster para Sincronização

O primeiro passo é preparar todos os nós do cluster
configurando contas de usuário
e garantindo acesso seguro entre servidores.

<a id="users-permissions"></a>

### Configurando Usuários e Permissões de Acesso

Crie um usuário em todos os nós
(por exemplo, `angie-ha-sync`) com privilégios `sudo`:

```console
$ sudo adduser angie-ha-sync
```

Defina uma senha se necessário:

```console
$ sudo passwd angie-ha-sync
```

#### NOTE
Em alguns sistemas operacionais (por exemplo, Alt Linux),
você deve adicionar o usuário ao grupo `wheel`:

```console
$ sudo usermod -a -G wheel angie-ha-sync
```

Para trabalhar com `rsync` quando MAC está habilitado no Astra Linux, defina
o nível de integridade correto:

```console
$ sudo pdpl-user -i 63 angie-ha-sync
```

Configure sudo sem senha:

```console
$ echo "angie-ha-sync ALL=(ALL:ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers
```

No nó master, crie chaves SSH e copie-as para os nós de backup:

```console
$ su - angie-ha-sync
$ ssh-keygen -t rsa
$ ssh-copy-id angie-ha-sync@node2_hostname
```

#### WARNING
Antes de copiar as chaves SSH, certifique-se de que o
arquivo `/etc/ssh/sshd_config` tenha a opção:

`PasswordAuthentication yes`

Após configurar o acesso baseado em chave, defina o valor como `no` para melhorar
a segurança.

#### NOTE
Para sincronização cruzada da configuração do Angie, copie as chaves do usuário
para todos os nós:

```console
$ scp -p ~angie-ha-sync/.ssh/id_rsa angie-ha-sync@node2_hostname:.ssh/
```

<a id="install"></a>

## Instalando Angie e angie-ha-sync

Após preparar os nós, você precisa instalar os principais componentes do cluster:
Angie e o pacote de sincronização de configuração.

Configure o repositório em todos os nós de acordo com as instruções para os pacotes do seu sistema:

- [Instruções para Angie](https://pt.angie.software//angie/docs/installation/oss_packages.md#oss-packages)
- [Instruções para Angie PRO](https://pt.angie.software//angie/docs/installation/pro_packages.md#pro-packages)

<a id="install-ha-sync"></a>

### Instalando angie-ha-sync

O módulo de sincronização de configuração está disponível nos seguintes pacotes:

- Angie: `angie-ha-sync`
- Angie PRO: `angie-pro-ha-sync`

#### NOTE
Ao instalar este pacote em um sistema limpo,
o pacote correspondente `angie` ou `angie-pro`
também será instalado como dependência.

Em todos os nós, instale o pacote usando o gerenciador de pacotes do seu SO, por exemplo:

```console
$ sudo {apk|apt|pkg|yum|zypper} {add|install} angie-pro-ha-sync
```

<a id="sync"></a>

## Configurando Sincronização de Configuração

O próximo passo é configurar a sincronização automática de arquivos de configuração
entre os nós do cluster.

#### NOTE
Princípios de sincronização:

- A sincronização é realizada via `rsync`.
- Ocorre apenas quando o serviço Angie está em execução.
- Executada manualmente (comando `angiehasync -Sd`).
- Funciona em uma direção: do nó master para o backup.
- `rsync` executa em modo daemon.

<a id="rsync"></a>

### Configurando `rsync`

Crie uma configuração `rsync` (`/etc/rsyncd.conf`) nos nós:

```ini
[angie] # Diretório com configuração do Angie
    path = /etc/angie
# Usuário para sincronização
    uid = angie-ha-sync
# Grupo do usuário
    gid = angie-ha-sync
# IP ou sub-rede de onde conexões são permitidas
    hosts allow = 10.21.8.0/24
# Negar todos os outros
    hosts deny = *
```

Dependendo do SO, inicie o daemon:

```console
$ sudo service rsyncd start # ou $ sudo service rsync start
```

#### NOTE
Para alguns sistemas, existem instruções prontas:

- [Alt](https://www.altlinux.org/Настройка_rsync-сервера)
- [Astra](https://wiki.astralinux.ru/pages/viewpage.action?pageId=41191598#id-Архивированиеивосстановлениефайловссохранениеммандатныхатрибутов-RSYNC)

<a id="sync-config"></a>

### Configurando o Arquivo de Sincronização

Edite `/etc/angiehasync/angiehasync.conf`:

```ini
M_NODE="<node1_hostname>"            # Hostname ou IP deste nó
TARGET_HOSTS="<node2_hostname>"      # Lista de hosts/IPs para sincronização (separados por espaço).
                                     # Pode ser omitido em nós de backup.
SSH_USER="user"                      # Usuário para sincronização (com privilégios de administrador)
SSH_ID="/home/$SSH_USER/.ssh/id_rsa" # Caminho para chave privada
```

#### NOTE
Para sincronização cruzada,
preencha a lista `TARGET_HOSTS` em todos os nós;
no entanto, não inclua o nó atual
que está sendo configurado na lista.

<a id="healthcheck"></a>

### Configurando Verificações de Saúde para Angie

Adicione um bloco de verificação de saúde à configuração do Angie
(`/etc/angie/angie.conf`):

```ini
server {

    listen unix:/tmp/angie_hcheck.sock; # Socket Unix para verificação
    access_log off;
    error_log /dev/null;
    default_type text/plain;
    return 200 'ok\n';
}
```

Inicie o Angie:

```console
$ sudo angie -t && sudo service angie start
```

Inicie a sincronização:

```console
$ sudo angiehasync -Sd
```

#### NOTE
O script verificará automaticamente a configuração, realizará sincronização com todos
os nós e a aplicará.

<a id="keepalived"></a>

## Configurando Keepalived

Para failover automático entre nós do cluster, o Keepalived é usado —
um serviço para gerenciar endereços IP virtuais (VIP).

#### NOTE
Se o pacote `keepalived` não estiver instalado — instale-o:

```console
$ sudo {apk|apt|pkg|yum|zypper} {add|install} keepalived
```

Para vincular processos a endereços IP não locais,
permita que o sistema execute as ações correspondentes:

```console
$ sudo sysctl -w net.ipv4.ip_nonlocal_bind=1
```

Mais detalhes:
[https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt#ip_nonlocal_bind](https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt#ip_nonlocal_bind)

Suponha que o VIP `10.21.11.230`
seja atribuído ao nó master (`10.21.8.26`)
ou ao backup (`10.21.8.27`).

Se o Angie escutar neste VIP (`listen 10.21.11.230:80;`)
mas o endereço ainda não estiver atribuído,
o Angie não conseguirá iniciar sem o parâmetro `ip_nonlocal_bind`.

<a id="keepalived-config"></a>

### Configuração do Keepalived

No nó master (`/etc/keepalived/keepalived.conf`):

```ini
global_defs {
    enable_script_security
}

vrrp_script angie_check {
    script "/usr/bin/curl -s --connect-timeout 5 -A 'angie_hcheck_script'
    --no-buffer -XGET --unix-socket /tmp/angie_hcheck.sock http://hcheck/"
    interval 5 user angie
}

vrrp_instance angie {
    state MASTER interface enp0s2 virtual_router_id 254 priority 100
    advert_int 2 unicast_src_ip 10.21.8.26

    unicast_peer {
        10.21.8.27
    }

    virtual_ipaddress {
        10.21.11.230
    } track_script {
        angie_check
    }
}
```

No nó de backup:

```ini
global_defs {
    enable_script_security
}

vrrp_script angie_check {
    script "/usr/bin/curl -s --connect-timeout 5 -A 'angie_hcheck_script'
    --no-buffer -XGET --unix-socket /tmp/angie_hcheck.sock http://hcheck/"
    interval 5 user angie
}

vrrp_instance angie {
    state MASTER interface enp0s2 virtual_router_id 254 priority 99
    advert_int 2 unicast_src_ip 10.21.8.27

    unicast_peer {
        10.21.8.26
    }

    virtual_ipaddress {
        10.21.11.230
    } track_script {
        angie_check
    }
}
```

#### NOTE
Na seção `vrrp_instance angie`, defina os seguintes valores:

- `unicast_src_ip` — IP do nó atual
- `unicast_peer` — IP dos nós vizinhos
- `virtual_ipaddress` — IP virtual (VIP)
- `interface` — interface de rede

Inicie o serviço:

```console
$ sudo keepalived -t && sudo service keepalived start
```

<a id="keepalived-details"></a>

### Detalhamento da Configuração do Keepalived

Vamos examinar os principais elementos da configuração do Keepalived em detalhes
para entender os princípios de operação do cluster.

A configuração inclui duas partes:

- `global_defs` — configurações globais
- `vrrp_instance` — parâmetros VRRP (comutação de VIP)

Elementos principais:

- `enable_script_security` — permite execução de scripts de verificação de saúde
- `vrrp_script` — script de verificação de saúde do Angie
- `state MASTER` — estado inicial do nó
- `priority` — prioridade (papel MASTER é atribuído ao mais alto)
- `advert_int` — intervalo de anúncio VRRP
- `unicast_src_ip` — IP do nó atual
- `unicast_peer` — IPs dos vizinhos
- `virtual_ipaddress` — endereço VIP
- `track_script` — monitoramento de disponibilidade através de scripts de verificação de saúde

#### NOTE
Se o nó master original se recuperar,
ele recuperará o papel MASTER (prioridade mais alta).
Para desabilitar o failback, use o parâmetro `nopreempt`:

```none
vrrp_instance angie {
    ... nopreempt
}
```

<a id="testing"></a>

## Testando a Operação do Cluster

Após completar a configuração, é necessário testar a operação do cluster
e garantir a comutação correta entre os nós.

Verifique o status do VIP:

```console
$ ip addr show enp0s2 | grep "10.21.11.230"
```

Teste a tolerância a falhas:

Pare o Angie no nó master:

```console
$ sudo service angie stop
```

Verifique a transição do VIP para o nó de backup:

```console
$ ip addr show enp0s2 | grep "10.21.11.230"
```

Inicie o Angie no nó master novamente:

```console
$ sudo service angie start
```

Após isso, o VIP deve retornar ao nó master.
