EventStore on Azure and Ubuntu - it's a piece of cake! #4

Finally - the last but not least post about setting your own EventStore instance using Ubuntu on Azure. We've already prepared the majority of work needed here, so it shouldn't be difficult to adjust is just a bit to use DNS instead of hardcoded IPs.

Configuration

Currently our configuration looks like this:

/
---
RunProjections: None
ClusterSize: 3
GossipSeed: 10.0.3.6:2112,10.0.3.5:2112
DiscoverViaDns: False
ExtIp: 10.0.3.4
IntIp: 10.0.3.4

Clearly the first change is to get rid of the DiscoverViaDns property. The reason why we're going to remove it is the fact, that it's set to true by default. However, it appears that we need two more properties: ClusterDns and ClusterGossipPort. Additionally we'll remove the GossipSeed property as it also won't work here anymore. Let's get to work!

Network, DNS and Azure

When we created Ubuntu VMs in Azure we're given a single instance of a virtual network. You can think about it as a logical representation of your network in Azure - you manage IPs, DNS and other settings without installing physical devices. It gives you isolation and security - if you want to, you can forbid both inbound and outbound traffic. What we're interested in right now is its DNS capability. Currently you have two options:

  • use a DNS provided by Azure
  • use your own DNS 

Unfortunately using the former won't work here - we have to add records manually, what is not allowed when using Azure DNS. Obtaining and configuring a DNS server is beyond the scope of this post - if you're interested take a look here. The good thing is that it's still possible within Azure and additional tools are required. Once you have your DNS, the configuration should look similar to:

/
---
RunProjections: None
ClusterSize: 3
ExtIp: 10.0.3.4
IntIp: 10.0.3.4
IntTcpPort: 1111
ExtTcpPort: 1112
IntHttpPort: 2113
ExtHttpPort: 2114
ClusterDns: domain.com
ClusterGossipPort: 2113

DNS entries

The tricky thing here is to set correct entries in your DNS server. What you have to do here is to add an A entry pointing to your private IPs inside a network. Note that there's no concerns in doing this - it's a common practice. The one issue here is that it describes a little how your local network looks like - while accessing domain from an Azure network will point to the correct machine, when one tries to access it from an external network, he will be redirected to the private IP being the same as the one used in an entry.

Summary

This is it - we've went through installing, configuring and managing EventStore using Ubuntu and Azure. I strongly encourage you to discover other OSS solution, which could be run using such configuration and play with them, it becomes more and more fun.

EventStore on Azure and Ubuntu - it's a piece of cake! #3

In the last but one post of this series we'll try to run a simple cluster of 3 nodes running EventStore instances. What is worth noting here is the fact, that there're three ways to organize and configure instances, so they work with each other:

  • running them on the same machine
  • running them on separate machines using IPs
  • running them on separate machines using DNS

Because the first one is almost self-describing(you have to start three instances on different ports), we'll omit it here and focus on the more complicated examples.

Running on separate machines

We'll start with creating 2 additional machines for our purposes. Just create two additional VM instances in the resource group you're using just like in the very first post of this series and we're good to go. Make sure that you're creating them in the same virtual network, which was created for the first virtual machine.

Once VMs are created, log in to each one and install EventStore instances as described in the previous posts.

Now we have to configure our instances so they're aware of other nodes. Basically what you have to do here is to change configuration on each node so it knows cluster size and other communication partners. Your eventstore.conf file could look like this:

/
---
RunProjections: None
ClusterSize: 3
GossipSeed: 10.0.3.6:2112,10.0.3.5:2112
DiscoverViaDns: False
ExtIp: 10.0.3.4
IntIp: 10.0.3.4

The important thing here is the GossipSeed property, which points to other cluster nodes. I'm using here private IPs so my instances are still secured inside the network. The important thing here is that ES uses internal HTTP port for gossiping so make sure you're using the right value - if anything's wrong, election service won't be able to other machines and you'll see DEAD as other nodes status.

Configure all three nodes with proper gossip seeds and IPs by modifying each one's configuration file. Once you're done, go to the web panel of ES and sign in as admin.

Checking cluster status

If you sign in to the web panel, you'll see Cluster status menu item:

It will show all nodes attached, current state(which one is a master) and many, many more. I strongly recommend you to play a bit with it.

We've managed to create a cluster of 3 different machines running EventStore using VMs from Azure. In the last part of this series we'll try to use DNS instead to ease configuration a bit if anything changes.