詳細検索

Redundância de instâncias NAT

Avatar
por komi

Redundância de instâncias NAT
Traduzido do 日本語 • Ver original

Olá. Aqui é a Komiya da plataforma.

Mesmo que você redundance as outras, se não redundance a instância de nat,
Achei que os servidores que são HA no segmento privado não conseguiriam se comunicar com o servidor da API da AWS e ficariam travados.
Referindo-me aos artigos de nossos predecessores, fiz as seguintes declarações.

**・Considere o que fazer de alguma forma
**

Como fiz com Amazon Linux, provavelmente é difícil colocar Heartbeat ou algo assim, e acho que nem preciso usar o heartbaet para começo de conversa.
Parece que seria suficiente monitorar a partir do sistema de espera e substituir a tabela de roteamento na AWS.

Para a instância de NAT de reserva,
 Se você não criar, terá que criar, começar e criar uma tabela de roteamento, então o tempo de troca será longo.
 Existe uma taxa de instância, mas parece que é melhor mantê-la ativada.

**・Por enquanto, comece mexendo nas configurações da instância NAT existente do Amazon Linux.
**
Sudo

# usermod -G roda user-op
# id user-op
UID=500(user-op) GID=501(user-op) grupos=501(user-op),10(roda)
# Visudo
%roda TODOS=(TODOS) TODOS

Remova o comentário.
Veja se você pode sudo em relação a outras instâncias

Além disso, coloque a ferramenta Python na instância NAT

Configure também o envio de e-mails
Parecia que o Sendmail estava rodando no Amazon Linux.

vi /etc/mail/submit.cf
D{MTAHost}[172.18.10.22]
Djnat01.hoge.com *nat02 muda dessa forma
Parada de serviço sendmail
chkconfig sendmail desligado
Yum install mailx
echo hoge |mail -s testkomi komiyay@xxxxx

Locais correspondentes

mv /etc/localtime /etc/localtime.org
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
Data
Qui 14 Nov 10:25:59 JST 2013
crontab -e
# Sincronização do Tempo
0 * * * * /usr/sbin/ntpdate -bs 172.18.10.24
Serviço NTPD Stop
chkconfig ntpd desligado

Coloque afinação do kernel

# cp -p /etc/sysctl.conf{,.org}
# vi /etc/sysctl.conf
vm.swappiness = 30
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 10
# sysctl -p

・Crie uma instância NAT separada e uma tabela de roteamento com ela como gateway padrão.

Instâncias NAT copiam AMIs para o mesmo segmento

Feito
I-005A5E02
Se você não configurar o Source/DestCheck como Desabilitar, ele não aparecerá como uma instância de saída ao rotear para o RouterTable.

rtb-yyy
O alvo do Destino 0.0.0.0/0 (ou seja, defoge) na tabela de roteamento é
Especifique e adicione à instância anterior
Neste ponto, não há sub-redes associadas a essa tabela.

・Por enquanto, tente conectar a tabela de roteamento com comandos AWS enquanto faz ping para o Yahoo no host privado.

Dê uma olhada no manual

# Ajuda para substituir-rotar-tabel-associação de tabela AWS EC2

SINOPSE
             substituir-rota-tabella-associação
           [--ensaio seco | --não-ensaio]
           --associação-id <value>
           --rota-tabel-id <value>
       --association-id (string)
           O ID representa a associação atual entre o original
           tabela de rotas e a sub-rede. 

       --route-table-id (string)
           O ID da nova tabela de rotas para associar à sub-rede. 

# Ajuda com tabelas de descrição de rotas AWS EC2
SINOPSE
             Describe-route-tables
           [--ensaio seco | --não-ensaio]
           [--identificações de tabela <value>de rota ]
           [--<value>filtros]
--filters Nome=string1,Values=string1,string2
   associação.subnet-id

Verificando failover nos comandos

Referência: http://d.hatena.ne.jp/j3tm0t0/20120814/1344971491

