We went through the process last night of setting up Amazon EC2 nodes with the Event Store running on them. This post is a quick tutorial of how to do it.
First when setting up your node add to the security group (we did a t1.micro running ubuntu 12 to start with).
22 (SSH) 0.0.0.0/0 1113 0.0.0.0/0 2113 0.0.0.0/0
Now bring up your node. The first thing that you will need to get is mono. To do this you can just
sudo apt-get install mono-complete
You can also build trunk from sources by cloning github and doing an autogen + make however on a tiny node like a t1.micro this is probably going to take a while. You probably would want to get a large node then move the image. For building out a stable environment this is recommended as we have pushed changes to mono trunk that are not yet available outside of trunk dealing with tcp and threading issues.
After that grab the sources (or a binary distribution of the Event Store.
mkdir src cd src git clone firstname.lastname@example.org:EventStore/EventStore.git EventStore cd EventStore xbuild src/EventStore.sln
Now we have the EventStore built. First we need to get the IP address of the node we can get this by running ifconfig.
ubuntu@domU-12-31-39-09-48-08:~/src/EventStore$ ifconfig eth0 Link encap:Ethernet HWaddr 12:31:39:09:48:08 inet addr:<span style="color: #ff0000;">10.210.79.246</span> Bcast:10.210.79.255 Mask:255.255.254.0 inet6 addr: fe80::1031:39ff:fe09:4808/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:6813 errors:0 dropped:0 overruns:0 frame:0 TX packets:5176 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:555815 (555.8 KB) TX bytes:6101901 (6.1 MB) Interrupt:25
Let’s bring up the EventStore
mono --gc=sgen bin/eventstore/debug/anycpu/EventStore.SingleNode.exe -c 0 --ip 10.210.79.246 -h 2113 -t 1113 --prefixes http://ec2-107-21-68-86.compute-1.amazonaws.com:2113/
This tells the EventStore to run on our external ip address on port 2113 for HTTP and 1113 for TCP with no cached chunks (no a lot of memory on the tiny nodes). It also tells us that “http://ec2-107-21-68-86.compute-1.amazonaws.com:2113/” is a valid prefix for HTTP requests. This is the name of your node (or an elastic ip if you are using elastic ips).
Now the EventStore is up and running. We can from home go to http://ec2-107-21-68-86.compute-1.amazonaws.com:2113/ and get the management console.
Here are some benchmarks on the node.
[01929,10,08:14:00.544] Write request took: 00:00:00.4987778. [01929,10,08:14:00.554] Connection [10.210.79.246:1113] was closed cleanly. [01929,01,08:14:00.555] Command exited with code 0.
[01953,12,08:16:11.695] Connection [10.210.79.246:1113] was closed cleanly. [01953,01,08:16:11.696] Command exited with code 0. [01953,12,08:16:11.696] Completed. Successes: 4976, failures: 24 (WRONG VERSION: 24, P: 0, C: 0, F: 0, D: 0) [01953,12,08:16:11.696] 5000 requests completed in 62802ms (79.62 reqs per sec).
[01953,140,08:16:58.716] Read request took: 00:00:00.0091795. [01953,140,08:16:58.716] ##teamcity[buildStatisticValue key='RD-latency-ms' value='9'] [01953,140,08:16:58.716] Connection [10.210.79.246:1113] was closed cleanly. [01953,01,08:16:58.717] Command exited with code 0.
[01953,140,08:17:46.753] Completed. READS done: 5000. [01953,140,08:17:46.753] 5000 requests completed in 7024ms (711.85 reqs per sec).
The t1.micro instance is not a very beefy instance. The benchmarks also appear to fluctuate heavily (these are from this morning, last night writes were twice as fast https://gist.github.com/3783566). Also note that given the small data the reads were still pretty fast though they would likely get to be slower as more data was put in. However you can take the same image and bring it up on a hi1.4xlarge (high io node).
[01465,06,08:28:20.039] Write request took: 00:00:00.0272964. [01465,06,08:28:20.039] Connection [10.148.133.45:1113] was closed cleanly. [01465,01,08:28:20.039] Command exited with code 0.
[01465,10,08:29:18.472] 10000 requests completed in 2173ms (4601.93 reqs per sec).
[01565,09,08:30:25.412] Read request took: 00:00:00.0017523.
[01565,32,08:31:55.462] DONE TOTAL 100000 READS IN 00:00:03.6915271 (27089.1/s).
This is actually slower than my desktop computer (about the same as my zenbook laptop, makes you stop and think about cloud costs for a moment!). For write speed the most important determining factor is the hard drives its run on. Overall however the amazon node performs fairly well. Also note that no optimizations were taken during this process.