Category Archivescalability hacking
Databases & MySQL & WebApps & scalability hacking 10 Nov 2009 03:56 pm
Notes on adding more MySQL databases
Just notes for myself on adding more MySQL databases without shutting down the master database.
on existing slave:
copy data dir from /var/lib/mysql and data from /var/run/mysqld to new slave database:
tar cvf Mysql_slave.tar mysql/*
scp Mysql_slave.tar root@new-db.com:/var/lib/.
cd /var/run
tar cvf Mysqld_slave.tar mysqld/*
scp Mysqld_slave.tar mysqld/*
scp Mysqld_slave.tar root@new-db.com:/var/run/.
copy /etc/my.cnf from old slave to new slave
add entry for new server-id
start existing slave:
tar xvf Mysql_slave.tar
cd /var/run
tar xvf Mysqld_slave.tar
/etc/init.d/mysqld start
start new slave:
mysql
start slave;
on masterdb:
e.g.:
test on master:
create database repl;
check on slave:
show databases; /* should show new database */
test on master:
drop database repl;
check on slave:
show databases; /* new database should be dropped */
Now it’s time to turn this into an automated shell script with Expect in there.
How-To & scalability hacking 08 Nov 2009 10:42 am
Part II: Getting to 600 Concurrent Users
I couldn’t sleep last night. I’m worried we’ll lose this client.
So just to be clear. I wasn’t part of the crew responsible for scaling this site. I had already set up a scalable architecture for the site, that would automatically and horizontally scale at Amazon. That idea got shot down for legal reasons that to my surprise haven’t been in play for awhile. Can we say, “Office politics?”
I totally recommend Amazon’s Autoscaling to anybody that’s new to this.
Instead of auto-scaling, the site was architected by a local San Francisco firm who I won’t mention here.
Let’s just hope enough people read this so that they won’t even have to know the name of the company and will just know the smell of an un-scaleable architecture.
Scalability requirement: 100,000 concurrent users
This is how they set it up:
- two web servers
- one database
- four video transcoders that hits the master database
- one more app server that hits the master database
- no slave db
If they had even googled ‘building scalable websites’ they would have come across a book that would have avoided all of this, Cal Henderson’s Building Scalable Websites. It should be mandatory reading for anybody working on a large website, and it just scratches the surface.
So, how did we get to 600 concurrent users?
We tweaked mysql by putting this in /etc/m.cnf:
max_connections=10000
query_cache_size=50000000
thread_cache_size=16
thread_concurrency=16 # only works on Solaris and is ignored on other OSes
We ran siege and were able to get to about 300 concurrent users without breaking a sweat, but now apache was dying.
So we tweaked apache. We started out with this:
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
And ended up with this:
MinSpareServers 50
MaxSpareServers 200
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
RAM and CPU were doubled.
Databases & How-To & scalability hacking 06 Nov 2009 10:21 am
Scaling from 100 to 100000 concurrent users in a day?
Well, it looks pretty bad right now. A vendor just ceded control for web application architecture. Initial tests say that the site won’t do no more 100 users concurrently.
Who the hell makes a web app without a slave database and calls themselves website architects? Apparently these guys did.
Please start following if you want to see if this web app can make it to launch.
Databases & WebApps & scalability hacking 08 Sep 2009 09:00 am
Benchmarking Inserts on Drizzle and MySQL
I’m not comparing apples to apples yet… but out of the box, drizzle does inserts faster than MySQL using the same table type, InnoDB.
Here’s what I’m comparing:
drizzle r1126 configured with defaults, and
MySQL 5.1.38 configured with
./configure --prefix=/usr/local/mysql --with-extra-charsets=complex \ --enable-thread-safe-client --enable-local-infile --enable-shared \ --with-plugins=partition,innobase
which is really nothing complicated.
SQL query caching is turned off on both database servers. Both are using the InnoDB engine plug-in.
I’m running these benchmarks on a MacBook Pro 2.4 GHz Intel Core 2 Duo with 2GB 1067 MHz DDR3 RAM.
I wrote benchmarking software about 2 years ago to test partitions but I’ve since abstracted the code to be database agnostic.
You can get the benchmarking code at Github.
At the command-line, you type:
where 10000 is the number of rows allocated total, and 4 is the number of partitions for those rows.
You can type the same thing for mysql:
and get interesting results.
Here’s what I got:
MySQL
bash-3.2$ php build_tables.php 10000 4 mysql Elapsed time between Start and Test_Code_Partition: 13.856538 last table for php partition: users_03 Elapsed time between No_Partition and Code_Partition: 14.740206 ------------------------------------------------------------- marker time index ex time perct ------------------------------------------------------------- Start 1252376759.26094100 - 0.00% ------------------------------------------------------------- No_Partition 1252376773.11747900 13.856538 48.45% ------------------------------------------------------------- Code_Partition 1252376787.85768500 14.740206 51.54% ------------------------------------------------------------- Stop 1252376787.85815000 0.000465 0.00% ------------------------------------------------------------- total - 28.597209 100.00% ------------------------------------------------------------- 20000 rows inserted...
drizzle
bash-3.2$ php build_tables.php 10000 4 drizzle Elapsed time between Start and Test_Code_Partition: 7.502141 last table for php partition: users_03 Elapsed time between No_Partition and Code_Partition: 7.072367 ------------------------------------------------------------- marker time index ex time perct ------------------------------------------------------------- Start 1252376733.68141500 - 0.00% ------------------------------------------------------------- No_Partition 1252376741.18355600 7.502141 51.47% ------------------------------------------------------------- Code_Partition 1252376748.25592300 7.072367 48.52% ------------------------------------------------------------- Stop 1252376748.25627400 0.000351 0.00% ------------------------------------------------------------- total - 14.574859 100.00% ------------------------------------------------------------- 20000 rows inserted...
MySQL: 699 inserts per second
drizzle: 1372 inserts per second
As far as inserts go, drizzle is about 2 times faster out of the box than MySQL.
How-To & TechBiz & WebApps & scalability hacking & sysadmin 02 Aug 2009 11:28 pm
How to Load Balance and Auto Scale with Amazon’s EC2
This blog post is a quick introduction to load balancing and auto scaling on with Amazon’s EC2.
I was kinda amazed about how easy it was.
Prelims: Download the load balancer API software, auto scaling software, and cloud watch software. You can get all three at a download page on Amazon.
Let’s load balancer two servers.
elb-create-lb lb-example --headers \ --listener "lb-port=80,instance-port=80,protocol=http" \ --availability-zones us-east-1a
The above creates a load balancer called “lb-example,” and will load balance traffic on port 80, i.e. the web pages that you serve.
To attach specific servers to the load balancer you just type:
elb-register-instances-with-lb lb-example --headers \ --instances i-example,i-example2
where i-example and i-example2 are the instance id’s of the servers you want added to the load balancer.
You’ll also want to monitor the health of the load balanced servers, so please add a health check:
elb-configure-healthcheck lb-example --headers \ --target "HTTP:80/index.html" --interval 30 --timeout 3 \ --unhealthy-threshold 2 --healthy-threshold 2
Now let’s set up autoscaling:
as-create-launch-config example3autoscale --image-id ami-mydefaultami \ --instance-type m1.small
as-create-auto-scaling-group example3autoscalegroup \ --launch-configuration example3autoscale \ --availability-zones us-east-1a \ --min-size 2 --max-size 20 \ --load-balancers lb-example
as-create-or-update-trigger example3trigger \ --auto-scaling-group example3autoscalegroup --namespace "AWS/EC2" \ --measure CPUUtlization --statistic Average \ --dimensions "AutoScalingGroupName=example3autoscalegroup" \ --period 60 --lower-threshold 20 --upper-threshold 40 \ --lower-breach-increment=-1 --upper-breach-increment 1 \ --breach-duration 120
With the 3 commands above I’ve created an auto-scaling scenario where a new server is spawned and added to the load balancer every two minutes if the CPU Utlization is above 20% for more than 1 minute.
Ideally you want to set –lower-threshold to something high like 70 and –upper-threshold to 90, but I set both to 20 and 40 respectively just to be able to test.
I tested using siege.
Caveats: the auto-termination part is buggy, or simply didn’t work. As the load went down, the number of the server on-line remained the same. Anybody have thoughts on this?
What does auto-scaling and load balancing in the cloud mean? Well, the total cost of ownership for scalable, enterprise infrastructure just went down by lots. It also means that IT departments can just hire a cloud expert and deploy solutions from a single laptop instead of having to figure out the cost for hardware load balancers and physical servers.
The age of Just-In-Time IT just got ushered in with auto-scaling and load balancing in the cloud.
command-line & scalability hacking 26 Feb 2009 10:39 pm
Oddments: A Great Blog For Keeping Up With Drizzle and Gearman
Alan Kasindorf just introduced me to a great blog by Eric Day, Oddments.
If you are into learning about alternatives to MySQL like Drizzle, or how to scale writes to a database using Gearman, then I wholeheartedly recommend his blog.
I really like the samples of code he puts up that acts as a very useful, and direct tutorial to new technologies.