I would like to deploy a remote actors software made with akka on a cluster. The system is composed of several worker nodes and a single master node. The problem is that I cannot know in advance the IP address of the cluster nodes (but I know they are all part of the same subnetwork). So, I need a nice way of discovering the IP address of everyone after startup, to create the correct actor refs on each node.
I am looking for a ligtweight solution (I just need it for the initial setup) distributed under any free software license.
A while ago I created a prototype that's intended to solve your problem (feel free to reuse the code and/or contribute).
A few words on how does it work. It starts a remote actor for each actor registry (=node). RegistryActor holds links to all the other registries running in a distributed setup. When a new node is added to the system, it needs to know about at least one other node (ActorRegistry) and notify it. ActorRegistry than lets all other nodes know about the new one (thus, any RegistryActor has links to all other RegistryActor's), and starts a process of exchanging links to actors - at the end of it, all the actor registries have links to all actors (either local or remote) running in a system.
For more details, please refer this blogpost.
Take a look at jgroups.
http://jgroups.org/
It meets all of your criteria - it is lightweight, open source and very mature, stable product.
You can easily configure it for automatic group management and discovery based on your requirements - it supports almost any network configuration - you can use multicast, shared file, or unicast for group member discovery.
Unless all nodes share some common knowledge, I think your solution would have to rely on IP broadcast. Broadcasting is defined as sending a packet to all network nodes on a subnet, so if your master node does that while all worker nodes listen for it, you should be able to connect them all without knowing the IP addresses a priori.
I haven't coded this in Scala, but here's a fairly readable example of how to broadcast messages in java: http://download.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html. It should be straightforward to adapt it to Scala using the same classes.