web-dev-qa-db-ja.com

HetznerのフェイルオーバーIPに関するDNSの問題

「実際の」IPと外部IPを持つ2つのサーバーAとBがあり、いわゆる 'failover ip' (WXYZ)を切り替えて、AまたはBの特定の外部IPを指すと仮定します。 「外」からと簡単に行われました。背景として:フェイルオーバーIPは/ etc/network/interfacesの新しいエントリとして設定されています:

auto eth0:0  
iface eth0:0 inet static
  address W.X.Y.Z
  netmask 255.255.255.224 

次に、WXYZがハードウェアAを使用するように動的に構成されていると仮定します。次に、Bから「curl domain.com」を呼び出し、正しいフェイルオーバーIP WXYZを使用しますが、使用する代わりに、何らかの方法で間違った外部IP B(またはlocalhost?)に解決します。構成されたものA:

Trying W.X.Y.Z ...
* connect to W.X.Y.Z port 443 failed: Connection refused
* Failed to connect to domain.com port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to domain.com port 443: Connection refused

ローカルのnginxを起動すると、domain.comを正常にカールできます

どういうわけかローカルでDNSを構成する必要がありますか? DNSチェーンについて詳しく知るにはどうすればよいですか?

mtr を使用すると、サーバーBからこれを試行した場合、domain.comが出力されます。

これは この質問 に関連していますか?

The failover IP is W.X.Y.Z and is also the A record of domain.com

The /etc/hosts file for both nodes serverA and serverB looks like:

    127.0.0.1       localhost
    127.0.1.1       luminarhost            
    xxx    serverA
    xxx    serverB        

The /etc/network/interfaces of serverA

    ### Hetzner Online AG - installimage
    # Loopback device:
    auto lo
    iface lo inet loopback

    # device: eth0
    auto  eth0
    iface eth0 inet static
      address   xxx
      broadcast xxx
      netmask   xxx
      gateway   xxx
      # default route to access subnet
      up route add -net xxx netmask 255.255.255.224 gw xxx eth0

    iface eth0 inet6 static
      address xxx
      netmask xxx
      gateway xxx

    # failover ip
    auto eth0:0
    iface eth0:0 inet static
      address W.X.Y.Z
      netmask 255.255.255.224

and of serverB it is:

    ### Hetzner Online AG - installimage
    # Loopback device:
    auto lo
    iface lo inet loopback

    # device: eth0
    auto  eth0
    iface eth0 inet static
      address   xxx
      broadcast xxx
      netmask   xxx
      gateway   xxx
      # default route to access subnet
      up route add -net xxx netmask 255.255.255.192 gw xxx eth0

    iface eth0 inet6 static
      address xxx
      netmask xxx
      gateway xxx

    # failover ip
    auto eth0:0
    iface eth0:0 inet static
      address W.X.Y.Z
      netmask 255.255.255.224
