Balanceamento de carga keepalived do MySQL. Tempo limite do servidor de backup

2

Caro pessoal amado no ServerFault. Eu estou tentando (e falhando) para configurar uma matriz de servidor MySQL de carga balanceada. Por favor, me esclareça, mostre-me o erro nos meus caminhos.

Configuração atual: dois servidores MySQL com IPs fixos dedicados (10.116.219.47 e 10.116.219.48) e um IP virtual que é compartilhado usando keepalived (10.116.219.12). Essa configuração é bem-sucedida no fornecimento de failover. O servidor DB2 assume rapidamente se desligarmos o servidor DB1. É somente ao adicionar um bloco virtual_server à configuração, que as coisas começam a quebrar.

DB1

vrrp_instance VI_2 {
    state MASTER

    interface eth0
    virtual_router_id 60
    priority 150

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 3S83hbt200SbwY6
    }
    virtual_ipaddress {
        10.116.219.12
    }
}

DB2

vrrp_instance VI_2 {
    state BACKUP

    interface eth0
    virtual_router_id 60
    priority 100

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 3S83hbt200SbwY6
    }
    virtual_ipaddress {
        10.116.219.12
    }
}

Estamos tentando adicionar balanceamento de carga à configuração keepalived, mas aqui o DB2 para de responder.

virtual_server 10.116.219.12 3306 {
  delay_loop 2
  lb_algo rr
  lb_kind DR
  protocol TCP

  real_server 10.116.219.47 3306 {
    weight 10
    TCP_CHECK {
      connect_port    3306
      connect_timeout 1
    }
  }

  real_server 10.116.219.48 3306 {
    weight 10
    TCP_CHECK {
      connect_port    3306
      connect_timeout 1
    }
  }
}

Tentar conectar-se ao ip virtual (10.116.219.12) alternará em uma resposta bem-sucedida do DB1 ou um time-out do DB2.

Depuração até agora:

  • O MySQL se conectando ao ip fixo funciona tanto no DB1 quanto no DB2. A ligação do Firewall / MySQL não está bloqueando as conexões de entrada.
  • Defina net.ipv4.ip_forward = 1 no DB1 e no DB2
  • A escuta de conexões de entrada TCP no DB2 mostrará a tentativa. (20: 46: 08.385786 IP 10.116.219.44.46211 > 10.116.219.12.mysql)

Portanto, parece que o DB2 MySQL-server se recusa a responder, meu palpite é que o destino do pacote de entrada (o ip virtual compartilhado) não é conhecido para o servidor DB2, porque DB1 o está carregando como mestre de manutenção.

    
por TuxM 04.10.2014 / 21:27

2 respostas

4

Como você está usando o roteamento direto, o IP virtual precisará ser configurado nos dois servidores ao mesmo tempo. Você pode fazer isso com uma segunda instância vrrp que configura o VIP (10.116.219.12) na interface de loopback do servidor secundário. Quando a conexão é encaminhada do balanceador de carga para o servidor secundário, ela retornará na eth0 normalmente.

Se você fizer isso, precisará desativar o roteamento de origem via sysctl. Por exemplo:

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

Além disso, você precisará alterar a forma como o ARP é anunciado e responde às solicitações ( mais informações ):

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

Além disso, configure a filtragem de rp:

net.ipv4.conf.eth0.rp_filter = 1 # Works for CentOS 5
or
net.ipv4.conf.eth0.rp_filter = 2 # Works for CentOS 6+

A configuração padrão do rp_filter pode variar entre as versões do kernel, por isso certifique-se de escolher a configuração correta. Mais informações .

    
por 04.10.2014 / 21:48
0

Para estender a resposta do Gene e fazer com que o jnovack seja "unlost", o que funcionou para mim no CentOS 7 foi:

  • Em ambos os servidores MySQL, crie o arquivo /etc/sysconfig/network-scripts/ifcfg-lo:1 contendo

    DEVICE=lo:1
    BOOTPROTO=static
    ONBOOT=yes
    IPADDR=***your keepalived virtual IP***
    NETMASK=255.255.255.255
    
  • Em ambos os servidores MySQL, configure o sysctl com (não esqueça de sysctl -p para recarregar)

    net.ipv4.ip_nonlocal_bind=1
    net.ipv4.ip_forward=1
    net.ipv4.conf.default.arp_ignore=1
    net.ipv4.conf.default.arp_announce=2
    net.ipv4.conf.all.arp_ignore=1
    net.ipv4.conf.all.arp_announce=2
    net.ipv4.conf.default.rp_filter=0
    net.ipv4.conf.all.rp_filter=0
    net.ipv4.tcp_syncookies=1
    net.ipv4.conf.all.log_martians=1
    net.ipv4.conf.lo.arp_ignore=1
    net.ipv4.conf.lo.arp_announce=2
    
  • Reinicie o serviço de rede

    systemctl restart network
    # service network restart on CentOS 6
    

(você pode verificar sua nova interface virtual no loopback executando ifconfig )

  • Reinicie o keepalived service

    systemctl restart keepalived
    # service keepalived restart on CentOS 6
    
por 05.05.2017 / 17:34