Step 1 Create AMI and try http

I can login then search in the community instances and search for lamp. There is only one Fedora AMI available. So I start with this.

I try to access the website after the server is fully up and running.

Errors

Error 1

After the VM is up and running, I cannot connect to port 80 (http server), even though the service is running.

From netstat -tulnp I can see port 80 is open. But cannot connect.

The reason is that from the “security group” I have to enable the http service, otherwise it will be blocked. So I terminate the VM and started a new one is a security group and open the http port in the group.

Error 2

Even after I added the security group it is still not working. The reason is the IP address on the VM's eth0 is not the public ip address.

To solve it, I need to use the public DNS from the desciption tab of the VM.

Step 2 Clone the machine and prepare the webpage

Clone the machine

According to the assignment, I have to run two LAMP servers. Since the first one is up and running, I can just “clone” it and name the cloned one “Vic lamp2 fedora”

Make the webpage
<html>
<header>
<title>LAMP 1</title>
</header>
<body>
<table align=center width=30%>
<tr>
<td align=center><h2>OS3 LIA</h2></td>
</tr>
<tr>
<td align=center><p>Created by Vic</p></td>
</tr>
<tr>
<tr><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td></tr>
 
<td align=right>served by i-898071ff</td>
</tr>
</table>
</html>

The unique ID for lamp1 is i-898071ff and the unique ID for lamp2 is i-a38677d5 .

Test each server

Test result of lamp1

vding@fx160-14:~/Downloads$ ab -n 50000 -c 500 http://ec2-79-125-55-188.eu-west-1.compute.amazonaws.com/index.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking ec2-79-125-55-188.eu-west-1.compute.amazonaws.com (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests
 
 
Server Software:        Apache/2.2.15
Server Hostname:        ec2-79-125-55-188.eu-west-1.compute.amazonaws.com
Server Port:            80
 
Document Path:          /index.php
Document Length:        363 bytes
 
