hedge-rs
A cluster membership Rust library. It is built on spindle-rs, a distributed locking library built on Cloud Spanner and TrueTime. It is a port (subset only) of the original hedge, which is written in Go. Ported features include:
- Tracking of member nodes - good for clusters with sizes that can change dynamically overtime, such as GCP MIGs, and Kubernetes Deployments;
- Leader election - the cluster elects and maintains a single leader node at all times;
- List of members - get a list of all member nodes at any time;
- Send - any member node can send messages to the leader at any time; and
- Broadcast - any member node can broadcast messages to all nodes at any time.
Running the sample
First, create the Spanner table for spindle-rs:
(
name STRING(MAX) NOT NULL,
heartbeat TIMESTAMP OPTIONS (allow_commit_timestamp=true),
token TIMESTAMP OPTIONS (allow_commit_timestamp=true),
writer STRING(MAX),
) PRIMARY KEY (name)
Then you can run the sample like so:
# Clone and build:
# Run the first instance. The first host:port is for hedge-rs'
# internal server; the last host:port is for main's test TCP.
# (Use your actual Spanner values.)
# Run this 2nd instance on a different terminal. The first
# host:port is for hedge-rs' internal server; the last
# host:port is for main's test TCP.
# (Use your actual Spanner values.)
# Run this 3rd instance on a different terminal. The first
# host:port is for hedge-rs' internal server; the last
# host:port is for main's test TCP.
# (Use your actual Spanner values.)
You can play around by adding more processes, killing the leader process, killing a non-leader process, restarting an existing process, etc.
To test the send() and broadcast() APIs, you can do something like:
# Messages starting with 'send' will use the send() API.
|
# Messages starting with 'broadcast' will use the broadcast() API.
|
Runing the sample on a GCP MIG
A sample cloud-init startup script is provided for spinning up a Managed Instance Group with the sample code running as a systemd service. You need to update the ExecStart section first with your actual Spanner connection URL and table name.
# Create a launch template. The provided --service-account
# will provide access to Spanner.
# Create the MIG. Update {target-region} with actual value.
# Let's use 'https://github.com/flowerinthenight/g-ssh-cmd'
# to tail the logs from all three VMs.
# Assuming your 'gcloud' is configured properly:
# On a different terminal, SSH to one of the VMs and try:
| \