autoscaling with amazon ec2 and elb

Creating an auto scaled system using an Amazon load balancer is an interesting task that I did recently.

Here are the list of commands that I used to setup from the command line :

as-create-launch-config ec2elbconfig --image-id ami-xxxxx --instance-type m1.large --key key_name

Also if you don’t have already setup credentials you may append

-I amazonid -S secretkey

Do not forget to add –key because after the instance is up you won’t be able to log on it.

Next command is:

as-create-auto-scaling-group MyAutoScalingGroup --launch-configuration ec2elbconfig --availability-zones us-east-1c --min-size 2 --max-size 6 --load-balancers MyLoadBalancer

Where : MyLoadBalancer – is the name of your ELB ( loading balancer ) from amazon

Nex we create two policy rules, one for adding server and one for remover:

[root@server]# as-put-scaling-policy HighCpuPolicy --auto-scaling-group MyAutoScalingGroup --adjustment=1 --type ChangeInCapacity --cooldown 300
arn:aws:autoscaling:us-east-1:xxx:scalingPolicy:xxx-xx-xx-xx-xxxxx:autoScalingGroupName/MyAutoScalingGroup:policyName/HighCpuPolicy
[root@server]# as-put-scaling-policy LowCpuPolicy --auto-scaling-group MyAutoScalingGroup --adjustment=-1 --type ChangeInCapacity --cooldown 300
arn:aws:autoscaling:us-east-1:xxx:scalingPolicy:xxx-xx-xx-xx-xxxxx:autoScalingGroupName/MyAutoScalingGroup:policyName/LowCpuPolicy

Here is important to remember the output.
After this we must create two monitor rules that will scale our balancer, so will need two more rules:

mon-put-metric-alarm HighCpuAlarm --comparison-operator GreaterThanThreshold --evaluation-periods 4 --metric-name CPUUtilization --namespace "AWS/EC2" --period 60 --statistic Average --threshold 30 --alarm-actions arn:aws:autoscaling:us-east-1:xxx:scalingPolicy:xxx-xx-xx-xx-xxxxx:autoScalingGroupName/MyAutoScalingGroup:policyName/HighCpuPolicy --dimensions "AutoScalingGroupName=MyAutoScalingGroup"

and

mon-put-metric-alarm LowCpuAlarm --comparison-operator LessThanThreshold --evaluation-periods 4 --metric-name CPUUtilization --namespace "AWS/EC2" --period 60 --statistic Average --threshold 20 --alarm-actions arn:aws:autoscaling:us-east-1:xxx:scalingPolicy:xxx-xx-xx-xx-xxxxx:autoScalingGroupName/MyAutoScalingGroup:policyName/LowCpuPolicy --dimensions "AutoScalingGroupName=MyAutoScalingGroup"

After this you will have allways 2 instance up, and if the load go up then 30% more then 4 minutes the system will go up with one more server, if the load go bellow 20% more then 4 minutes will remove one server from load balancer.

If you need to remove this you must delete rules from bottom to top using bellow commands with name of your rules.

mon-delete-alarms
as-delete-policy
as-delete-auto-scaling-group
as-delete-launch-config

RAID10 ephemeral storage on AWS EC2

If you’re thinking of doing Radi10  on the ephemeral storage disks attached to an Ec2 instance, this post is for you. Well first of all you have to chose a instance with 4 drives.

You may chose m1.xlarge or c1.xlarge  or cc2.8xlarge . This are only instances with 4 drives. On other instances you may chose to make Raid0, witch in some case is good also.

Well first of all you have to boot your instance, after this please check if you have mounted one of them ( in some cases only one is mounted as ephemeral0 )

You have to umount that drive.

After that fdisk on oll of them and make one drive with full size ( in this manner we will make a raid10 ) with all space.

To see your drivers just run

ls -1 /dev/sd*

and you will see something like :
/dev/sda1
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde

What I want to do is to make sdb, sdc, sdd, sde one raid10

I’ll just create a single partition on each one. Using 

fdisk

, I choose the fd (Linux raid auto) partition type and create partitions using the entire disk on each one. When I’m done, each drive looks like this:

fdisk -l /dev/sdb

Disk /dev/sdb: 450.9 GB, 450934865920 bytes
255 heads, 63 sectors/track, 54823 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc696d4f6

Device Boot Start End Blocks Id System
/dev/sdb1 1 54823 440365716 fd Linux raid autodetect

Now I create the raid

mdadm  -v --create /dev/md0 --level=raid10 --raid-devices=4 /dev/xvdb1 /dev/xvdc1 /dev/xvdd1 /dev/xvde1

This is taking some time, so to verify if the construction of raid is ready run

 watch cat /proc/mdstat

When is ready you have to see something like this

Personalities : [raid10]
md127 : active raid10 xvdc1[1] xvdb1[0] xvdd1[2] xvde1[3]
880729088 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

unused devices: <none>

Ok now we have to create a new partition. Just

fdisk /dev/md0

 create your partition.

fdisk /dev/md0 

mkfs -t ext4 /dev/md0p1

mkdir /mnt/raidd

mount  /dev/md0p1  /mnt/raidd