active_rt=rtb-xxxxxxxx
standby_rt=rtb-yyy
subnetid=subnet-zzzzzzzz
aws EC2 describe-route-tables --route-table-ids ${active_rt} --filters Name=association.subnet-id,Values=${subnetid}
            "Associações": [ 
                { 
                    "SubnetId": "subnet-zzzzzzzz", 
                    "RouteTableAssociationId": "; rtbassoc-7c535b1e", 
                    "RouteTableId": "rtb-xxxxxxxx" 
                }, 
associação='aws ec2 describe-route-tables --route-table-ids ${active_rt} --filters Name=association.subnet-id,Values=${subnetid}|grep -A 1 ${subnetid}|awk '{print $2}'|tail -1|sed -e 's/[",]//g''

# AWS EC2 Replace-Route-Table-Association --Route-table-id ${standby_rt} --association-id $association
{ 
    "NewAssociationId": "rtbassoc-52767e30" 
}

# aws ec2 describe-route-tables --filters Name=association.sub
net-id,Values=${subnetid}|grep -A 1 ${subnetid}|awk '{print $2}'|tail -1|sed -e
's/[",]//g' 
rtbassoc-52767e30

Consegui confirmar pelo console de gerenciamento que ele realmente havia mudado para a rota de espera.
O teste de comutação apenas com o comando foi bem-sucedido. O ping para o Yahoo não foi interrompido.

・Considere as condições para failover

Se você pensar com referência abaixo, se não conseguir se comunicar com cerca de 3 hosts na parte de trás das cenas, pode usar um failover.
http://d.hatena.ne.jp/hirose31/20131105/1383623672

Será que é mais fácil usar servo. Vou pesquisar.
Ferramenta de Mensagens Serf em EC2 | Developers.IOSerf - blog de Jedipunkzhttps://dl.bintray.com/mitchellh/serf/[Serf] Atualizado para a v0.2.0 e verificado as alterações | Pocketstudio.jp log3Monitoramento automático de nó munin-node com serf-munin | Pocketstudio.jp log3Balanceador automático de carga feito com Serf+HAProxy - Glide Note - Glide Note

Referência de redundância NAT:
O Abismo da Redundância de Instâncias NAT - (Hi)memossuz-lab - blog: Criando "Nat de Alta Disponibilidade" (CentOS6) Cloudpack Blog: Tentando ordenar por cabeçalho de host com HAProxy (com ELB) Tentei criar uma instância NAT redundante - log4moto

Tentei colocar um servo e pesquisei sobre isso.
Como resultado, parece que há pouca informação porque é muito novo, então decidi fazer o meu melhor com scripts shell.
(Havia pouquíssimos exemplos de eventos personalizados para usuários, então senti que não atendeu à demanda desta vez.)

Pode ser um padrão familiar chamado F/O quando o efeito do PtBooks cai no marcapasso.
Se você faz ping por ssh a partir do sistema de espera e cerca de 3 nós não forem bons, parece que F/O está mais alinhado com a situação real.

Você quer rodar regularmente no cron ou no mon?
Não tenho tempo para ⇒ e é fácil, então o cron está tranquilo.

Por enquanto, é ping, então tudo bem se não for root.

Registre a chave pública NAT em /home/user-op/.ssh/authorized_keys em todos os hosts por trás dela.

Ping de usuário op@nfs02 $ ssh 8.8.8.8
PING 8.8.8.8 (8.8.8) 56(84) bytes de dados. 
64 bytes a partir da 8.8.8.8: icmp_seq=1 TTL=49 tempo=37,8 ms
64 bytes a partir da 8.8.8.8: icmp_seq=2 TTL=49 tempo=60,2 ms

É possível verificar assim, então penso em que tipo de script e como executá-lo

・Pense em como executar o script que faz failover.

Script completo↓

mkdir /opt/{bin,log}
vi /opt/bin/chk_backseg_ping.sh
------------------------ 
#!/lixo/batida
# 
# chk_backseg_ping.sh: Checagem de ping do host no segmento privado e realização de F/O para NAT após falha
# Dependências: comandos aws, /etc/hosts
# Atualizado:20131114 - criar komiyay
# 
## variáveis
título=Hoge
datetime='/bin/date +%Y/%m/%d.%H:%M:%S'
nochk_time=30
up_time='uptime|grep min|awk '{print $3}'|sed 's/,//g''
mailto=xxxxx@xxxx.net
log=/opt/log/aws_error.log
backseg='172.18.20' 
hostgroup='grep $backseg /etc/hosts|egrep -v -a 'vip|sorry|^#'|awk '{print $2}'|perl -pe 's/\n/ /g''
ssh_chkfile=/home/user-op/.ssh/authorized_keys
dir='echo $(cd $(dirname $0); pwd)'
lockfile=$dir/nat_fo_complete
user=user-op
alvo1=8.8.8.8
alvo2=8.8.4.4
target3=yahoo.co.jp
pin_count=4
pin_int=0,5
pin_wait=3
ng_count=3
active_rt=rtb-xxxxxxxx
standby_rt=rtb-yyy
subnetid=subnet-zzzzzzzz

## Funções definidas pelo usuário
nat_failover() { 
        echo 'date +&quot;%Y-%m-%d %T&quot;' &quot;iniciar substituir-rota-associação-tabela&quot; &gt;&gt; $log
        eval 'aws ec2 describe-route-tables|grep -A 2 ${subnetid}|egrep '(RouteTableAssociationId| RouteTableId)'|sed -e 's/[&quot;, ]//g'|awk -F : '{print $1&quot;=&quot;$2}''
        if [ ${RouteTableId} = ${active_rt} ]
          então
            AWS EC2 Replace-Route-Table-Association --Route-table-ID ${standby_rt} \ 
            --association-id ${RouteTableAssociationId} &gt;&gt; $log 2&gt;&amp;1
            resultado='echo $?'
            echo ${result} &gt; ${lockfile}
            failstat=&quot;fail de ${active_rt} para ${standby_rt}, segment:${backseg}, status:${result}&quot; 
          senão
            AWS EC2 Replace-Route-Table-Association --Route-table-ID ${active_rt} \ 
            --association-id ${RouteTableAssociationId} &gt;&gt; $log 2&gt;&amp;1
            resultado='echo $?'
            echo ${result} &gt; ${lockfile}
            failstat=&quot;fail from ${standby_rt} to ${active_rt}, segment:${backseg}, status:${result}&quot; 
        fi
}

mail_fail() { 
        printf &quot;NAT_failover pronto. por favor, verifique o site.\n ${failstat}&quot; \ 
        |mail -s &quot;(${title}) nat_f/o_${datetime}&quot; ${mailto}
}

## Processamento principal
### Verificação completa de failover
se [ -f ${lockfile} ]; então
  Saída
senão
  : 
fi

## Verifique inválido alguns minutos após a inicialização
se [ -n &quot;$up_tempo&quot; ]; então
 se [ $up_tempo -lt $nochk_tempo ]; então
  Saída
 senão
  : 
 fi
senão
 : 
fi

### Verificação de SSH
pois eu em $hostgroup
faça
  ssh ${user}@${i} ls ${ssh_chkfile}
  resultado='echo $?'
  se [ $result -eq 0 ]; então
    chkhosts="$chkhosts $i" 
  fi
Feito

### checagem de ping
ng_hosts=0
pois eu em $chkhosts
faça
  target='printf "$target 1\n$target2\n$target3"|sort -R|cabeça -1'
  ssh ${user}@${i} ping -q -c ${pin_count} -i ${pin_int} -w ${pin_wait} ${target} > /dev/null 2>&1
  resultado='echo $?'
  se [ ${resultado} -ne 0 ]; então
    ng_hosts='expr $ng_hosts + 1'
  fi
Feito

### falha se o ng_hosts for igual ou maior que o ng_count
se [ $ng_hosts -ge $ng_count ]
  então
    se [ -f ${lockfile} ]; então
      Saída
    senão
      : 
    fi
    nat_failover
    mail_fail
  senão
    : 
fi

saída 0
------------------------ 
chmod +x /opt/bin/chk_backseg_ping.sh

Você pode entender quando vir, mas se eu ousar explicar,
apresentadores, e
Se o resultado do ping for NG para 3 ou mais hosts, reassocie a rota no lado nat02.
Estou verificando a conectividade do SSH.
O alvo do ping também foi especificado aleatoriamente a partir dos três, então, a menos que seja eliminado,
 Não vou me desistir quando não posso ir para a Target e posso ir para a Global. Talvez.

Se o próprio NAT falhar em alcançar o servidor da API, ele falhará no F/O, mas
 O arquivo de bloqueio de conclusão é criado e entra em um status de terminação anormal, então não é reexecutado.

No caso de um ambiente que para/liga regularmente, parece que você precisa prestar atenção na ordem de inicialização, como iniciar o NAT por último.
Se o nat não for iniciado, o servidor atrás do HA não poderá se comunicar com a API.
Achei melhor colocar uma ramificação, assim a verificação não começa em poucos minutos.

・Resultados do teste

# Time Bash -x ./chk_backseg_ping.sh
~Omitido~
+ ssh user-op@nfs01 ping -q -c 4 -i 0,5 -w 3 yahoo.co.jp
++ Echo 0
+ resultado=0
+ '[' 0 -ne 0 ']' 
+ para i em '$chkhosts' 
++ cabeça -1
++ ordenar -R
++ printf '8.8.8.8\n8.8.4.4\nyahoo.co.jp' 
+ alvo=8.8.8.8
+ ssh user-op@nfs02 ping -q -c 4 -i 0,5 -w 3 8.8.8.8
++ Echo 0
+ resultado=0
+ '[' 0 -ne 0 ']' 
+ '[' 0 -ge 3 ']' 
+ : 
+ saída 0

real 0m19.274s
usuário 0m0.124s
SYS 0M0.280s

Parece que não houve failover porque não houve problema com a comunicação por ping.
Em seguida, vou parar os iptables do nat01 e garantir que o global não seja pingado nem f/o.

[root@nat01 ~]# status do service iptables
Mesa: nat
Pré-roteamento em cadeia (política ACCEPT)
Destino de origem NUM Prot Opt

Chain INPUT (política ACCEPT)
Destino de origem NUM Prot Opt

Chain OUTPUT (política ACCEPT)
Destino de origem NUM Prot Opt

Chain POSTROUTING (política ACCEPT)
Destino de origem NUM Prot Opt
1 MÁSCARA TODOS -- 172.18.0.0/16 0.0.0.0/0

[root@nat01 ~]# serviço iptables para
iptables: Regras de limpeza do firewall: [ OK ]
iptables: Configurando cadeias para a política ACEITAR: nat [ OK ]
iptables: Módulos de descarga: [ OK ]
[root@nat01 ~]# status do service iptables
iptables: O firewall não está rodando. 

Realizado enquanto faz ping de um servidor no segmento back apropriado.

# Time Bash -x ./chk_backseg_ping.sh
+ título=hoge
++ /bin/date +%Y/%m/%d.%H:%M:%S
+ datatempo=2013/11/15.15:34:16
+ mailto=xxxxxxx@xxxx.net
+ log=/opt/log/aws_error.log
+ backseg=172.18.20
++ awk '{print $2}' 
++ perl -pe 's/\n/ /g' 
++ egrep -v -a 'vip|desculpa|^#' 
++ grep 172.18.20 /etc/hosts
+ hostgroup='lvs01 lvs02 cache01 cache02 db01 db02 web01 mov01 nfs01 nfs02 ' 
+ ssh_chkfile=/home/user-op/.ssh/authorized_keys
++++ nome de dirname ./chk_backseg_ping.sh
+++ cd . 
+++ pwd
++ echo /opt/bin
+ dir=/opt/bin
+ lockfile=/opt/bin/nat_fo_complete
+ usuário=user-op
+ alvo1=8.8.8.8
+ alvo2=8.8.4.4
+ target3=yahoo.co.jp
+ pin_count=4
+ pin_int=0,5
+ pin_wait=3
+ ng_count=3
+ active_rt=rtb-xxxxxxxx
+ standby_rt=rtb-yyy
+ subnetid=subnet-zzzzzzzz
+ '[' -f /opt/bin/nat_fo_complete ']' 
+ : 
+ para i em '$hostgroup' 
+ ssh user-op@lvs01 ls /home/user-op/.ssh/authorized_keys
/home/user-op/.ssh/authorized_keys
++ Echo 0
+ resultado=0
+ '[' 0 -eq 0 ']' 
+ chkhosts=' lvs01' 
~Omitido~
+ para i em '$hostgroup' 
+ ssh user-op@nfs02 ls /home/user-op/.ssh/authorized_keys
/home/user-op/.ssh/authorized_keys
++ Echo 0
+ resultado=0
+ '[' 0 -eq 0 ']' 
+ chkhosts=' lvs01 lvs02 cache01 cache02 db01 db02 web01 mov01 nfs01 nfs02' 
+ ng_hosts=0
+ para i em '$chkhosts' 
++ cabeça -1
++ ordenar -R
++ printf '8.8.8.8\n8.8.4.4\nyahoo.co.jp' 
+ alvo=8.8.4.4
+ ssh user-op@lvs01 ping -q -c 4 -i 0,5 -w 3 8,8.4.4
++ Echo 1
+ resultado=1
+ '[' 1 -ne 0 ']' 
++ expr 0 + 1
+ ng_hosts=1
+ para i em '$chkhosts' 
++ cabeça -1
++ ordenar -R
++ printf '8.8.8.8\n8.8.4.4\nyahoo.co.jp' 
+ alvo=yahoo.co.jp
+ ssh user-op@lvs02 ping -q -c 4 -i 0,5 -w 3 yahoo.co.jp
++ Echo 1
+ resultado=1
+ '[' 1 -ne 0 ']' 
++ expr 1 + 1
+ ng_hosts=2
~Omitido~
+ para i em '$chkhosts' 
++ cabeça -1
++ ordenar -R
++ printf '8.8.8.8\n8.8.4.4\nyahoo.co.jp' 
+ alvo=8.8.4.4
+ ssh user-op@nfs02 ping -q -c 4 -i 0,5 -w 3 8,8.4.4
++ Echo 1
+ resultado=1
+ '[' 1 -ne 0 ']' 
++ expr 9 + 1
+ ng_hosts=10
+ '[' 10 -ge 3 ']' 
+ '[' -f /opt/bin/nat_fo_complete ']' 
+ : 
+ nat_failover
++ date '+%Y-%m-%d %T' 
+ Echo 2013-11-15 15:34:50 'Iniciar substituir-rota-tabela-associação' 
++ egrep '(RouteTableAssociationId| RouteTableId)' 
++ sed -e 's/[&quot;, ]//g' 
++ grep -A 2 subnet-zzzzzzzz
++ awk -F : '{print $1&quot;=&quot;$2}' 
++ AWS EC2 Describe-Route-Tables
+ eval RouteTableAssociationId=rtbassoc-6a212908 RouteTableId=rtb-xxxxxxxx
++ RouteTableAssociationId=rtbassoc-6a212908
++ RouteTableId=rtb-xxxxxxxx
+ '[' rtb-xxxxxxxx = rtb-xxxxxxxx ']' 
+ AWS EC2 replace-route-table-association --route-table-id rtb-yyyy --association-id rtbassoc-6a212908
++ Echo 0
+ resultado=0
+ eco 0
+ failstat='falha de rtb-xxxxxxxx para rtb-yyyyy, segmento:172.18.20, status:0' 
+ mail_fail
+ mail -s '(hoge) nat_f/o_2013/11/15.15:34:16' xxxxxxx@xxxx.net
+ printf 'NAT_failover feito. Por favor, verifique o site.\n Falha de RTB-xxxxxxxx para RTB-yyyyy, segmento:172.18.20, status:0' 
+ saída 0

real 0m35.361s
usuário 0m1.392s
SYS 0M0.456s

O tempo de execução durante o failover é de 35 segundos, então é aceitável rodar a cada minuto. (Se houver hosts demais
Vi que ele podia ser rodado em paralelo quando rodava em segundo plano, mas eu não entendia direito, então decidi não me preocupar com isso.
(Também pensei que correr em paralelo provavelmente seria um ataque DoS, então não seria bom.) )
Se você está preocupado com o tempo de carregamento ou execução, acho que seria uma boa ideia verificar vários hosts selecionados aleatoriamente em vez de todos.
Se quiser mudar, vai ficar assim.

hostgroup='grep $backseg /etc/hosts|egrep -v -a 'vip|sorry|^#'|awk '{print $2}'|perl -pe 's/\n/ /g''
↓
check_num=6
HostGroup='grep $backseg /etc/hosts|egrep -v -a 'vip|sorry|^#'|awk '{print $2}'|sort -R|head -${check_num}|perl -pe 's/\n/ /g''

Criei um arquivo de bloqueio para impedir o registro do cron sem pensar que ele seria executado várias vezes.
Você precisará gerenciá-lo manualmente quando se recuperar.

Se você testar com um arquivo de bloqueio, ele termina imediatamente após a variável ser definida.

# Time Bash -x ./chk_backseg_ping.sh
~Omitido~
+ pin_wait=3
+ ng_count=3
+ active_rt=rtb-xxxxxxxx
+ standby_rt=rtb-yyy
+ subnetid=subnet-zzzzzzzz
+ '[' -f /opt/bin/nat_fo_complete ']' 
+ saída

real 0m0.039s
usuário 0m0.000s
SYS 0m0.012s

O script que mencionei está listado na URL abaixo.
Tentei criar uma instância NAT redundante - log4moto

Pessoalmente, estou um pouco preocupado se consigo pingar tanto o yahoo.co.jp.
8.~ Parece ser o Google, então vou fazer tudo certo.
Parece que existe algo assim↓. Também existe a opinião de que vou tentar pingar no Yahoo em vez do JP.
Site de verificação de ping (operação de teste) - Rede de Informação Acadêmica (SINET4, SINET4) ・ Por enquanto, registro de crons a cada 2 minutos (na máquina de espera)

# crontab -e
# crontab -l
## Verificação NAT e script de failover
*/2 * * * * /opt/bin/chk_backseg_ping.sh

Vou adicionar porque foi corrigido depois.

# diferença chk_backseg_ping.sh velho/chk_backseg_ping.sh.20140210
31d30
&lt; current_ids=$dir/current_ids
36,41c35
> aws ec2 describe-route-tables|grep -A 2 ${subnetid}|egrep '(RouteTableAssociationId| RouteTableId)'|sed -e 's/[", ]//g'|awk -F : '{print $1"="$2}' > $current_ids
> fonte $current_ids
> se [ -z "${RouteTableAssociationId}" ]; então
> printf "Falhou ao definir o valor de RouteTableAssociationId e RouteTableId.. \n O failover de natação não iniciou. Talvez aws-api-server inacessível."| tee -a ${log}|mail -s "(${título}) nat_f/o_${datetime}" ${mailto}
> saída
<       fi
---
> eval 'aws ec2 describe-route-tables|grep -A 2 ${subnetid}|egrep '(RouteTableAssociationId| RouteTableId)'|sed -e 's/[", ]//g'|awk -F : '{print $1"="$2}''

Obrigado por assistir ao que foi dito acima.

Related Articles