7
Karussell
  • 約束通り、ここに私の答えがあります:

  • 完全な開示:私はHetznerで働いていませんが、Hetznerでハードウェアを共同で使用していた過去と現在のさまざまな会社で働いていました。

  • プロファイル内の場所が正しく、サポートが必要な場合:私は同じ都市を拠点としており、1つまたは2つの手を提供することができます。

  • Hetznerを扱ったことのないすべての人にとって:彼らはネットワークアクセスなどをフィルタリングしています。これは、特に フェイルオーバーIP (ある種の高可用性を提供するために異なるマシンで使用できるIP)に関してです、特定のIPに向けられたトラフィックを特定のMACに送信していること。

  • トラフィックの送信先であるターゲット(マシン)を変更する場合は、POSTリクエストを [〜#〜] api [〜#〜] に送信する必要があります。 HTTPS経由で提供されます。次に、APIは認証(ユーザー名と対応するパスワード)と要求を検証し、有効であれば、この新しい構成をネットワーク内のさまざまなルーターに伝達します。この手法は、フランスに拠点を置く大手プロバイダーであるOVHで使用されている手法に似ています。

  • 警告:人々がこれらのIPを使用して、マシン/サービスに(書かれているように)ある種の高可用性を提供している場合でも、新しいルーティング構成の伝達には時間がかかり、場合によっては最大60秒かかることがあります。これは、たとえば、ある種の自動フェイルオーバーを使用している場合、現在トラフィックがルーティングされているマシンが一定の時間ダウンすると、トラフィックがドロップされます。マシンがダウンし、新しいルーティング構成が導入される時点まで。
  • これまでの紹介では、具体的な問題を見てみましょう。
  • コメント/チャットで指摘されているように、auto eth0:0を使用すると、ネットワークが起動するとすぐに、通常はブート時に、インターフェイスeth0:0にフェイルオーバーIPが設定されます。同じ構成の2つのマシンがあるため、同じIPが2つの異なるマシンでアクティブであるという状況になります(これはノーゴーではありませんが、現在対処している状況につながります) )。ただ注意:同じインターフェイスに複数回エイリアスを設定している構文は 非推奨 です(ただし、引き続き機能します)。 「新しい方法」は、Debian wiki(このリンク)にも記載されており、oneインターフェースに複数のIPを割り当てるだけです。
  • だから:あなたは同時に両方のマシンにローカルに割り当てられたIPを持っています。テストケース内のcurlは、指定されたドメイン名をIPに解決し、ポート443でこのIPへの接続を試みます。このIPはいずれの場合もローカルに割り当てられているため、到達可能です。パケットがネットワークに送信されることはありません。現時点でnginx(テストケースのように)がローカルで実行されていない場合は、接続が拒否されているだけで、これは完全に問題なく有効です。「IPはローカルなので、そこにトラフィックを送信できます」 。 たぶんの情報を持つルータにパケットを送信することは決してありません:「このIPに向けられたトラフィックはこのマシンに行くべきです」。
  • さて...実際、私はあなたが何を求めているのか完全にはわかりません。何が起こっているのかを理解したいだけですか?もしそうなら、私はこれを説明しようとしました。この状況を「解決」する方法を見つけて実装しますか?後者の場合、ここにいくつかの考えがあります:
  • 解決策1:auto eth0:0からディレクティブeth0:0を削除します(ただし、/etc/network/interfacesの残りの構成はそのままにします)。これを行うと、IPがマシンに割り当てられますされません。これを行うのは、ifup eth0:0を実行するタスク(スクリプトのタスク)です(そしてmaybeは、APIに話しかけ、トラフィックが正しいマシンにルーティングされるようにします)。
  • ソリューション2、別名「すべてを自動化」:手動フェイルオーバーを行わず、両方のマシン間のハートビート(正常性をチェックする)を介してこれを自動的に行うシステムを実装します。これには複数のソリューションが存在します。たとえば、- Virtual Router Redundancy Protocol および(完全な開示:私の個人的なお気に入り、私はこれをこのようなタスクのために生産で何年も使っています): corosyncおよびペースメーカー 、これは事実上の標準ですLinuxで高可用性を提供するクラスターをセットアップします。 (また、 this を参照してください。)後の方法を試してみたい場合は、Kuminaの優れた人々が リソースエージェント を数年前に開発(および公開)しました。ヘッツナーでこの状況に正確に対処したことに対して。リソースエージェントは、APIと通信することでルーティング情報を更新します。
  • 終わりに(今のところ):私はあなたが何を求めているのか完全にはわかりません。あなたが現在直面している問題の根本的な原因を説明しようとしました。さらに、私は可能な解決策についていくつかの考えを提示しようとしました。あなたがやろうとしていることがわからなかった場合は、不明な点があるか、追加の質問があります。フィードバックを送ってください。喜んでお手伝いします(または少なくとも試します)。
  • (その他:構成などを投稿に移動して、すべてのものを1か所に保管してください。この質問は将来他の人に役立つかもしれません。)
10
gf_

言及した@gf_とまったく同じセルフループの問題に直面しました。

次のライブラリは同じことを達成するために完璧に機能しました。

https://github.com/mrkamel/heartbeat

上記のライブラリのhooks/afterおよびhooks/before機能を使用して、リモートノードにフローティングIPを追加および削除できます。

スラック通知を送信し、フローティングIPをその切り替え先のマシンに追加するhooks/before/sendmailスクリプトの例。

#!/bin/sh

echo "???? Switching to failover ip $1 from $2 to $3" | slacktee.sh  

ssh -o StrictHostKeyChecking=no $3 'ip addr add '"$1"'/32 dev `route | grep "^default" | grep -o "[^ ]*$"`'

スラック通知を送信し、移動先のフローティングIPを削除するhooks/after/sendmailスクリプトの例

#!/bin/sh

ssh -o StrictHostKeyChecking=no $2 'ip addr del '"$1"'/32 dev `route | grep "^default" | grep -o "[^ ]*$"`'

echo "???? Switch success for failover ip $1 from $2 to $3"| slacktee.sh

注意:
1。ハートビートを実行しているマシンとフローティングIPが割り当てられているマシンでは、最初にssh鍵交換を使用してログインをパスワードなしで行う必要があります(id_rsa共有を確認してください)。
2。 slacktee.shライブラリは、スラック通知を簡単に送信するために使用されます。

1
nizam.sp