After you done this, reboot your server . After the server is up and running, on amazon it appear that they will be rename . So md0p1 will be someting lik md127

You may run

grep md /var/log/dmesg

and you will see something like this
[ 0.436792] md: bind<xvde1>
[ 0.444720] md: bind<xvdd1>
[ 0.526356] md: bind<xvdb1>
[ 0.543458] md: bind<xvdc1>
[ 0.547763] md: raid10 personality registered for level 10
[ 0.548234] md/raid10:md127: active with 4 out of 4 devices
[ 0.548311] md127: detected capacity change from 0 to 901866586112

After this you may add to fstab bellow line:

/dev/md127p1 /mnt/raidd auto defaults,comment=cloudconfig 0 2

Now if you run

mount /mnt/raidd 

you shuld have raid mounted

df -h

Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 9.9G 2.4G 7.0G 26% /
tmpfs 7.4G 0 7.4G 0% /dev/shm
/dev/md127p1 827G 6.7G 779G 1% /mnt/raidd

 

Automatic script for backup up redis on a amazon ebs

Hello

Bellow is a script for backup up a redis on a unmounted ebs volume . First of all you have to create this file on that ebs

/mnt/backup/mounted

Why  I use this  ? Well I use it because I want to run on multiple servers.

 

 

 

#!/bin/bash
instance=i-xxxxx
volume=vol-xxxx
iplocalhost=10.00.00.111
mkdir /mnt/backup
atached=0
if [ ! -f /tmp/redis1 ]; then
touch /tmp/redis1
else
exit 0
fi
export EC2_HOME=/path/ec2-1.4.4.2
export JAVA_HOME=/usr/lib/jvm/jre
export CLASSPATH=${EC2_HOME}/lib
export EC2_PRIVATE_KEY=/root/path/pk.pem
export EC2_CERT=/root/path/cert.pem
while [ $atached -lt 1 ];do
/path/ec2-1.4.4.2/bin/ec2-attach-volume -K /root/path/pk.pem -C /root/path/cert.pem $volume -i $instance -d /dev/sdh
sleep 10
mount /dev/sdh /mnt/backup
sleep 5
if [ -f /mnt/backup/mounted ]; then
rsync -vrplogDtH /var/lib/redis/6379 /mnt/backup/cassandra1
atached=1
fi
done
cd /
umount -lf /mnt/backup
sleep 3
/path/ec2-1.4.4.2/bin/ec2-detach-volume -K /root/path/pk.pem -C /root/path/cert.pem $volume -i $instance -d /dev/sdh
rm -rf /tmp/redis1

Using Domain Names With Elastic Load Balancing route53

Well a few day’s ago I have to setup a domain to use loadbalancer from Amazon.  Well there are 2 posibilities

1. You may associate a subdomain  with CNAME to loadbalancer, however this is not a good solution because you may not use ex: matrafox.info you may use only www.matrafox.info

2.  Move the domain to amazon also use route53 and you may add alias to domain also. How you may do this.

elb-associate-route53-hosted-zone myLoadBalancer –rr-name example.com –hosted-zone-id Z123000000 –weight 100
elb-associate-route53-hosted-zone myLoadBalancer –rr-name www.example.com –hosted-zone-id Z123000000 –weight 100

And if you want to remvoe just use
elb-disassociate-route53-hosted-zone myLB –rr-name example.com –hosted-zone-id Z123000000 –weight 100

myLoadBalancer – is the name of your load balancer
example.com – name of your domain
Z123000000 – this you will get from route53 page. Each domain has a unique zone id
weight – is something from route53 that you need it.

However wehen I try this solution I have this error:
elb-associate-route53-hosted-zone: program error

It appear that this error was because the domain was not fully propagated.

However to use this second solution you have to know your credential, and have installed their api.

One other simple solution is to add directly into route53, how you do this ?
1. go to ec2/load balancer and copy dns name of your load balancer ex: MyLoadBalancer-0000000000.us-east-1.elb.amazonaws.com , and his name ( myloadbalancer )
2. go to route 53 and edit your domain.
3. Chose what you want to be on load balancer .
and the parameter are
A – IPV4 address
Alias : yes
alias target: ( name of your load balancer ) myloadbalancer ( this will be all with low letter )
Weighted Set: yes
Weight : 100
Set id: MyLoadBalancer-0000000000.us-east-1.elb.amazonaws.com. ( do not forget the dot from the end )
And save this is preaty easy because you don’t have to use a lot of commands.

ngnix php apc memcached – connection stay active

Well, one client complain because the server start going to be verry slow. After a short look, I see that where over 20k ESTABLISHED connection from php-fpm to memcached server.

The main problem was that the server didn’t verify if have a connection active and every time was adding a new one.

After a short search we nottice that we have the stable version of memcached ( php module ) , and the new one have something like isPristine function, you won’t find anything on official documentation on pecl site.

So, the fix was to upgrade to memcached-2.0.0b2 .

How to upgrade memcached:

pecl uninstall memcached

pecl install memcached-2.0.0b2

After this you may use into php code  isPristine

 

 

← Older Entries
Newer Entries →