net_adm:world() を使用して他のホストのノードに接続していますが、これを機能させる唯一の方法は、hosts ファイルを手動で作成し、ファイルに他のホストの名前をリストすることです。ホストが 10 台ある場合、このファイルを 10 台のマシンすべてに配置し、新しいホストがクラスターに追加されるたびにリストを 10 回更新する必要があります。
新しいホスト上のノードへの接続が確立されるたびに、このファイルを自動的に更新する方法はありませんか?
net_adm:world() を使用して他のホストのノードに接続していますが、これを機能させる唯一の方法は、hosts ファイルを手動で作成し、ファイルに他のホストの名前をリストすることです。ホストが 10 台ある場合、このファイルを 10 台のマシンすべてに配置し、新しいホストがクラスターに追加されるたびにリストを 10 回更新する必要があります。
新しいホスト上のノードへの接続が確立されるたびに、このファイルを自動的に更新する方法はありませんか?
.hosts.erlang ファイルが完全である必要も、100% 正しい必要もありません。ノードは、クラスター内の他のすべてのノードについて学習するために、互いに接続するだけで済みます。
.hosts.erlang ファイルのメンテナンスをスキップして、マルチキャスト UDP を使用してノードを動的に検出できます。コード例については、 nodefinderを参照してください。
マルチキャスト UDP ルートから始めましたが、中央のホスト ファイルを維持し、rsync を使用してそれをすべてのホストに配布することにしました。ノードを頻繁に再起動しないため、大きな問題にはなっていません。
シェフを使用.hosts.erlang
して、クラスターに属するノードのファイルを事前設定します。この関数は、ノードの 1 つがダウンしている場合などに、net_adm:world()
含まれているものと必ずしも一致しないクラスターの一部であるノードを特定するために使用できます。.hosts.erlang
を使用する代わりに、(から読み取る代わりに) ホストのリストを取得し、現在接続されているノードを決定するのと同じことを行うnet_adm:world()
関数があります。net_adm:world_list(Hosts)
.hosts.erlang
net_adm:world()