Scaling MySQL powered Web Sites by Sharding and Replication - SF MySQL Meetup Nov 2008

Peter Zaitsev will be giving his excellent presentation “Scaling MySQL powered Web Sites by Sharding and Replication” to the upcoming SF MySQL 6:00pm on November 3rd @ the CBS Interactive (formerly CNET Networks) building in SOMA San Francisco (235 2nd St).

RSVP here: http://mysql.meetup.com/30/calendar/8912109/

Description from the 2008 Velocity conference:
When your application grows beyond capacity of a single MySQL server there are few ways to scale, with most typical being Replication and Sharding.

In this presentation you will learn how, depending on your application performance scalability and high availability goals, you can choose what proper scaling strategy will be good for you.

We also will speak about scalability limitations of replication of Replication and Sharding, implementation complexities, and aspects of operation.

Peter Zaitsev’s bio:
MySQL Performance Blog

Peter helped many companies ranging from one man startups to Fortune 500 companies with their Performance and Scaling problems on various stages starting from architecture design and down to queries and schema optimization.

Over cause of the years Peter has spoken on many International conferences focused on MySQL, Open Source, Databases or High Performance Web applications.

Before co-founding Percona Peter worked for MySQL AB as head of High Performance Group being involved in Support, Consulting, Development and working with vendors helping to optimize their software or hardware to perform well with MySQL.

Peter also was involved in number of Web Startups in the roles ranging from CTO to Consultant and has a lot of experience in MySQL and Web Applications Operations, Deployment, Quality Assurance and Development.
Please join us!

Map to CNET Networks, Inc.
When you arrive, please look for the PHP/MySQL Meetup sign pointing you to the conference room.

Look forward to seeing you there!

Posted under Events, Internet, Technology, Tips & Tricks, Web Development, mysql

This post was written by Michael Tougeron on October 23, 2008

Tags: , , , ,

memcached PHP semaphore & cache expiration handling

There are a lot of different ways that people use memcached and PHP. The most common of which is probably your basic set and get to cache data from your database.

function get_my_data1() {
    $cache_id = "mykey";
    $data = $memcache_obj->get($cache_id);
    if ( !$data ) {
        $data = get_data_from_db_function();
        $memcache_obj->set($cache_id, $data, $sec_to_cache_for);
    }
    return $data;
}

But what if the query that’s going to hit the database is pretty intensive and you don’t want more than one user to hit the db at a time? That’s easily handling via a semaphore lock.

function get_my_data2() {
    $cache_id = "mykey";
    $data = $memcache_obj->get($cache_id);
    if ( !$data ) {
        // check to see if someone has already set the lock
        $data_lock = $memcache_obj->get($cache_id . '_qry_lock');
        if ( $data_lock ) {
            $lock_counter = 0;
            // loop until you find that the lock has been released.  that implies that the query has finished
            do while ( $data_lock ) {
                // you may only want to wait for a specified period of time.
                // one second is usually sufficient since your goal is to always have sub-second response time
                // if you query takes more than 1 second, you should consider "warming" your cached data via a cron job
                if ( $lock_counter > $max_time_to_wait ) {
                    $lock_failed = true;
                    break;
                }
                // you really want this to be a fraction of a second so the user waits as little as possible
                // for the simplicity of example, I'm using the sleep function.
                sleep(1);
                $data_lock = $memcache_obj->get($cache_id . '_qry_lock');
            }
            // if the loop is completed, that either means the user waited for too long
            // or that the lock has been removed.  try to get the cached data again; it should exist now
            $data = $memcache_obj->get($cache_id);
            if ( $data ) {
                return $data;
            }
        }
        // set a lock for 2 seconds
        $memcache_obj->set($cache_id . '_qry_lock', true, 2);
        $data = get_data_from_db_function();
        $memcache_obj->set($cache_id, $data, $sec_to_cache_for);
        // don't forget to remove the lock
        $memcache_obj->delete($cache_id . '_qry_lock');
    }
    return $data;
}

More below the break –> Read More…

Posted under PHP, Tips & Tricks, Web Development, mysql

This post was written by Michael Tougeron on January 11, 2008

Tags: , ,