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
Hostsファイルはそのようなメカニズムを提供しません。同じ名前の2つのIPをリストすると、最初のIPのみが使用されます。したがって、プライマリIPとセカンダリIPなどはありません。
また、hostsファイルはURLを処理しません。質問で提供されたような名前を処理するだけです。 URLには、http://Host/path/to/resource
などの完全なパスとプロトコルが含まれています。
/etc/hosts
ファイルを介して回復力やラウンドロビンロードバランシングを提供することはできません。この目的のために設計されたものではありません。
代わりに、オプションは...(順不同)
/ 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使用量が大幅に削減されます。
セットアップは簡単です。次の指示に従ってください:
はい、/ 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
ただし、検索メカニズムは、一致が見つかるまでリストを処理します。
そのため、書かれた質問への回答はYESですが、それは課題となります。しかし、克服できないものはありません。
これを試してください。これらの各IPアドレスには、実際に異なる名前を付ける必要があります。
これを実現する簡単な方法は、AWS Route53などのパブリックDNSサービスを使用することです。 Aレコードごとに複数のIPアドレスを優先的に入力できます
abc.efg.datastore.com
10 141.131.286.1
20 141.131.286.237
証明書が含まれていない限り、これは機能しており、規範やベストプラクティスにさえ反対していません。
NSLookupまたは他のドメインクエリは両方のアドレスを返します。アプリはこれを処理できる必要があります。そして、はい、ドメインは、単にローカルのホスト名ではなく、公に登録されたドメインである必要があります。
少なくともmacOSでは、他の回答とは異なり、システムリゾルバーは最初に停止するのではなく、/ etc/hostsのホスト名に関連付けられたすべてのエントリを返します。