Concurrency Level:      500
Time taken for tests:   35.314 seconds
Complete requests:      50000
Failed requests:        0
Write errors:           0
Total transferred:      27805004 bytes
HTML transferred:       18153267 bytes
Requests per second:    1415.86 [#/sec] (mean)
Time per request:       353.143 [ms] (mean)
Time per request:       0.706 [ms] (mean, across all concurrent requests)
Transfer rate:          768.90 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       21  197 756.9     39    9045
Processing:    21  147 493.4     84   15242
Waiting:       19  144 493.4     82   15242
Total:         45  344 964.0    125   18264
 
Percentage of the requests served within a certain time (ms)
  50%    125
  66%    140
  75%    154
  80%    169
  90%    367
  95%   1924
  98%   3152
  99%   3420
 100%  18264 (longest request)

Test result of lamp3

vding@fx160-14:~/Downloads$ ab -n 50000 -c 500 http://ec2-46-137-1-222.eu-west-1.compute.amazonaws.com/index.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
 
Benchmarking ec2-46-137-1-222.eu-west-1.compute.amazonaws.com (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
apr_socket_recv: Connection timed out (110)
Total of 31982 requests completed

After 31982 requests, the machine cannot handle it anymore. Let's lower the time and do it again.

lam3 take2

Benchmarking ec2-46-137-1-222.eu-west-1.compute.amazonaws.com (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed 8000 requests
Completed 10000 requests
Completed 12000 requests
Completed 14000 requests
Completed 16000 requests
Completed 18000 requests
Completed 20000 requests
Finished 20000 requests
 
 
Server Software:        Apache/2.2.15
Server Hostname:        ec2-46-137-1-222.eu-west-1.compute.amazonaws.com
Server Port:            80
 
Document Path:          /index.php
Document Length:        364 bytes
 
Concurrency Level:      500
Time taken for tests:   13.632 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Total transferred:      11140000 bytes
HTML transferred:       7280000 bytes
Requests per second:    1467.11 [#/sec] (mean)
Time per request:       340.807 [ms] (mean)
Time per request:       0.682 [ms] (mean, across all concurrent requests)
Transfer rate:          798.03 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       21  203 757.3     49    9113
Processing:    21  109 137.2     88    1994
Waiting:       21  108 137.2     86    1994
Total:         43  312 797.1    142    9435
 
Percentage of the requests served within a certain time (ms)
  50%    142
  66%    155
  75%    170
  80%    177
  90%    214
  95%    930
  98%   3177
  99%   3434
 100%   9435 (longest request)

It does not make sense to compare two machines under different condition. so here come lamp1 take2 with same parameter as lamp3 take2

Benchmarking ec2-79-125-55-188.eu-west-1.compute.amazonaws.com (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed 8000 requests
Completed 10000 requests
Completed 12000 requests
Completed 14000 requests
Completed 16000 requests
Completed 18000 requests
Completed 20000 requests
Finished 20000 requests
 
 
Server Software:        Apache/2.2.15
Server Hostname:        ec2-79-125-55-188.eu-west-1.compute.amazonaws.com
Server Port:            80
 
Document Path:          /index.php
Document Length:        363 bytes
 
Concurrency Level:      500
Time taken for tests:   14.892 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Total transferred:      11120000 bytes
HTML transferred:       7260000 bytes
Requests per second:    1343.01 [#/sec] (mean)
Time per request:       372.297 [ms] (mean)
Time per request:       0.745 [ms] (mean, across all concurrent requests)
Transfer rate:          729.21 [Kbytes/sec] received
 
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       21  187 796.5     26    9047
Processing:    22  152 457.5     87    7390
Waiting:       21  149 457.2     86    7389
Total:         47  339 985.2    127   10413
 
Percentage of the requests served within a certain time (ms)
  50%    127
  66%    149
  75%    161
  80%    172
  90%    326
  95%    897
  98%   3155
  99%   4833
 100%  10413 (longest request)

Compare two of the servers

#lamp1 
Time per request:       372.297 [ms] (mean)
Time per request:       0.745 [ms] (mean, across all concurrent requests)
 
#lamp3
Time per request:       340.807 [ms] (mean)
Time per request:       0.682 [ms] (mean, across all concurrent requests)

From this result, we can say that lamp1 can handle more concurrent and requests in large volume, but response slower. It maybe on a link which has a lot of capacity but several more hops away from us. lamp3 failed two time in 50000 requests. But it response time is slightly better than from lamp1.

Step 3 Load balance

Create load balancer

I created load balancer by just click on the new button in the load balancer menu and add two instances of mine into the load balancer. It works after a while for “registration”. Now I can access “my website” through another DNS name. and the traffice is distributed among the two servers.

Test load balancer

I ran the same test on load balancer instead of the single machine, and below is the result (shortened)

#result
Time per request:       613.916 [ms] (mean)
Time per request:       1.228 [ms] (mean, across all concurrent requests)

But this does not say anything about the behavior of the load balancer.

A script can be used to test the load balancer. This script will try to access 1.html to 10.html on the load balancer, from the naming in the access log of the two single machines, we can see the distribution strategy of the load balancer.

#!/bin/sh
for i in `seq 1 10`; do
  wget http://vic-http-530589179.eu-west-1.elb.amazonaws.com/$i.html > /dev/null
next

log file of lamp1

#/var/log/httpd
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /1.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /3.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /5.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /7.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:30 -0500] "GET /9.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"

log file of lamp3

#var/log/httpd
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /2.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /4.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /6.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:29 -0500] "GET /8.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.234.91.224 - - [15/Feb/2011:10:29:30 -0500] "GET /10.html HTTP/1.1" 404 317 "-" "Wget/1.12 (linux-gnu)"

From the “GET /1.html” trunk of the log we can easily see that the load balancer is evenly distributing the load. In total 10 request, even ones go to lamp3, odd ones go to lamp1.

Overload one of the balanced server

I flooded lamp3 since it response faster. And below is the mean of “Time per request” of each test entity

#load balancer
Time per request:       229.334 [ms] (mean)
Time per request:       0.459 [ms] (mean, across all concurrent requests)
 
#lamp1
Time per request:       391.629 [ms] (mean)
Time per request:       0.783 [ms] (mean, across all concurrent requests)
 
#lamp3 
#flooded
Time per request:       466.372 [ms] (mean)
Time per request:       0.933 [ms] (mean, across all concurrent requests)

It is clearly shown that lamp3 is flooded. And load balancer is doing better than the single machines. This clearly shows that load balancer is really working as its name suggests, distributing the loads, hence the response we got from it can be better than the single machine.

Errors

Error 1

I created the VMs in different section, namely, eu-west-1a and eu-west-1b. The loader balancer did not allow it. It is recommended to have even number of instances in one section.

So I started another machine lamp3 in section eu-west-1a I now have two instances. And the load balancer can run now.

Step 4 Windows machine

Create win2k8 instance and enable IIS

I choose the Amazon win2k8 instance with iis. Then enable 3389 (RDP) port from the security group and open port 80 on windows machine. Then it fully works

Add it to load balancer and test

response time of the servers and load balancer

load balancer (only the necessary information is pasted here)

vding@fx160-14:~/Downloads$ ab -n 30000 -c 500 http://vic-http-530589179.eu-west-1.elb.amazonaws.com/
.
Server Software:        Apache/2.2.15
Server Hostname:        vic-http-530589179.eu-west-1.elb.amazonaws.com
Server Port:            80
.
Time per request:       190.050 [ms] (mean)
Time per request:       0.380 [ms] (mean, across all concurrent requests)
.

windows machine

vding@fx160-14:~/Downloads$ ab -n 30000 -c 500 http://ec2-79-125-50-217.eu-west-1.compute.amazonaws.com/
.
Server Software:        Microsoft-IIS/7.0
Server Hostname:        ec2-79-125-50-217.eu-west-1.compute.amazonaws.com
Server Port:            80
.
Time per request:       397.411 [ms] (mean)
Time per request:       0.795 [ms] (mean, across all concurrent requests)
.

Now check the behavior of the load balancer with three machines in it. I use again the script mentioned above.

And below is the result of log book of web server on each machine.

#lamp1
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /1.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /4.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /7.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /10.html HTTP/1.1" 404 317 "-" "Wget/1.12 (linux-gnu)"
 
#lamp3
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /2.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /5.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /8.html HTTP/1.1" 404 316 "-" "Wget/1.12 (linux-gnu)"
10.224.71.85 - - [15/Feb/2011:13:13:21 -0500] "GET /11.html HTTP/1.1" 404 317 "-" "Wget/1.12 (linux-gnu)"
 
#win2k8 IIS7
2011-02-15 18:13:21 10.234.23.86 GET /3.html - 80 - 10.224.71.85 Wget/1.12+(linux-gnu) 404 0 2 0
2011-02-15 18:13:21 10.234.23.86 GET /6.html - 80 - 10.224.71.85 Wget/1.12+(linux-gnu) 404 0 2 0
2011-02-15 18:13:21 10.234.23.86 GET /9.html - 80 - 10.224.71.85 Wget/1.12+(linux-gnu) 404 0 2 0
2011-02-15 18:13:21 10.234.23.86 GET /12.html - 80 - 10.224.71.85 Wget/1.12+(linux-gnu) 404 0 2 0

As we can see, it is still evenly distributed in a round robin fashion. The load balancer is give out task like in a ring, each one get its turn.

Step 5 Secure

To secure the servers, we can do it from the security group. We can limit the source address which are by default set to 0.0.0.0/0 (every host). We can limit it to 145.100.102.128/27, which is the range of all the workstation in the lab. Now only the machine with those IPs can access the services.

Step 6 Termination

I terminated all the machines since I finished more or less with the assignment. To answer the questions I do not need the running machine. And for the bonus, I can setup other machines later.

Error

I removed load balancer and all the machines, except one. The windows 2008 machine does not want to shutdown. Hence, I cannot remove the security group. I will check tomorrow if the machine is shutdown.

I found out that all the test machines, together with security groups and load balancers are gone over night. Either removed by the system automatically or removed by Jaap to prevent higher cost.