<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PlanetMysql.ru - информация о СУБД MySQL &#187; memcached</title>
	<atom:link href="http://planetmysql.ru/category/memcached/feed/" rel="self" type="application/rss+xml" />
	<link>http://planetmysql.ru</link>
	<description>Блог о самой популярной СУБД MySQL</description>
	<lastBuildDate>Fri, 10 Feb 2012 22:53:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>[RELOADED] Vote for MySQL+ community awards 2011 !</title>
		<link>http://feedproxy.google.com/~r/mysqlplusrss/~3/85PRjYkfCIM/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reloaded-vote-for-mysql-community-awards-2011</link>
		<comments>http://feedproxy.google.com/~r/mysqlplusrss/~3/85PRjYkfCIM/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 20:31:42 +0000</pubDate>
		<dc:creator>Cedric PEINTRE</dc:creator>
				<category><![CDATA[admin]]></category>
		<category><![CDATA[cacti]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[cold backup]]></category>
		<category><![CDATA[Common schema]]></category>
		<category><![CDATA[couchdb]]></category>
		<category><![CDATA[drbd]]></category>
		<category><![CDATA[Drizzle]]></category>
		<category><![CDATA[FromDual]]></category>
		<category><![CDATA[Galera Replication]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[infinidb]]></category>
		<category><![CDATA[Innotop]]></category>
		<category><![CDATA[Live !]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[MHA]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[MONyog]]></category>
		<category><![CDATA[mycheckpoint]]></category>
		<category><![CDATA[mydumper]]></category>
		<category><![CDATA[mylvmbackup]]></category>
		<category><![CDATA[MyS]]></category>
		<category><![CDATA[MySQL Enterprise Backup]]></category>
		<category><![CDATA[MySQL Enterprise Monitor]]></category>

		<guid isPermaLink="false">http://www.mysqlplus.net/?p=242</guid>
		<description><![CDATA[[UPDATE 2011/01/11] : New poll added, vote for the best GUI client tool ! (And continue to vote for other polls)
And thanks again for your involvement. It&#8217;s time to vote again&#8230; 
First of all, I wish you a happy new year.
Many things happened last year, it was really exciting to be involved in the MySQL ecosystem.
I hope this enthusiasm will be increased this year, up to you !
To start the year, I propose the MySQL+ Community Awards 2011
It will only take 5 minutes to fill out these polls.
Answer with your heart first and then with your experience with some of these tools or services.
Polls will be closed January 31, so, vote now !
For &#8220;other&#8221; answers, please,  let me a comment with details.
Don&#8217;t hesitate to submit proposal for tools or services in the comments.
And, please, share these polls !
&#160;
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
Happy 2012 !
Cédric
This article is obviously not sponsored !
(MySQL is a trademark of Oracle Corporation and/or its affiliates)
Sources :

Oracle products, tools and services : http://www.mysql.com
SkySQL products, tools and services : http://www.skysql.com
Percona products, tools and services : http://www.percona.com
FromDual products, tools and services : http://www.fromdual.com
PalominoDB products, tools and services : http://palominodb.com/
Pythian products, tools and services : http://www.pythian.com/
Blue Gecko products, tools and services : http://www.bluegecko.net/
Zabbix : http://www.zabbix.com/
MySQL Cacti templates : http://code.google.com/p/mysql-cacti-templates/
Nagios : http://www.nagios.org/
r1soft CDP for MySQL : http://www.r1soft.com/linux-cdp/cdp-enterprise-edition/mysql/ 
mylvmbackup tool : http://www.lenzg.net/mylvmbackup/
mydumper tool : http://www.mydumper.org/
ZRM tools : http://www.zmanda.com
Galera replication : http://codership.com/products/galera_replication
Tungsten replicator : http://code.google.com/p/tungsten-replicator/
DRBD : http://www.drbd.org/
ShoonerSQL : http://www.schoonerinfotech.com/products/schoonersql
ScaleBase : http://www.scalebase.com/
common-schema : http://code.google.com/p/common-schema/
innotop : http://code.google.com/p/innotop/
MySQL Tuner : https://launchpad.net/mysqltuner/2.0/mysqltuner-2.1-rev17
mycheckpoint : http://code.openark.org/forge/mycheckpoint
MariaDB : http://mariadb.org/
TokuDB : http://www.tokutek.com/
InfiniDB : http://infinidb.org/
Drizzle : https://launchpad.net/drizzle
Amazon SimpleDB : http://aws.amazon.com/fr/simpledb//180-2635771-0721067/
mongoDB : http://www.mongodb.org/
Cassandra : http://cassandra.apache.org/
CouchDB : http://couchdb.apache.org/
Tokyo Cabinet : http://fallabs.com/
Riak : http://basho.com/
Hadoop : http://hadoop.apache.org/
Tarantool : http://tarantool.org/
memcached : http://memcached.org/
MySQL Sandbox : http://mysqlsandbox.net/
openark kit : http://code.openark.org/forge/openark-kit
Redis : http://redis.io/
Ganglia : http://ganglia.sourceforge.net/
HandlerSocket : https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL

Related Posts :Why a new memory engine may change everything ?Words about PLUK2011Monitoring your monitoring tools (MONyog inside) ![UPDATED] Why you should go to Percona Live (London) ?Does mpstat can replace vmstat ?]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mysqlplus.net/wp-content/uploads/2012/01/award.jpg" rel="lightbox[242]"><img class="alignleft size-full wp-image-274" title="award" src="http://www.mysqlplus.net/wp-content/uploads/2012/01/award.jpg" alt="" width="162" height="257" /></a></p>
<p><em><strong>[UPDATE 2011/01/11]</strong> : New poll added, vote for the best GUI client tool ! (And continue to vote for other polls)</em><br />
<em>And thanks again for your involvement. It&#8217;s time to vote again&#8230; </em></p>
<p>First of all, <strong>I wish you a happy new year</strong>.<br />
Many things happened last year, it was really exciting to be involved in the MySQL ecosystem.<br />
I hope this enthusiasm will be increased this year, up to you !</p>
<p>To start the year, I propose the <strong><em>MySQL+ Community Awards 2011</em></strong><br />
It will only take <strong>5 minutes</strong> to fill out these polls.<br />
Answer with your heart first and then with your experience with some of these tools or services.</p>
<p><strong>Polls will be closed January 31</strong>, so, vote now !<br />
For &#8220;<em>other</em>&#8221; answers, please,  let me a comment with details.</p>
<p>Don&#8217;t hesitate to submit proposal for tools or services in the comments.<br />
And, please, share these polls !</p>
<p>&nbsp;</p>
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.<br />
Note: There is a poll embedded within this post, please visit the site to participate in this post's poll.
<p>Happy 2012 !<br />
Cédric</p>
<p><strong>This article is obviously not sponsored !</strong><br />
<em>(MySQL is a trademark of Oracle Corporation and/or its affiliates)</em></p>
<p><span>Sources :</span></p>
<ul>
<li>Oracle products, tools and services : <a href="http://www.mysql.com" >http://www.mysql.com</a></li>
<li>SkySQL products, tools and services : <a href="http://www.skysql.com" >http://www.skysql.com</a></li>
<li>Percona products, tools and services : <a href="http://www.percona.com" >http://www.percona.com</a></li>
<li>FromDual products, tools and services : <a href="http://www.fromdual.com" >http://www.fromdual.com</a></li>
<li>PalominoDB products, tools and services : <a href="http://palominodb.com/" >http://palominodb.com/</a></li>
<li>Pythian products, tools and services : <a href="http://www.pythian.com/" >http://www.pythian.com/</a></li>
<li>Blue Gecko products, tools and services : <a href="http://www.bluegecko.net/" >http://www.bluegecko.net/</a></li>
<li>Zabbix : <a href="http://www.zabbix.com/" >http://www.zabbix.com/</a></li>
<li>MySQL Cacti templates : <a href="http://code.google.com/p/mysql-cacti-templates/" >http://code.google.com/p/mysql-cacti-templates/</a></li>
<li>Nagios : <a href="http://www.nagios.org/" >http://www.nagios.org/</a></li>
<li>r1soft CDP for MySQL : <a href="http://www.r1soft.com/linux-cdp/cdp-enterprise-edition/mysql/" >http://www.r1soft.com/linux-cdp/cdp-enterprise-edition/mysql/ </a></li>
<li>mylvmbackup tool : <a href="http://www.lenzg.net/mylvmbackup/" >http://www.lenzg.net/mylvmbackup/</a></li>
<li>mydumper tool : <a href="http://www.mydumper.org/" >http://www.mydumper.org/</a></li>
<li>ZRM tools : <a href="http://www.zmanda.com" >http://www.zmanda.com</a></li>
<li>Galera replication : <a href="http://codership.com/products/galera_replication" >http://codership.com/products/galera_replication</a></li>
<li>Tungsten replicator : <a href="http://code.google.com/p/tungsten-replicator/" >http://code.google.com/p/tungsten-replicator/</a></li>
<li>DRBD : <a href="http://www.drbd.org/" >http://www.drbd.org/</a></li>
<li>ShoonerSQL : <a href="http://www.schoonerinfotech.com/products/schoonersql" >http://www.schoonerinfotech.com/products/schoonersql</a></li>
<li>ScaleBase : <a href="http://www.scalebase.com/" >http://www.scalebase.com/</a></li>
<li>common-schema : <a href="http://code.google.com/p/common-schema/" >http://code.google.com/p/common-schema/</a></li>
<li>innotop : <a href="http://code.google.com/p/innotop/" >http://code.google.com/p/innotop/</a></li>
<li>MySQL Tuner : <a href="https://launchpad.net/mysqltuner/2.0/mysqltuner-2.1-rev17" >https://launchpad.net/mysqltuner/2.0/mysqltuner-2.1-rev17</a></li>
<li>mycheckpoint : <a href="http://code.openark.org/forge/mycheckpoint" >http://code.openark.org/forge/mycheckpoint</a></li>
<li>MariaDB : <a href="http://mariadb.org/" >http://mariadb.org/</a></li>
<li>TokuDB : <a href="http://www.tokutek.com/" >http://www.tokutek.com/</a></li>
<li>InfiniDB : <a href="http://infinidb.org/" >http://infinidb.org/</a></li>
<li>Drizzle : <a href="https://launchpad.net/drizzle" >https://launchpad.net/drizzle</a></li>
<li>Amazon SimpleDB : <a href="http://aws.amazon.com/fr/simpledb//180-2635771-0721067/" >http://aws.amazon.com/fr/simpledb//180-2635771-0721067/</a></li>
<li>mongoDB : <a href="http://www.mongodb.org/" >http://www.mongodb.org/</a></li>
<li>Cassandra : <a href="http://cassandra.apache.org/" >http://cassandra.apache.org/</a></li>
<li>CouchDB : <a href="http://couchdb.apache.org/" >http://couchdb.apache.org/</a></li>
<li>Tokyo Cabinet : <a href="http://fallabs.com/" >http://fallabs.com/</a></li>
<li>Riak : <a href="http://basho.com/" >http://basho.com/</a></li>
<li>Hadoop : <a href="http://hadoop.apache.org/" >http://hadoop.apache.org/</a></li>
<li>Tarantool : <a href="http://tarantool.org/" >http://tarantool.org/</a></li>
<li>memcached : <a href="http://memcached.org/" >http://memcached.org/</a></li>
<li>MySQL Sandbox : <a href="http://mysqlsandbox.net/" >http://mysqlsandbox.net/</a></li>
<li>openark kit : <a href="http://code.openark.org/forge/openark-kit" >http://code.openark.org/forge/openark-kit</a></li>
<li>Redis : <a href="http://redis.io/" >http://redis.io/</a></li>
<li>Ganglia : <a href="http://ganglia.sourceforge.net/" >http://ganglia.sourceforge.net/</a></li>
<li>HandlerSocket : <a href="https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL" >https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL</a></li>
</ul>
<div><B><U>Related Posts :</U></B><ul><li><a href="http://www.mysqlplus.net/2011/09/26/memory-engine-change/" rel="bookmark">Why a new <I>memory</I> engine may change everything ?</a></li><li><a href="http://www.mysqlplus.net/2011/10/28/words-pluk2011/" rel="bookmark">Words about PLUK2011</a></li><li><a href="http://www.mysqlplus.net/2011/12/02/monitoring-monitoring-tools-monyog-inside/" rel="bookmark">Monitoring your monitoring tools (MONyog inside) !</a></li><li><a href="http://www.mysqlplus.net/2011/09/22/percona-live/" rel="bookmark">[UPDATED] Why you should go to Percona Live (London) ?</a></li><li><a href="http://www.mysqlplus.net/2011/07/06/mpstat-replace-vmstat/" rel="bookmark">Does <i>mpstat</i> can replace <i>vmstat</i> ?</a></li></ul></div><div>
<a href="http://feeds.feedburner.com/~ff/mysqlplusrss?a=85PRjYkfCIM:VfxG9oKLf8I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/mysqlplusrss?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/mysqlplusrss?a=85PRjYkfCIM:VfxG9oKLf8I:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/mysqlplusrss?i=85PRjYkfCIM:VfxG9oKLf8I:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/mysqlplusrss?a=85PRjYkfCIM:VfxG9oKLf8I:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/mysqlplusrss?i=85PRjYkfCIM:VfxG9oKLf8I:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/mysqlplusrss?a=85PRjYkfCIM:VfxG9oKLf8I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/mysqlplusrss?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/mysqlplusrss/~4/85PRjYkfCIM" height="1" width="1" /><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=31501&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=31501&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2012/01/05/reloaded-vote-for-mysql-community-awards-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>High Performance PHP Session Storage on Scale</title>
		<link>http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=high-performance-php-session-storage-on-scale</link>
		<comments>http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html#comments</comments>
		<pubDate>Thu, 17 Nov 2011 15:34:00 +0000</pubDate>
		<dc:creator>Johannes Schl&#252;ter</dc:creator>
				<category><![CDATA[memcache]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[MySQL Cluster]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php session]]></category>
		<category><![CDATA[scalability]]></category>

		<guid isPermaLink="false">http://schlueters.de/blog/archives/164-guid.html</guid>
		<description><![CDATA[One of the great things about the HTTP protocol, besides status code 418, is that it's stateless. A web server therefore is not required to store any information on the user or allocate resources for a user after the individual request is done. By that a single web server can handle many many many different users easily, and well if it can't anymore one can add a new server, put a simple load balancer in front and scale out. Each of those web servers then handles its requests without the need for communication which leads to linear scaling (assuming network provides enough bandwidth etc.). 
Now the Web isn't used for serving static documents only anymore but we have all these fancy web apps. And those applications often have the need for a state. The most trivial information they need is the current user. HTTP is a great protocol and provides a way to do authentication which works well with its stateless nature - unfortunately this authentication is implemented badly in current clients. Ugly popups, no logout button, ... I don't have to tell more I think. For having nicer login systems people want web forms. Now the stateless nature of HTTP is a problem: The user may login and then browse around. On later requests it should still be known who that user is - with a custom HTML form based login alone this is not possible. A solution might be cookies. At least one might think so for a second. But setting a cookie &#34;this is an authorized user&#34; alone doesn't make sense as it could easily be faked. Better is to simply store a random identifier in a cookie and then keep a state information on the server. Then all session data is protected and only the user who knows this random identifier is authenticated. If this identifier is wisely chosen and hard to guess this works quite well. Luckily this is a mostly PHP- and MySQL-focused blog and as PHP is a system for building web applications this functionality is part of the core language: The PHP session module. 
The session module, which was introduced in PHP 4, partly based on work on the famous phplib library, is quite a fascinating piece of code. It is open and extendable in so many directions but still so simple to use that everybody uses it, often newcomers learn about it on their first day in PHP land. Of course you can not only store the information whether the user is logged in but cache some user-specific data or keep the state on some transactions by the user, like multi-page forms or such. 
In its default configuration session state will be stored on the web server's file system. Each session's data in its own file in serialized form. If the filesystem does some caching or one uses a ramdisk or something this can be quite efficient. But as we suddenly have a state on the web server we can't scale as easily as before anymore: If we add a new server and then route a user with an existing session to the new server all the session data won't be there. That is bad. This is often solved by a configuration of the load balancer to route all requests from the same user to the same web server. In some cases this works quite ok, but it is often seen that this might cause problems. Let's assume you want to take a machine down for maintenance. All sessions there will die. Or imagine there's a bunch of users who do complex and expensive tasks - then one of your servers will have a hard time, giving these users bad response times which feels like bad service, even though your other systems are mostly idle. 
A nice solution for this would be to store the sessions in a central repository which can be accessed from all web servers. Continue reading "High Performance PHP Session Storage on Scale"]]></description>
			<content:encoded><![CDATA[<p>One of the great things about the HTTP protocol, besides <a href="http://tools.ietf.org/html/rfc2324">status code 418</a>, is that it's stateless. A web server therefore is not required to store any information on the user or allocate resources for a user after the individual request is done. By that a single web server can handle many many many different users easily, and well if it can't anymore one can add a new server, put a simple load balancer in front and scale out. Each of those web servers then handles its requests without the need for communication which leads to linear scaling (assuming network provides enough bandwidth etc.).</p> 
<p>Now the Web isn't used for serving static documents only anymore but we have all these fancy web apps. And those applications often have the need for a state. The most trivial information they need is the current user. HTTP is a great protocol and provides a way to do authentication which works well with its stateless nature - unfortunately this authentication is implemented badly in current clients. Ugly popups, no logout button, ... I don't have to tell more I think. For having nicer login systems people want web forms. Now the stateless nature of HTTP is a problem: The user may login and then browse around. On later requests it should still be known who that user is - with a custom HTML form based login alone this is not possible. A solution might be cookies. At least one might think so for a second. But setting a cookie &quot;this is an authorized user&quot; alone doesn't make sense as it could easily be faked. Better is to simply store a random identifier in a cookie and then keep a state information on the server. Then all session data is protected and only the user who knows this random identifier is authenticated. If this identifier is wisely chosen and hard to guess this works quite well. Luckily this is a mostly PHP- and MySQL-focused blog and as PHP is a system for building web applications this functionality is part of the core language: The <a href="http://php.net/session">PHP session module</a>.</p> 
<p>The session module, which was introduced in PHP 4, partly based on work on the famous phplib library, is quite a fascinating piece of code. It is open and extendable in so many directions but still so simple to use that everybody uses it, often newcomers learn about it on their first day in PHP land. Of course you can not only store the information whether the user is logged in but cache some user-specific data or keep the state on some transactions by the user, like multi-page forms or such.<br /></p> 
<p>In its default configuration session state will be stored on the web server's file system. Each session's data in its own file in serialized form. If the filesystem does some caching or one uses a ramdisk or something this can be quite efficient. But as we suddenly have a state on the web server we can't scale as easily as before anymore: If we add a new server and then route a user with an existing session to the new server all the session data won't be there. That is bad. This is often solved by a configuration of the load balancer to route all requests from the same user to the same web server. In some cases this works quite ok, but it is often seen that this might cause problems. Let's assume you want to take a machine down for maintenance. All sessions there will die. Or imagine there's a bunch of users who do complex and expensive tasks - then one of your servers will have a hard time, giving these users bad response times which feels like bad service, even though your other systems are mostly idle.</p> 
<p>A nice solution for this would be to store the sessions in a central repository which can be accessed from all web servers.</p> <br /><a href="http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html#extended">Continue reading "High Performance PHP Session Storage on Scale"</a><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=30959&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=30959&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2011/11/17/high-performance-php-session-storage-on-scale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Cluster 7.2 (DMR2): NoSQL, Key/Value, Memcached</title>
		<link>http://blogs.oracle.com/MySQL/entry/mysql_cluster_7_2_dmr2?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql-cluster-7-2-dmr2-nosql-keyvalue-memcached-2</link>
		<comments>http://blogs.oracle.com/MySQL/entry/mysql_cluster_7_2_dmr2#comments</comments>
		<pubDate>Fri, 07 Oct 2011 05:27:03 +0000</pubDate>
		<dc:creator>MySQL Community</dc:creator>
				<category><![CDATA[auto-sharding]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[HA]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[MySQL Cluster]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://blogs.oracle.com/MySQL/entry/mysql_cluster_7_2_dmr2</guid>
		<description><![CDATA[70x Higher Performance, Cross Data
Center Scalability and New NoSQL Interface 
  Its
been an exciting week for all involved with MySQL Cluster, with the
announcement of the second Development Milestone Release (7.2.1) at Oracle Open
World. Highlights include: 
  - Enabling next generation
web services: 70x higher complex query performance, native memcached API and
integration with the latest MySQL 5.5 server 
  - Enhancing cross data
scalability: new multi-site clustering and enhanced active/active replication 
  - Simplified provisioning: consolidated user
privileges. 
  You can download the DMR for evaluation now from: http://dev.mysql.com/downloads/cluster/&#160;(select Development Milestone Release tab). 
   
    You
can also read up on the detail of each of these features in the new article posted
at the MySQL Developer Zone. In this blog, I’ll summarize the main
parts of the announcement. 
      
   
  70x Higher Performance with
Adaptive Query Localization (AQL) 
  Previewed as part of the first MySQL Cluster DMR,
AQL is
enabled by a new Index Statistics function that allows the SQL optimizer to
build a better execution plan for each query. 
    
    
  As a result, JOIN operations are pushed
down to the data nodes where the query
executes in parallel on local copies of the data. A merged result set is then
sent back to the MySQL Server, significantly enhancing performance by reducing
network trips. 
    
    
  Take a look at how this is used by a
web-based content management to increase performance by 70x 
    
    
  Adaptive Query Localization enables MySQL
Cluster to better serve those use-cases that have the need to run real-time
analytics across live data sets, along with high throughput OLTP operations.
Examples include recommendations engines and clickstream analysis in web
applications, pre-pay billing promotions in mobile telecoms networks or fraud
detection in payment systems. 
    
    
    
  New NoSQL Interface and
Schema-less Storage with the memcached API 
  The memcached interface released as an Early Access project with the first
MySQL Cluster DMR is now integrated directly into the MySQL Cluster 7.2.1
trunk, enabling simpler evaluation. 
  The
popularity of Key/Value stores has increased dramatically. With MySQL Cluster and the new memcached API,
you have all the benefits of an ACID RDBMS, combined with the performance
capabilities of Key/Value store. 
  By
default, every Key / Value is written to the same table with each Key / Value
pair stored in a single row – thus allowing schema-less data storage.
Alternatively, the developer can define a key-prefix so that each value is
linked to a pre-defined column in a specific table. 
  Of course if the application needs to access the same data through SQL
then developers can map key prefixes to existing table columns, enabling Memcached access
to schema-structured data already stored in MySQL Cluster.  
  You
can read more about the design goals and implementation of the memcached API
for MySQL Cluster here. 
    
    
  Integration with MySQL 5.5 
  MySQL
Cluster 7.2.1 is integrated with MySQL Server 5.5, providing binary
compatibility to existing MySQL Server deployments. Users can now fully exploit
the latest capabilities of both the InnoDB and MySQL Cluster storage engines
within a single application.  
  Users
simply install the new MySQL Cluster binary including the MySQL 5.5 release,
restart the server and immediate have access to both InnoDB and MySQL Cluster! 
    
    
  Enhancing Cross Data Center
Scalability: Simplified Active / Active Replication 
  MySQL Cluster has long offered Geographic Replication, distributing clusters
to remote data centers to reduce the affects of geographic latency by pushing
data closer to the user, as well as providing a capability for disaster
recovery.  
  Geographic replication has always been designed around an Active /
Active technology, so if applications are attempting to update the same row on
different clusters at the same time, the conflict can be detected and
resolved. With the release of MySQL Cluster
7.2.1, implementing Active / Active replication has become a whole lot
simpler. Developers no longer need to
implement and manage timestamp columns within their applications. Also
rollbacks can be made to whole transactions rather than just individual
operations. 
    
  You can learn more here.  
    
    
  Enhancing Cross Data Center
Scalability: Multi-Site Clustering 
  MySQL Cluster 7.2.1 DMR provides a new option for cross data center
scalability – multi-site clustering. For
the first time splitting data nodes across data centers is a supported
deployment option.  
  Improvements to MySQL Cluster’s heartbeating mechanism with a new “ConnectivityCheckPeriod”
parameter enables greater resilience to temporary latency spikes on a WAN,
thereby maintaining operation of the cluster.   
  With this deployment model, users can synchronously replicate updates
between data centers without needing conflict detection and resolution, and
automatically failover between those sites in the event of a node failure.   
  Users
need to characterize their network bandwidth and latencies, and observe best
practices in configuring both their network environment and Cluster. More
guidance is available here. 
    
    
  User
Privilege Consolidation 
  User
privilege tables are now consolidated into the data nodes and centrally
accessible by all MySQL servers accessing the cluster.  
  Previously the privilege tables were local to each MySQL server, meaning
users and their associated privileges had to be managed separately on each
server. By consolidating privilege data, users need only be defined once and
managed centrally, saving Systems Administrators significant effort and
reducing cost of operations. 
    
    
  Summary 
  The MySQL Cluster 7.2.1 DMR enables new classes of use-cases to benefit
from web-scale performance with carrier-grade availability.  
  You can download the DMR for evaluation now from:&#160;http://dev.mysql.com/downloads/cluster/&#160;(select
Development Milestone Release tab). 
  You can learn more about the MySQL Cluster architecture from our Guide
to scaling web databases.&#160;  
  Let us know what you think of these enhancements directly in comments of
this or the associated blogs. We look forward to working with the community to
perfect these new features.]]></description>
			<content:encoded><![CDATA[<!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:Revision>0</o:Revision>
  <o:TotalTime>0</o:TotalTime>
  <o:Pages>1</o:Pages>
  <o:Words>977</o:Words>
  <o:Characters>5569</o:Characters>
  <o:Company>Homework</o:Company>
  <o:Lines>46</o:Lines>
  <o:Paragraphs>13</o:Paragraphs>
  <o:CharactersWithSpaces>6533</o:CharactersWithSpaces>
  <o:Version>14.0</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]--> <!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInval>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>JA</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
   <w:UseFELayout/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="276">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--> <!--[if gte mso 10]>

<![endif]--> <!--StartFragment--> 
  <p><b><span lang="EN-US">70x Higher Performance, Cross Data
Center Scalability and New NoSQL Interface</span></b></p> 
  <p><span lang="EN-US">Its
been an exciting week for all involved with MySQL Cluster, with the
announcement of the <a href="http://dev.mysql.com/tech-resources/articles/mysql-cluster-7.2.html">second Development Milestone Release (7.2.1)</a> at Oracle Open
World.<span> </span>Highlights include:</span></p> 
  <p><!--[if !supportLists]--><span lang="EN-US"><span>-<span> </span></span></span><!--[endif]--><b><span lang="EN-US">Enabling next generation
web services:</span></b><span lang="EN-US"> 70x higher complex query performance, native memcached API and
integration with the latest MySQL 5.5 server<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN-US"><span>-<span> </span></span></span><!--[endif]--><b><span lang="EN-US">Enhancing cross data
scalability:</span></b><span lang="EN-US"> new multi-site clustering and enhanced active/active replication<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN-US"><span>-<span> </span></span></span><!--[endif]--><b><span lang="EN-US">Simplified provisioning:</span></b><span lang="EN-US"> consolidated user
privileges.</span></p> 
  <p><span>You can download the DMR for evaluation now from:</span><span> <a href="http://dev.mysql.com/downloads/cluster/">http://dev.mysql.com/downloads/cluster/</a>&nbsp;(select Development Milestone Release tab).</span></p> 
  <div> 
    <p><span>You
can also read up on the detail of each of these features in the new article posted
at the <a href="http://dev.mysql.com/tech-resources/articles/mysql-cluster-7.2.html">MySQL Developer Zone</a>. In this blog, I’ll summarize the main
parts of the announcement.</span></p> 
    <p> </p> 
  </div> 
  <p><b><span>70x Higher Performance with
Adaptive Query Localization (AQL)<o:p /></span></b></p> 
  <p><span>Previewed as part of the <a href="http://dev.mysql.com/tech-resources/articles/mysql-cluster-labs-dev-milestone-release.html">first MySQL Cluster DMR</a>,
</span><span>AQL is
enabled by a new Index Statistics function that allows the SQL optimizer to
build a better execution plan for each query.</span></p> 
  <p> </p> 
  <p><span lang="EN-US"><o:p> </o:p></span></p> 
  <p><span lang="EN-US">As a result, JOIN operations are pushed
down to the data nodes </span><span>where the query
executes in parallel on local copies of the data. A merged result set is then
sent back to the MySQL Server, significantly enhancing performance by reducing
network trips.</span></p> 
  <p> </p> 
  <p><span><o:p> </o:p></span></p> 
  <p><span><a href="http://www.clusterdb.com/mysql-cluster/70x-faster-joins-with-aql-in-mysql-cluster-7-2-dmr/">Take a look</a> at how this is used by a
web-based content management to increase performance by 70x</span></p> 
  <p><span lang="EN-US"><o:p> </o:p></span></p> 
  <p> </p> 
  <p><span>Adaptive Query Localization enables MySQL
Cluster to better serve those use-cases that have the need to run real-time
analytics across live data sets, along with high throughput OLTP operations.
Examples include recommendations engines and clickstream analysis in web
applications, pre-pay billing promotions in mobile telecoms networks or fraud
detection in payment systems.</span></p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p><b><span>New NoSQL Interface and
Schema-less Storage with the memcached API<o:p /></span></b></p> 
  <p><span>The memcached interface released as an Early Access project with the first
MySQL Cluster DMR is now integrated directly into the MySQL Cluster 7.2.1
trunk, enabling simpler evaluation.</span></p> 
  <p><span lang="EN-US">The
popularity of Key/Value stores has increased dramatically.<span> </span>With MySQL Cluster and the new memcached API,
you have all the benefits of an ACID RDBMS, combined with the performance
capabilities of Key/Value store.</span></p> 
  <p><span lang="EN-US">By
default, every Key / Value is written to the same table with each Key / Value
pair stored in a single row – thus allowing schema-less data storage.
Alternatively, the developer can define a key-prefix so that each value is
linked to a pre-defined column in a specific table.</span></p> 
  <p><span>Of course if the application needs to access the same data through SQL
then developers can map key prefixes to existing table columns, </span><span lang="EN-US">enabling Memcached access
to schema-structured data already stored in MySQL Cluster.</span><span> </span></p> 
  <p><span lang="EN-US">You
can read more about the design goals and implementation of the memcached API
for MySQL Cluster <a href="http://www.clusterdb.com/mysql-cluster/scalabale-persistent-ha-nosql-memcache-storage-using-mysql-cluster/">here.</a></span></p> 
  <p> </p> 
  <p> </p> 
  <p><b><span>Integration with MySQL 5.5<o:p /></span></b></p> 
  <p><span lang="EN-US">MySQL
Cluster 7.2.1 is integrated with MySQL Server 5.5, providing binary
compatibility to existing MySQL Server deployments. Users can now fully exploit
the latest capabilities of both the InnoDB and MySQL Cluster storage engines
within a single application.<span> </span></span></p> 
  <p><span lang="EN-US">Users
simply install the new MySQL Cluster binary including the MySQL 5.5 release,
restart the server and immediate have access to both InnoDB and MySQL Cluster!</span></p> 
  <p> </p> 
  <p> </p> 
  <p><b><span>Enhancing Cross Data Center
Scalability: Simplified Active / Active Replication<o:p /></span></b></p> 
  <p><span>MySQL Cluster has long offered Geographic Replication, distributing clusters
to remote data centers to reduce the affects of geographic latency by pushing
data closer to the user, as well as providing a capability for disaster
recovery.</span><span> </span></p> 
  <p><span>Geographic replication has always been designed around an Active /
Active technology, so if applications are attempting to update the same row on
different clusters at the same time, the conflict can be detected and
resolved.<span> </span>With the release of MySQL Cluster
7.2.1, implementing Active / Active replication has become a whole lot
simpler.<span> </span>Developers no longer need to
implement and manage timestamp columns within their applications. Also
rollbacks can be made to whole transactions rather than just individual
operations.</span></p> 
  <p> </p> 
  <p>You can learn more <a href="http://messagepassing.blogspot.com/2011/10/eventual-consistency-with-mysql.html">here.</a> </p> 
  <p> </p> 
  <p> </p> 
  <p><b><span>Enhancing Cross Data Center
Scalability: Multi-Site Clustering<o:p /></span></b></p> 
  <p><span>MySQL Cluster 7.2.1 DMR provides a new option for cross data center
scalability – multi-site clustering.<span> </span>For
the first time splitting data nodes across data centers is a supported
deployment option.</span><span> </span></p> 
  <p><span>Improvements to MySQL Cluster’s heartbeating mechanism with a new “</span><span lang="EN-US">ConnectivityCheckPeriod”
parameter</span><span> enables greater resilience to temporary latency spikes on a WAN,
thereby maintaining operation of the cluster.<span> </span></span><span> </span></p> 
  <p><span>With this deployment model, users can synchronously replicate updates
between data centers without needing conflict detection and resolution, and
automatically failover between those sites in the event of a node failure.<span> </span></span><span> </span></p> 
  <p><span lang="EN-US">Users
need to characterize their network bandwidth and latencies, and observe best
practices in configuring both their network environment and Cluster. More
guidance is available <a href="http://blogs.oracle.com/MySQL/entry/synchronously_replicating_databases_across_data">here.</a></span></p> 
  <p> </p> 
  <p> </p> 
  <p><b><span>User
Privilege Consolidation<o:p /></span></b></p> 
  <p><span lang="EN-US">User
privilege tables are now consolidated into the data nodes and centrally
accessible by all MySQL servers accessing the cluster.</span><span> </span></p> 
  <p><span>Previously the privilege tables were local to each MySQL server, meaning
users and their associated privileges had to be managed separately on each
server. By consolidating privilege data, users need only be defined once and
managed centrally, saving Systems Administrators significant effort and
reducing cost of operations.</span></p> 
  <p> </p> 
  <p> </p> 
  <p><b><span>Summary<o:p /></span></b></p> 
  <p><span>The MySQL Cluster 7.2.1 DMR enables new classes of use-cases to benefit
from web-scale performance with carrier-grade availability.</span><span> </span></p> 
  <p><span>You can download the DMR for evaluation now from:&nbsp;</span><span><a href="http://dev.mysql.com/downloads/cluster/">http://dev.mysql.com/downloads/cluster/</a>&nbsp;(select
Development Milestone Release tab).</span></p> 
  <p><span>You can learn more about the MySQL Cluster architecture from our <a href="http://mysql.com/why-mysql/white-papers/mysql_wp_scaling_web_databases.php">Guide
to scaling web databases</a>.&nbsp;</span><span> </span></p> 
  <p><span>Let us know what you think of these enhancements directly in comments of
this or the associated blogs. We look forward to working with the community to
perfect these new features.<o:p /></span></p> 
  <p><span><o:p> </o:p></span></p> 
  <p><span lang="EN-US"><o:p> </o:p></span></p> 
  <p><span lang="EN-US"><o:p> </o:p></span></p> 
  <p><span lang="EN-US"><o:p> </o:p></span></p> 
  <p><span lang="EN-US"><o:p> </o:p></span></p> <!--EndFragment--><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=30235&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=30235&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2011/10/07/mysql-cluster-7-2-dmr2-nosql-keyvalue-memcached-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scaling Web Databases, Part 3: SQL &amp; NoSQL Data Access</title>
		<link>http://blogs.oracle.com/MySQL/entry/scaling_web_databases_part_3?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scaling-web-databases-part-3-sql-nosql-data-access</link>
		<comments>http://blogs.oracle.com/MySQL/entry/scaling_web_databases_part_3#comments</comments>
		<pubDate>Fri, 05 Aug 2011 10:16:08 +0000</pubDate>
		<dc:creator>Oracle MySQL Group</dc:creator>
				<category><![CDATA[Cluster]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[MySQL Cluster]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[not-only-sql]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blogs.oracle.com/MySQL/entry/scaling_web_databases_part_3</guid>
		<description><![CDATA[Supporting successful services on the web means scaling your back-end databases across multiple dimensions. This blog focuses on scaling access methods to your data using SQL and/or NoSQL interfaces. 
    
  In Part 1 of
the blog series ,
I discussed scaling database performance using auto-sharding and
active/active geographic replication in MySQL Cluster to enable applications to
scale both within and across data centers. &#160; 
  In
Part 2,
I discussed the need to scale operational agility to keep pace with demand, which includes being able to add capacity and performance to the database, and
to evolve the schema – all without downtime. 
  So
in this blog I want to explore another dimension to scalability - &#160;how multiple interfaces can be
used to scale access to the database, enabling users to simultaneously serve
multiple applications, each with distinct access requirements. 
  Data
Access Interfaces to MySQL Cluster 
  MySQL Cluster automatically shards tables across pools of commodity data nodes, rather than store those tables in a single MySQL Server. It is therefore able to present multiple interfaces to the database, giving developers a
choice between: 
    
  - S &#160; &#160;- &#160;SQL for complex reporting-type queries; 
  - S &#160; &#160;- &#160;Simple Key/Value interfaces bypassing the SQL layer
for blazing fast reads &#38; writes; 
  - S &#160; &#160;- &#160;Real-time interfaces for micro-second latency, again bypassing the SQL layer 
    
    
  With this choice of interfaces, developers are
free to work in their own preferred environments, enhancing productivity and
agility and enabling them to innovate faster. 
    
  SQL or NoSQL - Selecting the Right Interface 
  The following chart shows all of
the access methods available to the database. The native API for MySQL Cluster is the C++ based NDB API. All other interfaces access the data through
the NDB API. 
         
  At the extreme right hand side
of the chart, an application has embedded the NDB API library enabling it to
make native C++ calls to the database, and therefore delivering the lowest
possible latency. 
    
  On the extreme left hand side of
the chart, MySQL presents a standard SQL interface to the data nodes, and
provides connectivity to all of the standard MySQL connectors including: 
    
  - Common web development languages and frameworks, i.e.
PHP, Perl, Python, Ruby, Ruby on Rails, Spring, Django, etc; 
  - JDBC (for additional connectivity into ORMs including
EclipseLink, Hibernate, etc) 
  - .NET 
  - ODBC 
    
    
  Whichever API is chosen for an
application, it is important to emphasize that all of these SQL and NoSQL
access methods can be used simultaneously, across the same data set, to provide
the ultimate in developer flexibility. Therefore, MySQL Cluster maybe
supporting any combination of the following services, in real-time: 
    
  - Relational queries using the SQL API; 
  - Key/Value-based web services using the REST/JSON and
memcached APIs; 
  - Enterprise applications with the ClusterJ and JPA APIs; 
  - Real-time web services (i.e. presence and location based)
using the NDB API. 
    
    
  The following figure aims to
summarize the capabilities and use-cases for each API. 
   
    
    
    
  Schema-less Data Store with the memcached API 
  As part of the MySQL
Cluster 7.2 Development Milestone Release , Oracle announced the preview of
native memcached Key/Value API support for MySQL Cluster  enabling direct
access to the database from the memcached API without passing through the SQL
layer.  You can read more about the implementation
and how to get going with it in this excellent post from Andrew Morgan. 
  The following image shows the implementation of the memcached API for MySQL Cluster&#160; 
       
  Implementation
is simple - the application sends read and write requests to the memcached process
(using the standard memcached API). This in turn invokes the Memcached Driver
for NDB (which is part of the same process), which in turn calls the NDB API
for very quick access to the data held in MySQL Cluster’s data nodes.  
    
  The solution
has been designed to be very flexible, allowing the application architect to
find a configuration that best fits their needs. It is possible to co-locate
the memcached API in either the data nodes or application nodes, or
alternatively within a dedicated memcached layer.  
  The benefit of this
approach is that users can configure behavior on a per-key-prefix basis
(through tables in MySQL Cluster) and the application doesn’t have to care – it
just uses the memcached API and relies on the software to store data in the
right place(s) and to keep everything synchronized. 
  By default, every Key
/ Value is written to the same table with each Key / Value pair stored in a
single row – thus allowing schema-less data storage. Alternatively, the
developer can define a key-prefix so that each value is linked to a pre-defined
column in a specific table. 
  Of course if the
application needs to access the same data through SQL then developers can map
key prefixes to existing table columns, enabling Memcached access to
schema-structured data already stored in MySQL Cluster. 
  Summary 
  MySQL Cluster provides developers and architects with a huge amount of flexibility in accessing their persistent data stores - a reflection that one size no longer fits all in the world of web services and databases. 
  You can learn more about this, and the other dimensions to scaling web databases in our new Guide.&#160; 
  As ever, let me know your thoughts in the comments below.&#160;]]></description>
			<content:encoded><![CDATA[<!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:Revision>0</o:Revision>
  <o:TotalTime>0</o:TotalTime>
  <o:Pages>1</o:Pages>
  <o:Words>281</o:Words>
  <o:Characters>1602</o:Characters>
  <o:Company>Homework</o:Company>
  <o:Lines>13</o:Lines>
  <o:Paragraphs>3</o:Paragraphs>
  <o:CharactersWithSpaces>1880</o:CharactersWithSpaces>
  <o:Version>14.0</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]--> <!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInval>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>JA</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
   <w:UseFELayout/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="276">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--> <!--[if gte mso 10]>

<![endif]--> <!--StartFragment--> 
  <p> </p> 
  <p>Supporting successful services on the web means scaling your back-end databases across multiple dimensions. This blog focuses on scaling access methods to your data using SQL and/or NoSQL interfaces.</p> 
  <p> </p> 
  <p><span lang="EN">In <a href="http://blogs.oracle.com/MySQL/entry/scaling_web_databases_auto_sharding">Part 1</a> of
the blog series ,
I discussed scaling database performance </span><span>using auto-sharding and
active/active geographic replication in <a href="http://mysql.com/products/cluster/">MySQL Cluster</a> to enable applications to
scale both within and across data centers. &nbsp;</span></p> 
  <p align="left"><span>In
<a href="http://blogs.oracle.com/MySQL/entry/scaling_web_databases_adding_nodes">Part 2</a>,
I discussed the need to scale operational agility to keep pace with demand, which includes being able to add capacity and performance to the database, and
to evolve the schema – all without downtime.</span></p> 
  <p align="left"><span>So
in this blog I want to explore another dimension to scalability - &nbsp;how multiple interfaces can be
used to scale access to the database, enabling users to simultaneously serve
multiple applications, each with distinct access requirements.</span></p> 
  <p><b><span lang="EN">Data
Access Interfaces to MySQL Cluster<o:p /></span></b></p> 
  <p><span lang="EN">MySQL Cluster automatically shards tables across pools of commodity data nodes, rather than store those tables in a single MySQL Server. It is therefore able to present multiple interfaces to the database, giving d</span>evelopers a
choice between:</p> 
  <p> </p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN-US">S &nbsp; &nbsp;- &nbsp;SQL for complex reporting-type queries;</span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN-US">S &nbsp; &nbsp;- &nbsp;Simple Key/Value interfaces bypassing the SQL layer
for blazing fast reads &amp; writes;</span></p> 
  <p><span lang="EN"><span>-<span> </span></span></span><span lang="EN-US">S &nbsp; &nbsp;- &nbsp;Real-time interfaces for micro-second latency, again bypassing the SQL layer</span></p> 
  <p> </p> 
  <p><span lang="EN"><o:p> </o:p></span></p> 
  <p><span lang="EN">With this choice of interfaces, </span><span lang="EN-US">developers are
free to work in their own preferred environments, enhancing productivity and
agility and enabling them to innovate faster.</span></p> 
  <p> </p> 
  <p><b>SQL or NoSQL - Selecting the Right Interface</b></p> 
  <p><span lang="EN">The following chart shows all of
the access methods available to the database. The native API for MySQL Cluster is the C++ based NDB API. All other interfaces access the data through
the NDB API.</span></p> 
  <p> <img src="http://blogs.oracle.com/MySQL/resource/cluster_apis.jpg" /> </p> <!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:Revision>0</o:Revision>
  <o:TotalTime>0</o:TotalTime>
  <o:Pages>1</o:Pages>
  <o:Words>190</o:Words>
  <o:Characters>1089</o:Characters>
  <o:Company>Homework</o:Company>
  <o:Lines>9</o:Lines>
  <o:Paragraphs>2</o:Paragraphs>
  <o:CharactersWithSpaces>1277</o:CharactersWithSpaces>
  <o:Version>14.0</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]--> <!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInval>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>JA</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
   <w:UseFELayout/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="276">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--> <!--[if gte mso 10]>

<![endif]--> <!--StartFragment--> 
  <p><span lang="EN">At the extreme right hand side
of the chart, an application has embedded the NDB API library enabling it to
make native C++ calls to the database, and therefore delivering the lowest
possible latency.<o:p /></span></p> 
  <p><span lang="EN"><o:p> </o:p></span></p> 
  <p><span lang="EN">On the extreme left hand side of
the chart, MySQL presents a standard SQL interface to the data nodes, and
provides connectivity to all of the standard MySQL connectors including:</span></p> 
  <p> </p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">Common web development languages and frameworks, i.e.
PHP, Perl, Python, Ruby, Ruby on Rails, Spring, Django, etc;<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">JDBC (for additional connectivity into ORMs including
EclipseLink, Hibernate, etc)<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">.NET<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">ODBC</span></p> 
  <p> </p> 
  <p><span lang="EN"><o:p> </o:p></span></p> 
  <p><span lang="EN">Whichever API is chosen for an
application, it is important to emphasize that all of these SQL and NoSQL
access methods can be used simultaneously, across the same data set, to provide
the ultimate in developer flexibility. Therefore, MySQL Cluster maybe
supporting any combination of the following services, in real-time:</span></p> 
  <p> </p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">Relational queries using the SQL API;<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">Key/Value-based web services using the REST/JSON and
memcached APIs;<o:p /></span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">Enterprise applications with the ClusterJ and JPA APIs;</span></p> 
  <p><!--[if !supportLists]--><span lang="EN"><span>-<span> </span></span></span><!--[endif]--><span lang="EN">Real-time web services (i.e. presence and location based)
using the NDB API.<o:p /></span></p> 
  <p><span lang="EN"><o:p> </o:p></span></p> 
  <p> </p> 
  <p><span lang="EN">The following figure aims to
summarize the capabilities and use-cases for each API.</span></p> 
  <p><img src="http://blogs.oracle.com/MySQL/resource/Cluster_api_cheatsheet.jpg" /></p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p><b>Schema-less Data Store with the memcached API</b></p> 
  <p>As part of the <a href="http://dev.mysql.com/tech-resources/articles/mysql-cluster-labs-dev-milestone-release.html">MySQL
Cluster 7.2 Development Milestone Release</a> , Oracle announced the preview of
native memcached Key/Value API support for MySQL Cluster <span> </span><span lang="EN-US">enabling direct
access to the database from the memcached API without passing through the SQL
layer. <span> </span>You can read more about the implementation
and how to get going with it in this <a href="http://www.clusterdb.com/mysql-cluster/scalabale-persistent-ha-nosql-memcache-storage-using-mysql-cluster/">excellent post</a><span> </span></span>from Andrew Morgan.</p> 
  <p>The following image shows the implementation of the memcached API for MySQL Cluster&nbsp;</p> 
  <p><img src="http://blogs.oracle.com/MySQL/resource/cluster_memcached.jpg" /><br /></p> <!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:Revision>0</o:Revision>
  <o:TotalTime>0</o:TotalTime>
  <o:Pages>1</o:Pages>
  <o:Words>210</o:Words>
  <o:Characters>1200</o:Characters>
  <o:Company>Homework</o:Company>
  <o:Lines>10</o:Lines>
  <o:Paragraphs>2</o:Paragraphs>
  <o:CharactersWithSpaces>1408</o:CharactersWithSpaces>
  <o:Version>14.0</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]--> <!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInval>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>JA</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
   <w:UseFELayout/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="276">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="0" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="0" Name="footnote text"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--> <!--[if gte mso 10]>

<![endif]--> <!--StartFragment--> 
  <p align="left">Implementation
is simple - the application sends read and write requests to the memcached process
(using the standard memcached API). This in turn invokes the Memcached Driver
for NDB (which is part of the same process), which in turn calls the NDB API
for very quick access to the data held in MySQL Cluster’s data nodes. <o:p /></p> 
  <p align="left"><o:p> </o:p></p> 
  <p align="left">The solution
has been designed to be very flexible, allowing the application architect to
find a configuration that best fits their needs. It is possible to co-locate
the memcached API in either the data nodes or application nodes, or
alternatively within a dedicated memcached layer.<span> </span><o:p /></p> 
  <p align="left">The benefit of this
approach is that users can configure behavior on a per-key-prefix basis
(through tables in MySQL Cluster) and the application doesn’t have to care – it
just uses the memcached API and relies on the software to store data in the
right place(s) and to keep everything synchronized.</p> 
  <p align="left">By default, every Key
/ Value is written to the same table with each Key / Value pair stored in a
single row – thus allowing schema-less data storage. Alternatively, the
developer can define a key-prefix so that each value is linked to a pre-defined
column in a specific table.</p> 
  <p align="left">Of course if the
application needs to access the same data through SQL then developers can map
key prefixes to existing table columns, <span lang="EN-US">enabling Memcached access to
schema-structured data already stored in MySQL Cluster.</span></p> 
  <p align="left"><b>Summary</b></p> 
  <p>MySQL Cluster provides developers and architects with a huge amount of flexibility in accessing their persistent data stores - a reflection that one size no longer fits all in the world of web services and databases.</p> 
  <p>You can learn more about this, and the other dimensions to scaling web databases in our new<a href="http://mysql.com/why-mysql/white-papers/mysql_wp_scaling_web_databases.php"> Guide.&nbsp;</a></p> 
  <p>As ever, let me know your thoughts in the comments below.&nbsp;</p> 
  <p><br /></p> 
  <p> </p> <!--EndFragment--> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> 
  <p> </p> <!--EndFragment--><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=29634&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=29634&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2011/08/05/scaling-web-databases-part-3-sql-nosql-data-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Direct access to MySQL Cluster through Memcached API – free webinar</title>
		<link>http://www.clusterdb.com/mysql-cluster/direct-access-to-mysql-cluster-through-memcached-api-free-webinar/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=direct-access-to-mysql-cluster-through-memcached-api-free-webinar&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=direct-access-to-mysql-cluster-through-memcached-api-%25e2%2580%2593-free-webinar</link>
		<comments>http://www.clusterdb.com/mysql-cluster/direct-access-to-mysql-cluster-through-memcached-api-free-webinar/?utm_source=rss&#038;amp;utm_medium=rss&#038;amp;utm_campaign=direct-access-to-mysql-cluster-through-memcached-api-free-webinar#comments</comments>
		<pubDate>Mon, 18 Jul 2011 09:22:02 +0000</pubDate>
		<dc:creator>Andrew Morgan</dc:creator>
				<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[MySQL Cluster]]></category>
		<category><![CDATA[MySQL Cluster 7.2]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://www.clusterdb.com/?p=1901</guid>
		<description><![CDATA[Memcached access to MySQL Cluster
As described in an earlier post Memcached is an extremely popular caching layer used in most big web properties and we&#8217;re adding the ability to access MySQL Cluster directly using the familiar Memcached key-value/NoSQL API without needing to go through the MySQL Server. There is a huge amount of flexibility built into this solution &#8211; including:

Decide what data should be held only in the Memcached server; what should be written straight through to MySQL Cluster and then discarded  and what data should be cached in Memcached but persisted in MySQL Cluster
Where data is held both in Cluster and the Memcached server, they can automatically be kept in sync
By default it&#8217;s completely schema-less, all key-value pairs will be transparently stored in a single table within MySQL Cluster behind the scenes
Can map key-prefixes to columns in MySQL Cluster tables &#8211; allowing simultaneous access to the same data using SQL.

Mat Keep along with JD Duncan (lead developer for this functionality) will be hosting a free webinar on this topic (and I&#8217;ll be helping with the Q&#38;A) on Wednesday (20th July 2011) at 9:00 am Pacific (17:00 UK, 18:00 CET). As always, please register for the event even if you can&#8217;t make this time as you&#8217;ll be sent a link to the recording.]]></description>
			<content:encoded><![CDATA[<div><a href="http://www.clusterdb.com/wp-content/uploads/2011/04/Memcached_layer1.jpg"><img class="size-medium wp-image-1704" title="Memcached_layer" src="http://www.clusterdb.com/wp-content/uploads/2011/04/Memcached_layer1-300x224.jpg" alt="" width="300" height="224" /></a><p>Memcached access to MySQL Cluster</p></div>
<p>As described in an <a href="http://www.clusterdb.com/mysql-cluster/scalabale-persistent-ha-nosql-memcache-storage-using-mysql-cluster/" >earlier post</a> Memcached is an extremely popular caching layer used in most big web properties and we&#8217;re adding the ability to access MySQL Cluster directly using the familiar Memcached key-value/NoSQL API without needing to go through the MySQL Server. There is a huge amount of flexibility built into this solution &#8211; including:</p>
<ul>
<li>Decide what data should be held only in the Memcached server; what should be written straight through to MySQL Cluster and then discarded  and what data should be cached in Memcached but persisted in MySQL Cluster</li>
<li>Where data is held both in Cluster and the Memcached server, they can automatically be kept in sync</li>
<li>By default it&#8217;s completely schema-less, all key-value pairs will be transparently stored in a single table within MySQL Cluster behind the scenes</li>
<li>Can map key-prefixes to columns in MySQL Cluster tables &#8211; allowing simultaneous access to the same data using SQL.</li>
</ul>
<div>Mat Keep along with JD Duncan (lead developer for this functionality) will be hosting a free webinar on this topic (and I&#8217;ll be helping with the Q&amp;A) on Wednesday (20th July 2011) at 9:00 am Pacific (17:00 UK, 18:00 CET). As always, please <a href="http://www.mysql.com/news-and-events/web-seminars/display-643.html?p=twitter" >register for the event</a> even if you can&#8217;t make this time as you&#8217;ll be sent a link to the recording.</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=29395&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=29395&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2011/07/18/direct-access-to-mysql-cluster-through-memcached-api-%e2%80%93-free-webinar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On generating unique IDs using LAST_INSERT_ID() and other tools</title>
		<link>http://code.openark.org/blog/mysql/on-generating-unique-ids-using-last_insert_id-and-other-tools?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=on-generating-unique-ids-using-last_insert_id-and-other-tools</link>
		<comments>http://code.openark.org/blog/mysql/on-generating-unique-ids-using-last_insert_id-and-other-tools#comments</comments>
		<pubDate>Wed, 02 Feb 2011 06:50:02 +0000</pubDate>
		<dc:creator>Shlomi Noach</dc:creator>
				<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[query-cache]]></category>

		<guid isPermaLink="false">http://code.openark.org/blog/?p=3283</guid>
		<description><![CDATA[There&#8217;s a trick for using LAST_INSERT_ID() to generate sequences in MySQL. Quoting from the Manual:


Create a table to hold the sequence counter and initialize               it:
mysql&#62; CREATE TABLE sequence (id INT NOT NULL);
mysql&#62; INSERT INTO sequence VALUES (0);


Use the table to generate sequence numbers like this:
mysql&#62; UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql&#62; SELECT LAST_INSERT_ID();




This trick calls for trouble.
Contention
A customer was using this trick to generate unique session IDs for his JBoss sessions. These IDs would eventually be written back to the database in the form of log events. Business go well, and one day the customer adds three new JBoss servers (doubling the amount of webapps). All of a sudden, nothing works quite as it used to. All kinds of queries take long seconds to complete; load average becomes very high.
A short investigation reveals that a very slight load is enough to make for an accumulation of sequence-UPDATE queries. Dozens of them are active at any given time, waiting for long seconds.
InnoDB or MyISAM both make for poor response times. No wonder! Everyone&#8217;s contending for one lock.
Not just one
Other queries seem to hang as well. Why?
It is easy to forget or let go unnoticed that there are quite a few global locks involved with each query. If query cache is activated, then any query must pass through that cache, holding the query cache mutex. There&#8217;s a global mutex on MyISAM&#8217;s key cache. There&#8217;s one on InnoDB&#8217;s buffer pool (see multiple buffer pools in InnoDB 5.5), albeit less of an overhead. And there&#8217;s the table cache.
When table cache is enabled, any completed query attempts to return file handles to the cache. Any new query attempts to retrieve handles from the cache. While writing to the cache (extracting, adding), the cache is locked. When everyone&#8217;s busy doing the sequence-UPDATE, table cache lock is being abused. Other queries are unable to find the time to squire the lock and get on with their business.
What can be done?
One could try and increase the table_open_cache value. That may help to some extent, and for limited time. But the more requests are made, the quicker the problem surfaces again. When, in fact, reducing the table_open_cache to zero (well, minimum value is 1) can make for a great impact. If there&#8217;s nothing to fight for, everyone just get by on their own.
I know the following is not a scientific explanation, but it hits me as a good comparison: when my daughter brings a friend over, and there&#8217;s a couple of toys, both are happy. A third friend makes for a fight: &#8220;I saw it first! She took it from me! I was holding it!&#8221;. Any parent knows the ultimate solution to this kind of fight: take away the toys, and have them find something else to enjoy doing. OK, sorry for this unscientific display, I had to share my daily stress.
When no table cache is available, a query will go on opening the table by itself, and will not attempt to return the file handle back to the cache. The file handle will simply be destroyed. Now, usually this is not desired. Caching is good. But in our customer&#8217;s case, the cost of not using a table cache was minified by the cost of having everyone fight for the sequence table. Reducing the table cache made for an immediate relaxation of the database, with observable poorer responsiveness on peak times, however way better than with large table cache.
Other tools?
I don&#8217;t consider the above to be a good solution. It&#8217;s just a temporary hack.
I actually don&#8217;t like the LAST_INSERT_ID() trick. Moreover, I don&#8217;t see that it&#8217;s the database&#8217;s job to provide with unique IDs. Let it do relational stuff. If generating IDs is too intensive, let someone else do it.
NoSQL solutions provide such a service. Memcached, redis, MongoDB (and probably more) all provide with increment functions. Check them out.
Application level solutions
I actually use an application level solution to generate unique IDs. I mean, there&#8217;s always GUID(), but it&#8217;s result is just too long. Take a look at the following Java code:

public class Utils {
  private static long lastUniqueNumber = 0;

  public static synchronized long uniqueNumber() {
    long unique = System.currentTimeMillis();
    if (unique &#60;= lastUniqueNumber)
      unique = lastUniqueNumber + 1;
    lastUniqueNumber = unique;
    return unique;
  }
}

Within a Java application this above method returns with unique IDs, up to 1000 per second on average (and it can perform way more than 1000 times per second).
On consequential executions of applications on the same machine one would still expect unique values due to the time-related nature of values. However, computer time changes. It&#8217;s possible that System.currentTimeMillis() would return a value already used in the past.
And, what about two processes running on the same machine at the same time? Or on different machine?
Which is why I use the following combination to generate my unique IDs:

Server ID (much like MySQL&#8217;s server_id parameter). this could be the last byte in the server&#8217;s IP address, or just 4 or 5 bits if not too many players are expected.
Process ID (plain old pid) which I pass to the Java runtime in the form of system properties. Any two processes running on the same machine are assured to have different IDs. To consequently spawned processes will have different IDs. The time it would take to cycle the process IDs is way more than would make for a &#8220;time glitch&#8221; problem as described above
Current time in milliseconds.

If you have to have everything withing 64 bit (BIGINT) then you&#8217;ll have to do bit manipulation, and drop some of the MSB on the milliseconds so as to overwrite with server &#38; process IDs.
If you are willing to have your IDs unique in the bounds of a given time frame (so, for example, a month from now you wouldn&#8217;t mind reusing old IDs), then the problem is significantly easier. You may just use &#8220;day of month&#8221; and &#8220;millis since day start&#8221; and save those precious bits.
Still other?
Please share your solutions below!]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s a <a href="http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id">trick</a> for using <strong>LAST_INSERT_ID()</strong> to generate sequences in MySQL. Quoting from the Manual:</p>
<blockquote>
<ol type="1">
<li>Create a table to hold the sequence counter and initialize               it:
<pre>mysql&gt; <strong><code>CREATE TABLE sequence (id INT NOT NULL);</code></strong>
mysql&gt; <strong><code>INSERT INTO sequence VALUES (0);</code></strong>
</pre>
</li>
<li>Use the table to generate sequence numbers like this:
<pre>mysql&gt; <strong><code>UPDATE sequence SET id=LAST_INSERT_ID(id+1);</code></strong>
mysql&gt; <strong><code>SELECT LAST_INSERT_ID();</code></strong>
</pre>
</li>
</ol>
</blockquote>
<p>This trick calls for trouble.</p>
<h4>Contention</h4>
<p>A customer was using this trick to generate unique session IDs for his JBoss sessions. These IDs would eventually be written back to the database in the form of log events. Business go well, and one day the customer adds three new JBoss servers (doubling the amount of webapps). All of a sudden, nothing works quite as it used to. All kinds of queries take long seconds to complete; load average becomes very high.<span></span></p>
<p>A short investigation reveals that a very slight load is enough to make for an accumulation of sequence-UPDATE queries. Dozens of them are active at any given time, waiting for long seconds.</p>
<p>InnoDB or MyISAM both make for poor response times. No wonder! Everyone&#8217;s contending for one lock.</p>
<h4>Not just one</h4>
<p>Other queries seem to hang as well. Why?</p>
<p>It is easy to forget or let go unnoticed that there are quite a few global locks involved with each query. If query cache is activated, then any query must pass through that cache, holding the query cache mutex. There&#8217;s a global mutex on MyISAM&#8217;s key cache. There&#8217;s one on InnoDB&#8217;s buffer pool (see multiple buffer pools in InnoDB 5.5), albeit less of an overhead. And there&#8217;s the table cache.</p>
<p>When table cache is enabled, any completed query attempts to return file handles to the cache. Any new query attempts to retrieve handles from the cache. While writing to the cache (extracting, adding), the cache is locked. When everyone&#8217;s busy doing the sequence-UPDATE, table cache lock is being abused. Other queries are unable to find the time to squire the lock and get on with their business.</p>
<h4>What can be done?</h4>
<p>One could try and increase the <strong>table_open_cache</strong> value. That may help to some extent, and for limited time. But the more requests are made, the quicker the problem surfaces again. When, in fact, <em>reducing</em> the <strong>table_open_cache</strong> to zero (well, minimum value is <strong>1</strong>) can make for a great impact. If there&#8217;s nothing to fight for, everyone just get by on their own.</p>
<p>I know the following is not a scientific explanation, but it hits me as a good comparison: when my daughter brings a friend over, and there&#8217;s a couple of toys, both are happy. A third friend makes for a fight: <em>&#8220;I saw it first! She took it from me! I was holding it!&#8221;</em>. Any parent knows the ultimate solution to this kind of fight: take away the toys, and have them find something else to enjoy doing. OK, sorry for this unscientific display, I had to share my daily stress.</p>
<p>When no table cache is available, a query will go on opening the table by itself, and will not attempt to return the file handle back to the cache. The file handle will simply be destroyed. Now, usually this is not desired. Caching is good. But in our customer&#8217;s case, the cost of not using a table cache was minified by the cost of having everyone fight for the sequence table. Reducing the table cache made for an immediate relaxation of the database, with observable poorer responsiveness on peak times, however way better than with large table cache.</p>
<h4>Other tools?</h4>
<p>I don&#8217;t consider the above to be a good solution. It&#8217;s just a temporary hack.</p>
<p>I actually don&#8217;t like the <strong>LAST_INSERT_ID()</strong> trick. Moreover, I don&#8217;t see that it&#8217;s the database&#8217;s job to provide with unique IDs. Let it do relational stuff. If generating IDs is too intensive, let someone else do it.</p>
<p>NoSQL solutions provide such a service. <a href="http://memcached.org/">Memcached</a>, <a href="http://redis.io/">redis</a>, <a href="http://www.mongodb.org/">MongoDB</a> (and probably more) all provide with increment functions. Check them out.</p>
<h4>Application level solutions</h4>
<p>I actually use an application level solution to generate unique IDs. I mean, there&#8217;s always <strong>GUID()</strong>, but it&#8217;s result is just too long. Take a look at the following Java code:</p>
<blockquote>
<pre>public class Utils {
  private static long lastUniqueNumber = 0;

  public static synchronized long uniqueNumber() {
    long unique = System.currentTimeMillis();
    if (unique &lt;= lastUniqueNumber)
      unique = lastUniqueNumber + 1;
    lastUniqueNumber = unique;
    return unique;
  }
}</pre>
</blockquote>
<p>Within a Java application this above method returns with unique IDs, up to 1000 per second on average (and it can perform way more than 1000 times per second).</p>
<p>On consequential executions of applications on the same machine one would still expect unique values due to the time-related nature of values. However, computer time changes. It&#8217;s possible that <strong>System.currentTimeMillis()</strong> would return a value already used in the past.</p>
<p>And, what about two processes running on the same machine at the same time? Or on different machine?</p>
<p>Which is why I use the following combination to generate my unique IDs:</p>
<ul>
<li>Server ID (much like MySQL&#8217;s server_id parameter). this could be the last byte in the server&#8217;s IP address, or just 4 or 5 bits if not too many players are expected.</li>
<li>Process ID (plain old pid) which I pass to the Java runtime in the form of system properties. Any two processes running on the same machine are assured to have different IDs. To consequently spawned processes will have different IDs. The time it would take to cycle the process IDs is way more than would make for a &#8220;time glitch&#8221; problem as described above</li>
<li>Current time in milliseconds.</li>
</ul>
<p>If you have to have everything withing 64 bit (BIGINT) then you&#8217;ll have to do bit manipulation, and drop some of the MSB on the milliseconds so as to overwrite with server &amp; process IDs.</p>
<p>If you are willing to have your IDs unique in the bounds of a given time frame (so, for example, a month from now you wouldn&#8217;t mind reusing old IDs), then the problem is significantly easier. You may just use &#8220;day of month&#8221; and &#8220;millis since day start&#8221; and save those precious bits.</p>
<h4>Still other?</h4>
<p>Please share your solutions below!</p><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=27152&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=27152&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2011/02/02/on-generating-unique-ids-using-last_insert_id-and-other-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plugin Memcached 20 Study</title>
		<link>http://learnmysql.blogspot.com/2010/11/plugin-memcached20-study.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=plugin-memcached-20-study</link>
		<comments>http://learnmysql.blogspot.com/2010/11/plugin-memcached20-study.html#comments</comments>
		<pubDate>Tue, 02 Nov 2010 11:57:00 +0000</pubDate>
		<dc:creator>navjyot</dc:creator>
				<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Check out this SlideShare Presentation: Plugin Memcached%20 StudyView more presentations from Liu Lizhi.]]></description>
			<content:encoded><![CDATA[Check out this SlideShare Presentation: <br /><div><b><a href="http://www.slideshare.net/chinawolfs/plugin-memcached20-study" title="Plugin Memcached%20 Study">Plugin Memcached%20 Study</a></b><br /><div>View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/chinawolfs">Liu Lizhi</a>.</div></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6428405298205573074-7016444353873574894?l=learnmysql.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26347&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26347&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/11/02/plugin-memcached-20-study/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL and memcached Guide</title>
		<link>http://learnmysql.blogspot.com/2010/11/mysql-and-memcached-guide.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql-and-memcached-guide</link>
		<comments>http://learnmysql.blogspot.com/2010/11/mysql-and-memcached-guide.html#comments</comments>
		<pubDate>Tue, 02 Nov 2010 11:57:00 +0000</pubDate>
		<dc:creator>navjyot</dc:creator>
				<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Check out this SlideShare Presentation: MySQL and memcached GuideView more documents from webhostingguy.]]></description>
			<content:encoded><![CDATA[Check out this SlideShare Presentation: <div><strong><a href="http://www.slideshare.net/webhostingguy/mysql-and-memcached-guide" title="MySQL and memcached Guide">MySQL and memcached Guide</a></strong><div>View more <a href="http://www.slideshare.net/">documents</a> from <a href="http://www.slideshare.net/webhostingguy">webhostingguy</a>.</div></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6428405298205573074-1310380524233534447?l=learnmysql.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26348&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26348&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/11/02/mysql-and-memcached-guide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction to memcached</title>
		<link>http://learnmysql.blogspot.com/2010/11/introduction-to-memcached.html?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=introduction-to-memcached-2</link>
		<comments>http://learnmysql.blogspot.com/2010/11/introduction-to-memcached.html#comments</comments>
		<pubDate>Tue, 02 Nov 2010 10:52:00 +0000</pubDate>
		<dc:creator>navjyot</dc:creator>
				<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Check out this SlideShare Presentation: Introduction to memcachedView more presentations from Jurriaan Persyn.]]></description>
			<content:encoded><![CDATA[Check out this SlideShare Presentation: <div><strong><a href="http://www.slideshare.net/oemebamo/introduction-to-memcached" title="Introduction to memcached">Introduction to memcached</a></strong><div>View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/oemebamo">Jurriaan Persyn</a>.</div></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6428405298205573074-7891487348837056739?l=learnmysql.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26345&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26345&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/11/02/introduction-to-memcached-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CB1 Ubuntu 10.10 Linux Development Setup</title>
		<link>http://www.cb1inc.com/2010/10/16/cb1-ubuntu-10-10-linux-development-setup/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cb1-ubuntu-10-10-linux-development-setup</link>
		<comments>http://www.cb1inc.com/2010/10/16/cb1-ubuntu-10-10-linux-development-setup/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 02:36:52 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Gearman]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.cb1inc.com/?p=1375</guid>
		<description><![CDATA[I use a MacBook Pro for my day-to-day operations here at CB1, INC.  I&#8217;m a huge believer that a development environment should mimic the production environment, so I find myself running a couple virtual machines in VMware Fusion.
The following guide is a reference for myself as well as possibly a helpful resource for setting up your own Linux development environment. Here&#8217;s an checklist of the tasks to perform and software to install:

Operating System

Ubuntu 10.10 64-bit: I use Ubuntu Desktop in dev and Ubuntu Server in production
Package updates and upgrades
Network configuration (at least 2 static IP addresses)


Development Tools

C/C++ development environment
Autotools
Sun Java JDK
Valgrind
Version control: Subversion, Bazaar, git
Android SDK


Servers

Samba (file sharing)
SSH (remote shell access)
Apache 2.2 (web server)
nginx 0.8 (web server)
PHP 5.3.3 (application server)
PHP-FPM (PHP&#8217;s FastCGI process manager)
MySQL 5.1 (database server)
PostgreSQL (database server)
memcached 1.4.5 (caching layer)
Gearman (job queue manager)


PHP Extensions

memcached
Xdebug
Gearman
APC


Desktop Applications

Google Chrome
KCachegrind
Appcelerator Titanium



Operating System

Start by installing Ubuntu 10.10 Desktop (or server). I&#8217;m not going to cover installing Ubuntu since there are already several other resources out there. Once Ubuntu is installed, open a Terminal:

user@ubuntu:~# sudo passwd root
[sudo] password for user: &#60;type your password&#62;
Enter new UNIX password: &#60;type new root password&#62;
Retype new UNIX password: &#60;type new root password again&#62;
passwd: password updated successfully

user@ubuntu:~# sudo apt-get update
user@ubuntu:~# sudo apt-get upgrade

user@ubuntu:~# mkdir ~/src

New File Permissions

user@ubuntu:~# sudo pico /etc/profile

Change 022 to 002. This setting controls the default permissions when a new file or directory is created.  This is mostly useful when managing files over Samba.
Network IP Addresses
Optionally, you may want to assign a static IP address. I set up one IP address for Apache and another for nginx.

user@ubuntu:~# sudo pico /etc/network/interfaces

The following is a reference for adding two static IPs.  Change the IPs to meet your needs.

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
	address 192.168.1.200
	netmask 255.255.255.0
	gateway 192.168.1.1

auto eth0:1
iface eth0:1 inet static
	address 192.168.1.201
	netmask 255.255.255.0


user@ubuntu:~# sudo /etc/init.d/networking restart

Packages
Here&#8217;s a bunch of packages that will set up compilers, version control, Java, MySQL, Apache, PHP, Memcache, Gearman, Samba, and more.

user@ubuntu:~# sudo apt-get install build-essential autotools-dev autoconf \
 autoconf2.13 openssh-server ethtool traceroute openjdk-6-jdk \
 mysql-server-5.1 bzr subversion subversion-tools ntp ntpdate \
 libpcre3-dev libevent-dev automake bison libtool scons  g++ \
 ncurses-dev libreadline-dev libz-dev libssl-dev  libcurl4-openssl-dev \
 ruby rubygems libzip-ruby1.8 libzip-ruby1.9.1 python-dev ruby-dev \
 libdbus-glib-1-dev uuid-dev libpam0g libpam0g-dev gperf samba valgrind \
 libxml2-dev libfreetype6-dev curl libcurl4-openssl-dev \
 libjpeg62-dev libpng12-dev sqlite3 libsqlite3-dev git-core \
 postgresql postgis gearman libgearman-dev php5 \
 libapache2-mod-php5 php5-dev memcached php5-memcached \
 php5-curl php5-gd php5-mysql php5-pgsql php-apc \
 php5-xdebug php5-fpm libapache2-mod-fastcgi

MySQL
During the package install above, MySQL will prompt you for the root password.
After the packages are installed, we need to allow remote MySQL connections.

user@ubuntu:~# sudo pico /etc/mysql/my.cnf

Comment out the bind-address line.

# bind-address          = 127.0.0.1

SSH
Next, you may optionally increase the connection keep alive interval for remote ssh connections. Timeouts aren&#8217;t really an issue for SSH&#8217;ing into a local VM, but really helps for remote installs.

user@ubuntu:~# sudo echo &#34;ClientAliveInterval 60&#34; &#62;&#62; /etc/ssh/sshd_config

Samba
Samba allows me to drag and drop files between my Mac and Linux VM. I personally do not enable/install Samba on production servers.

user@ubuntu:~# sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig
user@ubuntu:~# sudo pico /etc/samba/smb.conf

You can add a share such as the following:

[ubuntu]
        force user = &#60;your username&#62;
        writeable = yes
        create mode = 644
        path = /home/&#60;your username&#62;
        directory mode = 755
        force group = &#60;your username&#62;

Then create yourself a Samba user:

user@ubuntu:~# sudo smbpasswd -a &#60;your username&#62;

Apache 2
Apache is mostly configured out of the box, but I like to enable rewrite and SSL so I can test production features.

user@ubuntu:~# sudo a2enmod rewrite
user@ubuntu:~# sudo a2enmod ssl

Since I&#8217;m going to run Apache and nginx, I&#8217;m going bind Apache to eth0.

user@ubuntu:~# sudo pico /etc/apache2/ports.conf


NameVirtualHost 192.168.1.200:80
Listen 192.168.1.200:80

&#60;IfModule mod_ssl.c&#62;
    Listen 192.168.1.200:443
&#60;/IfModule&#62;

Now we need to add eth0&#8216;s IP to the default host:

user@ubuntu:~# sudo pico /etc/apache2/sites-enabled/000-default


&#60;VirtualHost 192.168.1.200:80&#62;
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        &#60;Directory /&#62;
                Options FollowSymLinks
                AllowOverride None
        &#60;/Directory&#62;
        &#60;Directory /var/www/&#62;
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        &#60;/Directory&#62;

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
&#60;/VirtualHost&#62;

Restart Apache for the changes to take effect.

user@ubuntu:~# sudo apache2ctl restart

Gearman
By default, Gearman uses memory to store pending jobs in the queue, but I prefer to use MySQL for persistent storage.  To do this, first create the queue database and table:

user@ubuntu:~# mysqladmin -uroot -p123123 create gearman
user@ubuntu:~# mysql -uroot -p123123 -e "CREATE TABLE gearman.gearman_queue (
  unique_key VARCHAR(64) NOT NULL,
  function_name VARCHAR(255) NULL,
  priority INT NULL,
  data LONGBLOB NULL,
  PRIMARY KEY (unique_key)
) ENGINE = InnoDB;"

Next update the init script to tell Gearman to use the database:

user@ubuntu:~# sudo mv /etc/default/gearman-job-server /etc/default/gearman-job-server.bak
user@ubuntu:~# sudo echo &#34;PARAMS=\&#34;-q libdrizzle --libdrizzle-host=127.0.0.1&#34; \
   &#34;--libdrizzle-user=root --libdrizzle-password=123123 --libdrizzle-db=gearman&#34; \
   &#34;--libdrizzle-table=gearman_queue --libdrizzle-mysql\&#34;&#34; &#62; /etc/default/gearman-job-server
user@ubuntu:~# sudo /etc/init.d/gearman-job-server restart

Gearman PHP Extension
We need to download and install the Gearman PHP extension if we want to write PHP workers or post jobs to the queue.

user@ubuntu:~# cd ~/src
user@ubuntu:~/src# wget http://pecl.php.net/get/gearman-0.7.0.tgz
user@ubuntu:~/src# tar xzf gearman-0.7.0.tgz
user@ubuntu:~/src# rm gearman-0.7.0.tgz package.xml
user@ubuntu:~/src# cd gearman-0.7.0
user@ubuntu:~/src# phpize
user@ubuntu:~/src# ./configure
user@ubuntu:~/src# make
user@ubuntu:~/src# sudo make install

Next, add the config file to load the Gearman PHP extension:

user@ubuntu:~# sudo echo &#34;extension=gearman.so&#34; &#62;&#62; /etc/php5/conf.d/gearman.ini

memcached PHP Extension
Since we have memcached and the memcached PHP extension install, let&#8217;s use it for storing session data:

user@ubuntu:~/src# sudo echo &#34;session.save_handler = memcached
session.save_path = \&#34;127.0.0.1:11211\&#34;&#34; &#62;&#62; /etc/php5/conf.d/memcached.ini

nginx
nginx is web server that is really fast.  I use nginx as my primary development web server unless I&#8217;m running a web app that only works with Apache. You can choose to install nginx from package, but I like to live life on the bleeding edge, so I&#8217;ll be building nginx from source. To install nginx, we need to download the source, compile it, install it, and configure it.

user@ubuntu:~# cd ~/src
user@ubuntu:~/src# wget http://nginx.org/download/nginx-0.8.52.tar.gz
user@ubuntu:~/src# tar xzf nginx-0.8.52.tar.gz
user@ubuntu:~/src# rm nginx-0.8.52.tar.gz
user@ubuntu:~/src# cd nginx-0.8.52
user@ubuntu:~/src# mkdir /var/lib/nginx
user@ubuntu:~/src# ./configure \
    --sbin-path=/usr/sbin \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --http-log-path=/var/log/nginx/access.log \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --with-http_stub_status_module
user@ubuntu:~/src# make
user@ubuntu:~/src# sudo make install

user@ubuntu:~# sudo pico /etc/init.d/nginx

Here&#8217;s the init script that will start nginx for us:

#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON &#124;&#124; exit 0
case &#34;$1&#34; in
  start)
        echo -n &#34;Starting $DESC: &#34;
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo &#34;$NAME.&#34;
        ;;
  stop)
        echo -n &#34;Stopping $DESC: &#34;
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        echo &#34;$NAME.&#34;
        ;;
  restart&#124;force-reload)
        echo -n &#34;Restarting $DESC: &#34;
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo &#34;$NAME.&#34;
        ;;
  reload)
        echo -n &#34;Reloading $DESC configuration: &#34;
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        echo &#34;$NAME.&#34;
        ;;
  *)
        echo &#34;Usage: /etc/init.d/$NAME {start&#124;stop&#124;restart&#124;reload&#124;force-reload}&#34; &#62;&#38;2
        exit 1
        ;;
esac
exit 0

Now we need to make the init script executable and enable it:

user@ubuntu:~# sudo chmod +x /etc/init.d/nginx
user@ubuntu:~# sudo update-rc.d nginx defaults

user@ubuntu:~# sudo pico /etc/nginx/nginx.conf

Here&#8217;s a starter nginx.conf with some basic settings:

user  www-data www-data;
worker_processes  2;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile                on;
    tcp_nodelay             on;
    tcp_nopush              on;
    keepalive_timeout       65;
    server_name_in_redirect off;
    server_tokens           off;

    add_header Strict-Transport-Security max-age=1800;
    add_header X-Frame-Options deny;

    gzip            on;
    gzip_buffers    16 8k;
    gzip_comp_level 9;
    gzip_types      text/plain text/xml application/x-javascript text/css;

    include /etc/nginx/sites/*;
}


user@ubuntu:~# sudo mkdir /etc/nginx/sites
user@ubuntu:~# sudo pico /etc/nginx/sites/default

Now we need to set up a default host that supports PHP (via PHP-FPM, PHP&#8217;s FastCGI Process Manager) and we want the default host to use the eth0:1 IP address:

server {
    listen       192.168.1.201:80 default;
    server_name  _;
    root   /var/www;
    index  index.php;
    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?q=$1 last;
            break;
        }
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include        fastcgi_params;
    }
    location ~* (\.(htaccess&#124;engine&#124;inc&#124;info&#124;install&#124;module&#124;profile&#124;po&#124;sh&#124;.*sql&#124;theme&#124;tpl(\.php)?&#124;xtmpl)&#124;code-style\.pl&#124;Entries.*&#124;Repository&#124;Root&#124;Tag&#124;Template)$ {
        deny all;
    }
}

After the config files are good to go, start nginx:

user@ubuntu:~# sudo /etc/init.d/nginx start

Service Names
I also like to add service names so I can see what ports are in use when I run netstat. I added drizzle and Cassandra for fun despite this post not including them.

user@ubuntu:~# sudo cp /etc/services /etc/services.bak
user@ubuntu:~# su
root@ubuntu:~# echo &#34;drizzle     4427/tcp
drizzle     4427/udp
memcached   11211/tcp
memcached   11211/udp
gearmand    4730/tcp
gearmand    4730/udp
fastcgi     9000/tcp
cassandra   9160/tcp&#34; &#62;&#62; /etc/services
root@ubuntu:~# exit

Android SDK
The Android SDK is unfortunately not in package, so you&#8217;ll need to download it from the Android Developer site: http://developer.android.com/sdk/index.html.

user@ubuntu:~# wget http://dl.google.com/android/android-sdk_r07-linux_x86.tgz
user@ubuntu:~# tar xzf android-sdk_r07-linux_x86.tgz
user@ubuntu:~# rm android-sdk_r07-linux_x86.tgz
user@ubuntu:~# sudo mv android-sdk-linux_x86 /usr/local
user@ubuntu:~# sudo find /usr/local/android-sdk-linux_x86 -type d -exec chmod 777 {} \;

You&#8217;ll need to add the Android SDK path near the top of your ~/.bash_profile or ~/.bashrc:

export PATH=${PATH}:/usr/local/android-sdk-linux_x86/tools

To manage your Android SDK packages and virtual devices, you&#8217;ll need to run the android app:

user@ubuntu:~# android

First go to Available Packages and download version 1.6 and 2.2 Android SDK packages.  You can also choose to download the documentation, samples, and Google APIs.


Downloading the package may take several minutes. You don&#8217;t have to create a virtual device right now if you are planning on installing Appcelerator&#8217;s Titanium platform.  You can exit the Android app when you&#8217;re done.
Desktop Apps
If you&#8217;re running Ubuntu Desktop, there are a couple handy apps I install.  The first is Google Chrome and can be directly downloaded from the Google Chrome download page.
I find KCachegrind and GHex to be useful:

user@ubuntu:~# sudo apt-get install kcachegrind ghex

Appcelerator Titanium
Titanium is an awesome platform for developing desktop applications for Linux, Mac OS X, and Windows as well as mobile apps for iPhone and Android. We use Titanium Developer to create Titanium projects. Begin by downloading the 64-bit version of Titanium:

user@ubuntu:~# wget -O titanium.tgz http://www.appcelerator.com/download-linux64

There&#8217;s also a 32-bit version available at http://www.appcelerator.com/download-linux32.
Next we unpack Titanium Developer and move it to a safe place:

user@ubuntu:~# tar xzf titanium.tgz
user@ubuntu:~# rm titanium.tgz

Next you need to run the installer by double-clicking the Titanium Developer executable. Run the executable and then click the Install button. You can try installing to /opt/titanium, but you might need root privileges.


Next, there are a few issues with outdated libraries, so we simply delete them:

user@ubuntu:~# rm ~/.titanium/runtime/linux/1.0.0/libgobject-2.0.*
user@ubuntu:~# rm ~/.titanium/runtime/linux/1.0.0/libglib-2.0.*
user@ubuntu:~# rm ~/.titanium/runtime/linux/1.0.0/libgio-2.0.*
user@ubuntu:~# rm ~/.titanium/runtime/linux/1.0.0/libgthread-2.0.*

Titanium Developer also complains if /bin/java doesn&#8217;t exist, so create a quick link:

user@ubuntu:~# sudo ln -s /usr/bin/java /bin/java

Relaunch Titanium Developer and enter your login credentials.  If you don&#8217;t have a login, you can get a free account.

After signing in, you may notice there are some updates available in the upper right corner of the window. Click in the box and the updates will be downloaded and installed.

Optionally you can create a launcher icon for your GNOME panel. Don&#8217;t forget to escape spaces in the command with a backslash!

Finishing Touches
Lastly, I like to re-arrange my desktop to maximize my coding real estate.

Conclusion
That should get you up and running with a neato dev environment.  If you need to run SSL, I wrote a post on Creating Self-Signed Certs on Apache 2.2 and Virtual Hosts and Wildcard SSL Certificates with Apache 2.2.
If you find any typos or additions, please feel free to sound off in the comments!]]></description>
			<content:encoded><![CDATA[<p>I use a MacBook Pro for my day-to-day operations here at CB1, INC.  I&#8217;m a huge believer that a development environment should mimic the production environment, so I find myself running a couple virtual machines in VMware Fusion.</p>
<p>The following guide is a reference for myself as well as possibly a helpful resource for setting up your own Linux development environment. Here&#8217;s an checklist of the tasks to perform and software to install:</p>
<ul>
<li>Operating System
<ul>
<li><a href="http://www.ubuntu.com/" >Ubuntu 10.10 64-bit</a>: I use Ubuntu Desktop in dev and Ubuntu Server in production</li>
<li>Package updates and upgrades</li>
<li>Network configuration (at least 2 static IP addresses)</li>
</ul>
</li>
<li>Development Tools
<ul>
<li>C/C++ development environment</li>
<li>Autotools</li>
<li>Sun Java JDK</li>
<li><a href="http://valgrind.org/" >Valgrind</a></li>
<li>Version control: <a href="http://subversion.tigris.org/" >Subversion</a>, <a href="http://bazaar.canonical.com/en/" >Bazaar</a>, <a href="http://git-scm.com/" >git</a></li>
<li><a href="http://developer.android.com/">Android SDK</a></li>
</ul>
</li>
<li>Servers
<ul>
<li><a href="http://www.samba.org/" >Samba</a> (file sharing)</li>
<li>SSH (remote shell access)</li>
<li><a href="http://httpd.apache.org/" >Apache 2.2</a> (web server)</li>
<li><a href="http://nginx.org/" >nginx 0.8</a> (web server)</li>
<li><a href="http://www.php.net/" >PHP 5.3.3</a> (application server)</li>
<li><a href="http://php-fpm.org/" >PHP-FPM</a> (PHP&#8217;s FastCGI process manager)</li>
<li><a href="http://www.mysql.com/" >MySQL 5.1</a> (database server)</li>
<li><a href="http://www.postgresql.org/" >PostgreSQL</a> (database server)</li>
<li><a href="http://memcached.org/" >memcached 1.4.5</a> (caching layer)</li>
<li><a href="http://gearman.org/" >Gearman</a> (job queue manager)</li>
</ul>
</li>
<li>PHP Extensions
<ul>
<li><a href="http://pecl.php.net/package/memcached" >memcached</a></li>
<li><a href="http://xdebug.org/" >Xdebug</a></li>
<li><a href="http://pecl.php.net/package/gearman" >Gearman</a></li>
<li><a href="http://pecl.php.net/package/APC" >APC</a></li>
</ul>
</li>
<li>Desktop Applications
<ul>
<li><a href="http://www.google.com/chrome">Google Chrome</a></li>
<li>KCachegrind</li>
<li><a href="http://www.appcelerator.com/products">Appcelerator Titanium</a></li>
</ul>
</li>
</ul>
<h3>Operating System</h3>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/ubuntu.png" /></p>
<p>Start by installing Ubuntu 10.10 Desktop (or server). I&#8217;m not going to cover installing Ubuntu since there are already several other resources out there. Once Ubuntu is installed, open a <strong>Terminal</strong>:</p>
<pre>
user@ubuntu:~# <span>sudo passwd root</span>
[sudo] password for user: &lt;type your password&gt;
Enter new UNIX password: &lt;type new root password&gt;
Retype new UNIX password: &lt;type new root password again&gt;
passwd: password updated successfully

user@ubuntu:~# <span>sudo apt-get update</span>
user@ubuntu:~# <span>sudo apt-get upgrade</span>

user@ubuntu:~# <span>mkdir ~/src</span>
</pre>
<h3>New File Permissions</h3>
<pre>
user@ubuntu:~# <span>sudo pico /etc/profile</span>
</pre>
<p>Change 022 to 002. This setting controls the default permissions when a new file or directory is created.  This is mostly useful when managing files over Samba.</p>
<h3>Network IP Addresses</h3>
<p>Optionally, you may want to assign a static IP address. I set up one IP address for Apache and another for nginx.</p>
<pre>
user@ubuntu:~# <span>sudo pico /etc/network/interfaces</span>
</pre>
<p>The following is a reference for adding two static IPs.  Change the IPs to meet your needs.</p>
<pre>
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
	address 192.168.1.200
	netmask 255.255.255.0
	gateway 192.168.1.1

auto eth0:1
iface eth0:1 inet static
	address 192.168.1.201
	netmask 255.255.255.0
</pre>
<pre>
user@ubuntu:~# <span>sudo /etc/init.d/networking restart</span>
</pre>
<h3>Packages</h3>
<p>Here&#8217;s a bunch of packages that will set up compilers, version control, Java, MySQL, Apache, PHP, Memcache, Gearman, Samba, and more.</p>
<pre>
user@ubuntu:~# <span>sudo apt-get install build-essential autotools-dev autoconf \
 autoconf2.13 openssh-server ethtool traceroute openjdk-6-jdk \
 mysql-server-5.1 bzr subversion subversion-tools ntp ntpdate \
 libpcre3-dev libevent-dev automake bison libtool scons  g++ \
 ncurses-dev libreadline-dev libz-dev libssl-dev  libcurl4-openssl-dev \
 ruby rubygems libzip-ruby1.8 libzip-ruby1.9.1 python-dev ruby-dev \
 libdbus-glib-1-dev uuid-dev libpam0g libpam0g-dev gperf samba valgrind \
 libxml2-dev libfreetype6-dev curl libcurl4-openssl-dev \
 libjpeg62-dev libpng12-dev sqlite3 libsqlite3-dev git-core \
 postgresql postgis gearman libgearman-dev php5 \
 libapache2-mod-php5 php5-dev memcached php5-memcached \
 php5-curl php5-gd php5-mysql php5-pgsql php-apc \
 php5-xdebug php5-fpm libapache2-mod-fastcgi</span>
</pre>
<h3>MySQL</h3>
<p>During the package install above, MySQL will prompt you for the root password.</p>
<p>After the packages are installed, we need to allow remote MySQL connections.</p>
<pre>
user@ubuntu:~# <span>sudo pico /etc/mysql/my.cnf</span>
</pre>
<p>Comment out the <em>bind-address</em> line.</p>
<pre>
# bind-address          = 127.0.0.1
</pre>
<h3>SSH</h3>
<p>Next, you may optionally increase the connection keep alive interval for remote ssh connections. Timeouts aren&#8217;t really an issue for SSH&#8217;ing into a local VM, but really helps for remote installs.</p>
<pre>
user@ubuntu:~# <span>sudo echo &quot;ClientAliveInterval 60&quot; &gt;&gt; /etc/ssh/sshd_config</span>
</pre>
<h3>Samba</h3>
<p>Samba allows me to drag and drop files between my Mac and Linux VM. I personally do <strong>not</strong> enable/install Samba on production servers.</p>
<pre>
user@ubuntu:~# <span>sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig</span>
user@ubuntu:~# <span>sudo pico /etc/samba/smb.conf</span>
</pre>
<p>You can add a share such as the following:</p>
<pre>
[ubuntu]
        force user = &lt;your username&gt;
        writeable = yes
        create mode = 644
        path = /home/&lt;your username&gt;
        directory mode = 755
        force group = &lt;your username&gt;
</pre>
<p>Then create yourself a Samba user:</p>
<pre>
user@ubuntu:~# <span>sudo smbpasswd -a &lt;your username&gt;</span>
</pre>
<h4>Apache 2</h4>
<p>Apache is mostly configured out of the box, but I like to enable rewrite and SSL so I can test production features.</p>
<pre>
user@ubuntu:~# <span>sudo a2enmod rewrite</span>
user@ubuntu:~# <span>sudo a2enmod ssl</span>
</pre>
<p>Since I&#8217;m going to run Apache and nginx, I&#8217;m going bind Apache to <em>eth0</em>.</p>
<pre>
user@ubuntu:~# <span>sudo pico /etc/apache2/ports.conf</span>
</pre>
<pre>
NameVirtualHost 192.168.1.200:80
Listen 192.168.1.200:80

&lt;IfModule mod_ssl.c&gt;
    Listen 192.168.1.200:443
&lt;/IfModule&gt;
</pre>
<p>Now we need to add <em>eth0</em>&#8216;s IP to the default host:</p>
<pre>
user@ubuntu:~# <span>sudo pico /etc/apache2/sites-enabled/000-default</span>
</pre>
<pre>
&lt;VirtualHost 192.168.1.200:80&gt;
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        &lt;Directory /&gt;
                Options FollowSymLinks
                AllowOverride None
        &lt;/Directory&gt;
        &lt;Directory /var/www/&gt;
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        &lt;/Directory&gt;

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost&gt;
</pre>
<p>Restart Apache for the changes to take effect.</p>
<pre>
user@ubuntu:~# <span>sudo apache2ctl restart</span>
</pre>
<h3>Gearman</h3>
<p>By default, Gearman uses memory to store pending jobs in the queue, but I prefer to use MySQL for persistent storage.  To do this, first create the queue database and table:</p>
<pre>
user@ubuntu:~# <span>mysqladmin -uroot -p123123 create gearman</span>
user@ubuntu:~# <span>mysql -uroot -p123123 -e "CREATE TABLE gearman.gearman_queue (
  unique_key VARCHAR(64) NOT NULL,
  function_name VARCHAR(255) NULL,
  priority INT NULL,
  data LONGBLOB NULL,
  PRIMARY KEY (unique_key)
) ENGINE = InnoDB;"</span>
</pre>
<p>Next update the init script to tell Gearman to use the database:</p>
<pre>
user@ubuntu:~# <span>sudo mv /etc/default/gearman-job-server /etc/default/gearman-job-server.bak</span>
user@ubuntu:~# <span>sudo echo &quot;PARAMS=\&quot;-q libdrizzle --libdrizzle-host=127.0.0.1&quot; \
   &quot;--libdrizzle-user=root --libdrizzle-password=123123 --libdrizzle-db=gearman&quot; \
   &quot;--libdrizzle-table=gearman_queue --libdrizzle-mysql\&quot;&quot; &gt; /etc/default/gearman-job-server</span>
user@ubuntu:~# <span>sudo /etc/init.d/gearman-job-server restart</span>
</pre>
<h3>Gearman PHP Extension</h3>
<p>We need to download and install the Gearman PHP extension if we want to write PHP workers or post jobs to the queue.</p>
<pre>
user@ubuntu:~# <span>cd ~/src</span>
user@ubuntu:~/src# <span>wget http://pecl.php.net/get/gearman-0.7.0.tgz</span>
user@ubuntu:~/src# <span>tar xzf gearman-0.7.0.tgz</span>
user@ubuntu:~/src# <span>rm gearman-0.7.0.tgz package.xml</span>
user@ubuntu:~/src# <span>cd gearman-0.7.0</span>
user@ubuntu:~/src# <span>phpize</span>
user@ubuntu:~/src# <span>./configure</span>
user@ubuntu:~/src# <span>make</span>
user@ubuntu:~/src# <span>sudo make install</span>
</pre>
<p>Next, add the config file to load the Gearman PHP extension:</p>
<pre>
user@ubuntu:~# <span>sudo echo &quot;extension=gearman.so&quot; &gt;&gt; /etc/php5/conf.d/gearman.ini</span>
</pre>
<h3>memcached PHP Extension</h3>
<p>Since we have memcached and the memcached PHP extension install, let&#8217;s use it for storing session data:</p>
<pre>
user@ubuntu:~/src# <span>sudo echo &quot;session.save_handler = memcached
session.save_path = \&quot;127.0.0.1:11211\&quot;&quot; &gt;&gt; /etc/php5/conf.d/memcached.ini</span>
</pre>
<h3>nginx</h3>
<p>nginx is web server that is really fast.  I use nginx as my primary development web server unless I&#8217;m running a web app that only works with Apache. You can choose to install nginx from package, but I like to live life on the bleeding edge, so I&#8217;ll be building nginx from source. To install nginx, we need to download the source, compile it, install it, and configure it.</p>
<pre>
user@ubuntu:~# <span>cd ~/src</span>
user@ubuntu:~/src# <span>wget http://nginx.org/download/nginx-0.8.52.tar.gz</span>
user@ubuntu:~/src# <span>tar xzf nginx-0.8.52.tar.gz</span>
user@ubuntu:~/src# <span>rm nginx-0.8.52.tar.gz</span>
user@ubuntu:~/src# <span>cd nginx-0.8.52</span>
user@ubuntu:~/src# <span>mkdir /var/lib/nginx</span>
user@ubuntu:~/src# <span>./configure \
    --sbin-path=/usr/sbin \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --http-log-path=/var/log/nginx/access.log \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --with-http_stub_status_module</span>
user@ubuntu:~/src# <span>make</span>
user@ubuntu:~/src# <span>sudo make install</span>

user@ubuntu:~# <span>sudo pico /etc/init.d/nginx</span>
</pre>
<p>Here&#8217;s the init script that will start nginx for us:</p>
<pre>
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
case &quot;$1&quot; in
  start)
        echo -n &quot;Starting $DESC: &quot;
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo &quot;$NAME.&quot;
        ;;
  stop)
        echo -n &quot;Stopping $DESC: &quot;
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        echo &quot;$NAME.&quot;
        ;;
  restart|force-reload)
        echo -n &quot;Restarting $DESC: &quot;
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo &quot;$NAME.&quot;
        ;;
  reload)
        echo -n &quot;Reloading $DESC configuration: &quot;
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        echo &quot;$NAME.&quot;
        ;;
  *)
        echo &quot;Usage: /etc/init.d/$NAME {start|stop|restart|reload|force-reload}&quot; &gt;&amp;2
        exit 1
        ;;
esac
exit 0
</pre>
<p>Now we need to make the init script executable and enable it:</p>
<pre>
user@ubuntu:~# <span>sudo chmod +x /etc/init.d/nginx</span>
user@ubuntu:~# <span>sudo update-rc.d nginx defaults</span>

user@ubuntu:~# <span>sudo pico /etc/nginx/nginx.conf</span>
</pre>
<p>Here&#8217;s a starter nginx.conf with some basic settings:</p>
<pre>
user  www-data www-data;
worker_processes  2;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile                on;
    tcp_nodelay             on;
    tcp_nopush              on;
    keepalive_timeout       65;
    server_name_in_redirect off;
    server_tokens           off;

    add_header Strict-Transport-Security max-age=1800;
    add_header X-Frame-Options deny;

    gzip            on;
    gzip_buffers    16 8k;
    gzip_comp_level 9;
    gzip_types      text/plain text/xml application/x-javascript text/css;

    include /etc/nginx/sites/*;
}
</pre>
<pre>
user@ubuntu:~# <span>sudo mkdir /etc/nginx/sites</span>
user@ubuntu:~# <span>sudo pico /etc/nginx/sites/default</span>
</pre>
<p>Now we need to set up a default host that supports PHP (via <a href="http://php-fpm.org/" >PHP-FPM, PHP&#8217;s FastCGI Process Manager</a>) and we want the default host to use the <em>eth0:1</em> IP address:</p>
<pre>
server {
    listen       192.168.1.201:80 default;
    server_name  _;
    root   /var/www;
    index  index.php;
    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?q=$1 last;
            break;
        }
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include        fastcgi_params;
    }
    location ~* (\.(htaccess|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)|code-style\.pl|Entries.*|Repository|Root|Tag|Template)$ {
        deny all;
    }
}
</pre>
<p>After the config files are good to go, start nginx:</p>
<pre>
user@ubuntu:~# <span>sudo /etc/init.d/nginx start</span>
</pre>
<h3>Service Names</h3>
<p>I also like to add service names so I can see what ports are in use when I run <em>netstat</em>. I added drizzle and Cassandra for fun despite this post not including them.</p>
<pre>
user@ubuntu:~# <span>sudo cp /etc/services /etc/services.bak</span>
user@ubuntu:~# <span>su</span>
root@ubuntu:~# <span>echo &quot;drizzle     4427/tcp
drizzle     4427/udp
memcached   11211/tcp
memcached   11211/udp
gearmand    4730/tcp
gearmand    4730/udp
fastcgi     9000/tcp
cassandra   9160/tcp&quot; &gt;&gt; /etc/services</span>
root@ubuntu:~# <span>exit</span>
</pre>
<h3>Android SDK</h3>
<p>The Android SDK is unfortunately not in package, so you&#8217;ll need to download it from the Android Developer site: <a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>.</p>
<pre>
user@ubuntu:~# <span>wget http://dl.google.com/android/android-sdk_r07-linux_x86.tgz</span>
user@ubuntu:~# <span>tar xzf android-sdk_r07-linux_x86.tgz</span>
user@ubuntu:~# <span>rm android-sdk_r07-linux_x86.tgz</span>
user@ubuntu:~# <span>sudo mv android-sdk-linux_x86 /usr/local</span>
user@ubuntu:~# <span>sudo find /usr/local/android-sdk-linux_x86 -type d -exec chmod 777 {} \;</span>
</pre>
<p>You&#8217;ll need to add the Android SDK path near the top of your <code>~/.bash_profile</code> <em>or</em> <code>~/.bashrc</code>:</p>
<pre>
export PATH=${PATH}:/usr/local/android-sdk-linux_x86/tools
</pre>
<p>To manage your Android SDK packages and virtual devices, you&#8217;ll need to run the <em>android</em> app:</p>
<pre>
user@ubuntu:~# <span>android</span>
</pre>
<p>First go to <em>Available Packages</em> and download version <strong>1.6</strong> <em>and</em> <strong>2.2</strong> Android SDK packages.  You can also choose to download the documentation, samples, and Google APIs.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/android4.jpg" /></p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/android5.jpg" /></p>
<p>Downloading the package may take several minutes. You don&#8217;t have to create a virtual device right now if you are planning on installing Appcelerator&#8217;s Titanium platform.  You can exit the Android app when you&#8217;re done.</p>
<h3>Desktop Apps</h3>
<p>If you&#8217;re running Ubuntu Desktop, there are a couple handy apps I install.  The first is Google Chrome and can be directly downloaded from the <a href="http://www.google.com/chrome/eula.html">Google Chrome download page</a>.</p>
<p>I find <em>KCachegrind</em> and <em>GHex</em> to be useful:</p>
<pre>
user@ubuntu:~# <span>sudo apt-get install kcachegrind ghex</span>
</pre>
<h3>Appcelerator Titanium</h3>
<p>Titanium is an awesome platform for developing desktop applications for Linux, Mac OS X, and Windows as well as mobile apps for iPhone and Android. We use Titanium Developer to create Titanium projects. Begin by downloading the 64-bit version of Titanium:</p>
<pre>
user@ubuntu:~# <span>wget -O titanium.tgz http://www.appcelerator.com/download-linux64</span>
</pre>
<p>There&#8217;s also a 32-bit version available at <code>http://www.appcelerator.com/download-linux32</code>.</p>
<p>Next we unpack Titanium Developer and move it to a safe place:</p>
<pre>
user@ubuntu:~# <span>tar xzf titanium.tgz</span>
user@ubuntu:~# <span>rm titanium.tgz</span>
</pre>
<p>Next you need to run the installer by double-clicking the <em>Titanium Developer</em> executable. Run the executable and then click the <em>Install</em> button. You can try installing to <code>/opt/titanium</code>, but you might need root privileges.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium1.jpg" /></p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium2.jpg" /></p>
<p>Next, there are a few issues with outdated libraries, so we simply delete them:</p>
<pre>
user@ubuntu:~# <span>rm ~/.titanium/runtime/linux/1.0.0/libgobject-2.0.*</span>
user@ubuntu:~# <span>rm ~/.titanium/runtime/linux/1.0.0/libglib-2.0.*</span>
user@ubuntu:~# <span>rm ~/.titanium/runtime/linux/1.0.0/libgio-2.0.*</span>
user@ubuntu:~# <span>rm ~/.titanium/runtime/linux/1.0.0/libgthread-2.0.*</span>
</pre>
<p>Titanium Developer also complains if <em>/bin/java</em> doesn&#8217;t exist, so create a quick link:</p>
<pre>
user@ubuntu:~# <span>sudo ln -s /usr/bin/java /bin/java</span>
</pre>
<p>Relaunch Titanium Developer and enter your login credentials.  If you don&#8217;t have a login, you can get a free account.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium3.jpg" /></p>
<p>After signing in, you may notice there are some updates available in the upper right corner of the window. Click in the box and the updates will be downloaded and installed.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium4.jpg" /></p>
<p>Optionally you can create a launcher icon for your GNOME panel. Don&#8217;t forget to escape spaces in the command with a backslash!</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium5.jpg" /></p>
<h3>Finishing Touches</h3>
<p>Lastly, I like to re-arrange my desktop to maximize my coding real estate.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/ubuntu_10-10.jpg" /></p>
<h3>Conclusion</h3>
<p>That should get you up and running with a neato dev environment.  If you need to run SSL, I wrote a post on <a href="http://www.cb1inc.com/2007/05/13/creating-self-signed-certs-on-apache-2-2/">Creating Self-Signed Certs on Apache 2.2</a> and <a href="http://www.cb1inc.com/2008/09/11/virtual-hosts-and-wildcard-ssl-certificates-with-apache-2-2/">Virtual Hosts and Wildcard SSL Certificates with Apache 2.2</a>.</p>
<p>If you find any typos or additions, please feel free to sound off in the comments!</p><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26253&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=26253&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
			<wfw:commentRss>http://planetmysql.ru/2010/10/17/cb1-ubuntu-10-10-linux-development-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

