web-dev-qa-db-ja.com

ホストファイルの1つのエントリに複数のIPを割り当てる

VPNを介して内部データベースに接続するWebサーバーがあります。 Webサーバーからデータベースへの2つのIP(プライマリとセカンダリ)があります。/etc/hostsファイルを設定して、プライマリIPが利用できない場合にセカンダリIPが使用されるようにするにはどうすればよいですか?

これは私のhostsファイルで機能しますか?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary
30
Mike T

Hostsファイルはそのようなメカニズムを提供しません。同じ名前の2つのIPをリストすると、最初のIPのみが使用されます。したがって、プライマリIPとセカンダリIPなどはありません。

また、hostsファイルはURLを処理しません。質問で提供されたような名前を処理するだけです。 URLには、http://Host/path/to/resourceなどの完全なパスとプロトコルが含まれています。

25
Khaled

/etc/hostsファイルを介して回復力やラウンドロビンロードバランシングを提供することはできません。この目的のために設計されたものではありません。

代わりに、オプションは...(順不同)

  1. リンクがドロップされたときにルートが変更されるように、ネットワークを適切に構成します
  2. DNSラウンドロビン負荷分散を使用する(良いアイデアではありません) TM)マネージドサービス(loaddns.comやdnsmadeeasy.comなど)の使用
  3. 必要に応じて定義されたバックエンドを使用して、発信トラフィック(HAProxy?)にローカルL3ロードバランサーを使用する
  4. Webアプリケーション自体に回復力を組み込む
14

/ etc/hostsはラウンドロビンをサポートしていませんが、#RoundRobinコメントでタグ付けされたエントリをsedで置き換える単純なbashスクリプトを記述できます(または使用する他のタグは、スクリプトのgrep行に反映するだけです)。 。

#!/bin/bash
fqdnips=( $(nslookup sub.domain.com|grep Address:|awk -F\  '{ print $2 }'|grep -v '#') )

new=`printf "${fqdnips[@]}"`
old=`grep "#RoundRobin" /etc/hosts|awk -F\  '{ print $1 }'`
sed -i "s/$old/$new/g" /etc/hosts

上記のスクリプトは、sub.domain.comのnslookupの出力を取得して、配列に格納します。次に、最上位の値を$ newに出力し、/ etc/hostsで割り当てられているタグ#RoundRobinの既存の値を取得します...最後に、sed置換を実行します

/ etc/hostsファイルのエントリは次のようになります

127.0.0.1        localhost
::1              localhost
11.12.13.14      sub.domain.com      #RoundRobin

最後に、このスクリプトをルートのcrontabに配置して1時間ごとに実行すると、/ etc/Hostラウンドロビンが作成されます。

これは、APIから一部のデータをプルしているコード化されたページがあり、APIサーバーのDNSルックアップがページのスクリプト実行で多くのハング時間を引き起こしている場合に特に役立ちます。単純なページのように見えます。コストのかかるDNSルックアップを回避するには(特に、サイトで1分間に数百のトラフィックが大量のトラフィックに対して実行されている場合)、/ etc/hostsを使用してリモートAPIサーバーのFQDNを解決する必要があります。これにより、APIデータをプルしてページを生成するためのCPU使用量が大幅に削減されます。

3
Satalink

セットアップは簡単です。次の指示に従ってください:

  1. dnsmasqをインストールする
  2. /etc/resolv.confを編集して、「nameserver 127.0.0.1」を最初のDNSとして設定します
  3. 代替として通常のDNSを追加します(たとえば、GoogleのDNS)2番目の行として「nameserver 8.8.8.8」
  4. / etc/hostsファイルに2つの必要なレコードがあることを確認してください
  5. コマンドHost abc.efg.datastore.comで確認してください

    これは、RR-DNSで2つのレコードに応答する必要があるため、リストの1つのノードがダウンした場合、アプリケーションは別のノードに接続されます
1
Ihor Kolodyuk

はい、/ etc/hostsの複数のIPが機能します。例、およびテスト。

> echo "192.168.0.141 test
192.168.0.142 test
192.168.0.143 test" >> /etc/hosts

> Dig test +short
192.168.0.141
192.168.0.142
192.168.0.143
0
user1133275

はい、うまくいきます。

ただし、検索メカニズムは、一致が見つかるまでリストを処理します。

そのため、書かれた質問への回答はYESですが、それは課題となります。しかし、克服できないものはありません。

これを試してください。これらの各IPアドレスには、実際に異なる名前を付ける必要があります。

0
SDsolar

これを実現する簡単な方法は、AWS Route53などのパブリックDNSサービスを使用することです。 Aレコードごとに複数のIPアドレスを優先的に入力できます

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

証明書が含まれていない限り、これは機能しており、規範やベストプラクティスにさえ反対していません。

NSLookupまたは他のドメインクエリは両方のアドレスを返します。アプリはこれを処理できる必要があります。そして、はい、ドメインは、単にローカルのホスト名ではなく、公に登録されたドメインである必要があります。

0
bortran

少なくともmacOSでは、他の回答とは異なり、システムリゾルバーは最初に停止するのではなく、/ etc/hostsのホスト名に関連付けられたすべてのエントリを返します。

0
zneak