<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-19281624</id><updated>2012-01-27T09:20:18.882Z</updated><category term='sandbox'/><category term='MySQL CLuster 7.0'/><category term='proto buffers'/><category term='Patriot Act'/><category term='clusterj'/><category term='installation'/><category term='tools'/><category term='use cases'/><category term='cmon'/><category term='contention'/><category term='memory management'/><category term='PaaS'/><category term='uc2011'/><category term='bugs'/><category term='corescripts'/><category term='MySQL Replication'/><category term='scaling'/><category term='openshift'/><category term='general'/><category term='large databases'/><category term='redhat'/><category term='MySQL Cluster'/><category term='Amazon EC2'/><category term='ldap'/><category term='configuration'/><category term='eurocloud'/><category term='tuning'/><category term='configurator'/><category term='nosql'/><category term='performance'/><category term='JOINs'/><category term='connectors'/><category term='usability'/><category term='update'/><category term='percona'/><category term='unorthodox'/><category term='online add node'/><category term='cloud services'/><category term='MySQL'/><category term='ndbinfo'/><category term='java'/><category term='cloud computing'/><category term='arbitration'/><category term='semi-sync replication'/><category term='error handling'/><category term='webinar'/><category term='cloud database'/><category term='MySQL Cluster 7.1'/><category term='severalnines'/><category term='deployment'/><category term='high availability'/><category term='6.4'/><category term='AMI'/><category term='monitoring'/><category term='award'/><category term='mysql 5.5'/><category term='clustered databases'/><category term='uc2010'/><category term='SPJ'/><category term='dolphinics'/><category term='gearman'/><category term='galera'/><category term='disk data'/><category term='high-availability'/><category term='administration'/><category term='ndb_restore'/><category term='synchronous replication'/><category term='jboss'/><category term='mysql ha'/><category term='sanity check'/><category term='benchmarking'/><category term='jbalock'/><category term='uc2009'/><category term='ubuntu'/><category term='automation'/><category term='chkfrag'/><category term='replication'/><title type='text'>Johan Andersson's Cluster and HA Blog</title><subtitle type='html'>Stuff mainly about MySQL Cluster. Johan works as a Consultant for Severalnines, a company focused on building fast, scalable, and highly available solutions. 

Prior to Severalnines, Johan was working at Ericsson/MySQL/Sun/Oracle and was the Principal Consultant and lead of the Cluster consulting group.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default?start-index=101&amp;max-results=100'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>123</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19281624.post-2953728638213424867</id><published>2011-12-15T14:55:00.003Z</published><updated>2011-12-15T15:18:22.531Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud database'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Replication'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Walking on Cloud 9</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:Arial;  panose-1:2 11 6 4 2 2 2 2 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:SimSun;  mso-font-alt:宋体;  mso-font-charset:128;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:"Lucida Sans";  panose-1:2 11 6 2 3 5 4 2 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:none;  mso-hyphenate:none;  font-size:12.0pt;  font-family:"Lucida Sans";  mso-ascii-font-family:"Times New Roman";  mso-fareast-font-family:SimSun;  mso-hansi-font-family:"Times New Roman";  mso-bidi-font-family:"Lucida Sans";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} p.MsoBodyText, li.MsoBodyText, div.MsoBodyText  {mso-style-noshow:yes;  mso-style-link:"Body Text Char";  margin-top:0cm;  margin-right:0cm;  margin-bottom:6.0pt;  margin-left:0cm;  mso-pagination:none;  mso-hyphenate:none;  font-size:12.0pt;  font-family:"Lucida Sans";  mso-ascii-font-family:"Times New Roman";  mso-fareast-font-family:SimSun;  mso-hansi-font-family:"Times New Roman";  mso-bidi-font-family:"Lucida Sans";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} a:link, span.MsoHyperlink  {mso-style-noshow:yes;  color:blue;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {mso-style-noshow:yes;  color:purple;  text-decoration:underline;  text-underline:single;} span.BodyTextChar  {mso-style-name:"Body Text Char";  mso-style-noshow:yes;  mso-style-locked:yes;  mso-style-link:"Body Text";  mso-ansi-font-size:12.0pt;  mso-bidi-font-size:12.0pt;  font-family:SimSun;  mso-fareast-font-family:SimSun;  mso-bidi-font-family:"Lucida Sans";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;     &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;As the saying goes, we at &lt;a href="http://severalnines.com/"&gt;&lt;u&gt;Severalnines&lt;/u&gt;&lt;/a&gt; have been walking on several clouds this year, 9 to be precise! &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Today, we are proud to say that we are on walking on Cloud 9!&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;And in the spirit of celebration, we would like to announce our:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Top 9 Clouds of the Year 2011 for &lt;a href="http://severalnines.com/"&gt;&lt;u&gt;Severalnines&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 1 – releasing &lt;a href="http://severalnines.com/products-services"&gt;&lt;u&gt;ClusterControl™&lt;/u&gt;&lt;/a&gt; - our first commercial product in April! &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://severalnines.com/products-services"&gt;&lt;u&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;ClusterControl™&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; is our flagship product. It enables developers and database administrators to Deploy, Manage, Monitor and Scale their clustered database platforms, free from the complexity and learning curves associated with database clusters. &lt;a href="http://severalnines.com/products-services"&gt;&lt;u&gt;Read more ...&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 2 – releasing ClusterControl™ for MySQL Replication&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Designed to address issues and needs of MySQL users relying on MySQL Replication, &lt;/span&gt;&lt;a href="http://www.severalnines.com/cluster-control-mysql-replication"&gt;&lt;u&gt;&lt;span style="font-family:Arial;"&gt;ClusterControl™ for MySQL Replication&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; offers a complete set of tools to assist developers and administrators of all skill levels to deploy, manage, monitor and scale their replicated MySQL databases. &lt;a href="http://www.severalnines.com/cluster-control-mysql-replication"&gt;&lt;u&gt;Read more ...&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 3 - releasing ClusterControl™ for MySQL Galera together with Codership&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;      &lt;p&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;u&gt;&lt;span style="font-family:Arial;"&gt;ClusterControl™ for MySQL Galera&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; enables customers to Deploy, Manage, Monitor and Scale a clustered MySQL database platform based on Galera Replication. &lt;/span&gt;&lt;span style="font-family:Arial;mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-font-kerning: 0pt;mso-ansi-language:EN-US;mso-fareast-language:EN-USfont-family:Arial;color:#262626;"  &gt;MySQL Galera is a synchronous multi-master cluster for MySQL/InnoDB, and allows applications to read and write from any MySQL Server.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Developers and DBAs now have access to all of the features of Severalnines' flagship product ClusterControl™ specifically adapted to MySQL Galera. &lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;u&gt;Read more ...&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 4 – reaching over 7,000 installations via the Severalnines &lt;a href="http://www.severalnines.com/resources/configurator"&gt;&lt;u&gt;Configurator&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;The &lt;u&gt;&lt;a href="http://www.severalnines.com/resources/configurator"&gt;Severalnines Configurator&lt;/a&gt; &lt;/u&gt;allows you to generate a production class configuration for a clustered MySQL configuration. It also generates a deployment package that automates the deployment of the complete database setup. Topologies can be based on MySQL Replication, MySQL Cluster or MySQL Galera.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;We have a great user base and in order to facilitate communication within our user community, we set up our &lt;a href="http://support.severalnines.com/home"&gt;&lt;u&gt;Severalnines Customer Services&lt;/u&gt;&lt;/a&gt; platform with forums, online support, etc. both for paying customers as well as users. &lt;a href="http://support.severalnines.com/home"&gt;&lt;u&gt;Check it out&lt;/u&gt;&lt;/a&gt; and join the conversation!&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 5&lt;/span&gt;&lt;/b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; – our Customers&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;At Severalnines, our goal is to reduce database costs, ease deployment, simplify management and increase DBA and developer productivity. &lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;But rather than us telling you why we think we are great, we wanted to provide documented case studies on how our innovative products are helping customers meet and exceed business goals for their database operations. &lt;a href="http://www.severalnines.com/references"&gt;&lt;u&gt;See what our customers have to say about us.&lt;/u&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 6&lt;/span&gt;&lt;/b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; – introducing Severalnines DataCloud™&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;a href="http://www.severalnines.com/DataCloud"&gt;&lt;u&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;a href="http://www.severalnines.com/DataCloud"&gt;&lt;u&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Severalnines DataCloud™&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;a href="http://www.severalnines.com/DataCloud"&gt; &lt;/a&gt;enables DBaaS for public, private and hybrid clouds. It extends the advantages of cloud computing to the database infrastructure layer by enabling on-demand access, automated management, managed availability and elasticity of MySQL databases. This reduces cost and the complexities of deploying and managing databases. &lt;a href="http://www.severalnines.com/DataCloud"&gt;&lt;u&gt;Read more ...&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 7&lt;/span&gt;&lt;/b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; – launching the first ever 100% European DbaaS with City Network&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;On November 23&lt;sup&gt;rd&lt;/sup&gt;, Severalnines and our partner City Network &lt;a href="http://www.severalnines.com/news"&gt;announced the first fully European Database as a Service (DBaaS) solution&lt;/a&gt; - in beta form. The City Cloud Database Service is based and operated in the European Union - offering European customers full compliance with EU Directive on Data Protection 95/46/EC and a safe haven from the reaches of the US Patriot Act and making it the first ever offering of its kind. &lt;a href="http://www.severalnines.com/news"&gt;&lt;u&gt;Read more ...&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 8&lt;/span&gt;&lt;/b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; – being talked about at the European Commission – Severalnines in the News&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Following our &lt;a href="http://www.severalnines.com/news"&gt;&lt;u&gt;announcement of the City Cloud Database Service&lt;/u&gt;&lt;/a&gt;, the press took over and &lt;a href="http://www.severalnines.com/news"&gt;&lt;u&gt;20+ original articles&lt;/u&gt;&lt;/a&gt; later, we discovered that we were even being talked about at European Commission conferences. Which shows to prove that politicians do read the papers (or are well briefed by colleagues who do) and that we had hit the right spot with our announcement. &lt;a href="http://www.severalnines.com/news"&gt;&lt;u&gt;Find out more&lt;/u&gt;&lt;/a&gt; and see all the press coverage in our &lt;a href="http://www.severalnines.com/news"&gt;&lt;u&gt;News Center.&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Cloud 9&lt;/span&gt;&lt;/b&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; – winning the EuroCloud Sweden &amp;amp; Europe Awards 2011 for Best Startup!!!&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;We did it! After winning the EuroCloud Award for Sweden, we won the EuroCloud Europe Award for Best Startup last week in Paris at a prestigious ceremony on the Seine. We attended the ceremony together with our friends from City Network and needless to say that we had a great night! The Awards have been widely covered by the European press in multiple languages – &lt;a href="http://www.severalnines.com/news"&gt;&lt;u&gt;visit our News Center for all the details.&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;All in all, it's been a great year for us and we have all of you to thank for that!&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;So here is a BIG 'thank you' from everyone at Severalnines to all our customers, partners, friends and supporters out there. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;Have a great year-end and and an even better start to the year 2012 - see you there!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin-bottom: 0.0001pt;"&gt;&lt;span style="  ;font-family:Arial;font-size:11pt;color:black;"   lang="EN-GB" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom:0cm;margin-bottom:.0001pt"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;color:black;"   lang="EN-GB" &gt;Please do reach out to us with your feedback on &lt;/span&gt;&lt;a href="http://www.facebook.com/pages/Severalnines/104774439598301"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;Facebook&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;a href="http://www.linkedin.com/company/severalnines"&gt;&lt;u&gt;LinkedIn&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;, &lt;a href="https://www.xing.com/companies/severalnines"&gt;&lt;u&gt;XING&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;/span&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;color:black;"   lang="EN-GB" &gt;or directly via these &lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi- font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;a href="http://www.severalnines.com/contact-us"&gt;contact details&lt;/a&gt; &lt;/span&gt;&lt;span   lang="EN-GB" style="font-family:Arial;color:black;"&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;color:black;"   lang="EN-GB" &gt;for fruitful and interactive discussions on this latest release. For 'instant' communication, feel free to follow us on &lt;/span&gt;&lt;a href="http://twitter.com/#%21/severalnines"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;Twitter&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span  lang="EN-GB" style="font-family:Arial;"&gt; &lt;/span&gt;&lt;span style="font-size: 11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="color:black;"&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom:0cm;margin-bottom:.0001pt"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi- font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;About Severalnines&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;a href="http://www.severalnines.com/"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;Severalnines&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;provides automation and management software for easily usable, highly available and auto-scalable cloud database platforms. &lt;a href="http://www.severalnines.com/products-services"&gt;&lt;u&gt;ClusterControl™&lt;/u&gt;&lt;/a&gt;, the company’s flagship product, used by developers and administrators of all skill levels, addresses the full deploy-manage-monitor-scale cycle. Severalnines has enabled over 7,000 deployments to date via its popular online &lt;a href="http://www.severalnines.com/resources/configurator"&gt;&lt;u&gt;configurator&lt;/u&gt;&lt;/a&gt; for clustered MySQL databases.&lt;/span&gt;  &lt;p style="margin-bottom:0cm;margin-bottom:.0001pt"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Arial;font-size:12.0pt;"  lang="EN-GB" &gt;To see who is using Severalnines today, please visit our &lt;a href="http://www.severalnines.com/references"&gt;&lt;u&gt;references page&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2953728638213424867?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2953728638213424867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2953728638213424867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2953728638213424867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2953728638213424867'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/12/walking-on-cloud-9.html' title='Walking on Cloud 9'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2154922934484584014</id><published>2011-11-23T09:48:00.003Z</published><updated>2011-11-23T09:53:20.021Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Patriot Act'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud services'/><category scheme='http://www.blogger.com/atom/ns#' term='clustered databases'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>New Euro Partnership offers safe-haven from US Patriot Act</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:Arial;  panose-1:2 11 6 4 2 2 2 2 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Calibri;  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-alt:Arial;  mso-font-charset:77;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:auto;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin-top:0cm;  margin-right:0cm;  margin-bottom:0cm;  margin-left:41.75pt;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:Arial;  mso-fareast-font-family:Arial;  mso-bidi-font-family:Arial;  color:black;  mso-ansi-language:EN-GB;  mso-fareast-language:EN-GB;} a:link, span.MsoHyperlink  {mso-style-parent:"";  color:blue;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {mso-style-noshow:yes;  color:purple;  text-decoration:underline;  text-underline:single;} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;     &lt;p class="MsoNormal" style="margin-top:0cm;margin-right:24.0pt; margin-bottom:14.0pt;margin-left:0cm;text-align:center;line-height:141%; tab-stops:210.0pt 354.75pt" align="center"&gt;&lt;b&gt;&lt;span style="font-size:18.0pt; line-height:141%;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;New Euro Partnership offers safe-haven from US Patriot Act&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span style="font-size:14.0pt;line-height:141%; font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;Severalnines and City Network launch first fully European ‘Database as a Service’&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:356.25pt"&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family: Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;STOCKHOLM and LONDON, 23&lt;sup&gt;rd&lt;/sup&gt; November&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size:11.0pt" lang="EN-GB"&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family: Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;a href="http://www.severalnines.com/"&gt;-Severalnines&lt;/a&gt;, provider of automation and management software for cloud database platforms, and &lt;a href="http://www.citynetwork.se/"&gt;City Network&lt;/a&gt;, the ‘data center in a browser’ company have announced the first fully European Database as a Service (DBaaS) solution - in beta form. The City Cloud Database Service is based and operated by companies in the European Union - offering European customers full compliance with EU Directive on Data Protection 95/46/EC and a safe haven from the reaches of the US Patriot Act.&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;EU customers can now benefit from the savings and flexibility enabled by cloud-based database services safe in the knowledge that they will not fall under the jurisdiction of the Patriot Act.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Under the Patriot Act, data from EU users of US-owned cloud-based services can currently be shared with US law enforcement agencies without the need to tell the user. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;“Small start-ups and large corporations are turning to the cloud in a bid to deploy and manage databases with as little overhead as possible - but they need to know their data is secure and that they retain the right and ability to control who accesses it,” says Vinay Joosery, chief executive officer at Severalnines.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;“A fully managed database service will enable our customers to further reap the benefits of the cloud,” says Johan Christenson, Chairman at City Network. “We believe that a service owned and operated locally in the EU, and fully compliant with EU data protection laws, will be very particularly attractive for European companies. US companies with European operations will also benefit from the lower latency of a locally hosted solution.”&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;The MySQL based City Cloud Database Service enables companies to outsource the configuration and management of their databases and only pay for what they use.&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;Specific benefits include:&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;Web interface for easy provisioning&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;Zero maintenance or administration – backups, patch management and replication handling are fully automated&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;Performance Management – users have visibility of top queries and can drill-down into performance&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;High Availability – failures are handled automatically to minimise downtime&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;Scalability – users can add more instances at the click of a mouse&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;Comprehensive user interface for administering databases; and&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;line-height: 115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family: Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;•&lt;span style="mso-spacerun: yes"&gt;   &lt;/span&gt;&lt;span style="mso-tab-count:1"&gt;            &lt;/span&gt;Data import and export functionality to help move MySQL databases within the cloud.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;line-height:115%"&gt;&lt;span style="font-size:11.0pt;line-height:115%;font-family:Calibri;mso-fareast-font-family: Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;The service relies on the Severalnines DataCloud platform, a database automation and management platform that helps companies run flexible databases anywhere, whether on their premises or in the cloud. It is based on City Network’s City Cloud computing platform which allows unlimited growth with a focus on stability, security and redundancy.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;City Cloud Database Service is available in beta. Companies can apply for the trial by emailing dbaas@citycloud.eu. The service is available free of charge for the duration of the beta period, which will run until early 2012. More information is available on &lt;a href="http://www.citycloud.eu/"&gt;http://www.citycloud.eu/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm"&gt;&lt;span style="font-size: 11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri;mso-bidi-font-family: Calibri" lang="EN-GB"&gt;[ENDS]&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family: Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family: Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;About Severalnines&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;Severalnines provides automation and management software for easily usable, highly available and auto-scalable cloud database platforms. ClusterControl™, the company’s flagship product, used by developers and administrators of all skill levels, addresses the full deploy-manage-monitor-scale cycle. Severalnines has enabled over 7,000 deployments to date via its popular online configurator for clustered MySQL® databases.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;With everyone at Severalnines coming from an Open Source background and with a view to supporting other start-up organisation, the company is introducing a start-up program, whereby organisations with less than 10 employees and less than one million Euro in funding will be given free access to its enterprise software for 12 months. For information, just email startup@severalnines.com.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;To see who is using Severalnines today, please visit our references page: http://severalnines.com/references&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family: Calibri;mso-bidi-font-family:Calibri" lang="EN-GB"&gt;About City Network&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:0cm;tab-stops:51.75pt"&gt;&lt;span style="font-size:11.0pt;font-family:Calibri;mso-fareast-font-family:Calibri; mso-bidi-font-family:Calibri" lang="EN-GB"&gt;With more than 10,000 customers across Europe City Network is one of the leading European hosting companies. Core services include cloud hosting, dedicated environments as well as shared hosting and domain services. City Network also provides high end backup services via www.onlinebackup.io. City Cloud is the cloud computing brand which you can read more about at www.citycloud.eu. You can find more information about City Network at: www.citynetworkhosting.com &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2154922934484584014?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2154922934484584014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2154922934484584014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2154922934484584014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2154922934484584014'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/11/new-euro-partnership-offers-safe-haven.html' title='New Euro Partnership offers safe-haven from US Patriot Act'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1297493062104620642</id><published>2011-10-25T10:42:00.005+01:00</published><updated>2011-10-25T11:08:05.457+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='galera'/><category scheme='http://www.blogger.com/atom/ns#' term='high-availability'/><category scheme='http://www.blogger.com/atom/ns#' term='synchronous replication'/><title type='text'>Severalnines releases ClusterControl™ for MySQL Galera in cooperation with Codership</title><content type='html'>&lt;style&gt; &lt;!--  /* Font Definitions */ @font-face  {font-family:"Courier New";  panose-1:2 7 3 9 2 2 5 2 4 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Times;  panose-1:2 0 5 0 0 0 0 0 0 0;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Wingdings;  panose-1:5 2 1 2 1 8 4 8 7 8;  mso-font-charset:2;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 0 65536 0 -2147483648 0;} @font-face  {font-family:Calibri;  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:77;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:auto;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Cambria;  panose-1:0 0 0 0 0 0 0 0 0 0;  mso-font-charset:77;  mso-generic-font-family:roman;  mso-font-format:other;  mso-font-pitch:auto;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:Tahoma;  panose-1:2 11 6 4 3 5 4 4 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;} @font-face  {font-family:TrebuchetMS;  mso-font-alt:"Trebuchet MS";  mso-font-charset:128;  mso-generic-font-family:swiss;  mso-font-pitch:auto;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:SimSun;  mso-font-alt:宋体;  mso-font-charset:128;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:0 0 0 0 0 0;} @font-face  {font-family:"Lucida Sans";  panose-1:2 11 6 2 3 5 4 2 2 4;  mso-font-charset:0;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 0 0 0 1 0;}  /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  mso-hyphenate:none;  font-size:12.0pt;  font-family:"Lucida Sans";  mso-ascii-font-family:"Times New Roman";  mso-fareast-font-family:SimSun;  mso-hansi-font-family:"Times New Roman";  mso-bidi-font-family:"Lucida Sans";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} h1  {mso-style-link:"Heading 1 Char";  mso-style-next:Normal;  margin-top:12.0pt;  margin-right:0cm;  margin-bottom:3.0pt;  margin-left:0cm;  mso-pagination:none;  page-break-after:avoid;  mso-outline-level:1;  mso-hyphenate:none;  font-size:16.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Calibri;  mso-fareast-font-family:"Times New Roman";  mso-hansi-font-family:Calibri;  mso-font-kerning:16.0pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;  font-weight:bold;} h4  {mso-style-noshow:yes;  mso-style-link:"Heading 4 Char";  mso-style-next:Normal;  margin-top:12.0pt;  margin-right:0cm;  margin-bottom:3.0pt;  margin-left:0cm;  mso-pagination:widow-orphan;  page-break-after:avoid;  mso-outline-level:4;  mso-hyphenate:none;  font-size:14.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Cambria;  mso-fareast-font-family:"Times New Roman";  mso-hansi-font-family:Cambria;  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;  font-weight:bold;} p.MsoBodyText, li.MsoBodyText, div.MsoBodyText  {mso-style-noshow:yes;  mso-style-link:"Body Text Char";  margin-top:0cm;  margin-right:0cm;  margin-bottom:6.0pt;  margin-left:0cm;  mso-pagination:widow-orphan;  mso-hyphenate:none;  font-size:12.0pt;  font-family:"Lucida Sans";  mso-ascii-font-family:"Times New Roman";  mso-fareast-font-family:SimSun;  mso-hansi-font-family:"Times New Roman";  mso-bidi-font-family:"Lucida Sans";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} a:link, span.MsoHyperlink  {mso-style-noshow:yes;  color:blue;  text-decoration:underline;  text-underline:single;} a:visited, span.MsoHyperlinkFollowed  {mso-style-noshow:yes;  color:purple;  text-decoration:underline;  text-underline:single;} strong  {mso-bidi-font-weight:bold;} p  {margin:0cm;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  mso-hyphenate:none;  font-size:10.0pt;  font-family:"Times New Roman";  mso-ascii-font-family:Times;  mso-fareast-font-family:SimSun;  mso-hansi-font-family:Times;  mso-bidi-font-family:"Times New Roman";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} span.Heading1Char  {mso-style-name:"Heading 1 Char";  mso-style-locked:yes;  mso-style-link:"Heading 1";  mso-ansi-font-size:16.0pt;  mso-bidi-font-size:16.0pt;  font-family:Calibri;  mso-ascii-font-family:Calibri;  mso-hansi-font-family:Calibri;  mso-font-kerning:16.0pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;  font-weight:bold;} span.Heading4Char  {mso-style-name:"Heading 4 Char";  mso-style-noshow:yes;  mso-style-locked:yes;  mso-style-link:"Heading 4";  mso-ansi-font-size:14.0pt;  mso-bidi-font-size:14.0pt;  font-family:Cambria;  mso-ascii-font-family:Cambria;  mso-hansi-font-family:Cambria;  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;  font-weight:bold;} span.BodyTextChar  {mso-style-name:"Body Text Char";  mso-style-noshow:yes;  mso-style-locked:yes;  mso-style-link:"Body Text";  mso-ansi-font-size:12.0pt;  mso-bidi-font-size:12.0pt;  font-family:SimSun;  mso-fareast-font-family:SimSun;  mso-bidi-font-family:"Lucida Sans";  mso-font-kerning:.5pt;  mso-ansi-language:EN-GB;  mso-fareast-language:HI;} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;}  /* List Definitions */ @list l0  {mso-list-id:402682693;  mso-list-type:hybrid;  mso-list-template-ids:1257259072 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l0:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1  {mso-list-id:874005134;  mso-list-type:hybrid;  mso-list-template-ids:-1660662300 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l1:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l1:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} @list l2  {mso-list-id:1599678830;  mso-list-type:hybrid;  mso-list-template-ids:1568694894 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l2:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l3  {mso-list-id:1651206021;  mso-list-type:hybrid;  mso-list-template-ids:1257796698 67698689 67698691 67698693 67698689 67698691 67698693 67698689 67698691 67698693;} @list l3:level1  {mso-level-number-format:bullet;  mso-level-text:;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:Symbol;} @list l3:level2  {mso-level-number-format:bullet;  mso-level-text:o;  mso-level-tab-stop:none;  mso-level-number-position:left;  text-indent:-18.0pt;  font-family:"Courier New";} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} --&gt; &lt;/style&gt;     &lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;Stockholm – October 25&lt;sup&gt;th&lt;/sup&gt; 2011&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;&lt;b style=""&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;&lt;a href="http://www.severalnines.com/"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;u&gt;Severalnines&lt;/u&gt;&lt;/b&gt;&lt;/a&gt;, provider of automation and management software for easily usable, highly available and auto-scalable cloud database platforms, today announces the release of &lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;u&gt;ClusterControl™ for MySQL Galera&lt;/u&gt;&lt;/b&gt;&lt;/a&gt; &lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;span style="text-decoration:none;text-underline:nonecolor:windowtext;" &gt;&lt;/span&gt;&lt;/a&gt;in cooperation with &lt;b style="mso-bidi-font-weight:normal"&gt;Codership&lt;/b&gt;, the replication experts organisation that leverages &lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;the latest developments in computer science to produce &lt;em&gt;&lt;span style="font-family:Times;"&gt;fast and scalable synchronous replication solutions that "just work"&lt;/span&gt;&lt;/em&gt; for databases and similar applications.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt"&gt;&lt;br /&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt"&gt;&lt;b&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;Introducing ClusterControl™ for MySQL Galera&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt"&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;u&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;ClusterControl™ for MySQL Galera&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt; &lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi-mso-font-kerning:0pt; mso-ansi-language:EN-US;mso-fareast-language:EN-USfont-size:10.0pt;" &gt;enables customers to Deploy, Manage, Monitor and Scale a clustered MySQL database platform based on Galera Replication.&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt"&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;Developers and DBAs now have access to all of the features of Severalnines' flagship product ClusterControl™ specifically adapted to MySQL Galera.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;Designed to address issues and needs of MySQL users relying on MySQL Replication, &lt;u&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;ClusterControl™ for MySQL Galera&lt;/a&gt; &lt;/u&gt;offers a complete set of tools to assist developers and administrators of all skill levels to deploy, manage, monitor and scale their replicated MySQL databases.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;br /&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;What is MySQL Galera?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;MySQL Galera is a synchronous multi-master cluster for MySQL/InnoDB or, in similar words, a synchronous multi-master replication plug-in for InnoDB. It is very different from the regular MySQL Replication and addresses a number of issues including write conflicts when writing on multiple masters, replication lag and slaves being out of sync with the master. Users do not have to know which server they can write to (the master) and which servers they can read from (the slaves). With MySQL Galera you can simply write and read from any MySQL Server.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;br /&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;; mso-bidi-Times New Roman&amp;quot;;mso-font-kerning:0pt;mso-ansi-language: EN-US;mso-fareast-language:EN-USfont-family:&amp;quot;;font-size:10.0pt;"  &gt; &lt;/span&gt;  &lt;h4 style="margin: 0.1pt 0cm; color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:11.0pt;mso-bidi- font-family:Times;font-size:14.0pt;"  lang="EN-GB" &gt;Galera Cluster Use Cases&lt;/span&gt;&lt;/h4&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:0cm"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Galera replication works for a wide variety of use cases for high availability and scalability where you tolerate no lost of transactions or no slave lag or you look for write/read scalability Here are some common use cases where Galera can be used.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:36.0pt; text-indent:-18.0pt;mso-list:l3 level1 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Read Master&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:72.0pt; text-indent:-18.0pt;mso-list:l3 level2 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:&amp;quot;Courier New&amp;quot;; mso-fareast-font-family:&amp;quot;Courier New&amp;quot;;mso-bidi-Courier New&amp;quot;font-family:&amp;quot;;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;o&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Traditional MySQL master-slave topology, but with Galera all "slave" nodes are capable masters at all times, it is just the application who treats them as slaves. Galera replication can guarantee 0 slave lag for such installations and due to parallel slave applying, much better throughput for the cluster.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:36.0pt; text-indent:-18.0pt;mso-list:l3 level1 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Write Scalability&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:72.0pt; text-indent:-18.0pt;mso-list:l3 level2 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:&amp;quot;Courier New&amp;quot;; mso-fareast-font-family:&amp;quot;Courier New&amp;quot;;mso-bidi-Courier New&amp;quot;font-family:&amp;quot;;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;o&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Distributing writes across the cluster will harness the CPU power in slave nodes for better use to process client write transactions. Due to the row based replication method, only changes made during a client transaction will be replicated and applying such a transaction in slave applier is much faster than the processing of the original transaction. Therefore the cluster can distribute the heavy client transaction processing across many master nodes and this yields in better write transaction throughput overall.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:36.0pt; text-indent:-18.0pt;mso-list:l3 level1 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;WAN Clustering&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:72.0pt; text-indent:-18.0pt;mso-list:l3 level2 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:&amp;quot;Courier New&amp;quot;; mso-fareast-font-family:&amp;quot;Courier New&amp;quot;;mso-bidi-Courier New&amp;quot;font-family:&amp;quot;;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;o&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Synchronous replication works fine over the WAN network. There will be a delay, which is proportional to the network round trip time (RTT), but it only affects the commit operation.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:36.0pt; text-indent:-18.0pt;mso-list:l3 level1 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Disaster Recovery&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:72.0pt; text-indent:-18.0pt;mso-list:l3 level2 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:&amp;quot;Courier New&amp;quot;; mso-fareast-font-family:&amp;quot;Courier New&amp;quot;;mso-bidi-Courier New&amp;quot;font-family:&amp;quot;;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;o&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Disaster recovery is a sub-class of WAN replication. Here one data center is passive and only receives replication events, but does not process any client transactions. Such a remote data center will be up to date at all times and no data loss can happen. During recovery, the spare site is just nominated as primary and application can continue as normal with a minimal fail over delay.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:36.0pt; text-indent:-18.0pt;mso-list:l3 level1 lfo4"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Latency Eraser&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p style="margin: 0.1pt 0cm 0.1pt 72pt; text-indent: -18pt;"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:&amp;quot;Courier New&amp;quot;; mso-fareast-font-family:&amp;quot;Courier New&amp;quot;;mso-bidi-Courier New&amp;quot;font-family:&amp;quot;;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;o&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;With WAN replication topology, cluster nodes can be located close to clients. Therefore all read &amp;amp; write operations will be super fast with the local node connection. The RTT related delay will be experienced only at commit time, and even then it can be generally accepted by end user, usually the kill-joy for end user experiences is the slow browsing response time, and read operations are as fast as they possibly can be.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt; margin-left:0cm;mso-para-margin-top:.01gd;mso-para-margin-right:0cm;mso-para-margin-bottom: .01gd;mso-para-margin-left:0cm;mso-hyphenate:auto"&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi- font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Features and benefits of MySQL Galera&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/a&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;b style=""&gt;&lt;span style=" ;font-family:Times;font-size:11pt;"  lang="EN-GB" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Galera features&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Active-active multimaster cluster&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Synchronous replication for InnoDB&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Read and write to any MySQL Server&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Automatic failover and node joining&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;True Parallel replication&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Direct client connections&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Galera benefits&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;No slave lag or lost of data or out-of-sync situations. &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:72.0pt;text-indent:-18.0pt;mso-list:l1 level2 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:&amp;quot;Courier New&amp;quot;; mso-fareast-font-family:&amp;quot;Courier New&amp;quot;;mso-bidi-Courier New&amp;quot;font-family:&amp;quot;;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;o&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;All nodes are consistent.&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Scales writes and reads&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo1"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Works synchronously over LAN/WAN/CLOUD&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=" ;font-family:Times;font-size:11pt;"  lang="EN-GB" &gt;No changes to applications&lt;/span&gt;&lt;/p&gt;&lt;span style=" ;font-family:Times;font-size:11pt;"  lang="EN-GB" &gt;&lt;br /&gt;&lt;/span&gt;&lt;p style="margin-top:.1pt"&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;u&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;View all of the features here &lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;/a&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt"&gt;&lt;span lang="EN-GB"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;b&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt"&gt;&lt;b&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;Deploying a Galera cluster with ClusterControl™&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;A Galera cluster can be configured using the &lt;u&gt;&lt;a href="http://www.severalnines.com/galera-configurator/"&gt;Severalnines Configurator&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt"&gt;&lt;br /&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:13.0pt;" lang="EN-GB" &gt;&lt;/span&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Our &lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera-tutorial"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;u&gt;Online Tutorial&lt;/u&gt;&lt;/b&gt;&lt;/a&gt; &lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera-tutorial"&gt;&lt;span style="text-decoration:none;text-underline:nonecolor:windowtext;" &gt;&lt;/span&gt;&lt;/a&gt;provides an in-depth view and understanding of Galera cluster, covering the following topics:&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Introduction to Galera cluster&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Differences between MySQL Replication and Galera replication&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;The pros and cons of Galera cluster&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Using Galera cluster to replicate between data centers&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Certification-based Replication&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Deploying a Galera cluster&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Failure handling with ClusterControl™ and Galera&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Adding a node to a Galera cluster&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:36.0pt; margin-bottom:.0001pt;text-indent:-18.0pt;mso-list:l2 level1 lfo3"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:10.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Schema changes in Galera cluster&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt"&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;Try the ClusterControl™ Configurator for MySQL Galera today or book a demo to see it live in action!&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-pagination: none;mso-list:l0 level1 lfo2;text-autospace:ideograph-numeric"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family: Symbol;mso-bidi-mso-ansi-language:DEfont-family:Symbol;font-size:11.0pt;color:black;"   lang="DE" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.severalnines.com/galera-configurator/"&gt;&lt;u&gt;&lt;span style=" font-family:Times;mso-fareast-font-family:TrebuchetMS;mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;ClusterControl™ &lt;/span&gt;&lt;/u&gt;&lt;u&gt;&lt;span style="font-family:Times;mso-fareast-font-family:TrebuchetMS; mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;Configurator for MySQL Galera&lt;span style="mso-spacerun: yes"&gt;  &lt;/span&gt;– try it today!&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-family:Times;mso-fareast-font-family:TrebuchetMS; mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt; &lt;/span&gt;&lt;span style="font-family:Times;mso-fareast-font-family:TrebuchetMS; mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-pagination: none;mso-list:l0 level1 lfo2;text-autospace:ideograph-numeric"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family: Symbol;mso-bidi-mso-ansi-language:DEfont-family:Symbol;font-size:11.0pt;color:black;"   lang="DE" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.severalnines.com/clustercontrol-mysql-galera-tutorial"&gt;&lt;u&gt;&lt;span style=" font-family:Times;mso-fareast-font-family:TrebuchetMS;mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;Online Tutorial – ClusterControl™ for MySQL Galera&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-family: Times;mso-fareast-font-family:TrebuchetMS;mso-bidi- mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:36.0pt;text-indent:-18.0pt;mso-pagination: none;mso-list:l0 level1 lfo2;text-autospace:ideograph-numeric"&gt;&lt;span style="font-family:Symbol;mso-fareast-font-family: Symbol;mso-bidi-mso-ansi-language:DEfont-family:Symbol;font-size:11.0pt;color:black;"   lang="DE" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://support.severalnines.com/home#overview"&gt;&lt;u&gt;&lt;span style=" font-family:Times;mso-fareast-font-family:TrebuchetMS;mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;Severalnines Knowledge Base&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-family:Times;mso-fareast-font-family:TrebuchetMS; mso-bidi-mso-ansi-language:DEfont-family:TrebuchetMS;font-size:11.0pt;color:black;"   lang="DE" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Symbol; mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;span style="mso-list:Ignore"&gt;·&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="  ;font-family:Times;font-size:11pt;color:black;"   lang="DE" &gt;&lt;a href="http://www.severalnines.com/book-demo-now"&gt;&lt;span style=" text-decoration:none;text-underline:nonecolor:windowtext;" &gt;Book a demo&lt;/span&gt;&lt;/a&gt;!&lt;a href="http://www.severalnines.com/book-demo-now"&gt;&lt;span style=" text-decoration:none;text-underline:nonecolor:windowtext;" &gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:0cm;margin-left:0cm; margin-bottom:.0001pt"&gt;&lt;span   lang="EN-GB"  style="font-family:Times;font-size:11.0pt;color:black;"&gt;Please do reach out to us with your feedback on &lt;/span&gt;&lt;a href="http://www.facebook.com/pages/Severalnines/104774439598301"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;Facebook&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;/span&gt;&lt;span   lang="EN-GB"  style="font-family:Times;font-size:11.0pt;color:black;"&gt;, &lt;/span&gt;&lt;a href="http://www.linkedin.com/company/severalnines"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;LinkedIn&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;/span&gt;&lt;span  lang="EN-GB"  style="font-family:Times;font-size:11.0pt;"&gt;, &lt;/span&gt;&lt;a href="https://www.xing.com/companies/severalnines"&gt;&lt;u&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;XING&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;/span&gt;&lt;span  lang="EN-GB"  style="font-family:Times;font-size:11.0pt;"&gt; &lt;span style="color:black;"&gt;or directly via these &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-family:Times;font-size:12.0pt;"  lang="EN-GB" &gt;&lt;a href="http://www.severalnines.com/contact-us"&gt;contact details&lt;/a&gt; &lt;/span&gt;&lt;span   lang="EN-GB"  style="font-family:Times;font-size:11.0pt;color:black;"&gt;for fruitful and interactive discussions on this latest release. For 'instant' communication, feel free to follow us on &lt;/span&gt;&lt;a href="http://twitter.com/#%21/severalnines"&gt;&lt;u&gt;&lt;span style=" ;font-family:Times;font-size:11.0pt;"  lang="EN-GB" &gt;Twitter&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span style=" ;font-family:Times;font-size:11.0pt;"  lang="EN-GB" &gt;&lt;span style="color:black;"&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p style="margin-top: 0.1pt;"&gt;&lt;b&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;About Severalnines&lt;/span&gt;&lt;/b&gt;&lt;span lang="EN-GB"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt"&gt;&lt;span lang="EN-GB"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt"&gt;&lt;a href="http://www.severalnines.com/"&gt;&lt;u&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt;Severalnines&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;span lang="EN-GB"  style="font-size:11.0pt;"&gt; provides automation and management software for easily usable, highly available and auto-scalable cloud database platforms. &lt;a href="http://www.severalnines.com/products-services"&gt;&lt;u&gt;ClusterControl™&lt;/u&gt;&lt;/a&gt;, the company’s flagship product, used by developers and administrators of all skill levels, addresses the full deploy-manage-monitor-scale cycle. Severalnines has enabled over 7,000 deployments to date via its popular &lt;a href="http://www.severalnines.com/resources/configurator"&gt;online &lt;u&gt;configurator&lt;/u&gt;&lt;/a&gt; for clustered MySQL databases.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;To see who is using Severalnines today, please visit our &lt;a href="http://www.severalnines.com/references"&gt;&lt;u&gt;references page&lt;/u&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0.1pt;"&gt;&lt;br /&gt;&lt;span lang="EN-GB"  style="font-size:11pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:0cm; mso-prop-change:&amp;quot;Sakari Keskitalo&amp;quot; 20111023T1219"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;&lt;span style="font-weight: bold;"&gt;About Codership&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-top:.1pt;margin-right:0cm;margin-bottom:.1pt;margin-left:0cm; mso-prop-change:&amp;quot;Sakari Keskitalo&amp;quot; 20111023T1219"&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-size:10.0pt;" lang="EN-GB" &gt;Codership Oy was founded in 2007 by database clustering experts to exploit the latest developments in computer science and produce &lt;em&gt;&lt;span style="font-family:Times;"&gt;fast &amp;amp; scalable synchronous replication solutions &lt;/span&gt;&lt;/em&gt;for databases and similar applications. Currently, Codership offers multi-master cluster for MySQL database as open source. For more information about our open source MySQL Galera software and support offering, visit&lt;/span&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;mso-bidi-mso-bidi- font-family:Tahoma;font-size:8.0pt;color:black;"   lang="EN-GB" &gt; &lt;/span&gt;&lt;/b&gt;&lt;a href="http://www.codership.com/"&gt;&lt;b&gt;&lt;span style="font-size:11.0pt; mso-bidi-font-size:8.0pt;color:black;"  lang="EN-GB" &gt;&lt;span style="font-weight:normal;text-decoration:none;text-underline: nonecolor:windowtext;" &gt;www.codership.com&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;mso-bidi-mso-bidi- font-family:Tahoma;font-size:8.0pt;color:black;"   lang="EN-GB" &gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;    &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p class="MsoNormal" style="text-autospace:ideograph-numeric"&gt;&lt;b&gt;&lt;span style="font-size:11.0pt;mso-bidi- font-family:Times;font-size:8.0pt;color:black;"   lang="EN-GB" &gt;© 2011 Severalnines AB. Severalnines and the Severalnines logo(s) are trademarks of Severalnines AB. &lt;/span&gt;&lt;/b&gt;&lt;span style="font-size:11.0pt;mso-bidi-font-family:Times;font-size:8.0pt;"  lang="EN-GB" &gt;MySQL is a registered trademark of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1297493062104620642?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1297493062104620642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1297493062104620642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1297493062104620642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1297493062104620642'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/10/severalnines-releases-clustercontrol_25.html' title='Severalnines releases ClusterControl™ for MySQL Galera in cooperation with Codership'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-6688813402684298585</id><published>2011-10-13T08:00:00.003+01:00</published><updated>2011-10-13T09:33:00.019+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql 5.5'/><category scheme='http://www.blogger.com/atom/ns#' term='percona'/><category scheme='http://www.blogger.com/atom/ns#' term='semi-sync replication'/><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql ha'/><title type='text'>Multi-master and read slaves using Severalnines</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-OmNyf7FBULs/TaMQUiQ6zKI/AAAAAAAAAMI/JG7bjJBQXhU/s1600/Slide1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-OmNyf7FBULs/TaMQUiQ6zKI/AAAAAAAAAMI/JG7bjJBQXhU/s320/Slide1.jpg" alt="" id="BLOGGER_PHOTO_ID_5594333107105483938" border="0" /&gt;&lt;/a&gt;This blog post shows how you can use the &lt;a href="http://www.severalnines.com/replication-configurator/"&gt;Severalnines Configurator for MySQL Replication  &lt;/a&gt;to deploy a Multi-master replication setup, and install &lt;a href="http://www.severalnines.com/cluster-control"&gt;ClusterControl&lt;/a&gt;.&lt;br /&gt;You can also &lt;a href="http://www.severalnines.com/resources/videos"&gt;watch videos &lt;/a&gt;showing what is described below or read an &lt;a href="http://www.severalnines.com/resources/tutorials"&gt;even more detailed tutorial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When the deployment is finished you have a set of tools to manage and monitor replication, as well as to add new slaves, and to perform failover.&lt;br /&gt;You can choose:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The number of slaves you wish to connect to the master-&amp;gt;relay master.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;whether you want to use MySQL 5.5.x or Percona 5.5.x&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Semi-sync replication or not (semi sync really recommended)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;cloud provider (on premise/EC2/Rackspace&lt;/li&gt;&lt;/ul&gt;Please note that your hosts must resolve to a valid ip. If 'hostname -i' resolves to nothing or to 127.0.0.1 it will not work.&lt;br /&gt;&lt;br /&gt;We recommend also that you don't use bi-directional replication. It may sound like a good idea, but in practice it is challenging to get it working well.&lt;br /&gt;&lt;br /&gt;When deployed you can easily perform tasks as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add new slaves&lt;/li&gt;&lt;li&gt;Failover&lt;/li&gt;&lt;li&gt;View replication health information&lt;/li&gt;&lt;li&gt;Stop/start replication links&lt;/li&gt;&lt;li&gt;Stage slaves&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The Configurator for MySQL Replication is a wizard-like application and you have to enter details about the setup you want to have. When this is done you will get a tar.gz that contains the deployment and management scripts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;ClusterControl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The deployment process will also install  ClusterControl which is a set of monitoring agents and functionality to  manage the database installation.  The agents are deployed on each server and collects host information and information from the local MySQL server a particular agent is monitoring (such as replication statistics and status information).&lt;br /&gt;&lt;br /&gt;One server (dedicated) is denoted the ClusterControl server. It is holding a database, CMON DB, that contains data about the monitored hosts, and the reporting data from the  local agents is stored in this database. On this server a Controller is running and faciliates failover etc.&lt;br /&gt;&lt;br /&gt;Moreover, the ClusterControl server exposes a web  interface that can be used to graphically see the health of the  replication cluster (after the deployment is done, take a web browser and point it to http://clustercontrolserver/cmon  :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-GrrXKz9FGUw/TaMO7TRxQCI/AAAAAAAAAL4/Q372Vv3SnMo/s1600/cmon-repl-monitor.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 165px;" src="http://4.bp.blogspot.com/-GrrXKz9FGUw/TaMO7TRxQCI/AAAAAAAAAL4/Q372Vv3SnMo/s320/cmon-repl-monitor.png" alt="" id="BLOGGER_PHOTO_ID_5594331574074163234" border="0" /&gt;&lt;/a&gt;From ClusterControl you can then upload a schema, and start loading in  data into a database. As well as doing GRANTs etc. In the Enterprise  version you an also define &lt;span style="font-weight: bold;"&gt;performance&lt;/span&gt; probes (to make sure you system  is not degrading over time), tune queries, try out new queries before  putting them in production. You also have a &lt;span style="font-weight: bold;"&gt;Query Monitor&lt;/span&gt; and explains  at your hands.&lt;br /&gt;&lt;br /&gt;Failover is automatic (if the master fails, the relay will become the  new master). When the master comes up again, it will connect to the new  master and sync up, become the relay, and the slaves will failover to  the relay.  We also make use of the replication features of MySQL 5.5 (such as relay recovery) and a bunch of other techniques.&lt;br /&gt;&lt;br /&gt;You can also &lt;span style="font-weight: bold;"&gt;add slaves or remove slaves &lt;/span&gt;with the &lt;span style="font-weight: bold;"&gt;click of a button&lt;/span&gt;, as well as scheduling backups.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Installation&lt;/span&gt;&lt;br /&gt;When you have finished the wizard you get a package that you should deploy on the ClusterControl server:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;tar xvfz s9s-mysql-55.tar.gz&lt;br /&gt;cd s9s-mysql-55/mysql/scripts/install&lt;br /&gt;./deploy.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The 'deploy.sh' script will create data directories, install initd scripts, create mysql users, apply database GRANTs (those you defined in the Configurator), and install ClusterControl.&lt;br /&gt;&lt;br /&gt;A while in 'deploy.sh' replication will be started, and it can look like this:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;*******************************************************************************&lt;br /&gt;*                   Starting replication                                      *&lt;br /&gt;*******************************************************************************&lt;br /&gt;Master hosts&lt;br /&gt;------------&lt;br /&gt;10.30.30.31: up&lt;br /&gt;10.30.30.32: up&lt;br /&gt;Slave hosts&lt;br /&gt;------------&lt;br /&gt;10.30.30.33: up&lt;br /&gt;10.30.30.34: up&lt;br /&gt;starting replication between 10.30.30.31 --&amp;gt; 10.30.30.32 (change master=1, reset master=1)&lt;br /&gt;replication [started] 10.30.30.31 --&amp;gt; 10.30.30.32&lt;br /&gt;starting replication between 10.30.30.32 --&amp;gt; 10.30.30.33 (change master=1, reset master=0)&lt;br /&gt;replication [started] 10.30.30.32 --&amp;gt; 10.30.30.33&lt;br /&gt;starting replication between 10.30.30.32 --&amp;gt; 10.30.30.34 (change master=1, reset master=0)&lt;br /&gt;replication [started] 10.30.30.32 --&amp;gt; 10.30.30.34&lt;br /&gt;master_host --&amp;gt;slave_host status  master_status  slave_status [binlog|m_pos|exec_pos|lag]&lt;br /&gt;10.30.30.31 10.30.30.32 ok         binlog.000003:250 binlog.000003| 250| 250| 0&lt;br /&gt;--- slaves follows ---&lt;br /&gt;10.30.30.32 10.30.30.33 ok         binlog.000001:107 binlog.000001| 107| 107| 0&lt;br /&gt;10.30.30.32 10.30.30.34 ok         binlog.000001:107 binlog.000001| 107| 107| 0&lt;br /&gt;&lt;/pre&gt;After this, ClusterControl will be installed. If you are using RPM based installation there can be rpm dependency problems (we install libmysqlclient.so.16), but it can conflict with what comes with your distribution. Please let us know if this happens, contact us on community@severalnines.com.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Starting/stopping Replication and basic examples&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After having executed deploy.sh, you can view the status of the mysql servers:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;cd s9s-mysql-55/mysql/scripts/&lt;br /&gt;./status.sh  -a&lt;br /&gt;Master hosts&lt;br /&gt;------------&lt;br /&gt;10.30.30.31: up&lt;br /&gt;10.30.30.32: up&lt;br /&gt;Slave hosts&lt;br /&gt;------------&lt;br /&gt;10.30.30.33: up&lt;br /&gt;10.30.30.34: up&lt;br /&gt;&lt;/pre&gt;To view the replication status:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;cd s9s-mysql-55/mysql/scripts/&lt;br /&gt;./repl-status.sh -a&lt;br /&gt;master_host --&amp;gt;slave_host status  master_status  slave_status [binlog|m_pos|exec_pos|lag]&lt;br /&gt;10.30.30.31 10.30.30.32 ok         binlog.000003:250 binlog.000003| 250| 250| 0&lt;br /&gt;--- slaves follows ---&lt;br /&gt;10.30.30.32 10.30.30.33 ok         binlog.000001:107 binlog.000001| 107| 107| 0&lt;br /&gt;10.30.30.32 10.30.30.34 ok         binlog.000001:107 binlog.000001| 107| 107| 0&lt;br /&gt;&lt;/pre&gt;To stop replication between 10.30.30.32 (relay master) to 10.0.30.33 you can do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;cd s9s-mysql-55/mysql/scripts/&lt;br /&gt;./stop-repl.sh -m 10.30.30.32 -s 10.30.30.33&lt;br /&gt;stopping replication between 10.30.30.32 --&amp;gt; 10.30.30.33&lt;br /&gt;replication [stopped] 10.30.30.32 --&amp;gt; 10.30.30.33&lt;br /&gt;&lt;/pre&gt;To start replication again you can do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;cd s9s-mysql-55/mysql/scripts/&lt;br /&gt;./start-repl.sh -m 10.30.30.32 -s 10.30.30.33&lt;br /&gt;starting replication between 10.30.30.32 --&amp;gt; 10.30.30.33 (change master=0, reset master=0)&lt;br /&gt;replication [started] 10.30.30.32 --&amp;gt; 10.30.30.33&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Other options for 'start-repl.sh' is -r (for reset master, dangerous), -c (change master). Normally these options are not needed but you can use them in conjuction with  -l (logpos) and -f (binlog file) if you want to start replication from a particular position.&lt;br /&gt;&lt;br /&gt;And we can check the replication status:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;ubuntu@ip-10-49-122-115:~/s9s-mysql-55/mysql/scripts$ ./repl-status.sh -a&lt;br /&gt;serverid master_host --&amp;gt;slave_host status  master_status  slave_status [binlog|m_pos|exec_pos|lag]&lt;br /&gt;1      10.48.207.130 10.48.139.24 ok         binlog.000005:494 binlog.000005| 494| 494| 0&lt;br /&gt;2     replication not activated - you must start replication on this link.&lt;br /&gt;--- slaves follows ---&lt;br /&gt;3      10.48.139.24 10.49.122.56 ok         binlog.000005:485 binlog.000005| 485| 485| 0&lt;br /&gt;4      10.48.139.24 10.49.110.183 ok         binlog.000005:485 binlog.000005| 485| 485| 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Good luck and don't hesitate to contact us at feedback@severalnines.com  or community@severalnines.com if you have any problems or whatever it may be. You can also &lt;a href="http://www.severalnines.com/book-demo-now"&gt;book a demo&lt;/a&gt; this if you want to know more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-6688813402684298585?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/6688813402684298585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=6688813402684298585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6688813402684298585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6688813402684298585'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/10/multi-master-and-read-slaves-using.html' title='Multi-master and read slaves using Severalnines'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-OmNyf7FBULs/TaMQUiQ6zKI/AAAAAAAAAMI/JG7bjJBQXhU/s72-c/Slide1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8316136363476647853</id><published>2011-10-04T08:58:00.005+01:00</published><updated>2011-10-04T09:26:06.705+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='clustered databases'/><category scheme='http://www.blogger.com/atom/ns#' term='high availability'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Replication'/><category scheme='http://www.blogger.com/atom/ns#' term='automation'/><title type='text'>Severalnines releases ClusterControl™ for MySQL Replication v. 1.1.9</title><content type='html'>Stockholm - October 4th 2011&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/"&gt;Severalnines&lt;/a&gt;, provider of automation and management software for easily usable, highly available and auto-scalable cloud database platforms, today announces the latest release of its flagship product &lt;a target="_blank" href="http://www.severalnines.com/cluster-control-mysql-replication"&gt;ClusterControl™ for MySQL Replication&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Introducing ClusterControl™ for MySQL Replication v.1.1.9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/cluster-control-mysql-replication"&gt;ClusterControl™ for MySQL Replication&lt;/a&gt; enables customers to Deploy, Manage, Monitor and Scale a clustered database platform based on the standard MySQL Replication.&lt;br /&gt;&lt;br /&gt;Developers and DBAs now have access to all of the features of Severalnines' flagship product ClusterControl™ specifically adapted to MySQL Replication.&lt;br /&gt;&lt;br /&gt;Designed to address issues and needs of MySQL users relying on MySQL Replication, &lt;a target="_blank" href="http://www.severalnines.com/cluster-control-mysql-replication"&gt;ClusterControl™ for MySQL Replication&lt;/a&gt; offers a complete set of tools to assist developers and administrators of all skill levels to deploy, manage, monitor and scale their replicated MySQL databases.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;a target="_blank" href="http://www.severalnines.com/cluster-control-mysql-replication"&gt;Features and benefits&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Config wizard&lt;/span&gt;&lt;br /&gt;- Generates individual configurations based on application needs&lt;br /&gt;- Creates deployment packages&lt;br /&gt;- Deploys a Replication cluster in minutes&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Config manager&lt;/span&gt;&lt;br /&gt;- Sanity checks changes to configuration parameters&lt;br /&gt;- Rolls out configuration changes to all servers and automates rolling restarts&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Upgrade advisor&lt;/span&gt;&lt;br /&gt;- Keeps users up-to-date by performing upgrades&lt;br /&gt;- Applies minor patches or major upgrades&lt;br /&gt;- Allows roll-back to previous versions&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Availability manager&lt;/span&gt;&lt;br /&gt;- Clusterware that detects process failures&lt;br /&gt;- Automates MySQL master fail-over&lt;br /&gt;- Performs recovery of failed database processes&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Backup manager&lt;/span&gt;&lt;br /&gt;- Schedule backups or allow users to start an immediate backup&lt;br /&gt;- Monitor and browse existing backups&lt;br /&gt;- Define retention policies&lt;br /&gt;- No proprietary data formats&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Monitor&lt;/span&gt;&lt;br /&gt;- Granular end-to-end transaction and database operation monitoring&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Query analyzer&lt;/span&gt;&lt;br /&gt;- Analysis on cluster-wide running queries&lt;br /&gt;- Global MySQL processlist&lt;br /&gt;- Deep real-time and historical visibility into individual nodes&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Alarms and notifications&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scale&lt;/span&gt;&lt;br /&gt;- Add new Slaves (or remove) to the cluster without any downtime&lt;br /&gt;- Easily specify hostnames of Slaves to be added&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/features-clustercontrol%E2%84%A2-mysql-replication"&gt;View all of the features here&lt;/a&gt;.&lt;br /&gt;&lt;h2&gt;Automated fail-over with ClusterControl™&lt;/h2&gt;Standard MySQL Replication is easy to set up, and is probably the most widely used mechanism to provide high availability for MySQL. Unfortunately, it is somewhat fragile. There is no support for fail-over. Slaves can easily end up with different data from the master. Diverging datasets can cause replication to stop. Crashing masters can corrupt binary logs, which means replication is not possible any more.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/products-services"&gt;ClusterControl™&lt;/a&gt; addresses the problems associated with master fail-over and resynchronizations, and avoids data loss by taking advantage of semi-sync replication in MySQL 5.5.&lt;br /&gt;&lt;br /&gt;ClusterControl™ automates fail-over and reconfiguration of the replication setup to keep the Replication cluster stable and running. This &lt;a target="_blank" href="http://www.severalnines.com/resources/tutorials"&gt;online tutorial&lt;/a&gt; explains the MySQL Replication architecture, and how different types of failures are handled.&lt;br /&gt;&lt;br /&gt;Users can &lt;a target="_blank" href="http://www.severalnines.com/replication-configurator/"&gt;try it now&lt;/a&gt; by generating their &lt;a target="_blank" href="http://www.severalnines.com/replication-configurator/"&gt;deployment package&lt;/a&gt;.&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reources related to this release&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/replication-configurator/"&gt;Configurator for MySQL Replication&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/resources/tutorials"&gt;Tutorial: ClusterControl for MySQL Replication&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/resources/videos"&gt;Videos: Online Demos on MySQL Replication&lt;/a&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/book-demo-now"&gt;Book a demo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please do reach out to us with your feedback on &lt;a target="_blank" href="http://www.facebook.com/pages/Severalnines/104774439598301"&gt;Facebook&lt;/a&gt;, &lt;a target="_blank" href="http://www.linkedin.com/company/severalnines"&gt;LinkedIn&lt;/a&gt;, &lt;a target="_blank" href="https://www.xing.com/companies/severalnines"&gt;XING&lt;/a&gt; or directly via these &lt;a target="_blank" href="http://www.severalnines.com/contact-us"&gt;contact details&lt;/a&gt; for fruitful and interactive discussions on this latest release. For 'instant' communication, feel free to follow us on &lt;a target="_blank" href="http://twitter.com/#%21/severalnines"&gt;Twitter&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;About Severalnines&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.severalnines.com/"&gt;Severalnines&lt;/a&gt; provides automation and management software for easily usable, highly available and auto-scalable cloud database platforms. &lt;a target="_blank" href="http://www.severalnines.com/products-services"&gt;ClusterControl™&lt;/a&gt;, the company’s flagship product, used by developers and administrators of all skill levels, addresses the full deploy-manage-monitor-scale cycle. Severalnines has enabled over 7,000 deployments to date via its popular &lt;a target="_blank" href="http://www.severalnines.com/resources/configurator"&gt;online configurator&lt;/a&gt; for clustered MySQL databases.&lt;br /&gt;&lt;br /&gt;To see who is using Severalnines today, please visit our &lt;a target="_blank" href="http://www.severalnines.com/references"&gt;references page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8316136363476647853?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8316136363476647853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8316136363476647853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8316136363476647853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8316136363476647853'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/10/severalnines-releases-clustercontrol.html' title='Severalnines releases ClusterControl™ for MySQL Replication v. 1.1.9'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1832528948490755305</id><published>2011-08-23T14:30:00.011+01:00</published><updated>2011-08-23T15:37:18.678+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud database'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='AMI'/><category scheme='http://www.blogger.com/atom/ns#' term='Amazon EC2'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>MySQL Clusters on Amazon EC2 - verified AMIs</title><content type='html'>We regularly receive questions from our user community with regards to which AMIs to use when deploying database clusters on Amazon EC2.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;As part of our ongoing development work on the &lt;a href="http://www.severalnines.com/cluster-configurator/" target="_blank"&gt;Severalnines Configurator&lt;/a&gt; and &lt;a href="http://www.severalnines.com/cluster-control" target="_blank"&gt;ClusterControl&lt;/a&gt;, we have recently done some testing on deploying MySQL Cluster on EC2 using Severalnines on three different AMIs. We thought we should share the results of these tests, hence the reason for this week's blog!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;If you would like to test such a deployment yourself, feel free to use the parameters and guidelines below to do so. You can also &lt;a href="http://www.severalnines.com/resources/videos" target="_blank"&gt;check out these new videos&lt;/a&gt; to see &lt;a href="http://www.severalnines.com/resources/videos" target="_blank"&gt;Severalnines technology in action&lt;/a&gt; prior to getting started with your testing.&lt;br /&gt;&lt;br /&gt;These are the three AMIs that we have tested the deployment on so as to have a good representative mix:&lt;br /&gt;&lt;br /&gt;* RightImage_CentOS_5.4_x64_v5.5.9&lt;br /&gt;* Amazon QuickStart AMI: amzn-ami-2011.02.1.x86_64-ebs&lt;br /&gt;* Canonical AMI: ubuntu-maverick-5g-64bit&lt;br /&gt;&lt;br /&gt;Of course, it would be great to hear from you on how your testing went and on what AMIs you are currently using yourself. Feel free to share your feedback with us on &lt;a href="http://www.facebook.com/pages/Severalnines/104774439598301" target="_blank"&gt;Facebook&lt;/a&gt;, &lt;a href="http://twitter.com/#%21/severalnines" target="_blank"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.linkedin.com/company/severalnines" target="_blank"&gt;LinkedIn&lt;/a&gt; or leave a comment on this blog.&lt;br /&gt;&lt;br /&gt;Here are the parameters that you can use to test your MySQL Cluster deployment using the &lt;a href="http://www.severalnines.com/cluster-configurator/" target="_blank"&gt;Severalnines Configurator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;In all cases, the Internal IP was used as the Hostname in the Configurator&lt;/span&gt; and the following was used for all tests:&lt;br /&gt;&lt;br /&gt;* Instance type: m1.larg&lt;br /&gt;* Number of instances: 5 (1 for ClusterControl), 2 for data nodes, 2 for MySQL servers and management servers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RightImage_CentOS_5.4_x64_v5.5.9 (ami-0f42a966)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* Cloud Provider [Configurator]: Amazon EC2&lt;br /&gt;* OS user [Configurator]: root&lt;br /&gt;* Operating System [Configurator]: Redhat/Fedora/Centos/Oracle&lt;br /&gt;* Data directories [Configurator]: /mnt/data/mysqlcluster for data nodes and management servers and /mnt/data/mysql (for the mysql servers) both RPM and tar.gz installation was tested using 'deploy.sh'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Canonical AMI: ubuntu-maverick-5g-64bit (ami-ac41b7c5)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* Cloud Provider [Configurator]: Amazon EC2&lt;br /&gt;* OS user [Configurator]: ubuntu&lt;br /&gt;* Operating System [Configurator]: Ubuntu/Debian&lt;br /&gt;* DataMemory [Configurator]: 512MB&lt;br /&gt; Set it down in the Configurator - yes, it is tiny, but the default disk in this AMI is tiny, so you should add a 20GB EBS Volume if you want to test with the default suggested DataMemory&lt;br /&gt;* Data directories [Configurator]: default suggested ones.&lt;br /&gt;* Installation was tested using 'deploy.sh'&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Amazon QuickStart AMI: amzn-ami-2011.02.1.x86_64-ebs (ami-8e1fece7)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* Cloud Provider [Configurator]: Amazon EC2&lt;br /&gt;* OS user [Configurator]: ec2-user&lt;br /&gt;* Operating System [Configurator]: Redhat/Fedora/Centos/Oracle&lt;br /&gt;* DataMemory [Configurator]: 512MB&lt;br /&gt; Set it down in the Confgurator. Yes, it is tiny, but the default disk in this AMI is tiny, so you should add a 20GB EBS Volume if you want to test with the default suggested DataMemory.&lt;br /&gt;* Data directories [Configurator]: default suggested ones.&lt;br /&gt;* .tar.gz installation using 'deploy.sh' no problems.&lt;br /&gt;*  RPM installation - dependency problems with libmysqlclient.so.16 vs libmysqlclient.so.14.&lt;br /&gt;  This can be fixed by editing the mysqlcluster-71-rpm/cluster/scripts/install/install-rpm.sh before running 'deploy.sh':&lt;br /&gt;  Change this, in the function named install_rpm_cmonmysql()  :&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   MySQL-Cluster-gpl-shared-compat-${version}-1.${rhel}.${arch}.rpm&lt;/span&gt;&lt;br /&gt;  to&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   MySQL-Cluster-gpl-shared-${version}-1.${rhel}.${arch}.rpm&lt;/span&gt;&lt;br /&gt;  Now you can run ./deploy.sh&lt;br /&gt;&lt;br /&gt;Finally, do not forget to set the EC2 Keypair in the Configurator and upload it to the &lt;a href="http://www.severalnines.com/cluster-control" target="_blank"&gt;ClusterControl&lt;/a&gt; server before running deploy.sh.&lt;br /&gt;&lt;br /&gt;You should now be up and running with your MySQL Cluster on EC2; if you have any questions or comments, please do let us know. We welcome your feedback on &lt;a href="http://www.facebook.com/pages/Severalnines/104774439598301" target="_blank"&gt;Facebook&lt;/a&gt;, &lt;a href="http://twitter.com/#%21/severalnines" target="_blank"&gt;Twitter&lt;/a&gt;, &lt;a href="http://www.linkedin.com/company/severalnines" target="_blank"&gt;LinkedIn&lt;/a&gt; or directly on this blog.&lt;br /&gt;&lt;br /&gt;For more information on AMIs: &lt;a href="http://aws.amazon.com/amis/" target="_blank"&gt;http://aws.amazon.com/amis/&lt;/a&gt;&lt;br /&gt;For more information on EC2: &lt;a href="http://aws.amazon.com/ec2/" target="_blank"&gt;http://aws.amazon.com/ec2/&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1832528948490755305?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1832528948490755305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1832528948490755305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1832528948490755305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1832528948490755305'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/08/test-deployment-of-mysql-cluster-on.html' title='MySQL Clusters on Amazon EC2 - verified AMIs'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7820102534073422182</id><published>2011-08-16T21:41:00.006+01:00</published><updated>2011-08-16T22:18:09.797+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='redhat'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud services'/><category scheme='http://www.blogger.com/atom/ns#' term='high availability'/><category scheme='http://www.blogger.com/atom/ns#' term='PaaS'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='openshift'/><category scheme='http://www.blogger.com/atom/ns#' term='jboss'/><title type='text'>MySQL Clusters in the Cloud with Severalnines on OpenShift</title><content type='html'>&lt;span style="font-style: italic;"&gt;A blog post on how to deploy a sample JBoss application on OpenShift Flex - using a highly available, scalable backend that leverages MySQL Cluster&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.severalnines.com/" TARGET="_blank"&gt;Severalnines&lt;/a&gt; team has been busy during the summer months and as result, we have included OpenShift Flex support to our &lt;a href="http://www.severalnines.com/resources/configurator" TARGET="_blank"&gt;Severalnines Configurator&lt;/a&gt; (amongst other things). &lt;a href="https://openshift.redhat.com/app/" TARGET="_blank"&gt;OpenShift,&lt;/a&gt; a Platform-as-a-Service operated by Red Hat, allows developers to develop and manage applications in the cloud. It is now possible to configure a clustered MySQL database for cloud services running on OpenShift. This brings high-availability and scalability at both the application and database layers.&lt;br /&gt;&lt;br /&gt;As a guest contributor on &lt;a href="https://www.redhat.com/openshift/blogs/mysql-clusters-in-the-cloud-with-severalnines-on-openshift" TARGET="_blank"&gt;Red Hat's OpenShift Community Blog&lt;/a&gt;, we provide a comprehensive, &lt;a href="https://www.redhat.com/openshift/blogs/mysql-clusters-in-the-cloud-with-severalnines-on-openshift" TARGET="_blank"&gt;step-by-step walkthrough&lt;/a&gt; for this type of deployment. For those of you who would also like to view the process “in action”, feel free to &lt;a href="http://severalnines.com/resources/videos" TARGET="_blank"&gt;view the video&lt;/a&gt; that complements this blog entry.&lt;br /&gt;&lt;br /&gt;Read the full blog &lt;a href="https://www.redhat.com/openshift/blogs/mysql-clusters-in-the-cloud-with-severalnines-on-openshift" TARGET="_blank"&gt;here&lt;/a&gt;!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7820102534073422182?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7820102534073422182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7820102534073422182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7820102534073422182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7820102534073422182'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/08/mysql-clusters-in-cloud-with.html' title='MySQL Clusters in the Cloud with Severalnines on OpenShift'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7127421494059432626</id><published>2011-05-26T14:53:00.005+01:00</published><updated>2011-05-26T15:00:26.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eurocloud'/><category scheme='http://www.blogger.com/atom/ns#' term='award'/><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><title type='text'>Best Start-up: Severalnines - at EuroCloud Sweden Award</title><content type='html'>&lt;a href="http://www.severalnines.com/"&gt;Severalnines&lt;/a&gt; is proud to announce that it won the Best Startup prize at the &lt;a href="http://www.eurocloud.se/"&gt;EuroCloud Sweden&lt;/a&gt; Award in Stockholm this week. The company was chosen out of a number of promising startups targeting the emerging cloud computing market.&lt;br /&gt;&lt;br /&gt;The jury noted that “&lt;span style="font-style: italic;"&gt;Severalnines have a compelling idea to cloud-enable any customer-preferred database in mission-critical setups. Together with a simple-to-use &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.severalnines.com/config/"&gt;configurator&lt;/a&gt;&lt;span style="font-style: italic;"&gt; they put the user in control.&lt;/span&gt;”&lt;br /&gt;&lt;br /&gt;We are quite honored and proud to receive the Best Startup award. Through our flagship product &lt;a href="http://www.severalnines.com/cluster-control"&gt;ClusterControl™&lt;/a&gt;, it is our objective to make complex database tasks easy and even enjoyable for our users, and above all, to make sure our users can realise the performance, high–availability and cost efficiencies that cloud computing promises.&lt;br /&gt;&lt;br /&gt;Articles on the award can be found here:&lt;br /&gt;&lt;a href="http://www.eurocloud.se/2011/05/24/vinnare-av-eurocloud-sweden-award#more-486"&gt;EuroCloud Announcement&lt;/a&gt;   (&lt;a href="http://translate.google.com/translate?sl=sv&amp;amp;tl=en&amp;amp;u=http%3A%2F%2Fwww.eurocloud.se%2F2011%2F05%2F24%2Fvinnare-av-eurocloud-sweden-award"&gt;in english&lt;/a&gt;)&lt;br /&gt;&lt;a href="http://www.idg.se/2.1085/1.387571/de-ar-sveriges-basta-molnforetag"&gt;IDG article&lt;/a&gt;  (&lt;a href="http://translate.google.com/translate?sl=sv&amp;amp;tl=en&amp;amp;u=http%3A%2F%2Fwww.idg.se%2F2.1085%2F1.387571%2Fde-ar-sveriges-basta-molnforetag"&gt;in english&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7127421494059432626?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7127421494059432626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7127421494059432626' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7127421494059432626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7127421494059432626'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/05/best-start-up-severalnines-at-eurocloud.html' title='Best Start-up: Severalnines - at EuroCloud Sweden Award'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-4850408627390797861</id><published>2011-04-13T23:23:00.005+01:00</published><updated>2011-04-14T01:40:57.690+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clusterj'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><title type='text'>Getting started with Cluster/J  - index search and  table scans</title><content type='html'>This post follows the &lt;a href="http://johanandersson.blogspot.com/2011/04/getting-started-with-clusterj-inserts.html"&gt;previous post&lt;/a&gt;, so set up the environment as described there.&lt;br /&gt;In this example we will perform a full table scan (select * from my_data2) and an index scan (select * from my_data2 where userid=1).&lt;br /&gt;&lt;br /&gt;The complete code is &lt;a href="http://www.severalnines.com/downloads/clusterj/whereclause"&gt;here&lt;/a&gt; from &lt;a href="http://www.severalnines.com"&gt;Severalnines&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Performing a full table scan (no search criteria)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Make sure you have records in the table my_data2.&lt;br /&gt;To perform reads by primary key, we can just use Session::find(..), but here we will do a full table scan.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;QueryBuilder qb = s.getQueryBuilder();&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Run the query:&lt;br /&gt;*/&lt;br /&gt;List &lt;mydata2&gt;resultList = query.getResultList();&lt;br /&gt;int count=0;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Loop over the results&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;List &lt;mydata2&gt;resultList = query.getResultList();&lt;br /&gt;int count=0;&lt;br /&gt;for (MyData2 result: resultList) {&lt;br /&gt;System.out.println(result.getFriendId());&lt;br /&gt;count++;&lt;br /&gt;}&lt;/mydata2&gt;&lt;/mydata2&gt;&lt;/pre&gt;That is it, if you run the example code, you will see the output.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Done reading X records in Y mssd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Performing a Index scan (search on part of the Primary Key)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;The following snippet shows how to setup a EQUAL-filter:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;/*&lt;br /&gt;*  We want to compare userid=1 (select * from my_data2 where userid=2) &lt;br /&gt;*/&lt;br /&gt;QueryBuilder qb = s.getQueryBuilder();&lt;br /&gt;QueryDomainType dobj = qb.createQueryDefinition(MyData2.class);&lt;br /&gt;/*&lt;br /&gt;* Create a filter, we call this filter 'user_id_filter'&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;PredicateOperand param = dobj.param("user_id_filter");&lt;br /&gt;/*&lt;br /&gt;* Set the column database column you want to filter on.&lt;br /&gt;* Note: The setting dobj.get("userId") is really strange.&lt;br /&gt;* In the table the column in the database is called userid, and in MyData2.&lt;br /&gt;* The documentation of Cluster/J is very bad here, but&lt;br /&gt;* the getter/setter are getUserId/setUserId, and you have to&lt;br /&gt;* take the word after the get/set (in this case UserId) and change the first&lt;br /&gt;* letter to lower case :(&lt;br /&gt;*/&lt;br /&gt;PredicateOperand column = dobj.get("userId");&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Perform an equal compare&lt;br /&gt;* we want to compare userid=1&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;Predicate compare=column.equal(param);&lt;br /&gt;dobj.where(compare);&lt;br /&gt;&lt;br /&gt;Query query = s.createQuery(dobj);&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Bind the search value to the filter&lt;br /&gt;*/&lt;br /&gt;query.setParameter("user_id_filter", new Long(1));&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Run the query:&lt;br /&gt;*/&lt;br /&gt;List &lt;mydata2&gt;resultList = query.getResultList();&lt;br /&gt;int count=0;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Loop over the results&lt;br /&gt;*/&lt;br /&gt;for (MyData2 result: resultList) {&lt;br /&gt;System.out.println(result.getFriendId());&lt;br /&gt;count++;&lt;br /&gt;}&lt;br /&gt;&lt;/mydata2&gt;&lt;/pre&gt;That is it for this time. I hope the clusterj documention will become better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-4850408627390797861?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/4850408627390797861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=4850408627390797861' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4850408627390797861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4850408627390797861'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/04/getting-started-with-clusterj-index.html' title='Getting started with Cluster/J  - index search and  table scans'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-3136760384046746534</id><published>2011-04-13T22:54:00.003+01:00</published><updated>2011-04-13T23:02:52.835+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clusterj'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><title type='text'>Getting started with Cluster/J  - inserts (combined PK)</title><content type='html'>This post follows the &lt;a href="http://johanandersson.blogspot.com/2011/04/getting-started-with-clusterj-inserts.html"&gt;previous post&lt;/a&gt;, so set up the environment as described there.&lt;br /&gt;In this example we will have a slightly different table with a combined PK.&lt;br /&gt;The complete code is &lt;a href="http://www.severalnines.com/downloads/clusterj/insert-multipk"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Create the table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first thing we should do is to create the table we need for this example:&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;  "&gt;CREATE TABLE `my_data2` (&lt;br /&gt;`userid` bigint(20) NOT NULL DEFAULT '0',&lt;br /&gt;`friendid` bigint(20) NOT NULL DEFAULT '0',&lt;br /&gt;`data` varbinary(255) DEFAULT NULL,&lt;br /&gt;`last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,&lt;br /&gt;PRIMARY KEY (`userid`,`friendid`)&lt;br /&gt;) ENGINE=ndbcluster DEFAULT CHARSET=latin1&lt;br /&gt;/*!50100 PARTITION BY KEY (userid) */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Mapping table to Java Interface&lt;/span&gt;&lt;br /&gt;An interfae describing each table is needed. You annotate the code with @PrimaryKey and @Column do denote if the names of columns and the column names.&lt;br /&gt;The only difference here is that you need to annotate all primary key columns with @PrimaryKey.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;import com.mysql.clusterj.annotation.Column;&lt;br /&gt;import com.mysql.clusterj.annotation.Index;&lt;br /&gt;import com.mysql.clusterj.annotation.PersistenceCapable;&lt;br /&gt;import com.mysql.clusterj.annotation.PrimaryKey;&lt;br /&gt;&lt;br /&gt;@PersistenceCapable(table="my_data2")&lt;br /&gt;@Index(name="id")&lt;br /&gt;public interface MyData2 {&lt;br /&gt;   &lt;br /&gt;      &lt;span style="font-weight: bold;"&gt;@PrimaryKey&lt;/span&gt;&lt;br /&gt;      long getUserId();&lt;br /&gt;      void setUserId(long i);&lt;br /&gt;    &lt;br /&gt;      &lt;span style="font-weight: bold;"&gt;@PrimaryKey&lt;/span&gt;&lt;br /&gt;      long getFriendId();&lt;br /&gt;      void setFriendId(long i);&lt;br /&gt;   &lt;br /&gt;      @Column(name = "data")&lt;br /&gt;      byte[] getData();&lt;br /&gt;      void setData(byte[] b);&lt;br /&gt;&lt;br /&gt;      @Column(name = "last_updated")&lt;br /&gt;      long getLastUpdated();&lt;br /&gt;      void setLastUpdated(long ts);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Performing an insert&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Populate the fields in the object, and make it persistent. Don't forget to set all primary key columns or you will get a ClusterJException.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;MyData my_data=s.newInstance(MyData.class);&lt;br /&gt;/**&lt;br /&gt;* Set the data on the object&lt;br /&gt;*/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;my_data.setUserId(i);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;my_data.setFriendId(i);&lt;/span&gt;&lt;br /&gt;my_data.setData(data);&lt;br /&gt;my_data.setLastUpdated(System.currentTimeMillis());&lt;br /&gt;/**&lt;br /&gt;* Persist the object */&lt;br /&gt;s.makePersistent(my_data);&lt;/pre&gt;That is it, if you run the example code, you will see the output.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Done inserting 100 records in X ms&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-3136760384046746534?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/3136760384046746534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=3136760384046746534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3136760384046746534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3136760384046746534'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/04/getting-started-with-clusterj-inserts_13.html' title='Getting started with Cluster/J  - inserts (combined PK)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8846076212096929333</id><published>2011-04-13T18:53:00.005+01:00</published><updated>2011-04-13T22:54:26.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clusterj'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><title type='text'>Getting started with Cluster/J  - inserts</title><content type='html'>Cluster/J is a the Java direct API to MySQL Cluster which means it bypasses the MySQL Server and executes requests directly on the data nodes of MySQL Cluster.   This gives very good performance (typically &amp;gt;2x faster than SQL) and low latency.&lt;br /&gt;&lt;br /&gt;In this blog I will present how to get started and how to do simple lookups.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;The complete source code (actually a bit extended to show  batching) for this example can be found at &lt;a href="http://www.severalnines.com/"&gt;Severalnines&lt;/a&gt; (&lt;a href="http://www.severalnines.com/downloads/clusterj/"&gt;here&lt;/a&gt;). The code you  will see below is just snippets.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Environment&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To start with you need MySQL Cluster up and running.&lt;br /&gt;For development on localhost then you can get a &lt;a href="http://www.severalnines.com/sandbox/"&gt;sandbox from Severalnines&lt;/a&gt;.&lt;br /&gt;If you want to have a test/production environment you should you the &lt;a href="http://www.severalnines.com/cluster-configurator/"&gt;Configurator for MySQL Cluster&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First of all you have to import the following Cluster/J jars into your project.&lt;br /&gt;In Eclipse, on the project, do "Properties -&amp;gt; Java Build Path --&amp;gt; Add External JARs"&lt;br /&gt;The  JARs you need to import are typically located in  /usr/local/mysql/share/java/  (if you have installed MySQL Cluster in  this location - this is the default location used by &lt;a href="http://www.severalnines.com/"&gt;Severalnines&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;You also need to set the JVM configuration in order to point out the libndbclient  library :&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;-Djava.library.path=/usr/local/mysql/lib/ -Xms128m -Xmx512m&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Create the table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first thing we should do is to create the table we need for this example:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;CREATE TABLE `my_data` (&lt;br /&gt;`id` bigint(20) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`data` varbinary(255) DEFAULT NULL,&lt;br /&gt;`last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,&lt;br /&gt;PRIMARY KEY (`id`) ) ENGINE=ndbcluster DEFAULT CHARSET=latin1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Mapping table to Java Interface&lt;/span&gt;&lt;br /&gt;An interfae describing each table is needed. You annotate the code with @PrimaryKey and @Column do denote if the names of columns and the column names.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;public interface MyData {     &lt;br /&gt;&lt;br /&gt;@PrimaryKey     &lt;br /&gt;long getId();&lt;br /&gt;void setId(long i); &lt;br /&gt;&lt;br /&gt;@Column(name = "data")&lt;br /&gt;byte[] getData();     &lt;br /&gt;void setData(byte[] b);&lt;br /&gt;&lt;br /&gt;@Column(name = "last_updated")&lt;br /&gt;long getLastUpdated();&lt;br /&gt;void setLastUpdated(long ts);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Setting up the connection to MySQL Cluster&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Properties p = new Properties();&lt;br /&gt;p.setProperty("com.mysql.clusterj.connectstring", "localhost:1186");&lt;br /&gt;p.setProperty("com.mysql.clusterj.database", "test");&lt;br /&gt;SessionFactory sf=ClusterJHelper.getSessionFactory(p);&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Creating a Session&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The SessionFactory provides Sessions. On a session instance you can  do a couple of things, e.g, makePersistent, updatePersistent, and find.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;/**&lt;br /&gt;* Sessions are not thread safe!&lt;br /&gt;*/&lt;br /&gt;Session s = sf.getSession();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Performing an insert&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Populate the fields in the object, and make it persistent.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;MyData my_data=s.newInstance(MyData.class);&lt;br /&gt;/**&lt;br /&gt;* Set the data on the object&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;my_data.setId(i);&lt;br /&gt;my_data.setData(data);&lt;br /&gt;my_data.setLastUpdated(System.currentTimeMillis());&lt;br /&gt;/**&lt;br /&gt;* Persist the object */&lt;br /&gt;s.makePersistent(my_data);&lt;/pre&gt;That is it, if you run the example code, you will see the output.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Done inserting 1000 records in 230 ms&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8846076212096929333?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8846076212096929333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8846076212096929333' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8846076212096929333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8846076212096929333'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/04/getting-started-with-clusterj-inserts.html' title='Getting started with Cluster/J  - inserts'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2017834105148792095</id><published>2011-04-12T19:41:00.005+01:00</published><updated>2011-04-12T20:25:01.558+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uc2011'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><title type='text'>(UC2011) BOF - Setting up MySQL Cluster on EC2</title><content type='html'>Severalnines will host a&lt;a href="http://en.oreilly.com/mysql2011/public/schedule/detail/19307"&gt; BOF at 7pm&lt;/a&gt; in Ballroom A, Tuesday 04/12.&lt;br /&gt;&lt;br /&gt;After a succesful cluster tutorial we will demo how to use Severalnines Configurator to deploy MySQL Cluster on EC2 on X computers  using one command (deploy.sh), complete with monitoring and management.&lt;br /&gt;&lt;span class="en_session_room"&gt;&lt;span class="location"&gt;&lt;br /&gt;See you there!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2017834105148792095?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2017834105148792095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2017834105148792095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2017834105148792095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2017834105148792095'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/04/uc2011-bof-setting-up-mysql-cluster-on.html' title='(UC2011) BOF - Setting up MySQL Cluster on EC2'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-6705422731436213276</id><published>2011-04-11T14:30:00.010+01:00</published><updated>2011-10-13T09:31:02.586+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql 5.5'/><category scheme='http://www.blogger.com/atom/ns#' term='percona'/><category scheme='http://www.blogger.com/atom/ns#' term='semi-sync replication'/><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql ha'/><title type='text'>Setting up Multi-master and read slaves using Severalnines</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-OmNyf7FBULs/TaMQUiQ6zKI/AAAAAAAAAMI/JG7bjJBQXhU/s1600/Slide1.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-OmNyf7FBULs/TaMQUiQ6zKI/AAAAAAAAAMI/JG7bjJBQXhU/s320/Slide1.jpg" alt="" id="BLOGGER_PHOTO_ID_5594333107105483938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://www.severalnines.com/resources/clustercontrol%E2%84%A2-mysql-replication-tutorial"&gt;Read the detailed replication tutorial instead&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This tutorial shows how you can use the &lt;a href="http://www.severalnines.com/replication-configurator/"&gt;Severalnines Configurator for MySQL Replication  &lt;/a&gt;to deploy a Multi-master replication setup, and install &lt;a href="http://www.severalnines.com/cluster-control"&gt;ClusterControl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When the deployment is finished you have a set of tools to manage and monitor replication, as well as to add new slaves, and to perform failover.&lt;br /&gt;You can choose:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; if you wish also setup bi-directional replication between the masters&lt;/li&gt;&lt;li&gt;the number of slaves you wish to connect to the master&lt;br /&gt;&lt;/li&gt;&lt;li&gt;whether you want to use MySQL 5.5.10 or Percona latest stable&lt;/li&gt;&lt;li&gt;Handlersocket (percona) or Semi-sync replication (MySQL 5.5)&lt;/li&gt;&lt;li&gt;cloud provider (on premise/EC2/Rackspace)&lt;/li&gt;&lt;/ul&gt;When deployed you can easily perform tasks as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add new slaves&lt;/li&gt;&lt;li&gt;Failover&lt;/li&gt;&lt;li&gt;View replication health information&lt;/li&gt;&lt;li&gt;Stop/start replication links&lt;/li&gt;&lt;li&gt;Stage slaves&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The Configurator for MySQL Replication is a wizard-like application and you have to enter details about the setup you want to have. When this is done you will get a tar.gz that contains the deployment and management scripts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;ClusterControl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The deployment process will also install  ClusterControl which is a set of monitoring agents and functionality to  manage the database installation.  The agents are deployed on each server and collects host information and information from the local MySQL server a particular agent is monitoring (such as replication statistics and status information).&lt;br /&gt;&lt;br /&gt;One server (either a standalone or one that will be part of the Replication cluster) is denoted the ClusterControl server. It is holding a database, CMON DB, that contains data about the monitored hosts, and the reporting data from the  local agents is stored in this database.&lt;br /&gt;&lt;br /&gt;Moreover, the ClusterControl server exposes a web  interface that can be used to graphically see the health of the  replication cluster (after the deployment is done, take a web browser and point it to http://clustercontrolserver/cmon  :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-GrrXKz9FGUw/TaMO7TRxQCI/AAAAAAAAAL4/Q372Vv3SnMo/s1600/cmon-repl-monitor.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 165px;" src="http://4.bp.blogspot.com/-GrrXKz9FGUw/TaMO7TRxQCI/AAAAAAAAAL4/Q372Vv3SnMo/s320/cmon-repl-monitor.png" alt="" id="BLOGGER_PHOTO_ID_5594331574074163234" border="0" /&gt;&lt;/a&gt;We are in the process of adding a Query Analyzer and shaping up the web interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Installation&lt;/span&gt;&lt;br /&gt;When you have finished the wizard you get a package that you should deploy on the ClusterControl server:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;tar xvfz s9s-mysql-55.tar.gz&lt;br /&gt;cd s9s-mysql-55/mysql/scripts/install&lt;br /&gt;./deploy.sh&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The 'deploy.sh' script will create data directories, install initd scripts, create mysql users, apply database GRANTs (those you defined in the Configurator), and install ClusterControl.&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Starting Replication and basic examples&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After having executed deploy.sh should do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;cd s9s-mysql-55/mysql/scripts/&lt;br /&gt;./list-servers.sh  -a&lt;br /&gt;master     : 10.48.207.130 [  up]&lt;br /&gt;master     : 10.48.139.24 [  up]&lt;br /&gt;slave     : 10.49.122.56 [  up]&lt;br /&gt;slave     : 10.49.110.183 [  up]&lt;br /&gt;&lt;/pre&gt;To verify the mysql servers are running and then:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;cd s9s-mysql-55/mysql/scripts/&lt;br /&gt;./start-repl.sh --master -i 1 -c  &lt;/pre&gt;&lt;br /&gt;The command above will do a CHANGE MASTER (-c) and  start replication from MySQL Server 1 to MySQL Server 2.&lt;br /&gt;&lt;br /&gt;This step is not automated since you may want to start bi-directional replication between the masters. In that case you do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;./start-repl.sh --master -a -c&lt;/pre&gt;&lt;br /&gt;The slaves are then started with:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;./start-repl.sh --slave -a -c&lt;br /&gt;&lt;/pre&gt;Which means,  start all slaves (-a) and change master on those slaves.&lt;br /&gt;&lt;br /&gt;Then you can run&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;./repl-status.sh  -a&lt;br /&gt;serverid master_host --&amp;gt;slave_host status  master_status  slave_status [binlog|m_pos|exec_pos|lag]&lt;br /&gt;1      10.48.207.130 10.48.139.24 ok         binlog.000005:107 binlog.000005| 107| 107| 0&lt;br /&gt;2     replication not activated - you must start replication on this link.&lt;br /&gt;--- slaves follows ---&lt;br /&gt;3      10.48.139.24 10.49.122.56 ok         binlog.000005:107 binlog.000005| 107| 107| 0&lt;br /&gt;4      10.48.139.24 10.49.110.183 ok         binlog.000005:107 binlog.000005| 107| 107| 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;We got two masters, and the master with server-id=1 replicates to server-id=2, and the master on server-id=2 replicates to the slaves (3 and 4).&lt;br /&gt;&lt;br /&gt;Now we are ready to provision data&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;./mysql.sh -h 10.48.207.130 -ppassword&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create table t1 (id integer auto_increment primary key, data varchar(255))engine=innodb;&lt;br /&gt;Query OK, 0 rows affected (0.02 sec)&lt;br /&gt;mysql&amp;gt; insert into t1(data) values('hello');&lt;br /&gt;&lt;/pre&gt;And we can check the replication status:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;ubuntu@ip-10-49-122-115:~/s9s-mysql-55/mysql/scripts$ ./repl-status.sh -a&lt;br /&gt;serverid master_host --&amp;gt;slave_host status  master_status  slave_status [binlog|m_pos|exec_pos|lag]&lt;br /&gt;1      10.48.207.130 10.48.139.24 ok         binlog.000005:494 binlog.000005| 494| 494| 0&lt;br /&gt;2     replication not activated - you must start replication on this link.&lt;br /&gt;--- slaves follows ---&lt;br /&gt;3      10.48.139.24 10.49.122.56 ok         binlog.000005:485 binlog.000005| 485| 485| 0&lt;br /&gt;4      10.48.139.24 10.49.110.183 ok         binlog.000005:485 binlog.000005| 485| 485| 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Good luck and don't hesitate to contact us at feedback@severalnines.com if you have any problems or whatever it may be. You can also &lt;a href="http://www.severalnines.com/book-demo-now"&gt;book a demo&lt;/a&gt; this if you want to know more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-6705422731436213276?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/6705422731436213276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=6705422731436213276' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6705422731436213276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6705422731436213276'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/04/setting-up-multi-master-and-read-slaves.html' title='Setting up Multi-master and read slaves using Severalnines'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-OmNyf7FBULs/TaMQUiQ6zKI/AAAAAAAAAMI/JG7bjJBQXhU/s72-c/Slide1.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1861751624227483171</id><published>2011-04-08T00:36:00.001+01:00</published><updated>2011-04-08T00:38:18.771+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='severalnines'/><title type='text'>Severalnines launch customer focused website</title><content type='html'>I am glad to announce our brand new website today (&lt;a class="moz-txt-link-abbreviated" href="http://www.severalnines.com/"&gt;www.severalnines.com&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The goal of the company is to make it easy for database developers to build their clustered database platforms, either on-premise or in the cloud.&lt;br /&gt;&lt;br /&gt;We invite you to explore the new resources on the website (white papers, videos, new configurator for MySQL Replication, new cluster configurator with cloud options, etc.).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1861751624227483171?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1861751624227483171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1861751624227483171' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1861751624227483171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1861751624227483171'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/04/severalnines-launch-customer-focused.html' title='Severalnines launch customer focused website'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8516429030406934283</id><published>2011-03-23T07:19:00.003Z</published><updated>2011-03-23T07:29:40.287Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='uc2011'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><title type='text'>Users Conference 2011  - Cluster Tutorial</title><content type='html'>I will be at the MySQL UC representing Severalnines AB. Together with my friends at SkySQL (Max and Joffrey) we will have have a &lt;a href="http://en.oreilly.com/mysql2011/public/schedule/detail/17821"&gt;joint tutorial on MySQL Cluster&lt;/a&gt;. You will learn MySQL Cluster and we will do  hands-on examples and present best practices to make your deployment easier. This also provides an excellent opportunity to discuss your requirements and get input and feedback on your database design.&lt;br /&gt;&lt;br /&gt;Also, if you are in the area and want to discuss MySQL Cluster, high availability, scalability issues, email me  at johan@severalnines.com and we can organize a meeting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8516429030406934283?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8516429030406934283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8516429030406934283' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8516429030406934283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8516429030406934283'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/03/users-conference-2011-cluster-tutorial.html' title='Users Conference 2011  - Cluster Tutorial'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1172340521441097944</id><published>2011-02-28T09:06:00.005Z</published><updated>2011-02-28T13:50:24.633Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><category scheme='http://www.blogger.com/atom/ns#' term='corescripts'/><title type='text'>Web and Telco mode Cluster Configuration</title><content type='html'>The &lt;a href="http://www.severalnines.com/config"&gt;Core Scripts&lt;/a&gt; (aka Configurator) for MySQL Cluster has now been updated with a new feature that allows you to tune cluster for a particular workload.&lt;br /&gt;Currently there are two types of workloads supported:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Web&lt;/li&gt;&lt;li&gt;Telco/Realtime&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://4.bp.blogspot.com/-CyklQtSc6YQ/TWunKSEpBnI/AAAAAAAAALw/0ptHtd-bk9Y/s1600/cluster_corescripts_storage.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 74px;" src="http://4.bp.blogspot.com/-CyklQtSc6YQ/TWunKSEpBnI/AAAAAAAAALw/0ptHtd-bk9Y/s320/cluster_corescripts_storage.png" alt="" id="BLOGGER_PHOTO_ID_5578736358520325746" border="0" /&gt;&lt;/a&gt;The Web workload is suitable for applications:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;with long running transactions (scans, joins and/or large updates)&lt;/li&gt;&lt;li&gt;reading and especially writing of large chunks (BLOBs) of data where an "innodb" like behavior is wanted.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The Telco workload is suitable for realtime applications with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;requirements on response times&lt;/li&gt;&lt;li&gt;requirements on failover times&lt;/li&gt;&lt;li&gt;short but many parallel request primarily on PK&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Buffers and timeouts are geared towards each workload. Some of it you can read more about &lt;a href="http://todointx.blogspot.com/2011/02/checkpoint-handling-enhancements-in.html"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Telco workload is also suitable for many kinds of applications in for example the following domains:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Finance,&lt;/li&gt;&lt;li&gt;Online gaming&lt;/li&gt;&lt;li&gt;Subscriber databases&lt;/li&gt;&lt;li&gt;Session management&lt;/li&gt;&lt;/ul&gt;If you don't know what is most suitable for you, please contact Severalnines and we help you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1172340521441097944?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1172340521441097944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1172340521441097944' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1172340521441097944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1172340521441097944'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/02/web-and-telcomode-cluster-configuration.html' title='Web and Telco mode Cluster Configuration'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CyklQtSc6YQ/TWunKSEpBnI/AAAAAAAAALw/0ptHtd-bk9Y/s72-c/cluster_corescripts_storage.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-4748472632869491006</id><published>2011-02-25T16:06:00.001Z</published><updated>2011-02-26T09:48:57.502Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cmon'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='clusterj'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><title type='text'>Cluster/J - Document-oriented approach on MySQL Cluster</title><content type='html'>In a project &lt;a href="http://www.severalnines.com/"&gt;Severalnines&lt;/a&gt; is engaged in, we are developing a realtime application based on Cluster/J.  To start with, I must say cluster/j is fantastic and so far I am very happy with it and beaten our expectations big time. It is quite new however and we stumbled on a couple of issues, but those were fixed very fast by the Cluster/J developers. The bugs we encountered were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bugs.mysql.com/bug.php?id=59942"&gt;bug 59942&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bugs.mysql.com/bug.php?id=59942"&gt;bug 59941&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Both which were worked around, and really we never did need to have a binary or a varbinary as the PK, we used a&lt;br /&gt;&lt;br /&gt;Performance is great - we have two data nodes (nehalem, 32GB RAM, 146GB SAS 10K disk, 2x4 core 2.4GHz (E5620) )  and two application hosts (same spec, less RAM as data nodes) and we easily push through 70-80K transactions per second (reads and writes). We could easily do more, if we added more applications on the application hosts. The data nodes are using about 50-60% of their capacity (CPU).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-eYs7RCmlYDM/TWerCoGeFRI/AAAAAAAAALo/7S1WKh8aoqo/s1600/cmon_stats_80k.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 166px;" src="http://2.bp.blogspot.com/-eYs7RCmlYDM/TWerCoGeFRI/AAAAAAAAALo/7S1WKh8aoqo/s320/cmon_stats_80k.png" alt="" id="BLOGGER_PHOTO_ID_5577614725134292242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The graph  (mysql cluster statistics) is at start quite spiky. As you can see transactions/operations goes up and down. This is because we first tested with 10M, then reloaded with 20M records, 40M, and finally 80M records and let it run overnight.&lt;br /&gt;&lt;br /&gt;The requests are primary key based, and there is a PK followed by a VARBINARY (and some other meta fields). In the VARBINARY a tree structure is stored. The tree structure represents a parent-child relationship, and we encode it in JSON. So we are using something like a document-oriented model. By doing this we avoid complex queries to navigate a parent child structure and thereby have many round-trips between application and data nodes , and instead ask for one big packet in one network roundtrip. Writes in this model will be more costly since we write back the whole parent-child structure instead of just one of the nodes in this structure.&lt;br /&gt;&lt;br /&gt;In the Java applications we also have a REST interface to the data.&lt;br /&gt;&lt;br /&gt;SQL is used only for one thing and that is to create the tables.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.severalnines.com/cmon"&gt;CMON Enterprise&lt;/a&gt; is used for monitoring and management, and the Cluster configuration comes from &lt;a href="http://www.severalnines.com/config"&gt;Severalnines Core Scripts&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Finally, we made some fine-tuning on MySQL Cluster and got another 20% - this is not shown in the graph, and another story.&lt;br /&gt;&lt;br /&gt;The only thing we are missing (or rather waiting for) now is the multi-connection functionality (ndb_cluster_connection pooling) in cluster/j.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-4748472632869491006?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/4748472632869491006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=4748472632869491006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4748472632869491006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4748472632869491006'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/02/clusterj-document-oriented-approach-on.html' title='Cluster/J - Document-oriented approach on MySQL Cluster'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-eYs7RCmlYDM/TWerCoGeFRI/AAAAAAAAALo/7S1WKh8aoqo/s72-c/cmon_stats_80k.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5743978727146353802</id><published>2011-02-17T19:40:00.007Z</published><updated>2011-02-18T14:35:05.202Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmon'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><title type='text'>CMON - Install Instructions</title><content type='html'>&lt;a href="http://www.severalnines.com/cmon"&gt;CMON 1.1.4 - the Cluster Monitor and Manager&lt;/a&gt; has recently been released and here is a little how to about how to install from binary and source (at the end), deployment etc. If you use RPMs, you should follow the &lt;a href="http://www.severalnines.com/cmon/#downloads"&gt;install guide here&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://3.bp.blogspot.com/-VzDkQKv3sgk/TV2Gcd1C_BI/AAAAAAAAALY/0E-bVs_DVF0/s1600/cmon.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 143px;" src="http://3.bp.blogspot.com/-VzDkQKv3sgk/TV2Gcd1C_BI/AAAAAAAAALY/0E-bVs_DVF0/s320/cmon.png" alt="" id="BLOGGER_PHOTO_ID_5574759737356123154" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;1. Download the cmon binary package to a monitoring host&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Currently there are binaries available for Linux 64-bit and 32-bit (statically linked) and works for MySQL Cluster 7.0.9 and later 7.0.x versions and also 7.1.x.&lt;br /&gt;&lt;br /&gt;In this case the monitoring host will be on 'ndb05' (IP address 10.0.1.5) - see 9. Suggested Deployment for a picture describing the setup.&lt;br /&gt;&lt;br /&gt;The Monitoring machine should have installed: &lt;ul&gt;&lt;li&gt; a mysql server up and running that will store the cmon database - this mysql server does not need to be connected to MySQL Cluster. If you build from source you need to have the mysql cluster libraries and include files&lt;/li&gt;     &lt;li&gt;apache (if you want to have the web interface) + php_mysql&lt;ul&gt;&lt;code&gt;sudo apt-get install apache2 php5-mysql&lt;/code&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;rrdtool (if you want to have graphs in web interface)&lt;/li&gt;&lt;ul&gt;&lt;code&gt;sudo apt-get install rrdtool&lt;/code&gt;&lt;/ul&gt;&lt;/ul&gt;The picture at the end of this post shows how you can deploy CMON.&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&amp;gt; cd /usr/local&lt;br /&gt;&amp;gt; wget http://www.severalnines.com/downloads/cmon/cmon-1.1.4-64bit-glibc23-mc70.tar.gz&lt;br /&gt;&amp;gt; tar xvfz cmon-1.1.4-64bit-glibc23-mc70.tar.gz&lt;br /&gt;&amp;gt; ln -s cmon-1.1.4-64bit-glibc23-mc70  cmon&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;2. Verify that you have a free API slot [mysqld] so that cmon can connect to MySQL Cluster&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&amp;gt; ndb_mgm -e "show"&lt;br /&gt;Cluster Configuration&lt;br /&gt;---------------------&lt;br /&gt;[ndbd(NDB)] 2 node(s)&lt;br /&gt;id=3 @10.0.1.3  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0, Master)&lt;br /&gt;id=4 @10.0.1.4  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0)&lt;br /&gt;&lt;br /&gt;[ndb_mgmd(MGM)] 2 node(s)&lt;br /&gt;id=1 @10.0.1.1  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;id=2 @10.0.1.2  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;&lt;br /&gt;[mysqld(API)] 6 node(s)&lt;br /&gt;id=7 @10.0.1.1  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;id=8 @10.0.1.2  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;id=9 (not connected, accepting connect from any host)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;id=10 (not connected, accepting connect from 10.0.1.5)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yes, I have two slots - if I run cmon from host 10.0.1.5, then it is fine (id=10), but in this case, I can connect cmon from any host (id=9). Point is that you must have a slot free with "any host" or from an explicit host.&lt;br /&gt;&lt;br /&gt;You must also have MemReportFrequency=30  (or some other value, in seconds) in order to get the memory usage events sent from MySQL Cluster. Otherwize, CMON will not be able to present memory utilization information!&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;3. Run the cmon install script&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&amp;gt; cd /usr/local/cmon/bin&lt;br /&gt;&amp;gt; ./cmon_install.sh&lt;br /&gt;&lt;br /&gt;This script will install cmon, rrd, init.d scripts, and generate SQL scripts for GRANTs&lt;br /&gt;Distribution: fedora&lt;br /&gt;&lt;br /&gt;**** MYSQL CONNECTION ****&lt;br /&gt;CMON and the  RRD scripts needs a mysql connection to speak mysql server holding the cmon database.&lt;br /&gt;Specify the BASEDIR where mysql is installed (default /usr/local/mysql/): &lt;span style="font-weight: bold;"&gt;/usr/local/mysql/mysql&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Specify the hostname of the mysql server having the cmon database (default 'ndb05'): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;/span&gt;&lt;br /&gt;No hostname specified - using default 'ndb05'&lt;br /&gt;&lt;br /&gt;Specify the port of the mysql server having the cmon database (default 3306): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;No port specified - using default 3306&lt;br /&gt;&lt;br /&gt;Specify the password for the 'cmon' user (default no password): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;No password specified - using default (no password)&lt;br /&gt;&lt;br /&gt;Specify the ndb-connectstring to the cluster - MUST BE COMMA SEPARATED (e.g, mgmdhost_A,mgmdhost_B):&lt;br /&gt;: &lt;span style="font-weight: bold;"&gt;ndb01,ndb02&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## Comment: ndb01,ndb02 are the hostnames of the two management&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## servers in my cluster. YOU MUST SPECIFY THIS!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Specify cluster_id - must be unique amongst all monitored cluster (default is '1'):&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Setting cluster_id = 1&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Specify the name of and where to write the cmon log file. (default is /var/log/cmon.log): &lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;logfile is not specified - using default (/var/log/cmon.log)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;****  WWW interface ****&lt;br /&gt;The www files will be copied to /var/www/html/cmon/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## Comment: The installation scripts tries to find the default&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## location for www used in your distribution&lt;/span&gt;&lt;br /&gt;Specify the WWWROOT of your webserver (default /var/www/html):  &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;Copying files to /var/www/html ..&lt;br /&gt;&lt;br /&gt;Specify the owner of the WWWROOT/cmon (default user 'apache'):&lt;span&gt;&lt;span style="font-weight: bold;"&gt; &amp;lt;return&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;owner is not specified - using default user 'apache'&lt;br /&gt;&lt;br /&gt;****  RRD ****&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## Comment: If you don't have RRD installed then graphs will not be available&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## from the web client, but there is no other functional impact!&lt;/span&gt;&lt;br /&gt;Do you wish to install the rrd database  on this node (y/n)? :&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt; y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Specify the full path to 'rrdtool' (default is /usr/bin/):&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt; &amp;lt;return&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;No path to rrd specified - using default /usr/bin/&lt;br /&gt;&lt;br /&gt;The rrdtool stores data files in a data directory.&lt;br /&gt;Specify the full path to the data directory (about 20MB free space will be neeeded).&lt;br /&gt;RRD data directory (default is /var/lib/cmon/):&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt; &amp;lt;return&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;No RRD data directory specified - using default /var/lib/cmon/&lt;br /&gt;The datadir does not exists and will be created now!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;**** INSTALL CRON SCRIPTS TO UPDATE/MANAGE/GRAPH RRD ****&lt;br /&gt;cron schedules jobs every 5 minutes to update the rrd database and generarate graphs for the web interface.&lt;br /&gt;You are recommended to install the cron jobs.&lt;br /&gt;cron jobs will be installed in /etc/cron.d/cmon Do you want to install cron jobs for cmon (y/n)? :&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt; y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;installed cron job in /etc/cron.d/cmon&lt;br /&gt;&lt;br /&gt;**** INITD SCRIPTS ****&lt;br /&gt;Do you want to install /etc/init.d/cmon (y/n)? : &lt;span style="font-weight: bold;"&gt;y&lt;/span&gt;&lt;br /&gt;Specify the directory where CMON should write its pidfile (default /var/run/): &lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Saving configuration to ../etc/init.d/cmon&lt;br /&gt;Installing /etc/init.d/cmon&lt;br /&gt;Done - Installed init.d scripts&lt;br /&gt;Now you can start cmon with '/etc/init.d/cmon start'&lt;br /&gt;Every change was written to /etc/cmon.cnf&lt;br /&gt;You need to issue the following GRANTs before starting CMON:&lt;br /&gt;&lt;br /&gt;GRANT super, replication client ON *.* TO 'cmon'@'ndb05';&lt;br /&gt;GRANT select,update,insert,delete,create ON cmon.* TO 'cmon'@'ndb05';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: Connect a mysql client to the cmon database and do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## (actual GRANTs are subject to your particular settings):&lt;/span&gt;&lt;br /&gt;mysql&amp;gt; GRANT super, replication client ON *.* TO 'cmon'@'ndb05';&lt;br /&gt;mysql&amp;gt; GRANT select,update,insert,delete,create ON cmon.* TO 'cmon'@'ndb05';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;4. Start CMON&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: Make sure CMON database and Cluster is started (so initialization won't fail)&lt;/span&gt;&lt;br /&gt;&amp;gt; /etc/init.d/cmon start&lt;br /&gt;Starting cmon:  ok&lt;br /&gt;&lt;br /&gt;The above actually means that the process started. It can still fail initializing the CMON database.&lt;br /&gt;Check the cmon log:&lt;br /&gt;&lt;br /&gt;&amp;gt;tail -f /var/log/cmon.log&lt;br /&gt;&lt;br /&gt;Feb 17 21:22:28 : (INFO) Starting cmon version 1.1.4 with the following parameters:&lt;br /&gt;--mysql-password=&lt;br /&gt;--mysql-hostname=127.0.0.1&lt;br /&gt;--mysql-port=3306&lt;br /&gt;--ndb-connectstring=app01,app02&lt;br /&gt;--cmon-port=50001&lt;br /&gt;--cluster-id=1&lt;br /&gt;--savetime-clusterlog=24 (hours)&lt;br /&gt;&lt;br /&gt;Feb 17 21:22:28 : (INFO) If that doesn't look correct, kill cmon and restart with -? for help on the parameters, or change the params in /etc/init.d/cmon&lt;br /&gt;Feb 17 21:22:28 : (INFO) You need to GRANT (and specify a password if you wish) the following on mysql on 127.0.0.1:&lt;br /&gt;Feb 17 21:22:28 : (INFO) GRANT create,select,update,insert,delete on cmon.* to 'cmon'@'127.0.0.1';&lt;br /&gt;Feb 17 21:22:28 : (INFO) GRANT super on *.* to 'cmon'@'127.0.0.1';&lt;br /&gt;Feb 17 21:22:28 : (INFO) Also GRANT (if you have CMON and the MYSQLD on the same host):&lt;br /&gt;Feb 17 21:22:28 : (INFO) GRANT create,select,update,insert,delete on cmon.* to 'cmon'@'127.0.0.1';&lt;br /&gt;Feb 17 21:22:28 : (INFO) GRANT super on *.* to 'cmon'@'127.0.0.1';&lt;br /&gt;Feb 17 21:22:28 : (INFO) and start cmon with --mysql-hostname=127.0.0.1&lt;br /&gt;Feb 17 21:22:28 : (INFO) Testing connection to mysqld..&lt;br /&gt;Feb 17 21:22:28 : (INFO) Trying to connect to management servers...&lt;br /&gt;Feb 17 21:22:28 : (INFO) Connection ok..&lt;br /&gt;Feb 17 21:22:28 : (INFO)&lt;br /&gt;Feb 17 21:22:28 : (INFO) Please wait while cmon is starting up..&lt;br /&gt;...&lt;br /&gt;Feb 17 21:22:30 : (INFO) MonitorThread: Cluster STARTED   - all nodes are started  - running 1&lt;br /&gt;Feb 17 21:22:30 : (INFO) MonitorThread: Number of Nodes = 12&lt;br /&gt;Feb 17 21:22:30 : (INFO) MonitorThread: MGM node id = 1&lt;br /&gt;Feb 17 21:22:30 : (INFO) MonitorThread: MGM node id = 2&lt;br /&gt;Feb 17 21:22:30 : (INFO) MonitorThread: NDBD node 3 is STARTED&lt;br /&gt;Feb 17 21:22:30 : (INFO) MonitorThread: NDBD node 4 is STARTED&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;## COMMENT: When you see it has picked up the nodes you have in your cluster, then&lt;br /&gt;## the initialization is good.&lt;br /&gt;## If this does not work, check GRANTs, connectstrings, and paths in /etc/cmon.cnf&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;5. &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;Web interface&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Requires that you have a webserver with php-mysql installed.&lt;br /&gt;Simply connect your web browser to e.g 127.0.0.1:8080/cmon or 127.0.0.1/cmon&lt;br /&gt;&lt;br /&gt;With the Web Interface it is easy to track performance problems and keep track on resource utilization problems, perhaps you have GC problems in you Java Application Servers (the picture actually show what happened with the transaction load when more worker threads were enabled)?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-rImLHvc-4RY/TV5_q4uUoAI/AAAAAAAAALg/0RKYsrgFte4/s1600/cmon-stats.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 211px;" src="http://4.bp.blogspot.com/-rImLHvc-4RY/TV5_q4uUoAI/AAAAAAAAALg/0RKYsrgFte4/s320/cmon-stats.png" alt="" id="BLOGGER_PHOTO_ID_5575033763489161218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;6. Access the Cluster status from SQL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: connect a mysql client to the mysql server holding the cmon database.&lt;/span&gt;&lt;br /&gt;mysql&amp;gt; use cmon;&lt;br /&gt;&lt;br /&gt;Database changed&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show tables;&lt;br /&gt;+-------------------------+&lt;br /&gt;| Tables_in_cmon          |&lt;br /&gt;+-------------------------+&lt;br /&gt;| alarm                   |&lt;br /&gt;| alarm_log               |&lt;br /&gt;| backup                  |&lt;br /&gt;| backup_log              |&lt;br /&gt;| cluster                 |&lt;br /&gt;| cluster_log             |&lt;br /&gt;| cluster_state           |&lt;br /&gt;| cluster_statistics      |&lt;br /&gt;| configurator_nodemap    |&lt;br /&gt;| diskdata                |&lt;br /&gt;| email_notification      |&lt;br /&gt;| mailserver              |&lt;br /&gt;| memory_usage            |&lt;br /&gt;| mysql_global_statistics |&lt;br /&gt;| mysql_master_status     |&lt;br /&gt;| mysql_server            |&lt;br /&gt;| mysql_slave_status      |&lt;br /&gt;| mysql_statistics        |&lt;br /&gt;| mysql_variables         |&lt;br /&gt;| node_state              |&lt;br /&gt;| node_statistics         |&lt;br /&gt;| restore                 |&lt;br /&gt;| restore_log             |&lt;br /&gt;| schema_object           |&lt;br /&gt;+-------------------------+&lt;br /&gt;24 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select status from cluster_state;&lt;br /&gt;+---------+&lt;br /&gt;| status  |&lt;br /&gt;+---------+&lt;br /&gt;| STARTED |&lt;br /&gt;+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from node_state;&lt;br /&gt;+-----+--------+------------+-----------+-----------+---------------+---------+-------------+-----------------+---------------------+&lt;br /&gt;| cid | nodeid | status     | node_type | nodegroup | host          | version | disconnects | last_disconnect | report_ts           |&lt;br /&gt;+-----+--------+------------+-----------+-----------+---------------+---------+-------------+-----------------+---------------------+&lt;br /&gt;|   1 |      1 | CONNECTED  | NDB_MGMD  |      NULL | 10.0.1.1      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      2 | CONNECTED  | NDB_MGMD  |      NULL | 10.0.1.2      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      3 | STARTED    | NDBD      |         0 | 10.0.1.3      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      4 | STARTED    | NDBD      |         0 | 10.0.1.4      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      7 | CONNECTED  | API       |      NULL | 10.0.1.1      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      8 | CONNECTED  | API       |      NULL | 10.0.1.2      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     13 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     12 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     11 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     10 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      9 | CONNECTED  | API       |      NULL | 10.0.1.5      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;+-----+--------+------------+-----------+-----------+---------------+---------+-------------+-----------------+---------------------+&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;7. Add MySQL Servers to be monitored&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As MySQL Cluster is not able to distinguish between an API or a MySQL Server, we need to tell CMON where our mysql servers are!&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&amp;gt; cd /usr/local/cmon/bin&lt;br /&gt;&amp;gt; ./cmon_add_mysqld.sh -ndb01 -p3306&lt;br /&gt;Using default config file path ../etc/cmon.conf&lt;br /&gt;Added MySQL Server&lt;br /&gt;&lt;br /&gt;You need to execute the following GRANTs on mysqld@ndb01 for CMON agent to be able to connect:&lt;br /&gt;&lt;br /&gt;GRANT REPLICATION SLAVE, SUPER ON *.* TO 'cmon'@'ndb05';&lt;br /&gt;GRANT SELECT ON mysql.* TO 'cmon'@'ndb05';&lt;br /&gt;&lt;/pre&gt;And so on, you need to add every mysql server you want to monitor.&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;8. Scripts&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;All information is stored in SQL tables so it is easy to write scripts around it. Here you can find some example scripts.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: Put the scripts in /usr/local/cmon/bin&lt;/span&gt;&lt;br /&gt;&amp;gt; cd /usr/local/cmon/bin&lt;br /&gt;&amp;gt; sh get_cluster_status.sh&lt;br /&gt;STARTED&lt;br /&gt;&lt;br /&gt;&amp;gt; sh get_node_status.sh -n 4&lt;br /&gt;STARTED&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;9. Suggested Deployment&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Recommendation: If you have the 'mysqld' on 10.10.1.5, connect it also to Cluster and you can use it for administration!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZP94gz0B_KE/S1AxFIWpZ0I/AAAAAAAAAJg/zb55Q3EvjdM/s1600-h/cmon-deploy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZP94gz0B_KE/S1AxFIWpZ0I/AAAAAAAAAJg/zb55Q3EvjdM/s320/cmon-deploy.png" alt="" id="BLOGGER_PHOTO_ID_5426891515193026370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;10. Building from source&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;If you prefer to build from source then you have to have:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MySQL Cluster binaries/libs/includes installed on the build machine&lt;/li&gt;&lt;li&gt;gcc/g++/make&lt;/li&gt;&lt;li&gt;mysql_config and ndb_config on the PATH&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&amp;gt; which mysql_config&lt;br /&gt;/usr/local/mysql/mysql/bin/mysql_config&lt;br /&gt;&amp;gt; which ndb_config&lt;br /&gt;/usr/local/mysql/mysql/bin/ndb_config&lt;br /&gt;&lt;br /&gt;## COMMENT: If 'mysql_config' or 'ndb_config' is not on the PATH,&lt;br /&gt;## then you must make sure it is!&lt;br /&gt;&lt;br /&gt;&amp;gt; wget http://www.severalnines.com/downloads/cmon/cmon-1.0.2.tar.gz&lt;br /&gt;&amp;gt; tar xvfz  cmon-1.0.2.tar.gz&lt;br /&gt;&amp;gt; cd cmon-1.0.2&lt;br /&gt;&amp;gt; ./configure --prefix=/usr/local/cmon/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: end the prefix with 'cmon' and life will be easier.&lt;/span&gt;&lt;br /&gt;&amp;gt; make&lt;br /&gt;&amp;gt; sudo make install&lt;br /&gt;&amp;gt; cd /usr/local/cmon/&lt;br /&gt;Proceed at section 2 above.&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;11. Bugs and problems&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I would be very happy if you file bugs on lauchpad! If you don't want to file a bug report, you can send an email to 'support (at) severalnines (dot) com&lt;br /&gt;Also, if you have suggestions for improvements, let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-5743978727146353802?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/5743978727146353802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=5743978727146353802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5743978727146353802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5743978727146353802'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2011/02/cmon-install-instructions.html' title='CMON - Install Instructions'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-VzDkQKv3sgk/TV2Gcd1C_BI/AAAAAAAAALY/0E-bVs_DVF0/s72-c/cmon.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-6264855654806847976</id><published>2010-12-16T14:07:00.003Z</published><updated>2010-12-16T14:28:35.469Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql 5.5'/><category scheme='http://www.blogger.com/atom/ns#' term='unorthodox'/><category scheme='http://www.blogger.com/atom/ns#' term='semi-sync replication'/><title type='text'>Semi-sync replication (5.5)</title><content type='html'>A bit unorthodox, I normally just write about MySQL Cluster here, but I just wanted to  understand how much latency semi-sync replication adds.&lt;br /&gt;&lt;br /&gt;The test was very simple:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;two mysql servers, interconnected (same switch) on a 1 Gig-E network&lt;/li&gt;&lt;li&gt;one table (see below)&lt;/li&gt;&lt;li&gt;comparing insert performance (one thread) with  'no replication at all' and 'semi sync replication enabled'.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;bencher (had to hack it a bit to make it work with vanilla mysql) running one thread, inserting 4B+128B+4B = 136B of data&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;CREATE TABLE `t1` (&lt;br /&gt;`id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`data` varchar(255) DEFAULT NULL,&lt;br /&gt;`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;PRIMARY KEY (`id`),&lt;br /&gt;KEY `ts` (`ts`)&lt;br /&gt;) ENGINE=InnoDB &lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Test 1  - no replication&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;src/bencher -t1 -r 30   -q "insert into t1(b) values('012345678901234567890123456789001234567890123456789012345678900123456789012345678901234567890012345678901567890123456789001234567')" \&lt;br /&gt;          -i "truncate table t1"  -o no_replication&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;--------------------------&lt;br /&gt;Average Throughput = 7451.26 tps (stdev=969.24)&lt;br /&gt;Average Latency (us)=134.31 (stdev=2904.26)&lt;br /&gt;95th Percentile (us)=110.00&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;/pre&gt;(I haven't looked into why the stdev is so high, but it looks like some requests takes really long time, but this i have not studied why).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Test 2  - Semi-sync replication&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;src/bencher -t1 -r 30   -q "insert into t1(b) values('012345678901234567890123456789001234567890123456789012345678900123456789012345678901234567890012345678901567890123456789001234567')" \&lt;br /&gt;          -i "truncate table t1"  -o no_replication&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;--------------------------&lt;br /&gt;Average Throughput = 2377.10 tps (stdev=210.42)&lt;br /&gt;Average Latency (us)=421.46  (stdev=2644.61)&lt;br /&gt;95th Percentile (us)=362.67&lt;/pre&gt;From this simpe test the increased latency when using semi sync replication is not surprising at all, since the semi-sync adds another network hop to the slave mysql server, and the difference in latency between 'no replication' and 'semi-sync' is very much expected network overhead, (similar factor as if you do a read in mysql cluster vs an write (which requires 2PC and network communication between the data nodes) ).&lt;br /&gt;&lt;br /&gt;So the next step now is to compare this to synchronous replication (cluster), but this will be another time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;innodb config for the record&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;innodb_buffer_pool_size=2048M&lt;br /&gt;innodb_log_file_size=256M&lt;br /&gt;innodb_log_files_in_group=3&lt;br /&gt;innodb_file_format=barracuda&lt;br /&gt;innodb_flush_method = O_DIRECT&lt;br /&gt;innodb_flush_log_at_trx_commit=2        &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-6264855654806847976?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/6264855654806847976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=6264855654806847976' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6264855654806847976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6264855654806847976'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/12/semi-sync-replication-55.html' title='Semi-sync replication (5.5)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-907355299801447770</id><published>2010-11-03T14:00:00.010Z</published><updated>2010-11-03T15:18:51.092Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='ndbinfo'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='disk data'/><title type='text'>DiskPageBufferMemory tuning  and disk data statistics in MySQL Cluster 7.1.9</title><content type='html'>From MySQL Cluster 7.1.9 (not yet released) it is possible to get better stats on disk data tables. In fact, the statistics makes it possible to tune the &lt;code&gt;DiskPageBufferMemory&lt;/code&gt; parameter  (similar to  innodb_bufferpool), in order to avoid disk seeks. It is much (understatement) faster to fetch data from the &lt;code&gt;DiskPageBufferMemory&lt;/code&gt; than disk.&lt;br /&gt;&lt;br /&gt;Here is an example/tutorial how to use this information and how to check the hit ratio of the &lt;code&gt;DiskPageBufferMemory&lt;/code&gt;. Next time, I will explain about other counters you can get from &lt;code&gt;ndbinfo.diskpagebuffer&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Finally, no more educated guesswork is needed.&lt;br /&gt;&lt;br /&gt;Let's take an example.&lt;br /&gt;&lt;br /&gt;I have a table t1 with 650000 record&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;CREATE TABLE `t1` (&lt;br /&gt;`id` bigint(20) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`data1` varchar(512) DEFAULT NULL,&lt;br /&gt;`data2` varchar(512) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=ndbcluster TABLESPACE ts_1 STORAGE DISK  ENGINE=ndbcluster &lt;/pre&gt; &lt;code&gt;data1&lt;/code&gt; and &lt;code&gt;data2&lt;/code&gt; is non-indexed columns so they will be placed on disk.&lt;br /&gt;Then doing Random reads  on this table with &lt;a href="http://www.severalnines.com/bencher"&gt;bencher&lt;/a&gt;:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt; src/bencher -r 100000 -t 1 -q \&lt;br /&gt;        "SET @x=FLOOR(1 + (RAND() * 650000));  SELECT * FROM t1 WHERE id=@x"&lt;br /&gt;&lt;/pre&gt; &lt;span style="font-weight: bold;"&gt;DiskPageBufferMemory=64&lt;/span&gt;M&lt;br /&gt;The initial performance after 340 seconds into the run:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Thread 0 - 274 tps (average tps measured after 335 secs)&lt;br /&gt;Thread 0 - 273 tps (average tps measured after 340 secs)&lt;br /&gt;&lt;/pre&gt;  and the hit ratio:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;mysql&amp;gt; SELECT&lt;br /&gt;node_id,&lt;br /&gt;100*(sum(page_requests_direct_return)/&lt;br /&gt;(sum(page_requests_direct_return)+sum(page_requests_wait_io))) as hit_ratio_pct&lt;br /&gt;FROM diskpagebuffer GROUP BY node_id;&lt;br /&gt;+---------+---------------+&lt;br /&gt;| node_id | hit_ratio_pct |&lt;br /&gt;+---------+---------------+&lt;br /&gt;|       3 |       93.3577 |&lt;br /&gt;|       4 |       93.6565 |&lt;br /&gt;+---------+---------------+&lt;br /&gt;&lt;br /&gt;2 rows in set (0.01 sec&lt;/pre&gt;A hit ratio of ~93%  - not so great.&lt;br /&gt;&lt;br /&gt;So let's increase the DiskPageBufferMemory  ( i am using the &lt;a href="http://www.severalnines.com/config"&gt;configurator scripts&lt;/a&gt; for this)&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;# change DiskPageBufferMemory to 512M in config.ini&lt;br /&gt;vi ../config/config.ini&lt;br /&gt;# do a rolling restart of the data nodes&lt;br /&gt;./rolling-restart.sh --layer=storage&lt;br /&gt;## the sit back and wait for the data nodes to be rolled..&lt;br /&gt;hostx: (324s elapsed) Node 3: starting (Last completed phase 100) (mysql-5.1.51 ndb-7.1.9)&lt;br /&gt;hostx: Data node 3 is STARTED&lt;br /&gt;## then wait for node 4..&lt;br /&gt;hosty: (98s elapsed) Node 4: starting (Last completed phase 4) (mysql-5.1.51 ndb-7.1.9)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Increasing  DiskPageBufferMemory=512M&lt;/span&gt;&lt;br /&gt;Of course, while doing the rolling restart, the same traffic is still happening on the cluster.  Let's check what the hit_ratio is now (while restarting node 3).&lt;br /&gt;&lt;br /&gt;695 seconds into the run we have:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;mysql&amp;gt;  "see above"&lt;br /&gt;+---------+---------------+&lt;br /&gt;| node_id | hit_ratio_pct |&lt;br /&gt;+---------+---------------+&lt;br /&gt;|       4 |       91.2639 |&lt;br /&gt;+---------+---------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;and perf is...&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Thread 0 - 200 tps (average tps measured after 690 secs)&lt;br /&gt;Thread 0 - 200 tps (average tps measured after 695 secs)&lt;br /&gt;&lt;/pre&gt; &lt;span style=";font-family:georgia;font-size:130%;"  &gt;&lt;span style="font-size:100%;"&gt;not good at all.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;After increase to DiskPageBufferMemory=512M&lt;/span&gt;&lt;br /&gt;When the rolling restart has completed the ./rolling-restart.sh prints out:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Cluster: Cluster has performed a rolling restart  &lt;/pre&gt; The DiskPageBufferMemory has now been changed to 512M.&lt;br /&gt;&lt;br /&gt;Let's check what hit ratio we get:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;mysql&amp;gt;  "see above"&lt;br /&gt;+---------+---------------+&lt;br /&gt;| node_id | hit_ratio_pct |&lt;br /&gt;+---------+---------------+&lt;br /&gt;|       3 |       98.2487 |&lt;br /&gt;|       4 |       98.6386 |&lt;br /&gt;+---------+---------------+&lt;br /&gt;2 rows in set (0.01 sec)&lt;br /&gt;&lt;/pre&gt; Hit ratio is picking up and performance as well:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Thread 0 - 1141 tps (average tps measured after 1310 secs)&lt;br /&gt;Thread 0 - 1149 tps (average tps measured after 1315 secs)&lt;br /&gt;&lt;/pre&gt;Now, we just have to wait for a while and let the system enter a steady state.&lt;br /&gt;Then we can check back on the hit ratio and perhaps increase the DiskPageBufferMemory even more.&lt;br /&gt;&lt;br /&gt;If you have 99.5 -- 99.9% hit ratio i would say you are good.&lt;br /&gt;&lt;br /&gt;After 1780 seconds into the run we have:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;+---------+---------------+&lt;br /&gt;| node_id | hit_ratio_pct |&lt;br /&gt;+---------+---------------+&lt;br /&gt;|       3 |       99.2035 |&lt;br /&gt;|       4 |       99.5251 |&lt;br /&gt;+---------+---------------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;and&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Thread 0 - 1669 tps (average tps measured after 1775 secs)&lt;br /&gt;Thread 0 - 1674 tps (average tps measured after 1780 secs)&lt;br /&gt;&lt;/pre&gt; ... wow .. tuning the DiskPageBufferMemory really helped.  And 3300 secs into the run, perf and hit ratio is still climbing:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;Thread 0 - 2329 tps (average tps measured after 3305 secs)&lt;br /&gt;Thread 0 - 2330 tps (average tps measured after 3310 secs&lt;/pre&gt;&lt;br /&gt;Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-907355299801447770?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/907355299801447770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=907355299801447770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/907355299801447770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/907355299801447770'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/11/diskpagebuffermemory-tuning-and-disk.html' title='DiskPageBufferMemory tuning  and disk data statistics in MySQL Cluster 7.1.9'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2501921451046379185</id><published>2010-10-29T12:05:00.007+01:00</published><updated>2010-10-29T13:28:53.873+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JOINs'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><title type='text'>Pushed down JOINs  - Webinar</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZP94gz0B_KE/TMq9eqYs04I/AAAAAAAAALI/tXcgPUtsgA4/s1600/Slide1.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ZP94gz0B_KE/TMq9eqYs04I/AAAAAAAAALI/tXcgPUtsgA4/s320/Slide1.png" alt="" id="BLOGGER_PHOTO_ID_5533443426649691010" border="0" /&gt;&lt;/a&gt;On Thursday, November 04,  at 0900PST/1700CET/1600GMT there is a webinar about Pushed Down Joins. This webinar will explain how Pushed Down Joins works, and some performance numbers.&lt;br /&gt;Register here: &lt;a href="http://mysql.com/news-and-events/web-seminars/display-583.html"&gt;http://mysql.com/news-and-events/web-seminars/display-583.html&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ZP94gz0B_KE/TMq9Q382RJI/AAAAAAAAALA/7R4nYS7Lyl4/s1600/Slide1.png"&gt;&lt;br /&gt;&lt;/a&gt;NDB Pushed JOINs means query shipping instead of data shipping and it reduces drastically the network hops between the MySQL Server and data nodes, which in turn gives a tremendous performance improvement. For particular queries a 180x improvement has been measured.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2501921451046379185?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2501921451046379185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2501921451046379185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2501921451046379185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2501921451046379185'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/10/pushed-down-joins-webinar.html' title='Pushed down JOINs  - Webinar'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZP94gz0B_KE/TMq9eqYs04I/AAAAAAAAALI/tXcgPUtsgA4/s72-c/Slide1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7697833563613885634</id><published>2010-10-11T16:08:00.002+01:00</published><updated>2010-10-12T06:49:22.141+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><title type='text'>MySQL Cluster - Performance (UPDATE on PK) - &gt;120K tx/sec</title><content type='html'>&lt;span&gt;This post follows on the&lt;a href="http://johanandersson.blogspot.com/2010/09/mysql-cluster-performance-select-on-pk.html"&gt; previous post on SELECT performance&lt;/a&gt;. In this post I want to show three things:&lt;/span&gt;&lt;br /&gt;&lt;ol style="font-family: georgia;"&gt;&lt;li&gt;How  many single row UPDATEs per second you can do on on a Cluster with two  data nodes (updating 64B data by the PRIMARY KEY, no batching)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Show how MySQL Cluster scales with threads and mysql servers&lt;/li&gt;&lt;li&gt;How ndb_cluster_connection_pool affects performance&lt;/li&gt;&lt;/ol&gt;&lt;span&gt;Next post will be what happens to INSERTs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Setup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;two data nodes&lt;/li&gt;&lt;li&gt;one to four mysql servers&lt;/li&gt;&lt;li&gt;interconnected with Gig-E (single NIC)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;deployed on six computers (of varying quality, but not really modern, see below). &lt;a href="http://www.severalnines.com/bencher"&gt;www.severalnines.com/bencher&lt;/a&gt; was co-located with each mysql servers to drive the load. The inserts are non batched and looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;UPDATE t1 SET data1='64B of data' WHERE id=[random];&lt;/pre&gt;Table looks like:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;CREATE TABLE `t1` (&lt;br /&gt;`id` bigint(20) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`data1` varchar(512) DEFAULT NULL,&lt;br /&gt;`data2` varchar(512) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=ndbcluster&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The configuration was generated using &lt;a href="http://www.severalnines.com/config"&gt;www.severalnines.com/config&lt;/a&gt; with the following options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MySQL Cluster 7.1.7 (src)&lt;/li&gt;&lt;li&gt;Cluster Usage: Option 3) High read/High write&lt;/li&gt;&lt;li&gt;Cores: 8&lt;/li&gt;&lt;li&gt;Multi-connection: 16 (so that i later could easily change between 1,8,16 connections in the pool)&lt;/li&gt;&lt;li&gt;DataMemory=2500M&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Hardware&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Data nodes deployed on: 2x4 cores Intel(R) Xeon(R) CPU   E5345  @ 2.33GHz&lt;br /&gt;&lt;/li&gt;&lt;li&gt;2 mysql servers deployed on: 2x2 cores with Intel(R) Xeon(R) CPU 5160  @ 3.00GHz&lt;/li&gt;&lt;li&gt;2 mysql servers deployed on: 2x4 cores with Intel(R) Xeon(R) CPU   E5345  @ 2.33GHz&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Results&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ZP94gz0B_KE/TLMIfypcexI/AAAAAAAAAK4/1GEIjBfSok4/s1600/update-64B-byPK.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 204px;" src="http://1.bp.blogspot.com/_ZP94gz0B_KE/TLMIfypcexI/AAAAAAAAAK4/1GEIjBfSok4/s320/update-64B-byPK.png" alt="" id="BLOGGER_PHOTO_ID_5526770509978303250" border="0" /&gt;&lt;/a&gt;&lt;a style="font-weight: bold;" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/TKMKYyL5bLI/AAAAAAAAAKY/ne8fYORmiUI/s1600/benchmark-read-mc717.png"&gt;&lt;br /&gt;&lt;/a&gt;A few notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;conn= 8 means ndb_cluster_connection_pool=8&lt;/li&gt;&lt;li&gt;1 app means one pair of bencher + mysqld co-located one server&lt;/li&gt;&lt;li&gt;With identical HW (2x4 cores) for the mysql server 130K updates per second should be possible.&lt;/li&gt;&lt;li&gt;Data nodes are quite loaded at 4 applications (from 64 - 128 threads), and the TC peaks at 86% CPU util.&lt;/li&gt;&lt;li&gt;The network was not saturated (about 200Mb/s each for TX and RX between the data nodes)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Latency numbers - i have them if someone is interested.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;How to improve this more:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;More cores, faster cores&lt;/li&gt;&lt;li&gt;more mysql servers (to scale out more)&lt;/li&gt;&lt;li&gt;eventually more data nodes &lt;/li&gt;&lt;li&gt;inifiniband&lt;/li&gt;&lt;li&gt;use ndbapi (nosql)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7697833563613885634?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7697833563613885634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7697833563613885634' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7697833563613885634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7697833563613885634'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/10/mysql-cluster-performance-update-on-pk_11.html' title='MySQL Cluster - Performance (UPDATE on PK) - &gt;120K tx/sec'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZP94gz0B_KE/TLMIfypcexI/AAAAAAAAAK4/1GEIjBfSok4/s72-c/update-64B-byPK.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8806972100652290994</id><published>2010-09-29T10:29:00.008+01:00</published><updated>2010-10-11T14:52:47.654+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><title type='text'>MySQL Cluster - Performance (SELECT on PK)</title><content type='html'>&lt;span style="font-family:georgia;"&gt;In this post I want to show three things:&lt;/span&gt;&lt;br /&gt;&lt;ol style="font-family: georgia;"&gt;&lt;li&gt;How many single row SELECTs per second (on the PRIMARY KEY, no batching) you can do on on a Cluster with two data nodes&lt;/li&gt;&lt;li&gt;Show how MySQL Cluster scales with threads and mysql servers&lt;/li&gt;&lt;li&gt;How ndb_cluster_connection_pool affects performance&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:georgia;"&gt;Next post will be what happens to INSERTs, and then UPDATEs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Setup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;two data nodes&lt;/li&gt;&lt;li&gt;one to four mysql servers&lt;/li&gt;&lt;li&gt;interconnected with Gig-E (single NIC)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;deployed on six computers (of varying quality, see below). &lt;a href="http://www.severalnines.com/bencher"&gt;www.severalnines.com/bencher&lt;/a&gt; was co-located with each mysql servers to drive the load. The reads were a PK SELECT like:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;SELECT data1,data2 FROM t1 WHERE id=[random];&lt;br /&gt;&lt;/pre&gt;data1 and data2 are each 256B, so in total 512B was read. There was 1M records in total in table t1, but this does not matter as the SELECT is on the PK (hash index) so it could have been 100B rows (if i have had the storage for it).&lt;br /&gt;&lt;br /&gt;Table looks like:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;CREATE TABLE `t1` (&lt;br /&gt;`id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt; `data1` varchar(512) DEFAULT NULL,&lt;br /&gt;`data2` varchar(512) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=ndbcluster&lt;br /&gt;&lt;/pre&gt;but only 256B of each 512B varchar was filled with data.&lt;br /&gt;&lt;br /&gt;The configuration was generated using &lt;a href="http://www.severalnines.com/config"&gt;www.severalnines.com/config&lt;/a&gt; with the following options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MySQL Cluster 7.1.7 (src)&lt;/li&gt;&lt;li&gt;Cluster Usage: Option 3) High read/High write&lt;/li&gt;&lt;li&gt;Cores: 8&lt;/li&gt;&lt;li&gt;Multi-connection: 16 (so that i later could easily change between 1,8,16 connections in the pool)&lt;/li&gt;&lt;li&gt;DataMemory=2500M&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Hardware&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Data nodes deployed on: Dual CPU Quad core Intel(R) Xeon(R) CPU   E5345  @ 2.33GHz&lt;br /&gt;&lt;/li&gt;&lt;li&gt;2 mysql servers deployed on: Dual CPU Dual core with Intel(R) Xeon(R) CPU 5160  @ 3.00GHz&lt;/li&gt;&lt;li&gt;2 mysql servers deployed on: Dual CPU Quad core Intel(R) Xeon(R) CPU   E5345  @ 2.33GHz&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Results&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a style="font-weight: bold;" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/TKMKYyL5bLI/AAAAAAAAAKY/ne8fYORmiUI/s1600/benchmark-read-mc717.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 161px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/TKMKYyL5bLI/AAAAAAAAAKY/ne8fYORmiUI/s320/benchmark-read-mc717.png" alt="" id="BLOGGER_PHOTO_ID_5522268988991171762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;A few notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;conn= 8 means ndb_cluster_connection_pool=8&lt;/li&gt;&lt;li&gt;1 app means one pair of bencher + mysqld co-located one server&lt;/li&gt;&lt;li&gt;See below why 4 apps does not give &gt;200K tx/s&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Conclusions&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Going from one mysql server to two mysql server gives a 99.9% throughput increase (32 threads).&lt;br /&gt;At this stage I wanted to try with four mysql servers, as the two mysql servers were completely CPU bound at this stage.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Going from two mysql servers to four mysql servers gives a 66% throughput increase.&lt;br /&gt;&lt;br /&gt;However, two of mysql servers were located on dual core, dual cpu, instead of dual cpu - quad core. The Dual CPU/Dual core servers were saturated already at 16 threads connected to MySQL.&lt;br /&gt;&lt;br /&gt;I expect, with similar hardware to get well above 200000tx/s. The MySQL servers on the dual cpu/quad core machines could do 52000tx/s, but the dual cpu/dual core could only handle ~ 38000tx/s when executing the SELECT from 32 threads.&lt;br /&gt;&lt;br /&gt;Hence, more than 200000tx/s should not be impossible, which would be a 92% increase in throughput compared to 2 mysql servers.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ndb_cluster_connection_pool=8 is a good value&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ndb_cluster_connection_pool=1 is is really bad&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ndb_cluster_connection_pool=16 does not give any real benefit, i can imagine it will be worse actually with more data nodes and more mysql servers b/c each data node has to read from more sockets. OTOH, epoll might help. Must be tested more :)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;On my dual cpu/quad core machines the mysql server could scale up to 32 threads and then it hit the roof (100% CPU util including the benchmark program)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;On my dual cpu/dual core machines the mysql server could scale up to16  threads and then it hit the roof (100% CPU util including the  benchmark program)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CPU-bound  -- the mysql servers got completely CPU bound with 32 threads&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; It would be fun to test with 16 or 24 core machines, but I don't have those. It would also be fun to test with faster CPUs.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The data nodes were not saturated on the peak results, but pay attention to the TC thread as in this case it accounts for most CPU util within the data node.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Latency numbers - i have them if someone is interested.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;How to improve this more:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;More cores, faster cores&lt;/li&gt;&lt;li&gt;more mysql servers (to scale out more)&lt;/li&gt;&lt;li&gt;eventually more data nodes &lt;/li&gt;&lt;li&gt;inifiniband&lt;/li&gt;&lt;li&gt;use ndbapi (nosql)&lt;/li&gt;&lt;/ul&gt;I think, despite MySQL Cluster being a relational database and despite we are using SQL, it is possible to get some decent numbers, and good scalability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8806972100652290994?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8806972100652290994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8806972100652290994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8806972100652290994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8806972100652290994'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/09/mysql-cluster-performance-select-on-pk.html' title='MySQL Cluster - Performance (SELECT on PK)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZP94gz0B_KE/TKMKYyL5bLI/AAAAAAAAAKY/ne8fYORmiUI/s72-c/benchmark-read-mc717.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8191378268304504459</id><published>2010-09-02T14:35:00.002+01:00</published><updated>2010-10-12T06:48:50.873+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='error handling'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='contention'/><category scheme='http://www.blogger.com/atom/ns#' term='jbalock'/><title type='text'>Cluster - spins/contentions and thread stuck in..</title><content type='html'>I get a number of question about contentions/"stuck in..".  So here comes some explanation to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Contention&lt;/li&gt;&lt;li&gt;Thread Stuck in&lt;/li&gt;&lt;li&gt;What you can do about it&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In 99% of the cases the contentions written out in the out file of the data nodes (ndb_X_out.log) is nothing to pay attention to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sendbufferpool waiting for lock, contentions: 6000 spins: 489200&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;sendbufferpool waiting for lock, contentions: 6200 spins: 494721&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Each spin is  read from the L1 cache (4 cycles on a Nehalem (3.2GHz), so about a nanosecond).&lt;br /&gt;1 spin = 1.25E-09 seconds (1.25ns)&lt;br /&gt;&lt;br /&gt;In the above we have:&lt;br /&gt;(494721-489200)/(6200-6000)= 27 spins/contention&lt;br /&gt;Time spent on a contention=27 x 1.25E-09=3.375E-08 seconds (0.03375 us)&lt;br /&gt;&lt;br /&gt;So we don't have a problem..&lt;br /&gt;&lt;br /&gt;Another example (here is a lock guarding a job buffer (JBA = JobBuffer A,  in short it handles signals for heartbeats and some other small things, all traffic goes over JobBuffer B).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;jbalock thr: 1 waiting for lock, contentions: 145000 spins: 3280892543&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;jbalock thr: 1 waiting for lock, contentions: 150000 spins: 3403539479&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(3403539479-3280892543)/(150000-145000)=24529 spins/contention&lt;br /&gt;Time spent on a contention: 3.06613E-05 seconds (30.66us )&lt;br /&gt;&lt;br /&gt;This is a bit higher than I would have expected and I think more analysis is needed. However, i tend not to get these contentions on a busy system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Ndb kernel thread X is stuck in ..&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Ndb kernel thread 4 is stuck in: Job Handling elapsed=100&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;Watchdog: User time: 82  System time: 667&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Ndb kernel thread 4 is stuck in: Job Handling elapsed=200&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Watchdog: User time: 82  System time: 668&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Ndb kernel thread 4 is stuck in: Job Handling elapsed=300&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;Watchdog: User time: 82  System time: 669&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Ndb kernel thread 4 is stuck in: Job Handling elapsed=400&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;Watchdog: User time: 82  System time: 670&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here the important is to look at how User time and System time behaves.&lt;br /&gt;If User time is constant (as it is here - 82ms), but the System time is growing (667, 668  etc) which indicates that the OS kernel is busy.&lt;br /&gt;Slow network?  Sub-optimal kernel version? NIC drivers? swapping? some kernel process using too much cpu?&lt;br /&gt;&lt;br /&gt;If User time is growing it is probably because the ndb kernel is overloaded.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;What can you do about this?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In config.ini:&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;RealtimeScheduler=1&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;LockExecThreadToCPU=[cpuids]&lt;x&gt;&lt;avoid cores="" handling="" interrupts="" for="" network=""&gt;&lt;/avoid&gt;&lt;/x&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;check that cpuspeed is not running ( &lt;span style="font-family:courier new;"&gt;yum remove cpuspeed&lt;/span&gt; )&lt;/li&gt;&lt;li&gt;.. and finally ask us to optimize more!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also, pay attention if you get the contentions on an idle Cluster or a busy Cluster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8191378268304504459?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8191378268304504459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8191378268304504459' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8191378268304504459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8191378268304504459'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/09/cluster-spinscontentions-and-thread.html' title='Cluster - spins/contentions and thread stuck in..'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5166216416301631264</id><published>2010-04-27T11:55:00.003+01:00</published><updated>2010-04-27T14:59:39.291+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='SPJ'/><title type='text'>MySQL Cluster - SPJ Preview - Feedback welcome</title><content type='html'>SPJ (preview,&lt;span style="font-weight: bold;"&gt; not  production ready&lt;/span&gt;) is a new feature allowing some types of JOINs to be  pushed down and executed inside the data nodes!  This allows for, in  many cases, much faster JOIN execution.&lt;br /&gt;&lt;p class="postBody"&gt;&lt;span style="font-weight: bold;"&gt;Now we would love to get  your feedback on this new feature:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Does what we have right now  improve performance for you?&lt;/li&gt;&lt;li&gt;Are there other types of JOINs we should  support in order to improve performance in you application (currently  only eq_ref is supported)?&lt;/li&gt;&lt;li&gt;What application are you using?&lt;/li&gt;&lt;/ul&gt;&lt;p class="postBody"&gt;&lt;span style="font-weight: bold;"&gt;There are  some  limitations currently:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;node failure handling of SPJ is not   complete, so if a data node crash, there are side-effects.&lt;/li&gt;&lt;li&gt;only eq_ref is  supported - other JOINs are executed as normal.&lt;/li&gt;&lt;li&gt;Don't put this in production.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Obtaining the MySQL Cluster SPJ preview version:&lt;/span&gt;&lt;ul&gt;&lt;li&gt;You must  know how to build MySQL Cluster from source&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.severalnines.com/config"&gt;www.severalnines.com/config&lt;/a&gt;  includes "7.1 SPJ Preview" (the scripts will compile and distribute the binaries for you)  - just select "MySQL Cluster 7.1.3-SPJ" from the Cluster Version drop down.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The source code (if you don't use severalnines/config) can be found &lt;a href="ftp://ftp.mysql.com/pub/mysql/download/cluster_telco/mysql-5.1.44-ndb-7.1.3-spj-preview/mysql-cluster-gpl-7.1.3-spj-preview.tar.gz"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;How to test is:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Run a JOIN query:&lt;br /&gt;&lt;code&gt;mysql&amp;gt; set ndb_join_pushdown=0; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;mysql&amp;gt; run join query &lt;/code&gt;&lt;br /&gt;&lt;code&gt;mysql&amp;gt; set ndb_join_pushdown=1; //ENABLES SPJ&lt;/code&gt;&lt;br /&gt;&lt;code&gt;mysql&amp;gt; run join query again &lt;/code&gt;&lt;br /&gt;Did it help?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run EXPLAIN on the queries (especially if SPJ did not help)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Feedback:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Send us the EXPLAINs of the queries where SPJ did not help!&lt;br /&gt;or&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Let us know if this feature was helpful for your application.&lt;br /&gt;and in any case please include&lt;br /&gt;&lt;/li&gt;&lt;li&gt;What kind of speed up (or decrease) was observed&lt;/li&gt;&lt;li&gt;What kind of cluster configuration/hw was used.&lt;/li&gt;&lt;/ul&gt;Please send your feedback to us: &lt;code&gt;spj-feedback (at) sun (dot) com&lt;/code&gt; .  Thank you!&lt;br /&gt;&lt;p class="postBody"&gt;&lt;span style="font-weight: bold;"&gt;Read more about SPJ:&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;More details about SPJ is in &lt;a href="http://assets.en.oreilly.com/1/event/36/MySQL%20Cluster%20and%20Pushdown-joins%20_In%20Pursuit%20of%20the%20Holy%20Grail_%20Presentation.pdf"&gt;Jonas'  MySQL UC 2010 presentation&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-5166216416301631264?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/5166216416301631264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=5166216416301631264' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5166216416301631264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5166216416301631264'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/04/mysql-cluster-spj-preview-feedback_27.html' title='MySQL Cluster - SPJ Preview - Feedback welcome'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1797031265773088309</id><published>2010-04-20T00:06:00.003+01:00</published><updated>2010-04-20T00:49:45.673+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><title type='text'>Tuning your Cluster with ndbinfo (7.1) part 1 of X</title><content type='html'>The new ndbinfo interface in 7.1 is really useful to assist in tuning MySQL Cluster. Here is an example (more will follow):&lt;br /&gt;&lt;br /&gt;I started with one test where I inserted two blobs (1KB + 1KB) in one table.&lt;br /&gt;From 16 threads (colocated with one mysqld, two data nodes, separate computers) and one application driving the load I reached about &lt;span style="font-weight: bold;"&gt;6960TPS&lt;/span&gt;, and the utilization of the redo buffers (controlled by the parameter &lt;code&gt;RedoBuffer&lt;/code&gt; in config.ini) looked like:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;mysql&amp;lt; select * from ndbinfo.logbuffers;&lt;br /&gt;+---------+----------+--------+----------+----------+--------+&lt;br /&gt;| node_id | log_type | log_id | log_part | total    | used   |&lt;br /&gt;+---------+----------+--------+----------+----------+--------+&lt;br /&gt;|       3 | REDO     |      0 |        1 | 50331648 | 196608 |&lt;br /&gt;|       3 | REDO     |      0 |        2 | 50331648 | 294912 |&lt;br /&gt;|       3 | REDO     |      0 |        3 | 50331648 | 131072 |&lt;br /&gt;|       3 | REDO     |      0 |        4 | 50331648 | 229376 |&lt;br /&gt;|       4 | REDO     |      0 |        1 | 50331648 | 229376 |&lt;br /&gt;|       4 | REDO     |      0 |        2 | 50331648 | 262144 |&lt;br /&gt;|       4 | REDO     |      0 |        3 | 50331648 | 163840 |&lt;br /&gt;|       4 | REDO     |      0 |        4 | 50331648 | 229376 |&lt;br /&gt;+---------+----------+--------+----------+----------+--------+&lt;br /&gt;8 rows in set (0.01 sec)&lt;br /&gt;&lt;/pre&gt;Which is basically nothing.&lt;br /&gt;&lt;br /&gt;I then increased the load and inserted&lt;span style="font-weight: bold;"&gt; 2 x 5120B BLOBs&lt;/span&gt; (from 16 threads one MySQL server), and run with an insert speed of &lt;span style="font-weight: bold;"&gt;4320TPS&lt;/span&gt;:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;mysql&amp;lt; select * from ndbinfo.logbuffers;&lt;br /&gt;+---------+----------+--------+----------+----------+----------+&lt;br /&gt;| node_id | log_type | log_id | log_part | total    | used     |&lt;br /&gt;+---------+----------+--------+----------+----------+----------+&lt;br /&gt;|       3 | REDO     |      0 |        1 | 50331648 | 11468800 |&lt;br /&gt;|       3 | REDO     |      0 |        2 | 50331648 | 31522816 |&lt;br /&gt;|       3 | REDO     |      0 |        3 | 50331648 | 42008576 |&lt;br /&gt;|       3 | REDO     |      0 |        4 | 50331648 | 43057152 |&lt;br /&gt;|       4 | REDO     |      0 |        1 | 50331648 | 14090240 |&lt;br /&gt;|       4 | REDO     |      0 |        2 | 50331648 | 17432576 |&lt;br /&gt;|       4 | REDO     |      0 |        3 | 50331648 | 10321920 |&lt;br /&gt;|       4 | REDO     |      0 |        4 | 50331648 | 12615680 |&lt;br /&gt;+---------+----------+--------+----------+----------+----------+&lt;/pre&gt;&lt;br /&gt;Above you can see that the redo buffers are used (the load will be spread around, and it is hard to catch a moment where the load is even on all buffers), and now the application started to throw the error &lt;code&gt;"Got temporary error 1221 'REDO buffers overloaded (increase RedoBuffer)' from NDBCLUSTER (1297)"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I can now follow the instruction to increase the REDO buffer, but would it help in this case?&lt;br /&gt;No, no and no.&lt;br /&gt;The disk is too slow to keep up and cannot write out to disk in the same rate as the application writes out.&lt;br /&gt;&lt;br /&gt;'iostat' gives:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&amp;lt; iostat -kx 1&lt;br /&gt;&lt;br /&gt;Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util&lt;br /&gt;cciss/c0d0        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00&lt;br /&gt;cciss/c0d1        0.00 27796.00    0.00 1454.00     0.00 115196.00   158.45    12.03    8.25   0.66  95.30&lt;br /&gt;dm-0              0.00     0.00    0.00 29270.00     0.00 117080.00     8.00   274.79    9.33   0.03  95.20&lt;br /&gt;dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00&lt;br /&gt;dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00&lt;br /&gt;dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00&lt;br /&gt;dm-4              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00&lt;br /&gt;dm-5              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And here you can see that the disks are quite utilized. This means that I have two options now if I want to be able to sustain the &lt;span style="font-weight: bold;"&gt;4320TPS&lt;/span&gt; insert load:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Increase the number of data nodes (computers) so instead of having two computers, I should have four so that I spread the load across more hardware&lt;/li&gt;&lt;li&gt;Improve my disk subsystem (add better disks, e.g,  to have 2-4 disk spindles to spread the load on), or by having the REDO log on device  cciss/c0d1 and the the LCP on device cciss/c0d0.&lt;/li&gt;&lt;/ul&gt;The CPU, could that also been an bottleneck in this case? No, it was not the issue. The CMVMI thread (one of the data nodes threads) was spending 44.4% polling data from the other nodes, and it is reading in quite large packets so that is why it was the heaviest user of CPU of the data node threads.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;5453 root      20   0 6594m 4.1g 6956 R 44.4 51.9   4:05.64 ndbmtd&lt;br /&gt;5471 root      20   0 6594m 4.1g 6956 S 32.5 51.9   3:39.07 ndbmtd&lt;br /&gt;5474 root      20   0 6594m 4.1g 6956 R 26.6 51.9   2:25.55 ndbmtd&lt;br /&gt;5475 root      20   0 6594m 4.1g 6956 S 23.7 51.9   2:25.01 ndbmtd&lt;br /&gt;5476 root      20   0 6594m 4.1g 6956 R 23.7 51.9   2:20.83 ndbmtd&lt;br /&gt;5473 root      20   0 6594m 4.1g 6956 R 21.7 51.9   2:26.57 ndbmtd&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1797031265773088309?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1797031265773088309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1797031265773088309' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1797031265773088309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1797031265773088309'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/04/tuning-your-cluster-with-ndbinfo-71.html' title='Tuning your Cluster with ndbinfo (7.1) part 1 of X'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2377752113060078922</id><published>2010-04-07T11:24:00.007+01:00</published><updated>2010-04-07T16:23:04.435+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><title type='text'>MySQL Cluster - BLOB performance and other things</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.oreilly.com/mysql2010/public/schedule/speaker/13954"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 125px; height: 125px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/S7yBRn-1ACI/AAAAAAAAAKI/XnL-oIhK9MM/s320/mysql2010_speaking_badge_125x125.gif" alt="" id="BLOGGER_PHOTO_ID_5457378988256460834" border="0" /&gt;&lt;/a&gt;At the UC 2010 I will have a session on &lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12445"&gt;MySQL Cluster Performance Tuning&lt;/a&gt;. This session will address a lot of the most common performance problems I see in my day to day job with Cluster. A small excerpt of the talk is below here and many other things will be addressed in the session (JOINs, schema optimization, batching, indexes, parameter tuning etc). I hope to see you there!&lt;br /&gt;&lt;br /&gt;First a bit on &lt;code&gt;ndb_autoincrement_prefetch_sz&lt;/code&gt; and then blobs!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ndb_autoincrement_prefetch_sz&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;One thing is contention on auto_increments, which can really slow down performance.&lt;br /&gt;By default the &lt;code&gt;ndb_autoincrement_prefetch_sz=1&lt;/code&gt;. This means that the mysqld will cache one auto_increment number and then go down to the data nodes to fetch the next number. It is better to let the mysqld cache more numbers, to avoid the unnecessary round-trip.&lt;br /&gt;&lt;br /&gt;From MySQL Cluster 7.0.13 you can set it up to 65536 (previously max was 256)&lt;br /&gt;&lt;br /&gt;With &lt;code&gt;ndb_autoincrement_prefetch_sz=1024&lt;/code&gt; the mysqld will cache 1024 numbers before fetching the next range of numbers from the data nodes.&lt;br /&gt;&lt;br /&gt;Som numbers for inserting batches of 16 records from 8 concurrent threads on one mysqld:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;ndb_autoincrement_prefetch_sz=1:                1211.91TPS&lt;br /&gt;ndb_autoincrement_prefetch_sz=256:              3471.71TPS&lt;br /&gt;ndb_autoincrement_prefetch_sz=1024:             3659.52TPS&lt;/pre&gt;Here we got an 3x improvement on INSERT performance. Nice!&lt;br /&gt;&lt;br /&gt;This test is by no means trying to max out the cluster, far from it, just  to illustrate how important it is to set the &lt;code&gt;ndb_autoincrement_prefetch_sz&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;BLOB/TEXT&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Another is on &lt;code&gt;BLOB/TEXT&lt;/code&gt; attributes - which in many cases are overused in applications (e.g, there is no reason to store an 'email' as a TEXT, or if the data is less than about 8000B).&lt;br /&gt;&lt;br /&gt;If you can change them to VARBINARY/VARCHAR (&lt;a href="http://blogs.sun.com/LinuxJedi/entry/blobs_in_mysql_cluster"&gt;as LinuxJedi suggests&lt;/a&gt;), do it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;BLOBs/TEXTs&lt;/code&gt; are significantly slower compared to &lt;code&gt;VARBINARY/VARCHAR&lt;/code&gt; (because the &lt;code&gt;BLOBs&lt;/code&gt; are stored in a separate table, and need to be locked with at least a  shared lock when accessed).&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;CREATE TABLE `t1_blob` (&lt;br /&gt;`id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`data1` blob,&lt;br /&gt;`data2` blob,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;)ENGINE=ndbcluster&lt;br /&gt;&lt;/pre&gt;and inserted 200K records. sizeof(data1) = 1024B, sizeof(data2) = 1024B.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;SELECT data1, data2 FROM t1 WHERE id=&amp;lt;rand&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Executed from 1 App - 8 Threads on one MySQLD and two data nodes resulted in:&lt;br /&gt;&lt;br /&gt;data1 and data2 represented as BLOBs : 5844 TPS&lt;br /&gt;data1 and data2 represented as VARBINARYs: &lt;span style="font-weight: bold;"&gt;19206 TPS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Again, this is not maxing out the data nodes, just to show you the idea.&lt;br /&gt;&lt;br /&gt;Conclusion&lt;br /&gt;If you can replace &lt;code&gt;TEXT/BLOB&lt;/code&gt; with &lt;code&gt;VARCHAR/VARBINARY&lt;/code&gt; (remember that the max record size in Cluster is 8052B)  do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2377752113060078922?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2377752113060078922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2377752113060078922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2377752113060078922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2377752113060078922'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/04/mysql-cluster-blob-performance-and.html' title='MySQL Cluster - BLOB performance and other things'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZP94gz0B_KE/S7yBRn-1ACI/AAAAAAAAAKI/XnL-oIhK9MM/s72-c/mysql2010_speaking_badge_125x125.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-3581554879687007737</id><published>2010-03-25T09:01:00.007Z</published><updated>2010-03-25T09:36:14.742Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='uc2010'/><title type='text'>UC2010 - MySQL Cluster Deploy and Perf Tuning BP</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://en.oreilly.com/mysql2010/public/schedule/speaker/13954"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 125px; height: 125px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/S6stmSPX0pI/AAAAAAAAAJ4/Qs8TxB3Yj4k/s320/mysql2010_speaking_badge_125x125.gif" alt="" id="BLOGGER_PHOTO_ID_5452501909616710290" border="0" /&gt;&lt;/a&gt;At the MySQL UC 2010 (on Tuesday 4/14  11:55 am) me and my colleague Joffrey Michaie will present &lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12446"&gt;MySQL Cluster - Deployment Best Practices&lt;/a&gt;. We will give talk about what is important to think about when deploying MySQL Cluster, what to do, what not to do, operational aspects and a few other practical things.&lt;br /&gt;This session will be a great follow-on to the &lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12469"&gt;introductory session on MySQL Cluster&lt;/a&gt; (and the &lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12438"&gt;tutorial&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;After the Deployment session, same day at 2:00pm, I will also have a session on &lt;a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12445"&gt;MySQL Cluster Performance Tuning Best Practices&lt;/a&gt;. In this session you will learn tricks and tips how to tune your Cluster, e.g how to tune and design your schema and queries so it runs optimally on MySQL Cluster.&lt;br /&gt;&lt;br /&gt;So if you want to see what happens after this slide you should come and join us!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/S6ss23JJelI/AAAAAAAAAJw/wQkWYgb6Uk4/s1600/+MySQL_UC2010_Cluster_Deploy.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 244px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/S6ss23JJelI/AAAAAAAAAJw/wQkWYgb6Uk4/s320/+MySQL_UC2010_Cluster_Deploy.png" alt="" id="BLOGGER_PHOTO_ID_5452501094888995410" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-3581554879687007737?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/3581554879687007737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=3581554879687007737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3581554879687007737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3581554879687007737'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/03/uc2010-mysql-cluster-deploy-and-perf.html' title='UC2010 - MySQL Cluster Deploy and Perf Tuning BP'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZP94gz0B_KE/S6stmSPX0pI/AAAAAAAAAJ4/Qs8TxB3Yj4k/s72-c/mysql2010_speaking_badge_125x125.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-923479427266326595</id><published>2010-02-03T09:28:00.004Z</published><updated>2010-02-03T12:59:03.865Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster'/><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>MySQL Cluster Configurator v3</title><content type='html'>Version 3.0 of the &lt;a href="http://www.severalnines.com/config3"&gt;severalnines/Configurator&lt;/a&gt; has been released:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Improved scripts (a lot of cleanup), prefixing the script output with the hostname:&lt;br /&gt;E.g,:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt;Cluster: Cluster Start                                                             &lt;br /&gt;Cluster: STARTING MANAGEMENT SERVERS                                               &lt;br /&gt;ps-ndb01: Starting management server (nodeid=1)                                     &lt;br /&gt;ps-ndb01: Copying ../config/config.ini to /etc/mysql                                &lt;br /&gt;ps-ndb01: Started management server (nodeid=1, pid=28253)&lt;br /&gt;...&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Reduced number of scripts&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt;start-cluster-initial.sh --&gt; start-cluster.sh --initial&lt;/code&gt;&lt;br /&gt;&lt;code&gt;rolling-restart-initial.sh --&gt; rollling-restart.sh --initial&lt;br /&gt;&lt;/code&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt;start-ndbd-&amp;lt;host&amp;gt;-&amp;lt;id&amp;gt;-initial.sh --&gt; &lt;/code&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt;start-ndbd-&amp;lt;host&amp;gt;-&amp;lt;id&amp;gt;.sh&lt;/code&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt; --initial&lt;/code&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Better error handling during rolling restarts&lt;/li&gt;&lt;li&gt;Scripts are checking if Node Failure handling is ready before starting nodes&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;code&gt;start-ndbd-&amp;lt;host&amp;gt;-&amp;lt;id&amp;gt;.sh&lt;/code&gt; - new parameters &lt;code&gt;[--initial] [--nowait] [--ignore]&lt;/code&gt;&lt;br /&gt;&lt;code&gt;--initial&lt;/code&gt;  - initial node start (clear out local ndb_fs&lt;br /&gt;&lt;code&gt;--nowait&lt;/code&gt; - script will exit as soon as data node is starting&lt;br /&gt;&lt;code&gt;--ignore&lt;/code&gt; - ignore waiting for Node Failure handling to complete&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Supports MySQL Cluster 7.1.1&lt;/li&gt;&lt;/ul&gt;Here is an example of how to try out 7.1.1 using the Configurator&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;1. Generate a Configuration (make sure you select "MySQL Cluster 7.1.1")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Currently 7.1.1 is only in source format so you need to have ncurses-devel/gcc/g++/make installed&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/S2lEEo30UCI/AAAAAAAAAJo/OGl6eTsaALY/s1600-h/configv3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 118px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/S2lEEo30UCI/AAAAAAAAAJo/OGl6eTsaALY/s320/configv3.png" alt="" id="BLOGGER_PHOTO_ID_5433949271880912930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2. Unpack the tarball you get and start the installation!&lt;/span&gt;&lt;br /&gt;You are recommended to set up &lt;a href="http://community.spiceworks.com/education/projects/Passwordless_SSH_Using_Shared_Keys"&gt;shared ssh keys&lt;/a&gt; between the "Frontend" (where you run the scripts) to the other nodes in the cluster in order to avoid typing passwords all the time.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;tar xvfz mysqlcluster-71.tar.gz&lt;br /&gt;cd mysqlcluster-71&lt;br /&gt;cd cluster/scripts/install/&lt;br /&gt;./shared-ssh-keys.sh ###WARNING - This script is experimental, let me know if it works!&lt;br /&gt;./download-and-compile.sh&lt;br /&gt;./install-cluster.sh&lt;br /&gt;./bootstrap.sh&lt;br /&gt;cd ..&lt;br /&gt;./start-cluster.sh --initial&lt;br /&gt;&lt;/pre&gt;Voila!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-923479427266326595?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/923479427266326595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=923479427266326595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/923479427266326595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/923479427266326595'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/02/mysql-cluster-configurator-v3.html' title='MySQL Cluster Configurator v3'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZP94gz0B_KE/S2lEEo30UCI/AAAAAAAAAJo/OGl6eTsaALY/s72-c/configv3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-4706286481920382155</id><published>2010-02-03T09:09:00.004Z</published><updated>2010-02-03T10:00:56.456Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndbinfo'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL Cluster 7.1'/><title type='text'>MySQL Cluster 7.1.1 (beta)  - what's in there</title><content type='html'>The main new features in MySQL Cluster 7.1.1 (beta) is the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ndbinfo (aka ndb$info) - Finally!! System tables for MySQL Cluster describing live usage of a lot of resources (RedoBuffer, Redo Log space, counters etc etc). Looks promising - makes Cluster  a lot more transparent. See examples below.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cluster/J - for more information and to learn more about it -  &lt;a href="http://www.clusterdb.com/mysql-cluster/upcoming-webinars-for-java-and-jpa-access-to-mysql-cluster/"&gt;register to a webinar and meet the architect and developer of Cluster/J&lt;/a&gt;!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.severalnines.com/config3"&gt;Severalnines/Configurator&lt;/a&gt; supports 7.1.1  -  to try it out!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;NDBINFO -  examples&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ever wondered how much for the RedoBuffer you are actually using?&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;mysql&gt;  SELECT * FROM ndbinfo.logbuffers;&lt;br /&gt;+---------+----------+--ç------+----------+----------+--------+&lt;br /&gt;|       3 | REDO     |      0 |        1 | 33554432 | 229376 |&lt;br /&gt;|       3 | REDO     |      0 |        2 | 33554432 | 229376 |&lt;br /&gt;|       3 | REDO     |      0 |        3 | 33554432 |  98304 |&lt;br /&gt;|       3 | REDO     |      0 |        4 | 33554432 | 229376 |&lt;br /&gt;|       4 | REDO     |      0 |        1 | 33554432 | 262144 |&lt;br /&gt;|       4 | REDO     |      0 |        2 | 33554432 |  65536 |&lt;br /&gt;|       4 | REDO     |      0 |        3 | 33554432 |  98304 |&lt;br /&gt;|       4 | REDO     |      0 |        4 | 33554432 | 262144 |&lt;br /&gt;+---------+----------+--------+----------+----------+--------+&lt;br /&gt;&lt;/pre&gt;And how about the Redo log space?&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;mysql&gt;  SELECT * FROM ndbinfo.logspaces;&lt;br /&gt;+---------+----------+--------+----------+------------+-----------+&lt;br /&gt;| node_id | log_type | log_id | log_part | total      | used      |&lt;br /&gt;+---------+----------+--------+----------+------------+-----------+&lt;br /&gt;|       3 | REDO     |      0 |        0 | 3221225472 | 200278016 |&lt;br /&gt;|       3 | REDO     |      0 |        0 | 3221225472 | 201326592 |&lt;br /&gt;|       3 | REDO     |      0 |        0 | 3221225472 | 202375168 |&lt;br /&gt;|       3 | REDO     |      0 |        0 | 3221225472 | 202375168 |&lt;br /&gt;|       4 | REDO     |      0 |        0 | 3221225472 | 201326592 |&lt;br /&gt;|       4 | REDO     |      0 |        0 | 3221225472 | 201326592 |&lt;br /&gt;|       4 | REDO     |      0 |        0 | 3221225472 | 202375168 |&lt;br /&gt;|       4 | REDO     |      0 |        0 | 3221225472 | 202375168 |&lt;br /&gt;+---------+----------+--------+----------+------------+-----------+&lt;br /&gt;8 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;Statistics ...&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;mysql&gt; SELECT * FROM ndbinfo.counters;&lt;br /&gt;+---------+------------+----------------+------------+--------------+-----------+&lt;br /&gt;| node_id | block_name | block_instance | counter_id | counter_name | val       |&lt;br /&gt;+---------+------------+----------------+------------+--------------+-----------+&lt;br /&gt;|       3 | DBLQH      |              1 |         10 | OPERATIONS   |   1747971 |&lt;br /&gt;|       3 | DBLQH      |              2 |         10 | OPERATIONS   |   1748870 |&lt;br /&gt;|       3 | DBLQH      |              3 |         10 | OPERATIONS   |   1749056 |&lt;br /&gt;|       3 | DBLQH      |              4 |         10 | OPERATIONS   |   1777925 |&lt;br /&gt;|       4 | DBLQH      |              1 |         10 | OPERATIONS   |   1747976 |&lt;br /&gt;|       4 | DBLQH      |              2 |         10 | OPERATIONS   |   1749008 |&lt;br /&gt;|       4 | DBLQH      |              3 |         10 | OPERATIONS   |   1749033 |&lt;br /&gt;|       4 | DBLQH      |              4 |         10 | OPERATIONS   |   1777928 |&lt;br /&gt;|       3 | DBTC       |              0 |          1 | ATTRINFO     | 470827014 |&lt;br /&gt;|       3 | DBTC       |              0 |          2 | TRANSACTIONS |    245150 |&lt;br /&gt;|       3 | DBTC       |              0 |          3 | COMMITS      |    245137 |&lt;br /&gt;|       3 | DBTC       |              0 |          4 | READS        |        25 |&lt;br /&gt;|       3 | DBTC       |              0 |          5 | SIMPLE_READS |         0 |&lt;br /&gt;|       3 | DBTC       |              0 |          6 | WRITES       |   3512472 |&lt;br /&gt;|       3 | DBTC       |              0 |          7 | ABORTS       |        13 |&lt;br /&gt;|       3 | DBTC       |              0 |          8 | TABLE_SCANS  |        29 |&lt;br /&gt;|       3 | DBTC       |              0 |          9 | RANGE_SCANS  |         0 |&lt;br /&gt;|       4 | DBTC       |              0 |          1 | ATTRINFO     | 472683577 |&lt;br /&gt;|       4 | DBTC       |              0 |          2 | TRANSACTIONS |    218857 |&lt;br /&gt;|       4 | DBTC       |              0 |          3 | COMMITS      |    218834 |&lt;br /&gt;|       4 | DBTC       |              0 |          4 | READS        |        10 |&lt;br /&gt;|       4 | DBTC       |              0 |          5 | SIMPLE_READS |         1 |&lt;br /&gt;|       4 | DBTC       |              0 |          6 | WRITES       |   3501562 |&lt;br /&gt;|       4 | DBTC       |              0 |          7 | ABORTS       |        22 |&lt;br /&gt;|       4 | DBTC       |              0 |          8 | TABLE_SCANS  |         3 |&lt;br /&gt;|       4 | DBTC       |              0 |          9 | RANGE_SCANS  |         0 |&lt;br /&gt;+---------+------------+----------------+------------+--------------+-----------+&lt;br /&gt;26 rows in set (0.12 sec)&lt;br /&gt;&lt;/pre&gt;And there is a  lot more!&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;mysql&gt; show tables;&lt;br /&gt;+-------------------+&lt;br /&gt;| Tables_in_ndbinfo |&lt;br /&gt;+-------------------+&lt;br /&gt;| blocks            |&lt;br /&gt;| config_params     |&lt;br /&gt;| counters          |&lt;br /&gt;| logbuffers        |&lt;br /&gt;| logspaces         |&lt;br /&gt;| memoryusage       |&lt;br /&gt;| nodes             |&lt;br /&gt;| pools             |&lt;br /&gt;| resources         |&lt;br /&gt;| transporters      |&lt;br /&gt;+-------------------+&lt;br /&gt;10 rows in set (0.01 sec)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-4706286481920382155?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/4706286481920382155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=4706286481920382155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4706286481920382155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4706286481920382155'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/02/mysql-cluster-711-beta-whats-in-there.html' title='MySQL Cluster 7.1.1 (beta)  - what&apos;s in there'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1706526411725570515</id><published>2010-02-01T16:27:00.003Z</published><updated>2010-02-01T16:30:49.533Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='webinar'/><title type='text'>Cluster Performance Tuning Webinar - EMEA</title><content type='html'>The 2nd of February, 0900GMT/1000CET  I will have a webinar on Cluster Performance Tuning for people located in EMEA timezone.&lt;br /&gt;&lt;br /&gt;For more information and registration:&lt;br /&gt;&lt;a href="http://mysql.com/news-and-events/web-seminars/display-480.html"&gt;&lt;br /&gt;http://mysql.com/news-and-events/web-seminars/display-480.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In addition to what is mentioned in the Agenda I will also present numbers on typical operations, how to design requests, explain how the optimizer works with MySQL Cluster etc etc.&lt;br /&gt;&lt;br /&gt;See you there!&lt;br /&gt;&lt;br /&gt;-johan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1706526411725570515?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1706526411725570515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1706526411725570515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1706526411725570515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1706526411725570515'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/02/cluster-performance-tuning-webinar-emea.html' title='Cluster Performance Tuning Webinar - EMEA'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8203211405057368846</id><published>2010-01-20T19:20:00.004Z</published><updated>2010-01-20T20:26:11.079Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='proto buffers'/><category scheme='http://www.blogger.com/atom/ns#' term='gearman'/><category scheme='http://www.blogger.com/atom/ns#' term='connectors'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><title type='text'>Gearman meets MySQL Cluster (NDBAPI)</title><content type='html'>After a discussion with my colleague Stephane Varoqui we decided to see how &lt;a href="http://www.danga.com/gearman/"&gt;Gearman&lt;/a&gt; and the &lt;a href="http://dev.mysql.com/doc/ndbapi/en/index.html"&gt;NDBAPI&lt;/a&gt; could be used together. The result of the POC was a Gearman worker and a couple of clients (clients and workers use &lt;a href="http://code.google.com/apis/protocolbuffers/"&gt;Google Protocol Buffers&lt;/a&gt; as the protocol). The worker can:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;set/get/delete records on a single table in MySQL Cluster using the primary key&lt;/li&gt;&lt;li&gt;set/get/delete "any" type. It is not possible to dynamically add types but this is done at compile time.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;supports the following SQL data types: &lt;code&gt;(UNSIGNED) INTEGER, (UNSIGNED) BIGINT, CHAR, VARCHAR/VARBINARY&lt;/code&gt;&lt;/li&gt;&lt;li&gt;supports the following Google Protocol Buffer&lt;a href="http://code.google.com/apis/protocolbuffers/docs/proto.html#scalar"&gt; scalars&lt;/a&gt;: &lt;code&gt;int32, uint32, int64, uint64, string, bytes&lt;/code&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;not handle much errors for the time being&lt;/li&gt;&lt;/ul&gt;and a client that can&lt;br /&gt;&lt;ul&gt;&lt;li&gt;create a message and send it to the Gearman Job Server&lt;/li&gt;&lt;li&gt;clients ca n be written in either C++, Java, or Python (subject to what languages that Google Protocol Buffers supports)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;receive (deserialize) the data.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So basically this is a new, albeit simple, connector to MySQL Cluster! Hopefully someone will find it useful.&lt;br /&gt;&lt;br /&gt;The code can be &lt;a href="http://www.severalnines.com/projects.php"&gt;downloaded here&lt;/a&gt; and some short instructions are here,  and if you guys out there thinks this is usable, then it might make it to launchpad. Let me know!&lt;br /&gt;&lt;br /&gt;Here follows some information what has been done and how to use this.&lt;br /&gt;&lt;br /&gt;First you have to create the relation tables (engine=ndb). I will use a 'Person' (for the rest of the examples) that  I will persist to the database.   I have created the following relational table:&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;CREATE TABLE `Person` (&lt;br /&gt;`id` int(11) NOT NULL,&lt;br /&gt;`name` varchar(128) DEFAULT NULL,&lt;br /&gt;`message` varchar(1024) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=ndbcluster DEFAULT CHARSET=latin1&lt;br /&gt;&lt;/pre&gt;The relational tables needs to be translated  to Google Protocol Buffers:&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&amp;gt; cat proto/Person.proto&lt;br /&gt;message Person {&lt;br /&gt;required int32 id = 1;  //PRIMARY KEY attributes are 'required'&lt;br /&gt;optional string name = 2;&lt;br /&gt;optional string message = 3;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; All columns in the relational table must exist in the protocol buffer definition.&lt;br /&gt;&lt;br /&gt;There is union-proto buffer called &lt;code&gt;NdbMessage.proto&lt;/code&gt; that then contains all the proto buffers that can be sent between the client and worker:&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&amp;gt; cat proto/NdbMessage.proto&lt;br /&gt;// import the relevant protos that can be in&lt;br /&gt;// the NdbMessage&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;import "Person.proto";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;message NdbMessage {&lt;br /&gt;enum Type { &lt;span style="font-weight: bold;"&gt;Person=1;&lt;/span&gt;}&lt;br /&gt;// Identifies which field is filled in.&lt;br /&gt;required Type type = 1;&lt;br /&gt;// list of possible protos comes here:&lt;br /&gt;optional &lt;span style="font-weight: bold;"&gt;Person person = 2;&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/apis/protocolbuffers/docs/proto.html#simple"&gt;proto files &lt;/a&gt;then needs to be run through the &lt;a href="http://code.google.com/apis/protocolbuffers/docs/proto.html#generating"&gt;protocol buffer compiler&lt;/a&gt;:&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&amp;gt; /usr/local/bin/protoc --proto_path=proto --cpp_out=`pwd` proto/Person.proto proto/NdbMessage.proto&lt;br /&gt;# this generates .h and .cc files for Proto buffer files.&lt;br /&gt;&lt;/pre&gt;There are three clients for this, one for each operation (set,get,delete).&lt;br /&gt;&lt;br /&gt;In the  ndbapi_set_client.cpp (the clients are based on the reverse_client.cpp in gearman) we invoke the 'ndbapi_set' function, that will be executed by the worker:&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;br /&gt;#include "NdbMessage.pb.h" &lt;span style="font-weight: bold;"&gt;&lt;br /&gt;#include "Person.pb.h"&lt;/span&gt;&lt;br /&gt;.&lt;br /&gt;/**instantiate a NdbMessage object and associate a Person to it*/&lt;br /&gt;NdbMessage m;&lt;br /&gt;m.set_type(NdbMessage_Type_Person);&lt;br /&gt;Person *  p=m.mutable_person();&lt;br /&gt;/* I must set all fields for now */&lt;br /&gt;p-&gt;set_id(1);&lt;br /&gt;p-&gt;set_name("Johan Andersson");&lt;br /&gt;p-&gt;set_message("hello world, my first insert");&lt;br /&gt;&lt;br /&gt;string s;&lt;br /&gt;m.SerializeToString(&amp;amp;s);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;const char * data = s.data();&lt;br /&gt;result= (char*)gearman_client_do(&amp;amp;client,&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"ndbapi_set"&lt;/span&gt;,&lt;br /&gt;NULL,&lt;br /&gt;(void *)data,&lt;br /&gt;(size_t)p.ByteSize(),&lt;br /&gt;&amp;amp;result_size,&lt;br /&gt;&amp;amp;ret);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The worker (ndbapi_worker.cpp) registers three functions:&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;ret=gearman_worker_add_function(&amp;amp;worker, "&lt;span style="font-weight: bold;"&gt;ndbapi_get&lt;/span&gt;", 0, ndbapi_get,NULL);&lt;br /&gt;ret=gearman_worker_add_function(&amp;amp;worker, "&lt;span style="font-weight: bold;"&gt;ndbapi_set&lt;/span&gt;", 0, ndbapi_set,NULL);&lt;br /&gt;ret=gearman_worker_add_function(&amp;amp;worker, "&lt;span style="font-weight: bold;"&gt;ndbapi_delete&lt;/span&gt;", 0, ndbapi_delete,NULL);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;And when the worker receives the function call to 'ndbapi_set' it has to deserialize the received message into a &lt;code&gt;NdbMessage&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;static void *ndbapi_set(gearman_job_st *job,&lt;br /&gt; void *context,&lt;br /&gt; size_t *result_size,&lt;br /&gt;gearman_return_t *ret_ptr)&lt;br /&gt;{&lt;br /&gt;/** receive message and convert into c++ string&lt;br /&gt;* construct the wanted object (dataObject) from parsing c++ string.&lt;br /&gt;*/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  const void * rawmessage;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  rawmessage= gearman_job_workload(job);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  string s((char*)rawmessage,  gearman_job_workload_size(job));&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  NdbMessage dataObject;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  if(! dataObject.ParseFromString(s))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      *ret_ptr= GEARMAN_WORK_FAIL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;      return NULL;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;The worker then looks at the type of the message and gets the underlying object (in this case &lt;code&gt;Person&lt;/code&gt;):&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&lt;br /&gt;google::protobuf::Message  * message;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;switch(dataObject.type())&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;case &lt;span style="font-weight: bold;"&gt;NdbMessage_Type_Person&lt;/span&gt;:&lt;br /&gt;{&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;message= (google::protobuf::Message*)&amp;amp;dataObject.person();&lt;/span&gt;&lt;br /&gt;reflection = (google::protobuf::Reflection *)message-&gt;GetReflection();&lt;br /&gt;descriptor = (google::protobuf::Descriptor*)message-&gt;GetDescriptor();&lt;br /&gt;}&lt;br /&gt;break;&lt;br /&gt;/*&lt;br /&gt;case NdbMessage_Type_MyType:&lt;br /&gt;{&lt;br /&gt;// the myType() ..  is the name of the field in MyType.proto:&lt;br /&gt;// MyType myType = &lt;id&gt;;&lt;br /&gt;message= (google::protobuf::Message*)&amp;amp;dataObject.myType();&lt;br /&gt;reflection = (google::protobuf::Reflection *)message-&gt;GetReflection();&lt;br /&gt;descriptor = (google::protobuf::Descriptor*)message-&gt;GetDescriptor();&lt;br /&gt;}&lt;br /&gt;break;&lt;br /&gt;*/&lt;br /&gt;default:&lt;br /&gt;cout &lt;&lt; "unknown type: "&lt;&lt; ret_ptr=" GEARMAN_WORK_FAIL;"&gt; the insert was successful */&lt;br /&gt;*result_size=0;&lt;br /&gt;*ret_ptr= GEARMAN_SUCCESS;&lt;br /&gt;return NULL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/id&gt;&lt;/pre&gt;In order to add a new type, you need to add a new 'case' to handle the type and how to get that object from the &lt;code&gt;NdbMessage&lt;/code&gt; object (dataObject).&lt;br /&gt;&lt;br /&gt;The worker loops over all fields in the received Proto Message and creates a transaction in the NDBAPI and executes it.  Thus this part agnostic to the type you give it. As long as the following is true:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The relational table only uses &lt;code&gt;(UNSIGNED) INTEGER, (UNSIGNED) BIGINT, CHAR, VARCHAR/VARBINARY&lt;/code&gt; data types.&lt;/li&gt;&lt;li&gt;The .proto definition contains all columns in the relational table&lt;/li&gt;&lt;li&gt;The .proto file marks the PRIMARY KEY of the relational table as 'required'&lt;/li&gt;&lt;li&gt;For 'ndbapi_set' you need to set all columns in the table ( i will fix that as soon as possible)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The data is then persisted in the table (currently the worker expects all tables to be stored in the 'test' database):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;mysql&gt; select * from Person;&lt;br /&gt;+----+-----------------+------------------------------+&lt;br /&gt;| id | name            | message                      |&lt;br /&gt;+----+-----------------+------------------------------+&lt;br /&gt;|  1 | Johan Andersson | hello world, my first insert |&lt;br /&gt;+----+-----------------+------------------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now the worker can also handle 'get' requests, and by using the get_client:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&gt; ./get_client  1&lt;br /&gt;name: Johan Andersson&lt;br /&gt;message: hello world, my first insert&lt;br /&gt;&lt;/pre&gt;And there is also a client that does deletes (delete_client):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&gt; ./delete_client  1&lt;br /&gt;Delete successful: id=1&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Summary/Conclusions&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What are the performance implications of using Proto Buffer's reflection mechanism?&lt;/li&gt;&lt;li&gt;Proto Buffer only works for C++, Java, and Python - currently no support for PHP.&lt;/li&gt;&lt;li&gt;Is it better to use something else than Proto Buffers for this?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Gearman was super-easy to install so thanks for that!&lt;/li&gt;&lt;li&gt;Google Protocol Buffers was super-easy to install so thanks for that!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The worker needs also to be extended to support range searches and to make use of the batching interface so that it is possible persist either many types or many instances of a type in a batch.&lt;/li&gt;&lt;li&gt;NO-SQL  --   YES-NDB !&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8203211405057368846?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8203211405057368846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8203211405057368846' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8203211405057368846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8203211405057368846'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/01/gearman-meets-mysql-cluster-ndbapi_20.html' title='Gearman meets MySQL Cluster (NDBAPI)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-504849205446504390</id><published>2010-01-14T21:45:00.003Z</published><updated>2010-02-01T16:37:47.837Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmon'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><title type='text'>CMON - Install Instructions</title><content type='html'>&lt;a href="http://www.severalnines.com/cmon"&gt;CMON - the Cluster Monitor&lt;/a&gt; has recently been released and here is a little how to about how to install from binary and source (at the end), deployment etc.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;1. Download the cmon binary package to a monitoring host&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Currently there are binaries available for Linux 64-bit and 32-bit (statically linked) and works for MySQL Cluster 7.0.9 and later.&lt;br /&gt;&lt;br /&gt;In this case the monitoring host will be on 'ndb05' (IP address 10.0.1.5) - see 9. Suggested Deployment for a picture describing the setup.&lt;br /&gt;&lt;br /&gt;The Monitoring machine should have installed: &lt;ul&gt;&lt;li&gt; a mysql server up and running that will store the cmon database (if you build from source you need to have the mysql cluster libraries and include files)&lt;/li&gt;     &lt;li&gt;apache (if you want to have the web interface) + php_mysql&lt;/li&gt;    &lt;li&gt;rrdtool (if you want to have graphs in web interface)&lt;/li&gt;&lt;/ul&gt;The picture at the end of this post shows how you can deploy CMON.&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&amp;gt; cd /usr/local&lt;br /&gt;&amp;gt; wget http://www.severalnines.com/downloads/cmon/cmon-1.0.2-64bit-glibc23-mysqlcluster-709.tar.gz&lt;br /&gt;&amp;gt; tar xvfz cmon-1.0.2-64bit-glibc23-mysqlcluster-709.tar.gz&lt;br /&gt;&amp;gt; ln -s cmon-1.0.2-64bit-glibc23-mysqlcluster-709 cmon&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;2. Verify that you have a free API slot [mysqld] so that cmon can connect to MySQL Cluster&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&amp;gt; ndb_mgm -e "show"&lt;br /&gt;Cluster Configuration&lt;br /&gt;---------------------&lt;br /&gt;[ndbd(NDB)] 2 node(s)&lt;br /&gt;id=3 @10.0.1.3  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0, Master)&lt;br /&gt;id=4 @10.0.1.4  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0)&lt;br /&gt;&lt;br /&gt;[ndb_mgmd(MGM)] 2 node(s)&lt;br /&gt;id=1 @10.0.1.1  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;id=2 @10.0.1.2  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;&lt;br /&gt;[mysqld(API)] 6 node(s)&lt;br /&gt;id=7 @10.0.1.1  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;id=8 @10.0.1.2  (mysql-5.1.39 ndb-7.0.9)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;id=9 (not connected, accepting connect from any host)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;id=10 (not connected, accepting connect from 10.0.1.5)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Yes, I have two slots - if I run cmon from host 10.0.1.5, then it is fine (id=10), but in this case, I can connect cmon from any host (id=9). Point is that you must have a slot free with "any host" or from an explicit host.&lt;br /&gt;&lt;br /&gt;You must also have MemReportFrequency=30  (or some other value, in seconds) in order to get the memory usage events sent from MySQL Cluster. Otherwize, CMON will not be able to present memory utilization information!&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;3. Run the cmon install script&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&amp;gt; cd /usr/local/cmon/bin&lt;br /&gt;&amp;gt; ./cmon_install.sh&lt;br /&gt;&lt;br /&gt;This script will install cmon, rrd, init.d scripts, and generate SQL scripts for GRANTs&lt;br /&gt;Distribution: fedora&lt;br /&gt;&lt;br /&gt;**** MYSQL CONNECTION ****&lt;br /&gt;CMON and the  RRD scripts needs a mysql connection to speak mysql server holding the cmon database.&lt;br /&gt;Specify the BASEDIR where mysql is installed (default /usr/local/mysql/): &lt;span style="font-weight: bold;"&gt;/usr/local/mysql/mysql&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Specify the hostname of the mysql server having the cmon database (default 'ndb05'): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;/span&gt;&lt;br /&gt;No hostname specified - using default 'ndb05'&lt;br /&gt;&lt;br /&gt;Specify the port of the mysql server having the cmon database (default 3306): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;No port specified - using default 3306&lt;br /&gt;&lt;br /&gt;Specify the password for the 'cmon' user (default no password): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;No password specified - using default (no password)&lt;br /&gt;&lt;br /&gt;Specify the ndb-connectstring to the cluster (e.g, host_A;host_B): &lt;span style="font-weight: bold;"&gt;ndb01;ndb02&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## Comment: ndb01;ndb02 are the hostnames of the two management&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## servers in my cluster. YOU MUST SPECIFY THIS!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;****  WWW interface ****&lt;br /&gt;The www files will be copied to /var/www/html/cmon/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## Comment: The installation scripts tries to find the default&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## location for www used in your distribution&lt;/span&gt;&lt;br /&gt;Specify the WWWROOT of your webserver (default /var/www/html):  &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;Copying files to /var/www/html ..&lt;br /&gt;&lt;br /&gt;****  RRD ****&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## Comment: If you don't have RRD installed then graphs will not be available&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## from the web client, but there is no other functional impact!&lt;/span&gt;&lt;br /&gt;Specify the full path to 'rrdtool' (default is /usr/bin/): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;No path to rrd specified - using default /usr/bin/&lt;br /&gt;&lt;br /&gt;The rrdtool stores data files in a data directory.&lt;br /&gt;Specify the full path to the data directory (about 20MB free space will be neeeded).&lt;br /&gt;RRD data directory (default is /data/rrd/): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;br /&gt;&lt;/span&gt;No RRD data directory specified - using default /data/rrd/&lt;br /&gt;Saving ../etc/cmon.conf&lt;br /&gt;&lt;br /&gt;**** INITD SCRIPTS ****&lt;br /&gt;Do you want to install /etc/init.d/cmon (y/n)? : &lt;span style="font-weight: bold;"&gt;y&lt;/span&gt;&lt;br /&gt;Specify the directory where CMON should write its pidfile (default /var/run/): &lt;span style="font-weight: bold;"&gt;&amp;lt;return&amp;gt;&lt;/span&gt;&lt;br /&gt;chkconfig&lt;br /&gt;Saving configuration to ../etc/init.d/cmon&lt;br /&gt;Installing /etc/init.d/cmon&lt;br /&gt;Done - Installed init.d scripts&lt;br /&gt;Now you can start cmon with '/etc/init.d/cmon start'&lt;br /&gt;&lt;br /&gt;**** INSTALL CRONTAB ****&lt;br /&gt;cron schedules jobs every 5 minutes to update the rrd database and generarate graphs for the web interface. You are recommended to install the cron jobs&lt;br /&gt;Do you want to install cron jobs for cmon (y/n)? : &lt;span style="font-weight: bold;"&gt;y&lt;/span&gt;&lt;br /&gt;You need to issue the following GRANTs before starting CMON:&lt;br /&gt;&lt;br /&gt;GRANT super, replication client ON *.* TO 'cmon'@'ndb05';&lt;br /&gt;GRANT select,update,insert,delete,create ON cmon.* TO 'cmon'@'ndb05';&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Configuration now complete - you can edit the /usr/local/cmon/bin/../etc/cmon.conf manually if you wish.&lt;br /&gt;&lt;br /&gt;Configuration is now complete, but you need to apply the suggest GRANTs to the cmon database:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: Connect a mysql client to the cmon database and do&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## (actual GRANTs are subject to your particular settings):&lt;/span&gt;&lt;br /&gt;mysql&amp;gt; GRANT super, replication client ON *.* TO 'cmon'@'ndb05';&lt;br /&gt;mysql&amp;gt; GRANT select,update,insert,delete,create ON cmon.* TO 'cmon'@'ndb05';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;4. Start CMON&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: Make sure CMON database and Cluster is started (so initialization won't fail)&lt;/span&gt;&lt;br /&gt;&amp;gt; /etc/init.d/cmon start&lt;br /&gt;Starting cmon version 1.0.0 with the following parameters:&lt;br /&gt;--mysqlpasswd=&lt;br /&gt;--mysqlhost=ndb05&lt;br /&gt;--mysqlport=3306&lt;br /&gt;--ndb-connectstring=ndb01;ndb02&lt;br /&gt;--savetime-clusterlog=48 (hours)&lt;br /&gt;&lt;br /&gt;If that doesn't look correct, kill cmon and restart with -? for help on the parameters, or change the params in /etc/init.d/cmon&lt;br /&gt;&lt;br /&gt;You need to GRANT (and specify a password if you wish) the following on mysql on ndb05:&lt;br /&gt;&lt;br /&gt;GRANT create,select,update,insert,delete on cmon.* to 'cmon'@'ndb05';&lt;br /&gt;GRANT super on *.* to 'cmon'@'ndb05';&lt;br /&gt;&lt;br /&gt;Testing connection to mysqld..&lt;br /&gt;Connection ok..&lt;br /&gt;Please wait while cmon is starting up..&lt;br /&gt;Recreating missing tables&lt;br /&gt;Done&lt;br /&gt;Registering managed cluster with cluster id=1&lt;br /&gt;Managed cluster has been registered - registered cluster id=1&lt;br /&gt;cmon has started successfully.&lt;br /&gt;Going to daemoinze.. - cmon will write a log in syslog from now&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;start on service executed successfully&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;5. Access the Cluster status from SQL&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre   style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;font-family:Andale Mono,Lucida Console,Monaco,fixed,monospace;font-size:12px;"&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: connect a mysql client to the mysql server holding the cmon database.&lt;/span&gt;&lt;br /&gt;mysql&amp;gt; use cmon;&lt;br /&gt;&lt;br /&gt;Database changed&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show tables;&lt;br /&gt;+-------------------------+&lt;br /&gt;| Tables_in_cmon          |&lt;br /&gt;+-------------------------+&lt;br /&gt;| alarm                   |&lt;br /&gt;| alarm_log               |&lt;br /&gt;| backup                  |&lt;br /&gt;| backup_log              |&lt;br /&gt;| cluster                 |&lt;br /&gt;| cluster_log             |&lt;br /&gt;| cluster_state           |&lt;br /&gt;| cluster_statistics      |&lt;br /&gt;| configurator_nodemap    |&lt;br /&gt;| diskdata                |&lt;br /&gt;| email_notification      |&lt;br /&gt;| mailserver              |&lt;br /&gt;| memory_usage            |&lt;br /&gt;| mysql_global_statistics |&lt;br /&gt;| mysql_master_status     |&lt;br /&gt;| mysql_server            |&lt;br /&gt;| mysql_slave_status      |&lt;br /&gt;| mysql_statistics        |&lt;br /&gt;| mysql_variables         |&lt;br /&gt;| node_state              |&lt;br /&gt;| node_statistics         |&lt;br /&gt;| restore                 |&lt;br /&gt;| restore_log             |&lt;br /&gt;| schema_object           |&lt;br /&gt;+-------------------------+&lt;br /&gt;24 rows in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select status from cluster_state;&lt;br /&gt;+---------+&lt;br /&gt;| status  |&lt;br /&gt;+---------+&lt;br /&gt;| STARTED |&lt;br /&gt;+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from node_state;&lt;br /&gt;+-----+--------+------------+-----------+-----------+---------------+---------+-------------+-----------------+---------------------+&lt;br /&gt;| cid | nodeid | status     | node_type | nodegroup | host          | version | disconnects | last_disconnect | report_ts           |&lt;br /&gt;+-----+--------+------------+-----------+-----------+---------------+---------+-------------+-----------------+---------------------+&lt;br /&gt;|   1 |      1 | CONNECTED  | NDB_MGMD  |      NULL | 10.0.1.1      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      2 | CONNECTED  | NDB_MGMD  |      NULL | 10.0.1.2      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      3 | STARTED    | NDBD      |         0 | 10.0.1.3      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      4 | STARTED    | NDBD      |         0 | 10.0.1.4      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      7 | CONNECTED  | API       |      NULL | 10.0.1.1      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      8 | CONNECTED  | API       |      NULL | 10.0.1.2      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     13 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     12 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     11 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |     10 | NO_CONTACT | API       |      NULL | 0.0.0.0       | NULL    |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;|   1 |      9 | CONNECTED  | API       |      NULL | 10.0.1.5      | 7.0.9   |           0 | NULL            | 2010-01-13 12:00:56 |&lt;br /&gt;+-----+--------+------------+-----------+-----------+---------------+---------+-------------+-----------------+---------------------+&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;6. Web interface&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Requires that you have a webserver with php-mysql installed.&lt;br /&gt;Simply connect your web browser to e.g 127.0.0.1:8080/cmon&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;7. Add MySQL Servers to be monitored&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As MySQL Cluster is not able to distinguish between an API or a MySQL Server, we need to tell CMON where our mysql servers are!&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&amp;gt; cd /usr/local/cmon/bin&lt;br /&gt;&amp;gt; ./cmon_add_mysqld.sh -ndb01 -p3306&lt;br /&gt;Using default config file path ../etc/cmon.conf&lt;br /&gt;Added MySQL Server&lt;br /&gt;&lt;br /&gt;You need to execute the following GRANTs on mysqld@ndb01 for CMON agent to be able to connect:&lt;br /&gt;&lt;br /&gt;GRANT REPLICATION SLAVE, SUPER ON *.* TO 'cmon'@'ndb05';&lt;br /&gt;GRANT SELECT ON mysql.* TO 'cmon'@'ndb05';&lt;br /&gt;&lt;/pre&gt;And so on, you need to add every mysql server you want to monitor.&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;8. Scripts&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;All information is stored in SQL tables so it is easy to write scripts around it. Here you can find some example scripts.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: Put the scripts in /usr/local/cmon/bin&lt;/span&gt;&lt;br /&gt;&amp;gt; cd /usr/local/cmon/bin&lt;br /&gt;&amp;gt; sh get_cluster_status.sh&lt;br /&gt;STARTED&lt;br /&gt;&lt;br /&gt;&amp;gt; sh get_node_status.sh -n 4&lt;br /&gt;STARTED&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;9. Suggested Deployment&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;Recommendation: If you have the 'mysqld' on 10.10.1.5, connect it also to Cluster and you can use it for administration!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZP94gz0B_KE/S1AxFIWpZ0I/AAAAAAAAAJg/zb55Q3EvjdM/s1600-h/cmon-deploy.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZP94gz0B_KE/S1AxFIWpZ0I/AAAAAAAAAJg/zb55Q3EvjdM/s320/cmon-deploy.png" alt="" id="BLOGGER_PHOTO_ID_5426891515193026370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;10. Building from source&lt;br /&gt;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;If you prefer to build from source then you have to have:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MySQL Cluster binaries/libs/includes installed on the build machine&lt;/li&gt;&lt;li&gt;gcc/g++/make&lt;/li&gt;&lt;li&gt;mysql_config and ndb_config on the PATH&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px;"&gt;&amp;gt; which mysql_config&lt;br /&gt;/usr/local/mysql/mysql/bin/mysql_config&lt;br /&gt;&amp;gt; which ndb_config&lt;br /&gt;/usr/local/mysql/mysql/bin/ndb_config&lt;br /&gt;&lt;br /&gt;## COMMENT: If 'mysql_config' or 'ndb_config' is not on the PATH,&lt;br /&gt;## then you must make sure it is!&lt;br /&gt;&lt;br /&gt;&amp;gt; wget http://www.severalnines.com/downloads/cmon/cmon-1.0.2.tar.gz&lt;br /&gt;&amp;gt; tar xvfz  cmon-1.0.2.tar.gz&lt;br /&gt;&amp;gt; cd cmon-1.0.2&lt;br /&gt;&amp;gt; ./configure --prefix=/usr/local/cmon/&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;## COMMENT: end the prefix with 'cmon' and life will be easier.&lt;/span&gt;&lt;br /&gt;&amp;gt; make&lt;br /&gt;&amp;gt; sudo make install&lt;br /&gt;&amp;gt; cd /usr/local/cmon/&lt;br /&gt;Proceed at section 2 above.&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;11. Bugs and problems&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I would be very happy if you file bugs on lauchpad! If you don't want to file a bug report, you can send an email to 'support (at) severalnines (dot) com&lt;br /&gt;Also, if you have suggestions for improvements, let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-504849205446504390?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/504849205446504390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=504849205446504390' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/504849205446504390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/504849205446504390'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2010/01/cmon-install-instructions.html' title='CMON - Install Instructions'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZP94gz0B_KE/S1AxFIWpZ0I/AAAAAAAAAJg/zb55Q3EvjdM/s72-c/cmon-deploy.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7262221297574385324</id><published>2009-12-31T13:20:00.004Z</published><updated>2009-12-31T13:43:56.326Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cmon'/><title type='text'>Cluster Monitoring</title><content type='html'>A new version of &lt;a href="http://www.severalnines.com/cmon"&gt;CMON&lt;/a&gt; - the monitor for MySQL Cluster - has been released. Many thanks to everyone who helped me with bug fixing and beta testing!&lt;br /&gt;&lt;br /&gt;CMON monitors all events and information that you can get from MySQL Cluster.&lt;br /&gt;&lt;br /&gt;Some of the things that CMON monitors:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cluster status (starting, started, stopped, recovering, degraded etc)&lt;/li&gt;&lt;li&gt;Data node status (started, stopped, starting etc)&lt;/li&gt;&lt;li&gt;Application (mysqld)  node status  (connected/disconnected)&lt;/li&gt;&lt;li&gt;DataMemory/IndexMemory/Tablespace utilization&lt;/li&gt;&lt;li&gt;Statistics from data nodes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Statistics from mysql servers&lt;/li&gt;&lt;li&gt;Replication (basic currenty) support -picks up if a mysql server is a slave and checks if is running or not&lt;/li&gt;&lt;li&gt;Alarm generation&lt;/li&gt;&lt;/ul&gt;There are pre-built binaries for Linux 64-bit (I have not got around yet to do debian and rpm packages), as well as source code. It has been tested in Fedora 9 , Ubuntu 9.04, Centos 4/5, but I have not had the possibility to test on Redhat/SLES/Debian yet, so it would be interesting to know if there are any issues with it there. There are also &lt;a href="http://www.severalnines.com/cmon/index.php#install"&gt;installation instructions&lt;/a&gt; and a &lt;a href="http://www.severalnines.com/cmon/index.php#deploy"&gt;deployment guide (PDF)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;CMON uses the Management API to collect information from MySQL Cluster and puts this information in a MySQL database, so it can be queried using SQL. This makes it very easy to write scripts around it  and there are some sample scripts on the &lt;a href="http://www.severalnines.com/cmon"&gt;CMON web page&lt;/a&gt;.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;# Get the status of Cluster for cluster with clusterid=1:&lt;br /&gt;root@centos4-1 bin]# ./get_cluster_status.sh --clusterid=1&lt;br /&gt;STARTED&lt;br /&gt;&lt;br /&gt;# Get the list of node ids for type NDBD so that we can iterate over them easily.&lt;br /&gt;[root@centos4-1 bin]# ./get_node_ids.sh --clusterid=1 -t NDBD&lt;br /&gt;3 4&lt;br /&gt;&lt;br /&gt;# Get the status of the node 3&lt;br /&gt;[root@centos4-1 bin]# ./get_node_status.sh  --clusterid=1 --nodeid=3&lt;br /&gt;STARTED&lt;br /&gt;&lt;/pre&gt;If you want you can also view the Cluster from a web interface (requires PHP), and you can get graphs using &lt;a href="http://oss.oetiker.ch/rrdtool/"&gt;RRD&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Installation is very simple, just run the cmon_install.sh script that is part of the package which will ask you a number of questions and write a configuration file.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZP94gz0B_KE/Szynb0jJRII/AAAAAAAAAJI/xPylHXbEL7A/s1600-h/cmon.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ZP94gz0B_KE/Szynb0jJRII/AAAAAAAAAJI/xPylHXbEL7A/s320/cmon.jpg" alt="" id="BLOGGER_PHOTO_ID_5421392147851592834" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7262221297574385324?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7262221297574385324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7262221297574385324' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7262221297574385324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7262221297574385324'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/12/cluster-monitoring.html' title='Cluster Monitoring'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZP94gz0B_KE/Szynb0jJRII/AAAAAAAAAJI/xPylHXbEL7A/s72-c/cmon.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-4247086962194240283</id><published>2009-11-27T12:42:00.002Z</published><updated>2009-11-27T12:54:37.914Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='error handling'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><title type='text'>Node failure handling - take 2</title><content type='html'>Jonas improved the node failure handling in MySQL Cluster 7.0.9 (and 6.3.29) so here comes a re-run of the a &lt;a href="http://johanandersson.blogspot.com/2009/09/node-failure-handling.html"&gt;previous blog post&lt;/a&gt;. And the node failure handling time has improved a lot - see below.&lt;br /&gt;&lt;br /&gt;I created in total 11345 tables, each with 128 columns, and then hit this &lt;a href="http://bugs.mysql.com/bug.php?id=49156"&gt;bug&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When all tables were created, I stopped one node and measured how long time it takes for the other node to perform the node failure handling. Here is what was written into the cluster log (look at the &lt;span style="font-weight: bold;"&gt;bold &lt;/span&gt;lines):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2009-11-27 13:39:21 [MgmtSrvr] ALERT    -- Node 4: Node 3 Disconnected&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] ALERT    -- Node 4: Network partitioning - arbitration required&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: President restarts arbitration thread [state=7]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: Communication to Node 3 closed&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] ALERT    -- Node 1: Node 3 Disconnected&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] ALERT    -- Node 4: Arbitration won - positive reply from node 1&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: GCP Take over started&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: Node 4 taking over as DICT master&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: GCP Take over completed&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: kk: 9670/4 0 0&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: LCP Take over started&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: ParticipatingDIH = 0000000000000010&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: ParticipatingLQH = 0000000000000010&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LCP_COMPLETE_REP_Counter_DIH = [SignalCounter: m_count=0 0000000000000000]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LCP_COMPLETE_REP_Counter_LQH = [SignalCounter: m_count=1 0000000000000010]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LAST_LCP_FRAG_ORD = [SignalCounter: m_count=0 0000000000000000]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LCP_COMPLETE_REP_From_Master_Received = 0&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: LCP Take over completed (state = 5)&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: ParticipatingDIH = 0000000000000010&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: ParticipatingLQH = 0000000000000010&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LCP_COMPLETE_REP_Counter_DIH = [SignalCounter: m_count=1 0000000000000010]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LCP_COMPLETE_REP_Counter_LQH = [SignalCounter: m_count=1 0000000000000010]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LAST_LCP_FRAG_ORD = [SignalCounter: m_count=1 0000000000000010]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 4: m_LCP_COMPLETE_REP_From_Master_Received = 0&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] INFO     -- Node 3: Node shutdown completed.&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:21 [MgmtSrvr] ALERT    -- Node 1: Node 3 Disconnected&lt;br /&gt;&lt;br /&gt;2009-11-27 13:39:22 [MgmtSrvr] INFO     -- Node 4: Started arbitrator node 1 [ticket=2a74000295047d39]&lt;br /&gt;&lt;br /&gt;2009-11-27 13:40:20 [MgmtSrvr] WARNING  -- Node 4: Failure handling of node 3 has not completed in 1 min. - state = 6&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2009-11-27 13:41:03 [MgmtSrvr] INFO     -- Node 4: Communication to Node 3 opened&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now, the node failure handling was completed in &lt;span style="font-weight: bold;"&gt;1 minute 42 seconds&lt;/span&gt;! This is quite some improvement from the &lt;span style="font-weight: bold;"&gt;17 minutes&lt;/span&gt; (although measured with 16000 tables and I will comeback when the bug mentioned above is fixed) measured before Jonas made his magic.&lt;br /&gt;&lt;br /&gt;What does it mean? It means that we can start to recover a failed data nodes much earlier now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-4247086962194240283?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/4247086962194240283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=4247086962194240283' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4247086962194240283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4247086962194240283'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/11/node-failure-handling-take-2.html' title='Node failure handling - take 2'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2231256358663597252</id><published>2009-11-26T10:18:00.003Z</published><updated>2009-11-26T10:42:30.714Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='scaling'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><title type='text'>Scaling - going from 2 to X data nodes</title><content type='html'>When moving from two data nodes to a bigger Cluster it is not necessarily true that you will have better performance. In fact you can get worse.&lt;br /&gt;&lt;br /&gt;Here are some things to think about:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; Database Load (traffic to Cluster) &lt;/span&gt; -  if you can handle query load X on a two node cluster and move the same load X to a four data node cluster you will likely get &lt;span style="font-style: italic;"&gt;new_load_X=0.8X&lt;/span&gt;, i.e., a performance degradation. This has to do with 1) buffers are not filled up fast enough so the data nodes will do "timeout" based sending or 2) that the access patterns aren't scaling. To correct 1) you need to increase the load on the cluster so that internal communication buffers fill up faster.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Access pattern related "problems":&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For &lt;span style="font-weight: bold;"&gt;primary key operations&lt;/span&gt; (reads, updates, deletes) you will always go to the correct node to fetch the data with PK operations, no matter how many nodes you have. So no problems with these types of ops.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;For &lt;span style="font-weight: bold;"&gt;index scans on a key&lt;/span&gt; you will always scan all data nodes. This can be expensive if the number of records you retrieve is "small" (about &amp;lt;=64 records), since setting up the index scan on every data node is expensive. Sending the actual data is relatively cheap. This can be the cause of performance degradation when moving from 2 data nodes to bigger cluster. This is not so much to do about, unless you can redesign your schema for most important requests to fit the &lt;span style="font-weight: bold;"&gt;index scans on part of PK &lt;/span&gt;way of accessing data.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;For &lt;span style="font-weight: bold;"&gt;index scans on part of PK&lt;/span&gt; there are two options - index scan all data nodes or index scan only one data node. This can also be the cause of performance degradation when moving from 2 data nodes to bigger cluster.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Example with  &lt;span style="font-weight: bold;"&gt;index scans on part of PK&lt;/span&gt;:&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;CREATE TABLE t1 (&lt;br /&gt;userid integer,&lt;br /&gt;serviceid integer,&lt;br /&gt;data varbinary(512),&lt;br /&gt;INDEX (serviceid),&lt;br /&gt;PRIMARY KEY(userid, serviceid)&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt; This table is by default &lt;span style="font-style: italic;"&gt;partitioned on the primary key&lt;/span&gt; (every table in cluster is by default partitioned on the primary key). This means in a four data node cluster that you can have your user spread out on 4 different partitions.&lt;/li&gt;&lt;li&gt;You may have this data&lt;/li&gt;&lt;/ul&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&amp;lt;userid,serviceid,&amp;gt;&lt;br /&gt;&amp;lt;1,1,aaa&amp;gt;&lt;br /&gt;&amp;lt;1,2,aaa&amp;gt;&lt;br /&gt;&amp;lt;1,3,aaa&amp;gt;&lt;br /&gt;&amp;lt;1,4,aaa&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The record &lt;code&gt;&amp;lt;1,1,aaa&amp;gt;&lt;/code&gt; may be on one data node. &lt;code&gt;&amp;lt;1,2,aaa&amp;gt;&lt;/code&gt; may be on another and so on. It is random.&lt;br /&gt;&lt;br /&gt;If you now do a &lt;code&gt;SELECT * FROM t1 WHERE userid=&amp;lt;value&amp;gt;&lt;/code&gt;&lt;br /&gt;then every data node will be scanned for data, the result then merged in the NDBAPI (mysqld).&lt;br /&gt;&lt;br /&gt;Good or bad? Depends on - if your user has &amp;gt;64 services (CPU and network dependent), then it is better to scan all data nodes.&lt;br /&gt;&lt;br /&gt;If your user has &amp;lt;=64 services then it is better to involve only one data node.&lt;br /&gt;&lt;br /&gt;You can then create the table as follows:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;CREATE TABLE t1 (&lt;br /&gt;userid integer,&lt;br /&gt;serviceid integer,&lt;br /&gt;data varbinary(512),&lt;br /&gt;INDEX (serviceid),&lt;br /&gt;PRIMARY KEY(userid, serviceid)&lt;br /&gt;) &lt;span style="font-weight: bold;"&gt;PARTITION BY KEY (userid)&lt;/span&gt;;&lt;/pre&gt;- You may have still have this data:&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&amp;lt;userid,serviceid,&amp;gt;&lt;br /&gt;&amp;lt;1,1,aaa&amp;gt;&lt;br /&gt;&amp;lt;1,2,aaa&amp;gt;&lt;br /&gt;&amp;lt;1,3,aaa&amp;gt;&lt;br /&gt;&amp;lt;1,4,aaa&amp;gt;&lt;br /&gt;&lt;/pre&gt;All records with &lt;code&gt;userid=1&lt;/code&gt; is now located in one data node (one partition) no matter how many data nodes you have!&lt;br /&gt;&lt;br /&gt;Now, the primary key is still &lt;code&gt;&amp;lt;userid,&amp;gt;&lt;/code&gt; but the data is put on the partitions by looking at  &lt;code&gt;&amp;lt;userid&amp;gt;&lt;/code&gt; only! This ensures that a user will be on only one partition, irrespectively how many services the user has. If you query on &amp;lt;userid&amp;gt; then only one partition will be involved in the search, since for a particular &lt;code&gt;&amp;lt;userid&amp;gt;&lt;/code&gt; in the table t1, all data for that user is in only one partition.&lt;br /&gt;&lt;br /&gt;If you now do a &lt;code&gt;SELECT * FROM t1 WHERE userid=&amp;lt;value&amp;gt;&lt;/code&gt; then only one data node will be scanned.&lt;br /&gt;&lt;br /&gt;For completeness of the example: &lt;code&gt;SELECT * FROM t1 WHERE serviceid=&amp;lt;value&amp;gt;&lt;/code&gt; will cause all data nodes to perform an index scan on the index (serviceid), since the data is not partitioned by serviceid, and not the leftmost column in the index (the indexed columns are used left to right).&lt;br /&gt;&lt;br /&gt;The main point is that the fixed cost of setting up an ordered index scan is expensive, but then to retrieve the records is cheap. So if you return many rows, read from all data nodes.&lt;br /&gt;&lt;br /&gt;If you later on plan to increase the number of data nodes from 4 to 8 nodes. Then using &lt;code&gt;PARTITION BY KEY&lt;/code&gt; when possible makes your upgrades (more data nodes) easier and less susceptible to performance decreases.&lt;br /&gt;&lt;br /&gt;This is how it looks on my system (as you can see partitioned searches (using PARTITION BY KEY) is faster up to ~ 64 records).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZP94gz0B_KE/Sw5af6nIXtI/AAAAAAAAAJA/cYPUIBDTktg/s1600/blog-scale.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZP94gz0B_KE/Sw5af6nIXtI/AAAAAAAAAJA/cYPUIBDTktg/s320/blog-scale.png" alt="" id="BLOGGER_PHOTO_ID_5408359706874371794" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2231256358663597252?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2231256358663597252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2231256358663597252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2231256358663597252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2231256358663597252'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/11/scaling-going-from-2-to-x-data-nodes.html' title='Scaling - going from 2 to X data nodes'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZP94gz0B_KE/Sw5af6nIXtI/AAAAAAAAAJA/cYPUIBDTktg/s72-c/blog-scale.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5268711269222588352</id><published>2009-11-26T07:57:00.003Z</published><updated>2009-11-26T09:15:14.971Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>MySQL Cluster 7.0.9b in Configurator  and Sandbox</title><content type='html'>&lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; and &lt;a href="http://www.severalnines.com/sandbox"&gt;Sandbox&lt;/a&gt; scripts are updated to use 7.0.9b.&lt;br /&gt;&lt;br /&gt;You are recommended to upgrade!&lt;br /&gt;&lt;br /&gt;Upgrade can be performend using these scripts:&lt;br /&gt;Binary distribution  - Upgrade script from 7.0.* -&gt; 7.0.9b  is &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-709b-src.sh"&gt;here&lt;/a&gt;.&lt;br /&gt;Source distribution  - Upgrade script from 7.0.* -&gt; 7.0.9b  is &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-709b-bin.sh"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Copy the scripts to "install/"&lt;/li&gt;&lt;li&gt;chmod u+x upgrade-script.sh&lt;br /&gt;&lt;/li&gt;&lt;li&gt;./upgrade-script.sh&lt;/li&gt;&lt;/ol&gt;After step 3) you need to run either:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;download-binary.sh&lt;/li&gt;&lt;li&gt;download-and-compile.sh&lt;/li&gt;&lt;/ul&gt;and then&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rolling-restart.sh&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-5268711269222588352?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/5268711269222588352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=5268711269222588352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5268711269222588352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5268711269222588352'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/11/mysql-cluster-709b-in-configurator-and.html' title='MySQL Cluster 7.0.9b in Configurator  and Sandbox'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2853826728347283187</id><published>2009-10-23T17:27:00.003+01:00</published><updated>2009-10-23T17:28:50.326+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webinar'/><title type='text'>Cluster Performance Tuning</title><content type='html'>The 3rd of November I will have a webinar on Cluster Performance Tuning.&lt;br /&gt;&lt;br /&gt;For more information:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mysql.com/news-and-events/web-seminars/display-453.html"&gt;http://www.mysql.com/news-and-events/web-seminars/display-453.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In addition to what is mentioned in the Agenda I will also present numbers on typical operations, how to design requests, explain how the optimizer works with MySQL Cluster etc etc.&lt;br /&gt;&lt;br /&gt;See you there!&lt;br /&gt;&lt;br /&gt;-johan&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2853826728347283187?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2853826728347283187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2853826728347283187' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2853826728347283187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2853826728347283187'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/10/cluster-performance-tuning.html' title='Cluster Performance Tuning'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-9164581179134585443</id><published>2009-10-07T08:13:00.003+01:00</published><updated>2009-10-07T08:23:31.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>MySQL Cluster 7.0.8a and 6.3.27a released (source)</title><content type='html'>Fixes regression - bug &lt;a href="http://bugs.mysql.com/bug.php?id=47844"&gt;47844&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; and &lt;a href="http://www.severalnines.com/sandbox"&gt;Sandbox&lt;/a&gt; scripts are updated to use this version.&lt;br /&gt;&lt;br /&gt;If you build from source then you can upgrade using these scripts:&lt;br /&gt;Upgrade script from 7.0.7 -&gt; 7.0.8a  is &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-707-to-708a-src.sh"&gt;here&lt;/a&gt;.&lt;br /&gt;Upgrade script from 7.0.8 -&gt; 7.0.8a  is &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-708-to-708a-src.sh"&gt;here&lt;/a&gt;.&lt;br /&gt;Upgrade script from 6.3.26-&gt; 6.3.27a  is &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-707-to-708a-src.sh"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Follow the instructions in this &lt;a href="http://johanandersson.blogspot.com/2009/09/upgrade-to-708-with-configurator.html"&gt;blog post&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-9164581179134585443?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/9164581179134585443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=9164581179134585443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/9164581179134585443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/9164581179134585443'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/10/mysql-cluster-708a-and-6327a-released.html' title='MySQL Cluster 7.0.8a and 6.3.27a released (source)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2256309603585821227</id><published>2009-10-06T14:52:00.002+01:00</published><updated>2009-10-06T15:01:48.932+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>MySQL Cluster 7.0.8/6.3.27 -  serious regression!!!</title><content type='html'>A regression in MySQL Cluster 7.0.8  and 6.3.27 has caused them to be removed from download.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Problem:&lt;/span&gt;&lt;br /&gt;If you have a mysql server with higher node id than 49, then it will cause cluster to crash.&lt;br /&gt;&lt;br /&gt;An updated version of MySQL Cluster 7.0.8, called 7.0.8a will be released very soon.&lt;br /&gt;&lt;br /&gt;The Configurator has been reverted back to use 7.0.7 and 6.3.26.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2256309603585821227?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2256309603585821227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2256309603585821227' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2256309603585821227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2256309603585821227'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/10/mysql-cluster-7086327-serious.html' title='MySQL Cluster 7.0.8/6.3.27 -  serious regression!!!'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-58648263275338839</id><published>2009-10-02T10:21:00.007+01:00</published><updated>2009-10-02T12:20:38.652+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='large databases'/><title type='text'>Configuring for large databases in MySQL Cluster</title><content type='html'>If you need to create a big database into MySQL Cluster with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A lot of tables indexes, columns, and tables&lt;/li&gt;&lt;li&gt;A lot of records&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;there are a few things to think about:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If a table has &gt; ~90M records, you have to create the table with &lt;code&gt;MAX_ROWS=&amp;lt;amount of records in table anticipating growth&amp;gt;&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;CREATE TABLE t1(...) ENGINE=ndbcluster MAX_ROWS=200000000;&lt;/code&gt;&lt;br /&gt;This way the data node will allocate more partitions for the table, since there is a limitation in how many records that can be stored in one partition (and the limit is around 90M records).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Many tables  / table objects --&gt; Make sure you increase &lt;code&gt;MaxNoOfTables&lt;/code&gt;  (kernel limit is 20320 tables). This creates a table object pool of size &lt;code&gt;MaxNoOfTables&lt;/code&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Each table you create will use one table object.&lt;/li&gt;&lt;li&gt;Each unique index you create will use one table object&lt;/li&gt;&lt;li&gt;Each ordered index you create will use one table object&lt;/li&gt;&lt;li&gt;Each BLOB/TEXT attribute will use one table object.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For example if you create the following table:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;CREATE TABLE `t1` (&lt;br /&gt;`a` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;`b` char(32) DEFAULT NULL,&lt;br /&gt;`c` blob,&lt;br /&gt;`d` bigint(20) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`a`),&lt;br /&gt;UNIQUE KEY `b` (`b`),&lt;br /&gt;KEY `d` (`d`)&lt;br /&gt;) ENGINE=ndbcluster;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The table will require table objects as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;PRIMARY KEY  (there is an ordered index on the PK): 1 table objects&lt;/li&gt;&lt;li&gt;UNIQUE KEY (unique hash index + ordered index): 1 + 1  table objects&lt;/li&gt;&lt;li&gt;BLOB: 1 table object&lt;/li&gt;&lt;li&gt;Actual Table: 1 table object&lt;/li&gt;&lt;li&gt;IN TOTAL = 5 table objects&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If you had specified &lt;code&gt;PRIMARY KEY USING HASH&lt;/code&gt;, and &lt;code&gt;UNIQUE KEY USING HASH&lt;/code&gt;, then you can save two table objects, one for each ordered index.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Many UNIQUE indexes --&gt; Increase &lt;code&gt;MaxNoOfUniqueHashIndexes&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Many ordered indexes  --&gt; Increase &lt;code&gt;MaxNoOfOrderedIndexes&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Many attributes - -&gt; Increase &lt;code&gt;MaxNoOfAttributes&lt;/code&gt; (should be sum of number of columns all tables and add 3-10% for spare).&lt;/li&gt;&lt;/ul&gt;Also you would probably want to increase:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;DataMemory&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;IndexMemory&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt; If you have a lot of BLOB/TEXT columns or have many client apps/users connecting to one MySQL Server:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;SendBufferMemory=8M&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;ReceiveBufferMemory=8M&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If you get "error  306" then you should increase&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;StringMemory=25&lt;/code&gt; to &lt;code&gt;StringMemory=50&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;IndexMemory=&lt;higher&gt;&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt; (Note with 7.0.8 i can create 16000+ tables with 128 columns in each with &lt;code&gt;StringMemory=25&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;This page will be updated if I find other things.&lt;br /&gt;&lt;br /&gt;If you still have problems - let us/me know, e.g, on the &lt;a href="http://lists.mysql.com/cluster"&gt;cluster mailing list&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; has these parameters specified already in the config.ini so it is a small thing to change (just run the ./rolling-restart.sh script).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-58648263275338839?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/58648263275338839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=58648263275338839' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/58648263275338839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/58648263275338839'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/10/configuring-for-large-databases-in.html' title='Configuring for large databases in MySQL Cluster'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7662566555747068839</id><published>2009-09-30T15:06:00.002+01:00</published><updated>2009-09-30T15:12:10.659+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>Upgrade to 7.0.8 (with the Configurator)</title><content type='html'>MySQL Cluster 7.0.8 was released as a source distribution 30th of Sept 2009. You should upgrade if you can build from source or use the &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;See below how to upgrade when using the Configurator.&lt;br /&gt;&lt;br /&gt;7.0.8 contains a number of &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-news-combined-7-0.html#dynxml-auto-changelog-difflist-mysqld-5.1.37-ndb-7.0.8"&gt;fixes&lt;/a&gt; in almost every area and you are recommended to upgrade if you experience problems with earlier version(s). Especially if you have encountered the "error 306" problem.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.severalnines.com/config/"&gt;Configurator v2.9&lt;/a&gt; has been updated to use this version.&lt;br /&gt;&lt;br /&gt;If you are already using the Configurator and build from source you can upgrade from MySQL Cluster 7.0.7 to 7.0.8 (and you are recommended to upgrade because of the following &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-news-5-1-35-ndb-7-0-7.html"&gt;changes/fixes&lt;/a&gt;) in four steps. Here is how:&lt;br /&gt;&lt;br /&gt;1.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;run the &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-707-to-708-src.sh"&gt;upgrade-707-to-708-src.sh&lt;/a&gt; script (put it in install/ and chmod u+x ./upgrade-707-to-708-src.sh):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;[cluster01]# pwd&lt;br /&gt;/root/mysqlcluster-70-master/cluster/scripts/install&lt;br /&gt;[cluster01]# chmod u+x ./upgrade-707-to-708-src.sh&lt;br /&gt;[cluster01]# ./upgrade-707-to-708-src.sh&lt;br /&gt;Upgrading scripts&lt;br /&gt;done - now run ./download-and-compile.sh&lt;br /&gt;&lt;/pre&gt;2. run the script download-and-compile.sh&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;[cluster01]# ./download-and-compile.sh&lt;br /&gt;After some time it will finish compiling:&lt;br /&gt;&lt;br /&gt;mysql-7.0.8-linux-x86_64/sql-bench/test-alter-table&lt;br /&gt;mysql-7.0.8-linux-x86_64.tar.gz created&lt;br /&gt;Removing temporary directory&lt;br /&gt;Downloaded binary distribution to ../../repo&lt;br /&gt;&lt;/pre&gt;(the 'downloaded binary' should really read 'Copied binary').&lt;br /&gt;&lt;br /&gt;3. When you get prompted with the following question answer 'y' (yes):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;Do you want to install the binaries on the hosts now&lt;br /&gt;(else run 'install-cluster.sh' later)? (y/n):y&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt; &lt;span style="font-weight: bold;"&gt;Important! Do not run the the bootstrap.sh script!!&lt;/span&gt;&lt;br /&gt;4. change directory to the scripts/ to directory and run the ./rolling-restart.sh script&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;[cluster01]# pwd&lt;br /&gt;/root/mysqlcluster-70-master/cluster/scripts/&lt;br /&gt;[cluster01]# ./rolling-restart.sh&lt;br /&gt;&lt;/pre&gt; This in an online procedure so it requires no downtime of the Cluster.&lt;br /&gt;If you are using binary distributions then you have to wait, because they are not ready yet.&lt;br /&gt;Good luck!&lt;br /&gt;&lt;br /&gt;Ps - Configurator 2.9 (released 2nd of September 2009) contains some minor fixes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adding of [mysqld] slot for administration purposes&lt;/li&gt;&lt;li&gt;./start-backup now backup the configuration files (config.ini, my.cnf and some internal files) as well.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7662566555747068839?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7662566555747068839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7662566555747068839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7662566555747068839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7662566555747068839'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/09/upgrade-to-708-with-configurator.html' title='Upgrade to 7.0.8 (with the Configurator)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8996601518225257310</id><published>2009-09-16T13:29:00.003+01:00</published><updated>2009-09-16T13:49:58.183+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='error handling'/><title type='text'>Node failure handling</title><content type='html'>When a data node fails, the other data nodes must perform clean-up of the failed node.&lt;br /&gt;&lt;br /&gt;E.g, to abort transactions in the PREPARE phase (Cluster uses a variant of the&lt;a href="http://en.wikipedia.org/wiki/Two-phase_commit_protocol"&gt; Two Phase Commit protocol&lt;/a&gt;) that has been started on the Data node that fails.&lt;br /&gt;Various protocols (if the failed data node is the master) must also fail-over. &lt;br /&gt;&lt;br /&gt;These things are carried out quite swiftly (configurable, but a couple of seconds by default but it also depends on the size of transactions that in the prepare phase that needs to be aborted).&lt;br /&gt;&lt;br /&gt;I wanted to check how long time it takes to do node failure handling with many tables (16000+) in the cluster, because in a "normal" database with a couple of hundred tables, then the time spent on node failure handling is not a factor.&lt;br /&gt;&lt;br /&gt;In this case I have two data nodes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Node 3  (master)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Node 4&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I have created 16000+ tables each with 128 columns just to see what happens with failure handling and recovery.&lt;br /&gt;&lt;br /&gt;Node 3 was killed, and the Node 4 then has to do node failure handling:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;2009-09-16 14:23:41 [MgmSrvr] WARNING  -- Node 4: Failure handling of node 3 has not completed in 15 min. - state = 6&lt;br /&gt;&lt;br /&gt;2009-09-16 14:24:41 [MgmSrvr] WARNING  -- Node 4: Failure handling of node 3 has not completed in 16 min. - state = 6&lt;br /&gt;&lt;br /&gt;2009-09-16 14:25:41 [MgmSrvr] WARNING  -- Node 4: Failure handling of node 3 has not completed in 17 min. - state = 6&lt;br /&gt;&lt;br /&gt;2009-09-16 14:26:13 [MgmSrvr] INFO     -- Node 4: Communication to Node 3 opened&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Eventually, we get the message :&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;2009-09-16 14:26:13 [MgmSrvr] INFO     -- Node 4: Communication to Node 3 opened&lt;br /&gt;&lt;/pre&gt; We cannot start to recover Node 3 until this message has been written out in the cluster log!&lt;br /&gt;&lt;br /&gt;If you try to connect the data  node before this, then the management server will say something like &lt;span style="font-weight: bold;"&gt;"No free slot found for node 3"&lt;/span&gt;, which basically means in this case that the node failure handling is ongoing.&lt;br /&gt;&lt;br /&gt;Now we have got the message and we can now start data node 3 again and it will recover&lt;br /&gt;&lt;br /&gt;Why is it taking long time:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The surviving data nodes that are handling the failures must write for each table that node three has crashed. This is written to disk. This is what takes time when you have many tables (about 17 minutes with &gt;16000 tables) so about 1000 tables per minute.. So in most databases it does not take that much time. Thanks Jonas for you explanation.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;However, it is important for you to understand that during this time it is STILL POSSIBLE to WRITE / READ to the Cluster, i.e., the database is online.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8996601518225257310?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8996601518225257310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8996601518225257310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8996601518225257310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8996601518225257310'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/09/node-failure-handling.html' title='Node failure handling'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1159267727494091603</id><published>2009-09-03T15:25:00.004+01:00</published><updated>2009-09-03T15:49:11.953+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='arbitration'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><title type='text'>MySQL Cluster on two hosts - options and implications</title><content type='html'>Considering that you have the following hosts and MySQL Cluster deployed in the following ways:&lt;br /&gt;&lt;br /&gt;A: ndb_mgmd, ndbd , mysqld&lt;br /&gt;B: ndb_mgmd, ndbd , mysqld&lt;br /&gt;&lt;br /&gt;Now you have a couple of options on how to handle potential network partitioning/split brain which could occur if the computer A and B lose contact with each other. Let's see the implications of these options.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Option 1: ArbitrationRank=1, no NIC bonding&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If ndb_mgmd on A is elected as the arbitrator and host A crashes, then data node on host B will also die (cannot reach arbitrator).&lt;/li&gt;&lt;li&gt;If ndb_mgmd on A is elected as the arbitrator and host B lose contact with host A, then the data node on B will shut down since it can't reach the arbitrator. For further discussions, call this &lt;span style="font-style: italic;"&gt;situation X&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;If you are in &lt;span style="font-style: italic;"&gt;situation X&lt;/span&gt; &lt;span style="font-weight: bold; font-style: italic;"&gt;and&lt;/span&gt; if you restart data node on B &lt;span style="font-style: italic; font-weight: bold;"&gt;and&lt;/span&gt; you have not fixed the link), then it will start isolated (after some timeouts have kicked in, StartPartionedTimeout and StartPartialTimeout). Now you are in &lt;span style="font-style: italic;"&gt;situation Y&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you had an application writing data (and assume this application crashed when the connection from B -&gt; A was lost) then the following can happen if you are in &lt;span style="font-style: italic;"&gt;situation Y&lt;/span&gt;&lt;/li&gt;&lt;li&gt;If you do "select count(*) from t1" on mysqld host A, then it can differ from a "select count(*) from t1" on mysqld on host B, because the data node on B never got the message to flush the redo buffer to the redo log.&lt;br /&gt;Now you have ended up in a very bad situation. Kill data node on host B. Fix network, restart data node with --initial.&lt;/li&gt;&lt;li&gt;However, this could be combined with &lt;a href="http://www.linux-ha.org/STONITH"&gt;STONITH&lt;/a&gt; to kill off one of the data nodes.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Option 2: ArbitrationRank=0, no NIC bonding&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; no arbitrators are used - no protection from split brain.&lt;/li&gt;&lt;li&gt;if host A lose contact with host B, then the data nodes will be split&lt;/li&gt;&lt;li&gt;Application can write to A and B, but e.g A will _never_ see the changes from B, and vice versa&lt;/li&gt;&lt;li&gt;The data nodes will drift apart and be out of sync (inconsistent). Very bad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When the link comes up again the data nodes A and B &lt;span style="font-weight: bold; font-style: italic;"&gt;will not&lt;/span&gt; reconnect to each other.&lt;/li&gt;&lt;li&gt;System administrator must kill one of the data nodes and restart it with --initial.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Option 3: ArbitrationRank=0, NIC bonding + redundant switch.&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;no arbitrators are used - no protection from split brain.&lt;/li&gt;&lt;li&gt;Same problems as Option 2) if a) both network links are broken or b) both switches crashes. However, the likelihood of this happening is very small.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Option 4: Aribtration=WaitExternal&lt;/span&gt;  (new in MySQL Cluster 7.0.7)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;External arbitrator is used: You, a sys admin, a dba, or a process.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;When the data nodes lose contact with each other, they are read-only for ArbitrationDelay before unlocking (and becoming writable).&lt;/li&gt;&lt;li&gt;This means that you have ArbitrationDelay (configurable) time to decide which data node that should live and who should die.&lt;/li&gt;&lt;li&gt;The data node that you killed can then be restarted with "ndbd", i.e, without --initial.&lt;/li&gt;&lt;li&gt;"You" in this case can be an external program, sysadmin etc..&lt;/li&gt;&lt;li&gt;If you use an external program must run on a third computer.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Option 5: ArbitrationRank=1 and have ndb_mgmd on remote site&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you use asynchronous replication between SITE_A and SITE_B then it could be possible to have the management server there with ArbitrationRank=1, and then potentially local management servers on host A and B that only has configuration data (i.e, ArbitrationRank=0 for those).&lt;/li&gt;&lt;li&gt;This must be tested to see if the link between SITE_A and SITE_B is "good enough". The link should also be reliable.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Option 6: ArbitrationRank=1 and have a third host (called C)&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This is the best and recommended approach (and best if even have a computer D that is like C for redundancy matters).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run the management server on host C. Setup would look like:&lt;br /&gt;A: ndbd + mysqld&lt;br /&gt;B: ndbd + mysqld&lt;br /&gt;C: ndb_mgmd (AribtrationRank=1) + mysqld&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;And the winner is...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;What is the "best" option:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Option 6) - get a third computer - simple&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Option 3), Option 4) - "you do it, but be careful"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Option 5) - must be tested&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Option 1) (atleast the cluster will crash avoiding inconsistencies)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Option 2)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;I am arguing with myself whether or not Option 1) should be on either 2nd or 3rd place, atleast it is simple and easy to understand.&lt;br /&gt;&lt;br /&gt;Of course redundant NICs (bonding) and redundant switches can be used in all of the options above, even it is not explicitly said so for some of them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1159267727494091603?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1159267727494091603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1159267727494091603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1159267727494091603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1159267727494091603'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/09/mysql-cluster-on-two-hosts-options-and.html' title='MySQL Cluster on two hosts - options and implications'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7297033154249246969</id><published>2009-09-03T11:30:00.000+01:00</published><updated>2009-09-03T11:30:00.058+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>Upgrade to 7.0.7 (with the Configurator)</title><content type='html'>MySQL Cluster 7.0.7 was released as a source distribution 1st of Sept 2009. You should upgrade if you can build from source or use the &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.severalnines.com/config/"&gt;Configurator v2.9&lt;/a&gt; has been updated to use this version.&lt;br /&gt;&lt;br /&gt;If you are already using the Configurator  and build from source you can upgrade from MySQL Cluster 7.0.6 to 7.0.7  (and you are recommended to upgrade because of the following &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-news-5-1-35-ndb-7-0-7.html"&gt;changes/fixes&lt;/a&gt;) in four steps. Here is how:&lt;br /&gt;&lt;br /&gt;1.&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;run the &lt;a href="http://www.severalnines.com/downloads/configurator/upgrade-706-to-707-src.sh"&gt;upgrade-706-to-707-src.sh&lt;/a&gt; script (put it in install/ and chmod u+x ./upgrade-706-to-707-src.sh):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;[cluster01]# pwd&lt;br /&gt;/root/mysqlcluster-70-master/cluster/scripts/install&lt;br /&gt;[cluster01]# chmod u+x ./upgrade-706-to-707-src.sh&lt;br /&gt;[cluster01]# ./upgrade-706-to-707-src.sh&lt;br /&gt;Upgrading scripts&lt;br /&gt;done - now run ./download-and-compile.sh&lt;br /&gt;&lt;/pre&gt;2. run the script download-and-compile.sh&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;[cluster01]# ./download-and-compile.sh&lt;br /&gt;After some time it will finish compiling:&lt;br /&gt;&lt;br /&gt;mysql-7.0.7-linux-x86_64/sql-bench/test-alter-table&lt;br /&gt;mysql-7.0.7-linux-x86_64.tar.gz created&lt;br /&gt;Removing temporary directory&lt;br /&gt;Downloaded binary distribution to ../../repo&lt;br /&gt;&lt;/pre&gt;(the 'downloaded binary' should really read 'Copied binary').&lt;br /&gt;&lt;br /&gt;3. When you get prompted with the following question answer 'y' (yes):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;Do you want to install the binaries on the hosts now&lt;br /&gt;(else run 'install-cluster.sh' later)? (y/n):y&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt; &lt;span style="font-weight: bold;"&gt;Important! Do not run the the bootstrap.sh script!!&lt;/span&gt;&lt;br /&gt;4. change directory to the scripts/ to directory and run the ./rolling-restart.sh script&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;[cluster01]# pwd&lt;br /&gt;/root/mysqlcluster-70-master/cluster/scripts/&lt;br /&gt;[cluster01]# ./rolling-restart.sh&lt;br /&gt;&lt;/pre&gt; This in an online procedure so it requires no downtime of the Cluster.&lt;br /&gt;If you are using binary distributions then you have to wait, because they are not ready yet.&lt;br /&gt;Good luck!&lt;br /&gt;&lt;br /&gt;Ps - Configurator 2.9 (released 2nd of September 2009) contains some minor fixes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adding of [mysqld] slot for administration purposes&lt;/li&gt;&lt;li&gt;./start-backup now backup the configuration files (config.ini, my.cnf and some internal files) as well.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7297033154249246969?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7297033154249246969/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7297033154249246969' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7297033154249246969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7297033154249246969'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/09/upgrade-to-707-with-configurator.html' title='Upgrade to 7.0.7 (with the Configurator)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8144202111442324427</id><published>2009-08-31T15:35:00.005+01:00</published><updated>2009-08-31T15:48:59.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><title type='text'>Data node stuck in phase 101 - what to do?</title><content type='html'>Sometimes I have seen and heard about that a data node gets stuck in start phase 101.&lt;br /&gt;&lt;br /&gt;Unfortunately it is difficult to reproduce this (found no way yet), so no bug fix is in the pipe yet.&lt;br /&gt;&lt;br /&gt;What happens is that in sp 101, the starting data node (actually a block called SUMA) should reconnect to the mysql server and take over the event handling (sending events to the mysql server), but it never gets the reconnect to the mysql server(s). A better explanation is &lt;a href="http://dev.mysql.com/doc/mysql-cluster-excerpt/5.1/en/mysql-cluster-start-phases.html"&gt;here&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;If you see your data node stuck here then try the following:&lt;br /&gt;1) Restart the mysql servers (one by one), the data node should now start&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;or&lt;/span&gt;&lt;br /&gt;2) Restart the mysql servers and restart the data node.&lt;br /&gt;&lt;br /&gt;Only do 2) if 1) does not work.&lt;br /&gt;&lt;br /&gt;And if you know how to reproduce - &lt;a href="http://bugs.mysql.com"&gt;let us know&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8144202111442324427?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8144202111442324427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8144202111442324427' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8144202111442324427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8144202111442324427'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/08/data-node-stuck-in-phase-101-what-to-do.html' title='Data node stuck in phase 101 - what to do?'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5203467964097763594</id><published>2009-08-04T13:53:00.003+01:00</published><updated>2009-08-04T14:25:15.225+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='memory management'/><title type='text'>OPTIMIZE TABLE on Cluster (revisited)</title><content type='html'>Jonas just wrote a patch to this &lt;a href="http://bugs.mysql.com/bug.php?id=43683"&gt;bug&lt;/a&gt; on OPTIMIZE TABLE, and the issue that was also discussed in this &lt;a href="http://johanandersson.blogspot.com/2009/03/memory-deallocationdefragmentation-and.html"&gt;blog post&lt;/a&gt;. Jonas also fixed this &lt;a href="http://bugs.mysql.com/bug.php?id=45971"&gt;bug&lt;/a&gt; when he was at it.&lt;br /&gt;&lt;br /&gt;Before, &lt;code&gt;OPTIMIZE TABLE&lt;/code&gt; hardly freed up any pages and to defragment you had to do a rolling restart of the data nodes. &lt;br /&gt;&lt;br /&gt;Now, there is only a &lt;span style="font-weight:bold;"&gt;2%&lt;/span&gt; discrepancy between &lt;code&gt;OPTIMIZE TABLE&lt;/code&gt; and doing a rolling restart. This is great stuff.&lt;br /&gt;This will fix will make it into &lt;span style="font-weight:bold;"&gt;6.3.26 and 7.0.7&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;See below for details:&lt;br /&gt;&lt;br /&gt;Creating two tables, t5 and t6:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE TABLE `t5` (&lt;br /&gt;`id` varchar(32) CHARACTER SET utf8 NOT NULL,&lt;br /&gt;`name` varchar(32) NOT NULL DEFAULT '',&lt;br /&gt;`unit` int(11) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`,`name`)&lt;br /&gt;) ENGINE=ndbcluster DEFAULT CHARSET=latin1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;And then the following table:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;'CREATE TABLE `t6` ( `id` varchar(32) CHARACTER SET utf8 NOT NULL, `name` varchar(32) NOT NULL DEFAULT '', c0 int unsigned not null, c1 int unsigned not null, data2 varchar(255),  `unit` int(11) DEFAULT NULL, PRIMARY KEY (`id`,`name`) ) ENGINE=ndbcluster DEFAULT CHARSET=latin1;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then we use &lt;code&gt;hugoLoad&lt;/code&gt; (a test program that isn't built by default in the src distribution of cluster) to load it with 1M records.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;./hugoLoad -r 1000000 -d test t5&lt;br /&gt;./hugoLoad -r 1000000 -d test t6&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Memory usage after population:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Node 2: Data usage is 45%(14890 32K pages of total 32768)&lt;br /&gt;Node 2: Index usage is 22%(3722 8K pages of total 16416)&lt;br /&gt;Node 3: Data usage is 45%(14890 32K pages of total 32768)&lt;br /&gt;Node 3: Index usage is 22%(3722 8K pages of total 16416)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Delete 500K records from t5.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; set ndb_use_transactions=0;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t5 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (2.73 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t5 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.13 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t5 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.11 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t5 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.13 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t5 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (2.97 sec)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Memory usage after deletion:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Node 2: Data usage is 45%(14890 32K pages of total 32768)&lt;br /&gt;Node 2: Index usage is 19%(3120 8K pages of total 16416)&lt;br /&gt;ndb_mgm&gt; Node 3: Data usage is 45%(14890 32K pages of total 32768)&lt;br /&gt;Node 3: Index usage is 19%(3121 8K pages of total 16416)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Run OPTIMIZE TABLE:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; optimize table t5;&lt;br /&gt;+---------+----------+----------+----------+&lt;br /&gt;| Table   | Op       | Msg_type | Msg_text |&lt;br /&gt;+---------+----------+----------+----------+&lt;br /&gt;| test.t5 | optimize | status   | OK       |&lt;br /&gt;+---------+----------+----------+----------+&lt;br /&gt;1 row in set (1 min 41.94 sec)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;CPU UTIL during OPTIMIZE TABLE:&lt;br /&gt;User:23.8%   Sys: 4.9%  ndbd               &lt;br /&gt;&lt;br /&gt;Memory usage after OPTIMIZE TABLE:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;                  &lt;br /&gt;ndb_mgm&gt; Node 2: Data usage is 39%(13090 32K pages of total 32768)&lt;br /&gt;Node 2: Index usage is 19%(3120 8K pages of total 16416)&lt;br /&gt;Node 3: Data usage is 39%(13090 32K pages of total 32768)&lt;br /&gt;Node 3: Index usage is 19%(3121 8K pages of total 16416)&lt;br /&gt;&lt;/code&gt;                                                                              &lt;br /&gt;  &lt;br /&gt;Delete 500K (50%) of the records from t6:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; set ndb_use_transactions=0;&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t6 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (2.77 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t6 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.05 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t6 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.12 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t6 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.19 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; delete from t6 limit 100000;&lt;br /&gt;Query OK, 100000 rows affected (3.24 sec)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Memory usage after deletion:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Node 2: Data usage is 39%(13090 32K pages of total 32768)&lt;br /&gt;Node 2: Index usage is 15%(2521 8K pages of total 16416)&lt;br /&gt;Node 3: Data usage is 39%(13090 32K pages of total 32768)&lt;br /&gt;Node 3: Index usage is 15%(2522 8K pages of total 16416)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Run OPTIMIZE TABLE:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; optimize table t6;&lt;br /&gt;+---------+----------+----------+----------+&lt;br /&gt;| Table   | Op       | Msg_type | Msg_text |&lt;br /&gt;+---------+----------+----------+----------+&lt;br /&gt;| test.t6 | optimize | status   | OK       |&lt;br /&gt;+---------+----------+----------+----------+&lt;br /&gt;1 row in set (1 min 45.83 sec)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Memory usage after OPTIMIZE TABLE:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Node 2: Data usage is 28%(9249 32K pages of total 32768)&lt;br /&gt;Node 2: Index usage is 15%(2521 8K pages of total 16416)&lt;br /&gt;Node 3: Data usage is 28%(9249 32K pages of total 32768)&lt;br /&gt;Node 3: Index usage is 15%(2522 8K pages of total 16416)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After restart of node 3:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Node 2: Data usage is &lt;span style="font-weight:bold;"&gt;28%&lt;/span&gt;(9249 32K pages of total 32768)&lt;br /&gt;Node 2: Index usage is 15%(2521 8K pages of total 16416)&lt;br /&gt;Node 3: Data usage is &lt;span style="font-weight:bold;"&gt;26%&lt;/span&gt;(8568 32K pages of total 32768)&lt;br /&gt;Node 3: Index usage is 13%(2236 8K pages of total 16416)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Only two percent diff between rolling restart and OPTIMIZE TABLE. Excellent. Thank you Jonas for fixing this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-5203467964097763594?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/5203467964097763594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=5203467964097763594' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5203467964097763594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5203467964097763594'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/08/optimize-table-on-cluster-revisited.html' title='OPTIMIZE TABLE on Cluster (revisited)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-3532673981124194783</id><published>2009-08-04T12:54:00.004+01:00</published><updated>2009-08-04T15:21:03.481+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><title type='text'>Upgrade 6.3.x to 7.0.6</title><content type='html'>Currently a number of users has reported upgrade issues on 6.3.x to 7.0.6  (below is an example what might happen to you).&lt;br /&gt;&lt;br /&gt;Thus, we don't recommend you to upgrade from 6.3.x to 7.0.6 in a production system yet.&lt;br /&gt;However, we are very interested in bug reports and and help with testing.&lt;br /&gt;We are also of course working on fixing these issues and will keep you posted when things has improved. Sorry for the inconvenience.&lt;br /&gt;&lt;br /&gt;Currently the "best practice" to upgrade is to:&lt;br /&gt;1) backup / mysqldump&lt;br /&gt;2) start cluster 7.0.6 with initial so it is completely blank&lt;br /&gt;3) restore backup / load dump&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ERROR 1005 (HY000): Can't create table 'test.#sql-3d25_aa905' (Errno: 140)&lt;br /&gt;&lt;br /&gt;mysql&gt; show warnings;&lt;br /&gt;+-------+------+--------------------------------------------------------------------------+&lt;br /&gt;| Level | Code | Message                   |&lt;br /&gt;+-------+------+--------------------------------------------------------------------------+&lt;br /&gt;| Error | 1296 | Error 755 'Invalid tablespace' from NDB                   |&lt;br /&gt;| Error | 1005 | Can't create table 'test.#sql-3d25_aa905' (Errno: 140) |&lt;br /&gt;+-------+------+--------------------------------------------------------------------------+&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-3532673981124194783?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/3532673981124194783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=3532673981124194783' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3532673981124194783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3532673981124194783'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/08/upgrade-63x-to-706.html' title='Upgrade 6.3.x to 7.0.6'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8056481409539143272</id><published>2009-08-03T08:15:00.004+01:00</published><updated>2009-08-03T08:15:00.400+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dolphinics'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='use cases'/><title type='text'>Cluster + Dolphin DX = Sweet!</title><content type='html'>At a customer I have had the opportunity to work with some really state of the art equipment.&lt;br /&gt;&lt;br /&gt;The customer is in the &lt;span style="font-weight: bold;"&gt;online gaming&lt;/span&gt; industry and we are &lt;span style="font-weight: bold;"&gt;building a platform based on MySQL Cluster&lt;/span&gt; where we are consolidating a number of applications. Workload is mainly inserts, updates, pk reads, and index scans (quite frequent), and a few joins.  The cluster handles the transient data (current working set), and is replicating to a long term data store (following this &lt;a href="http://johanandersson.blogspot.com/2009/05/ha-mysql-write-scaling-using-cluster-to.html"&gt;approach&lt;/a&gt;), and we are also feeding other back-end support systems from this.&lt;br /&gt;&lt;br /&gt;The cluster (&gt;8 computers) is interconnected with &lt;a href="http://www.dolphinics.com/products/dx-series-products.html"&gt;Dolphin DX adapters&lt;/a&gt;. Computers are &lt;a href="http://www.sun.com/servers/x64/x2270/specs.xml"&gt;SUNs Nehalem based&lt;/a&gt; servers (&lt;a href="http://processorfinder.intel.com/Details.aspx?sSpec=SLBF6"&gt;Intel XEON E5540&lt;/a&gt;). The cluster (7.0.6) consists of 4 data nodes  each having 32GB of RAM, plenty of RAID 1+0 storage, and &gt;4 mysql servers. All running on the Nehalems.. It is so sweet :)&lt;br /&gt;&lt;br /&gt;So much did things improve with the DX adapters over Gig-E? Just by plugging it in we got an overall &lt;span style="font-weight: bold;"&gt;2.5-3x performance improvement&lt;/span&gt; (throughput up, response times down). I love it. Now we will continue optimizing the setup, schemas, queries etc to really find out.&lt;br /&gt;&lt;br /&gt;I can really recommend the investment in DX adapters (remote memory access is faster than local disk) if you are after the top-notch performance , and the company behind it, &lt;a href="http://www.dolphinics.com/"&gt;Dolphin ICS&lt;/a&gt; is really fantastic to work with. If the DX switch would fail, then it will automatically fall back on the Gig-E adapters, transparently, and no service interruption (you or the applications don't notice a thing, except that performance drops).&lt;br /&gt;&lt;br /&gt;Note: Dolphin ICS' adapters offers a socket interface. Thus, any TCP/IP application can benefit from the low latency and high bandwidth.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8056481409539143272?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8056481409539143272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8056481409539143272' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8056481409539143272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8056481409539143272'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/08/cluster-dolphin-dx-sweet.html' title='Cluster + Dolphin DX = Sweet!'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-918072526513249756</id><published>2009-07-30T15:50:00.003+01:00</published><updated>2009-07-30T15:54:07.402+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ndb_restore'/><title type='text'>ndb_restore - best practice</title><content type='html'>A really simple best practice:&lt;br /&gt;&lt;br /&gt;Make sure there are NO mysql servers connected to the Cluster while you do the restore!&lt;br /&gt;It can cause the restore to fail badly and potentially even your cluster.&lt;br /&gt;&lt;br /&gt;Also, make sure (if you use disk data) to remove all data files in the datadirs of the data nodes as they are not removed when doing an --initial ... I have written a bug report about that...&lt;br /&gt;&lt;br /&gt;(i will update the severalnines/config scipts to include this best practice!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-918072526513249756?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/918072526513249756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=918072526513249756' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/918072526513249756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/918072526513249756'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/07/ndbrestore-best-practice.html' title='ndb_restore - best practice'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-4755810924004513326</id><published>2009-07-01T10:00:00.003+01:00</published><updated>2009-07-01T10:17:39.097+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><title type='text'>Problems with .FRM files, auto-discovery and MySQL Cluster</title><content type='html'>There are some bug reports on the auto-discovery protocol in MySQL Cluster.&lt;br /&gt;The idea of the auto-discovery protocol is to fetch the .frm files for the NDB tables stored in the data dictionary of the data nodes, and put them in the data directory of the mysql server.&lt;br /&gt;&lt;br /&gt;However, sometimes (not always, which makes it more difficult to reproduce and hence fix), the auto-discovery seems to make strange things (from this &lt;a href="http://bugs.mysql.com/bug.php?id=42773"&gt;bug report&lt;/a&gt;):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;After shuting down and restoring my cluster I get the following error.&lt;br /&gt;&lt;br /&gt;090211  9:59:26 [Note] NDB: mismatch in frm for panel.gatewayquestions, discovering...&lt;br /&gt;090211  9:59:26 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$panel/gatewayquestions&lt;br /&gt;090211  9:59:26 [Note] NDB Binlog: logging ./panel/gatewayquestions (UPDATED,USE_WRITE)&lt;br /&gt;&lt;br /&gt;This is due to the files already being in the mysql data directory. After the error the&lt;br /&gt;frm does not match the data in memory this causes the following.&lt;br /&gt;When running select count(*) from tablename;&lt;br /&gt;You will get an accurate count.&lt;br /&gt;When running select * from table name;&lt;br /&gt;You get an error Can't find record in tablename.&lt;br /&gt;&lt;/pre&gt; I have seen it as well at some customers usually with bigger installations and many tables.&lt;br /&gt;&lt;br /&gt;My current recommendation (work around) is to delete the FRM files associated with the NDB tables in the mysql server data directory before you start the mysql server(s).&lt;br /&gt;&lt;br /&gt;So this is what i always include in my MySQL server startup scripts (and is included in the &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; scripts):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;files=`find $mysql_datadir  -name "*.ndb"`&lt;br /&gt;for f in $files&lt;br /&gt;do&lt;br /&gt;    x=`basename $f .ndb`&lt;br /&gt;    #make sure we leave out ndb_binlog_index and ndb_schema since they are myisam tables&lt;br /&gt;    if [ "$x" == "ndb_binlog_index" ]  || [ "$x" == "ndb_schema" ] ;&lt;br /&gt;    then&lt;br /&gt;       echo "Ignoring $x"&lt;br /&gt;    else&lt;br /&gt;       y=`echo $f | sed  -e 's#ndb#frm#'`&lt;br /&gt;       rm -rf $f&lt;br /&gt;       rm -rf $y&lt;br /&gt;    fi&lt;br /&gt;done&lt;br /&gt;#start the mysqld here&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;If I want to restore data I usually:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;stop the cluster&lt;/li&gt;&lt;li&gt;start the data nodes with --initial&lt;br /&gt;&lt;/li&gt;&lt;li&gt;stop the mysql servers (make sure they are not started)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;restore the cluster data&lt;/li&gt;&lt;li&gt;start the mysql servers (clearing out whatever .frm files coming from the ndb tables)&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-4755810924004513326?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/4755810924004513326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=4755810924004513326' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4755810924004513326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4755810924004513326'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/07/problems-with-frm-files-auto-discovery.html' title='Problems with .FRM files, auto-discovery and MySQL Cluster'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5285386076969139392</id><published>2009-06-29T10:00:00.004+01:00</published><updated>2009-07-24T14:58:11.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>How to upgrade from 6.3 to 7.0</title><content type='html'>In order to upgrade from 6.3 to 7.0 you must follow these rules:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;IT IS ONLY POSSIBLE TO UPGRADE FROM 6.3 to at least 7.0.6&lt;/span&gt;!&lt;/li&gt;&lt;li&gt;I would recommend to upgrade from 6.3.x to 6.3.latest before doing the upgrade. If the upgrade does not work then and you have a good &lt;a href="http://www.severalnines.com/config"&gt;config.ini&lt;/a&gt; , you have probably hit a bug.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You cannot upgrade from 6.3 to the multi-threaded binary of 7.0.6 in one go.&lt;br /&gt;You have to upgrade from 'ndbd' (6.3)  --&gt; 'ndbd' (7.0.6)&lt;br /&gt;Then you can do 'ndbd' (7.0.6)  --&gt; 'ndbmtd' (7.0.6)&lt;/li&gt;&lt;/ol&gt;  So don't try to upgrade to 7.0.5  - it will fail.&lt;br /&gt;As usual when upgrading (version, configuration variables etc) you must do a rolling restart and restart:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ndb_mgmd (management servers)&lt;/li&gt;&lt;li&gt;ndbd (data nodes)&lt;/li&gt;&lt;li&gt;mysqld (mysql servers / direct api applications)&lt;/li&gt;&lt;/ol&gt;  &lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;Distribute the 7.0.6 binaries&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;  Copy the binaries to each host (i.e., replace existing 6.3 binaries) in the cluster.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Upgrading the Management Server(s)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In 6.3 you started the management server as (e.g):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;ndb_mgmd -f /etc/mysql/config.ini&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  In 7.0.6 you have to start them slightly differently, but first you have to stop &lt;span style="font-weight: bold;"&gt;both&lt;/span&gt; (if you have two, but you really should) management servers (because of this &lt;a href="http://bugs.mysql.com/bug.php?id=45495"&gt;bug&lt;/a&gt;):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;killall ndb_mgmd&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;    And.. I never use the management client to start/stop nodes, because I think it works sometimes which makes it difficult to file bugs on, and hard to rely on.&lt;br /&gt;&lt;br /&gt;When you have killed both you can then do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;ndb_mgmd -f /etc/mysql/config.ini --configdir=/etc/mysql --reload&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; The management server in 7.0.6 writes a binary config file in --configdir, which is a configuration cache.  --reload will reload the config.ini and update that cache.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Upgrading the Data Nodes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Restart the data nodes on each machine one at a time:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;killall ndbd&lt;br /&gt;ndbd --ndb-nodeid=X --ndb-connectstring="managementhostA;managementhostB"&lt;br /&gt;ndb_waiter --ndb-connectstring&lt;/code&gt;&lt;code&gt;="managementhostA;managementhostB"&lt;/code&gt;&lt;br /&gt;&lt;code&gt;# when ndb_waiter exits, you can restart the next data node.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Upgrading the MySQL Servers/Direct APIs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Stop and start the mysql servers:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;killall mysqld  #(or mysqladmin shutdown , both sends signal 15)&lt;br /&gt;mysqld_safe --defaults-file=/etc/config/my.cnf&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Upgrading to multithreaded 7.0.6 data nodes&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;   When the Cluster has been restarted with 7.0.6 you can upgrade to multithreaded data nodes.&lt;br /&gt;The binary for the multithreaded data node is called  'ndbmtd'.&lt;br /&gt;&lt;br /&gt;You need to set in config.ini (on both management servers):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;[ndbd default]&lt;br /&gt;..&lt;br /&gt;MaxNoOfExecutionThreads=#number of cores you have (up to 8)&lt;br /&gt;..&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  Then stop both management servers&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;killall ndb_mgmd&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;      When you have killed both you can then start both by doing:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;ndb_mgmd -f /etc/mysql/config.ini --configdir=/etc/mysql --reload&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  and then restart the data nodes one at a time:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;killall ndbd&lt;br /&gt;ndbmtd --ndb-nodeid=X --ndb-connectstring="managementhostA;managementhostB"&lt;br /&gt;ndb_waiter --ndb-connectstring&lt;/code&gt;&lt;code&gt;="managementhostA;managementhostB"&lt;/code&gt;&lt;br /&gt;&lt;code&gt;# when ndb_waiter exits, you can restart the next data node.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;   &lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Using Severalnines Configurator&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If you have a Severalnines installation of MySQL Cluster 6.3, then you can upgrade in the following way:&lt;ol&gt;&lt;li&gt;Make sure you have have the files: &lt;code&gt;&lt;br /&gt;mysqlcluster-xy/cluster/scripts/install/.s9s/hostnames&lt;br /&gt;&lt;/code&gt;&lt;code&gt;mysqlcluster-xy/cluster/scripts/install/.s9s/ndb_hostnames&lt;/code&gt;&lt;br /&gt;&lt;code&gt;mysqlcluster-xy/cluster/scripts/install/.s9s/mysql_hostnames&lt;/code&gt;&lt;br /&gt;&lt;code&gt;mysqlcluster-xy/cluster/scripts/install/.s9s/mgm_hostnames&lt;br /&gt;&lt;/code&gt;Otherwise you have a too old version of the Configurator package and you need to generate a new one.&lt;/li&gt;&lt;li&gt;Generate a new &lt;a href="http://www.severalnines.com/config"&gt;Config&lt;/a&gt; using 7.0.6 with the same nodes, data memory, data dirs etc.&lt;br /&gt;Select "no MT" when asked for  "Number of cores:"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/Skh6ytfNJBI/AAAAAAAAAI4/IG8dY7CKp80/s1600-h/blog_upgrade.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/Skh6ytfNJBI/AAAAAAAAAI4/IG8dY7CKp80/s320/blog_upgrade.png" alt="" id="BLOGGER_PHOTO_ID_5352663168752362514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install the package&lt;br /&gt;Let's assume you have 6.3 in:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;/root/mysqlcluster-63/&lt;/code&gt;&lt;/pre&gt;Install mysqlcluster-70.tar.gz&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;cd /root/&lt;br /&gt;tar xvfz mysqlcluster-70.tar.gz&lt;br /&gt;cd mysqlcluster-70/cluster/scripts/install&lt;/code&gt;&lt;/pre&gt;Copy the .s9s catalog from 6.3 so you get the hostnames&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;cp  -r /root/mysqlcluster-63/cluster/scripts/install/.s9s  .&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Download the binary or build the source:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;./download-binary.sh&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; or&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;./download-and-compile.sh&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;/li&gt;&lt;li&gt;Install and perform a rolling restart&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;./install-cluster.sh&lt;br /&gt;cd ..&lt;br /&gt;./rolling-restart.sh&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Change from ndbd --&gt; ndbmtd&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;vi ../config/config.ini&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; Locate MaxNoOfExecutionThreads and, un-comment it if needed and set it to as many cores as you have:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;[ndbd default]&lt;br /&gt;...&lt;br /&gt;MaxNoOfExecutionThreads=8&lt;br /&gt;...&lt;/code&gt;&lt;/pre&gt;Then change in the scripts from ndbd -&gt; ndbmtd&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;sed -i 's#libexec/ndbd#libexec/ndbmtd#g' *.sh&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Important! Don' leave out 'libexec' above!&lt;br /&gt;And do a rolling restart:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;./rolling-restart.sh&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Luckily it is much easier to upgrade from e.g 7.0.6 to 7.0.x and I will show when 7.0.7 is out how to do that in two lines.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-5285386076969139392?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/5285386076969139392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=5285386076969139392' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5285386076969139392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5285386076969139392'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/06/how-to-upgrade-from-63-to-70.html' title='How to upgrade from 6.3 to 7.0'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZP94gz0B_KE/Skh6ytfNJBI/AAAAAAAAAI4/IG8dY7CKp80/s72-c/blog_upgrade.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-8526738489212945095</id><published>2009-06-15T16:57:00.002+01:00</published><updated>2009-06-15T17:04:56.361+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webinar'/><title type='text'>Webinar - MySQL Cluster: Architectural Deep Dive</title><content type='html'>There will be a webinar presented by Tomas Ulin (Director MySQL Server Technologies) and Matthew Keep (MySQL Cluster Product Management).  The webinar covers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;how MySQL Cluster achieves predictable and consistent real time performance&lt;/li&gt;&lt;li&gt;how MySQL Cluster achieves continuous availability with sub-second fail-over, automated recovery and geographic replication&lt;/li&gt;&lt;li&gt;how MySQL Cluster enables users to dynamically scale throughput and data capacity&lt;/li&gt;&lt;li&gt;how to get started with MySQL Cluster&lt;/li&gt;&lt;/ul&gt;and I will be on the panel anwering your questions!&lt;br /&gt;&lt;br /&gt;When: Wednesday 17th of June 2009,  0930PST/1230EST/1730GMT/1830CET/&lt;br /&gt;See details and how to &lt;a href="http://www.mysql.com/news-and-events/web-seminars/display-363.html"&gt;register here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-8526738489212945095?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/8526738489212945095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=8526738489212945095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8526738489212945095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/8526738489212945095'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/06/webinar-mysql-cluster-architectural.html' title='Webinar - MySQL Cluster: Architectural Deep Dive'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7448904023882554694</id><published>2009-06-15T10:24:00.002+01:00</published><updated>2009-06-15T10:37:19.926+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>MySQL Cluster - versions NOT to use!</title><content type='html'>If you are using the following versions of MySQL Cluster:&lt;br /&gt;&lt;br /&gt;MySQL Cluster 6.3.17 -  &lt;a href="http://bugs.mysql.com/bug.php?id=41087"&gt;SHOW TABLES can drop tables...&lt;/a&gt;&lt;br /&gt;MySQL Cluster 6.3.18 - the above wasn't really fixed (fixed in 6.3.20)&lt;br /&gt;MySQL Cluster 6.3.19 -  the above wasn't really fixed (fixed in 6.3.20)&lt;br /&gt;MySQL Cluster 6.3.21 -  regression, pulled back because of &lt;a href="http://bugs.mysql.com/bug.php?id=42559"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are on any of these versions - then upgrade!&lt;br /&gt;The latest source and binary release is &lt;a href="http://dev.mysql.com/downloads/cluster/6.3.html"&gt;MySQL Cluster 6.3.24&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7448904023882554694?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7448904023882554694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7448904023882554694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7448904023882554694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7448904023882554694'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/06/mysql-cluster-versions-not-to-use.html' title='MySQL Cluster - versions NOT to use!'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-3424006877906027028</id><published>2009-05-15T17:18:00.008+01:00</published><updated>2010-02-25T14:46:01.152Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql ha'/><title type='text'>HA MySQL, write scaling using Cluster to non-cluster replication</title><content type='html'>There are various setups and solutions to solve the problem of having redundant mysql masters and scaling writes on them. MySQL Cluster can be an alternative. Here is why and how:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZP94gz0B_KE/Sg1_LtEZZtI/AAAAAAAAAIQ/fXRc9BrCQyg/s1600-h/scaleout.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ZP94gz0B_KE/Sg1_LtEZZtI/AAAAAAAAAIQ/fXRc9BrCQyg/s320/scaleout.png" alt="" id="BLOGGER_PHOTO_ID_5336060972557231826" border="0" /&gt;&lt;/a&gt;Pros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No need to worry about DRBD failover and recovery times&lt;/li&gt;&lt;li&gt;No need to worry about potential data loss when failover from active master to standby master (has all binlog really been replicated over from the failed master?)&lt;/li&gt;&lt;li&gt;Writes go to any mysql server connected to the Cluster - thus writes are easy to scale&lt;br /&gt;The data nodes will then send the committed writes to every mysql server with &lt;code&gt;--log-bin&lt;/code&gt; enabled.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;MySQL Cluster can handle a lot of writes (but the slaves can become the bottleneck)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Data nodes can be added online (MySQL Cluster 7.0) - thus write scaling is easy and can be done on-demand&lt;/li&gt;&lt;li&gt;Add new, consistent, slaves online (thanks to the online backup in MySQL Cluster)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Simple and very fast master failover policy - all masters connected to the cluster will receive the same events, thus (when both are working) they will have the same content in the binary log - none is lagging behind.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No additional hardware compared to a normal HA setup of the masters (two computers are enough)&lt;/li&gt;&lt;/ul&gt;Worried that NDB stores data in RAM - well &lt;a href="http://johanandersson.blogspot.com/2008/12/disk-data-summary.html"&gt;use disk based tables&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;Setting up MySQL Cluster&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You need to have at least:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;2 computers (HA with dual switches, nics and bonding, split brain only if both links are broken)&lt;br /&gt;- dual switches, dual nics (bonded).&lt;br /&gt;- each computer runs:&lt;br /&gt;1 data node (ndbd/ndbmtd),&lt;br /&gt;1 mysql server (master),&lt;br /&gt;1 ndb_mgmd&lt;br /&gt;or&lt;/li&gt;&lt;li&gt;4 computers  (better HA and no risk for network partitioning/split brain)&lt;br /&gt;- dual switches, dual nics (bonded).&lt;br /&gt;- two computers each runs:&lt;br /&gt;1 data node (ndbd/ndbmtd),&lt;br /&gt;- two computers each runs:&lt;br /&gt;1 mysql server (master), 1 ndb_mgmd.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Then it is of course possible to have more data nodes, more mysql servers etc, but we recommend two mysql servers that are masters in the replication so it is possible to failover between them.&lt;br /&gt;&lt;br /&gt;With &lt;a href="http://www.severalnines.com/config"&gt;www.severalnines.com/config&lt;/a&gt; you can easily generate either of these setups, and have a running Cluster in a couple of minutes.&lt;br /&gt;&lt;br /&gt;The idea here (just as in a normal HA MySQL setup) is to have two masters, &lt;code&gt;master_a&lt;/code&gt; and &lt;code&gt;master_b&lt;/code&gt;. The slaves will replicate from &lt;code&gt;master_a&lt;/code&gt; and failover to &lt;code&gt;master_b&lt;/code&gt; if &lt;code&gt;master_a&lt;/code&gt; fails!&lt;br /&gt;&lt;br /&gt;Note that you can write to _all_ mysql servers, and the data nodes will send the changes to the mysql servers that has --log-bin enabled.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Preparation of Slaves&lt;/span&gt;&lt;br /&gt;You must chose between 1) and 2) below, else the replication won't work:&lt;br /&gt;&lt;br /&gt;1. Enable INDEMPOTENCY  in my.cnf of the slaves using slave-exec-mode:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;--slave-exec-mode=IDEMPOTENT&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;2.  if you want to use STRICT (default), then you have to set on the master mysql servers (my.cnf):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;--ndb-log-update-as-write=O&lt;/code&gt;&lt;/pre&gt;Meaning that updates will be logged as updates, and not as writes.This downside with this is that twice as much as data will be sent (there is a before image and an after image for each update).&lt;br /&gt;&lt;br /&gt;Each slave must have the table &lt;code&gt;mysql.ndb_apply_status&lt;/code&gt;:&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;code&gt;&lt;/code&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;mysql_slave&amp;gt; use mysql;&lt;br /&gt;mysql_slave&amp;gt; CREATE TABLE `ndb_apply_status` (&lt;br /&gt;`server_id` int(10) unsigned NOT NULL,&lt;br /&gt;`epoch` bigint(20) unsigned NOT NULL,&lt;br /&gt;`log_name` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,&lt;br /&gt;`start_pos` bigint(20) unsigned NOT NULL,&lt;br /&gt;`end_pos` bigint(20) unsigned NOT NULL,&lt;br /&gt;PRIMARY KEY (`server_id`) USING HASH)&lt;br /&gt;ENGINE=INNODB DEFAULT CHARSET=latin1;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This table is used to know what data has been applied on the slave and from which master (see below more a longer explanation).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Preparation of Masters (masterA, masterB)&lt;/span&gt;&lt;br /&gt;Ensure you have the following in the my.cnf of the master mysql servers::&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;[mysqld]&lt;br /&gt;...&lt;br /&gt;#if you didnt&lt;/code&gt;&lt;code&gt; set --slave-exec-mode=IDEMPOTENT on the slaves you must set:&lt;/code&gt;&lt;br /&gt;&lt;code&gt;ndb-log-update-as-write=O&lt;br /&gt;#else&lt;br /&gt;&lt;/code&gt;&lt;code&gt;ndb-log-update-as-write=1&lt;br /&gt;#endif -- so pick one of the above!!&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;#enable cluster storage engine:&lt;br /&gt;ndbcluster&lt;br /&gt;&lt;br /&gt;#connect to cluster:&lt;br /&gt;&lt;/code&gt;&lt;code&gt;ndb-connectstring=&amp;lt;hostname of ndb_mgmd:port&amp;gt;&lt;br /&gt;&lt;br /&gt;#sync after each epoch (10 ms of transactions) - here is a disk tuning possibility.&lt;br /&gt;sync-binlog=1&lt;br /&gt;&lt;br /&gt;#you may also want to set binlog_cache_size (if Binlog_cache_disk_use is growing):&lt;br /&gt;binlog_cache_size=1048576&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;GRANT&lt;/code&gt; the replication user, e.g,&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql&amp;gt;GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'password'&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Creating the tables&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On MySQL Cluster&lt;br /&gt;Create all the tables for the application(s) using &lt;code&gt;engine=NDBCLUSTER&lt;/code&gt;.&lt;br /&gt;On each slave&lt;br /&gt;Create all the tables for the application(s) using e.g &lt;code&gt;engine=MYISAM&lt;/code&gt; or &lt;code&gt;engine=INNODB&lt;/code&gt;.&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;Staging a slave - with traffic on Cluster:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;In order to get a consistent slave you have to do as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:100%;"  &gt;Backup the Cluster&lt;/span&gt;&lt;br /&gt;Using the management client:&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;ndb_mgm&amp;gt;start backup&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;  &lt;code&gt;&lt;/code&gt;Copy all the backup files to the same location.&lt;br /&gt;If you use the &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; scripts:&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;./start-backup.sh /path/mycentral_backupdir/&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;   &lt;code&gt;&lt;/code&gt;all backup files will be copied from the nodes to &lt;code&gt;/path/mycentral_backupdir/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Remember the &lt;code style="font-weight: bold;"&gt;stopGCP=&amp;lt;some number&amp;gt;&lt;/code&gt; that is printed at the end of the backup.&lt;br /&gt;If you use &lt;code&gt;ndb_mgm -e "start backup"&lt;/code&gt; then it will look like this:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;ndb_mgm -e "start backup"&lt;br /&gt;Connected to Management Server at: localhost:1186&lt;br /&gt;Waiting for completed, this may take several minutes&lt;br /&gt;Node 3: Backup 14 started from node 1&lt;br /&gt;Node 3: Backup 14 started from node 1 completed&lt;br /&gt;StartGCP: 98278 &lt;b&gt;StopGCP: 98281&lt;/b&gt;&lt;br /&gt;#Records: 2058 #LogRecords: 0&lt;br /&gt;Data: 51628 bytes Log: 0 bytes&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;If you use &lt;code&gt;./start-backup /tmp&lt;/code&gt;  then it will look like this:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;Backup has completed on data nodes.&lt;br /&gt;Copying backup files to /tmp//BACKUP-2009May09-150743&lt;br /&gt;BACKUP-15.3.log                               100%   52     0.1KB/s   00:00&lt;br /&gt;BACKUP-15-0.3.Data                            100%   26KB  26.1KB/s   00:00&lt;br /&gt;BACKUP-15.3.ctl                               100%   11KB  10.6KB/s   00:00&lt;br /&gt;BACKUP-15.4.log                               100%   52     0.1KB/s   00:00&lt;br /&gt;BACKUP-15-0.4.Data                            100%   26KB  25.7KB/s   00:00&lt;br /&gt;BACKUP-15.4.ctl                               100%   11KB  10.6KB/s   00:00&lt;br /&gt;Backup completed and backup files can be found in /tmp//BACKUP-2009May09-150743&lt;br /&gt;Use the StopGCP to setup Cluster to non-cluster replication:&lt;br /&gt;&lt;b&gt;StopGCP: 98482&lt;/b&gt;&lt;/pre&gt;This is important as this tells where the backup ended, and from what point the slave should get the changes.  This number will be used later when the replication is setup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;Convert Cluster backup data files to CSV files&lt;/span&gt;&lt;br /&gt;For each backup file (for each data node in the master cluster) run:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;ndb_restore -c &amp;lt;connectstring&amp;gt;&lt;br /&gt;-b &amp;lt;backupid&amp;gt;&lt;br /&gt;-n &amp;lt;nodeid&amp;gt;&lt;br /&gt;--print-data&lt;br /&gt;--print-log&lt;br /&gt;--append&lt;br /&gt;--tab=&amp;lt;output directory&amp;gt;&lt;br /&gt;--fields-enclosed-by="'"&lt;br /&gt;--fields-separated-by=","&lt;br /&gt;--lines-terminated-by="\n"&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;    or if you are using the &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; scripts:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;./restore-backup.sh --csv --backupdir=&lt;/code&gt;&lt;code&gt;/path/mycentral_backupdir/ --csvdir=/mycsv/&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;This will create one txt file for each table and put it in &lt;code&gt;--csvdir&lt;/code&gt; (Configurator) or &lt;code&gt;--tab=&amp;lt;outputdir&amp;gt;&lt;/code&gt; for the vanilla ndb_restore.&lt;br /&gt;&lt;br /&gt;It will also tell you (if you used start-backup.sh) the stop gcp:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;./restore-backup.sh --csv&lt;br /&gt;        --backupdir=/cluster/backups/BACKUP-2009May10-165004&lt;br /&gt;        --csvdir=/cluster/backups/csv&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;To setup replication use StopGCP: 1511&lt;br /&gt;&lt;/pre&gt;Data is appended to the txt files, so running the command more than once is bad. Better delete the old txt files first.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:100%;"  &gt;Loading the .txt (CSV) into Slave&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;/span&gt;For all tables:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql_slave&amp;gt; LOAD DATA INFILE 'tablename.TXT'&lt;br /&gt;INTO table &amp;lt;tablename&amp;gt;&lt;br /&gt;FIELDS TERMINATED BY ','&lt;br /&gt;&lt;/code&gt;&lt;code&gt;ENCLOSED BY '\''&lt;/code&gt;&lt;code&gt;&lt;br /&gt;LINES TERMINATED BY '\n';&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;Now the slave is at the same state as the when the backup finished in the Cluster.&lt;br /&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Staging a slave - no traffic on Cluster:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You can use mysqldump for this.&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;host&gt; mysqldump -u&amp;lt;user&amp;gt; -p&amp;lt;password&amp;gt; &amp;lt;database&amp;gt; &amp;gt; database_dump.sql&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Then you copy the database_dump.sql  and change the &lt;code&gt;engine=ndb&lt;/code&gt; to &lt;code&gt;engine=innodb&lt;/code&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;host&gt; sed -i -e 's#ndbcluster#innodb# database_dump.sql&lt;/code&gt;&lt;/pre&gt; Then you have to find the good starting position from &lt;code&gt;master_a&lt;/code&gt;:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;master_a&gt; show master status;&lt;/code&gt;&lt;/pre&gt;  Remember the binlog filename and position, you will need it in the next step.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Starting the replication&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Create and grant the replication user (not shown here)&lt;br /&gt;&lt;br /&gt;If you have staged the slave using &lt;code&gt;mysqldump&lt;/code&gt;, then you go directly to &lt;code&gt;CHANGE MASTER..&lt;/code&gt; using the BINLOG  and POS from the previous step.&lt;br /&gt;&lt;br /&gt;Find out where the slave should start replicating from using the &lt;code&gt;stopGCP&lt;/code&gt; from the previous step "Backup the Cluster".&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql_masterA&amp;gt; SELECT @file:=SUBSTRING_INDEX(File, '/',-1),&lt;br /&gt;@pos:=Position&lt;br /&gt;FROM mysql.ndb_binlog_index&lt;br /&gt;WHERE gci&amp;gt;@stopGCP ORDER BY gci ASC LIMIT 1;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;if the query returns nothing (this means that no changes has happened on the cluster after the backup was completed) run:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql_masterA&amp;gt; SHOW MASTER STATUS;&lt;/code&gt;&lt;/pre&gt; Then change master&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql_slave&amp;gt;   CHANGE MASTER TO MASTER_HOST='masterA',&lt;br /&gt;        MASTER_PORT=3306,&lt;br /&gt;        MASTER_USER='repl',&lt;br /&gt;        MASTER_PASSWORD='password',&lt;br /&gt;        MASTER_LOG_FILE='@file',&lt;br /&gt;        MASTER_LOG_POS=@pos;&lt;br /&gt;mysql_slave&amp;gt;   START SLAVE IO_THREAD;&lt;br /&gt;## verify slave connected to masterA:&lt;br /&gt;mysql_slave&amp;gt;   SHOW SLAVE STATUS\g &lt;/code&gt;&lt;/pre&gt;if above is ok:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql_slave&amp;gt;   START SLAVE SQL_THREAD;&lt;br /&gt;mysql_slave&amp;gt;   SHOW SLAVE STATUS\g;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Master Failover&lt;/span&gt;&lt;br /&gt;Failover from masterA to masterB&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;mysql_slave&amp;gt;    STOP SLAVE;&lt;br /&gt;mysql_slave&amp;gt;    SELECT @epoch:=max(epoch) FROM mysql.ndb_apply_status;&lt;br /&gt;mysql_masterB&amp;gt;  SELECT @file:=SUBSTRING_INDEX(File, '/', -1),&lt;br /&gt;            @pos:=Position&lt;br /&gt;       FROM mysql.ndb_binlog_index&lt;br /&gt;       WHERE epoch&amp;gt;@epoch ORDER BY epoch ASC LIMIT 1;&lt;/pre&gt;If the query returns nothing (meaning nothing has been written to the master since the failure of masterA) do:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;mysql_masterB&amp;gt;  SHOW MASTER STATUS;&lt;br /&gt;#use the position and file in the query below:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; &lt;code&gt;&lt;/code&gt;Then change master&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;mysql_slave&amp;gt;   CHANGE MASTER TO MASTER_HOST='masterA',&lt;br /&gt;        MASTER_PORT=3306,&lt;br /&gt;        MASTER_USER='repl',&lt;br /&gt;        MASTER_PASSWORD='password',&lt;br /&gt;        MASTER_LOG_FILE='@file',&lt;br /&gt;        MASTER_LOG_POS=@pos;&lt;br /&gt;mysql_slave&amp;gt;   START SLAVE:&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Master crashes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;When the master restarts after a crash, it will write a &lt;code&gt;LOST_EVENTS&lt;/code&gt; event into its binary log.&lt;br /&gt;If a &lt;code&gt;LOST_EVENTS&lt;/code&gt; event is received on a slave, the slave will stop, and you have to do a Master Failover.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;Master connection glitch between data node and a master mysql server&lt;/span&gt;&lt;br /&gt;If the master would lose contact for a very short period of time with the cluster, then a &lt;code&gt;LOST_EVENTS&lt;/code&gt; event will be written into the binary log. See above.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;font-size:130%;"  &gt;ndb_apply_status, epochs and ndb_binlog_index&lt;/span&gt;&lt;br /&gt;The &lt;code&gt;mysql.ndb_apply_status&lt;/code&gt; is very important as it stores what epochs from the Cluster that the slave has applied.&lt;br /&gt;The epochs are consistent units and stores 10ms (controlled by &lt;code&gt;TimeBetweenEpochs&lt;/code&gt; in config.ini) of committed transactions.&lt;br /&gt;On the master side, the epochs are mapped to binary log filename and position in the &lt;code&gt;mysql.ndb_binlog_index&lt;/code&gt; table.&lt;br /&gt;The &lt;code&gt;mysql.ndb_binlog_index&lt;/code&gt; table is a &lt;code&gt;MYISAM&lt;/code&gt; table is local to each master and is the glue between what epoch has been applied on the slave, and what binary log and position it corresponds to for the master.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;Monitoring&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Replication - you can use Enterprise Monitor or whatever monitoring tool you prefer to monitor the replication and the mysql servers. Scripts for automatic failover must be implemented.&lt;br /&gt;Cluster - you can use &lt;a href="http://www.severalnines.com/cmon"&gt;cmon&lt;/a&gt; to monitor the data nodes and the other components connected to the Cluster. The web interface will soon look better :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Possible Extensions&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You can of course give the master mysql servers one virtual IP and use Hearbeat to failover the IP. This simplifies for the applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Bugs and Issues - TIMESTAMP&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Be careful with TIMESTAMP. Currently the ndb_restore program does not generate the timestamp using the MySQL TIMESTAMP, but rather it is a UNIX_TIMESTAMP.&lt;br /&gt;I have written a  &lt;a href="http://bugs.mysql.com/bug.php?id=44763"&gt;bug report&lt;/a&gt; on this. In the meantime, you have to convert the TIMESTAMP columns in the .txt files to the MySQL TIMESTAMP format YYYY-MM-DD HH:MM:SS.&lt;br /&gt;&lt;br /&gt;Please note that this is not a problem if you use &lt;code&gt;mysqldump&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I will update this part if you find any other problems - just let me know.&lt;br /&gt;&lt;br /&gt;Thanks to Magnus Blåudd, Cluster Team, for your input on this post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-3424006877906027028?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/3424006877906027028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=3424006877906027028' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3424006877906027028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/3424006877906027028'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/05/ha-mysql-write-scaling-using-cluster-to.html' title='HA MySQL, write scaling using Cluster to non-cluster replication'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZP94gz0B_KE/Sg1_LtEZZtI/AAAAAAAAAIQ/fXRc9BrCQyg/s72-c/scaleout.png' height='72' width='72'/><thr:total>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1707319696577646677</id><published>2009-05-08T10:11:00.009+01:00</published><updated>2010-11-17T07:52:00.117Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='sanity check'/><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='administration'/><title type='text'>Cluster fails to start - self diagnosis (sanity check mysql cluster)</title><content type='html'>If the MySQL Cluster fails to start, what can you do and what to check?&lt;br /&gt;Here are some sanity checks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;Initial system start&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;If it is the first time you start up the cluster and it fails,  then check the following:&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Network  &lt;/span&gt;&lt;span&gt;- Check /etc/hosts&lt;br /&gt;You should have (on the line for localhost)&lt;br /&gt;127.0.0.1  localhost&lt;br /&gt;and nothing else! Then usually, the normal IP address host mapping follows:&lt;br /&gt;10.0.1.10   hostA&lt;br /&gt;10.0.1.11   hostB&lt;br /&gt;...&lt;br /&gt;REDHAT and others can add a lot of other things to the "localhost" line(s), and this results in that the nodes won't be able to connect to each other (they will be stuck in phase 0 or phase 1)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Network&lt;/span&gt; - Check if you can &lt;span style="font-weight: bold;"&gt;ping&lt;/span&gt; the machines&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Network&lt;/span&gt; - Check if you have any &lt;span style="font-weight: bold;"&gt;firewalls&lt;/span&gt; enables ( e.g check with /sbin/iptables -L)&lt;br /&gt;Disable the firewall in that case. Exactly how depends on OS and Linux distribution.&lt;br /&gt;On Redhat systems, then SELinux might be enabled. Googling "disable firewall &amp;lt;your distro&amp;gt;" should give answers.  Firewall is the most common culprit preventing the nodes in the cluster talking to each other.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RAM  -&lt;/span&gt; Check if you have enough RAM to start the data nodes&lt;br /&gt;Check using 'top' on the computers where the data nodes running, while you start the data nodes. So always, have 'top -d1' running on the data nodes while they are starting up.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RAM&lt;/span&gt; - If you are allocating a lot of DataMemory, then you may also need to increase the parameter &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#mysql-cluster-param-ndbd-definition-timebetweenwatchdogcheckinitial"&gt;TimeBetweenWatchdogCheckInitial&lt;/a&gt; in [NDBD DEFAULT] of your config.ini. Set it to 60000 if you have &gt;16GB of RAM.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Disk space&lt;/span&gt; - check using ' df -h' if you have enough space where the data nodes has its data directory.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;CPU&lt;/span&gt; - if you use 7.0, enable multi-threading (8 cores) and only have a 4 core system or less, then there are chances that the Cluster won't come up. Competition for resources. I have seen this happening but no conclusive evidence yet.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;OS&lt;/span&gt; - if you have a mix of OSs where the data nodes run, then it can be a problem. E.g, I have seen problems even when Fedora has been used on all machines, but one of the machines had a slightly older linux kernel. Also, it won't work if one of the nodes is a RH4 and the other is a RH5 (atleast mixing RH3 and RH4 doesn't).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So for the "initial start" it is mainly environmental factors preventing the cluster to start.&lt;br /&gt;If you still have problems, ask on the &lt;a href="http://forums.mysql.com/list.php?25"&gt;Cluster Forum&lt;/a&gt; or MySQL Support if you have Support for advice.&lt;br /&gt;&lt;br /&gt;Also, disable NUMA (Cluster is not NUMA aware) and make sure you dont SWAP!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;System start&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If you can't restart the cluster, and you haven't changed the configuration and haven't been filling up the disks with other things (i.e, check disk,ram, network as above) , then you have probably hit a bug.  Ask on the &lt;a href="http://forums.mysql.com/list.php?25"&gt;Cluster Forum&lt;/a&gt; or MySQL Support if you have Support for advice.&lt;br /&gt;&lt;br /&gt;In many cases it is recoverable by restarting one node in each node group (instead of all data nodes), and try out different combinations. When the "half" cluster has started, then you can restart the rest of the data nodes with --initial and they will sync up from the already started nodes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-weight: bold;"&gt;Node (re)start&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;If you can't restart a failed data node, and you haven't changed the configuration and haven't been filling up the disks with other things (i.e, check disk,ram, network as above) , then you have probably hit a bug, but also there might have been corruption of the data files (this depends on how the computer/data node crashed).&lt;br /&gt;&lt;br /&gt;You can try to do an initial node restart (see below).&lt;br /&gt;&lt;br /&gt;Ask on the &lt;a href="http://forums.mysql.com/list.php?25"&gt;Cluster Forum&lt;/a&gt; or MySQL Support if you have Support for advice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Initial Node (re)start&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If you can't restart a failed data node with --initial, and you haven't changed the configuration and haven't been filling up the disks with other things (i.e, check disk,ram, network as above) , then you have probably hit a bug.  Ask on the &lt;a href="http://forums.mysql.com/list.php?25"&gt;Cluster Forum&lt;/a&gt; or MySQL Support if you have Support for advice.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-family:arial;"&gt;Collecting error data&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;The program '&lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-utilities-ndb-error-reporter.html"&gt;ndb_error_reporter&lt;/a&gt;' is great to collect log files from the data nodes and management servers and puts them into a single bz file. Send this file to either &lt;a href="http://forums.mysql.com/list.php?25"&gt;Cluster Forum&lt;/a&gt; or MySQL Support if you have Support together with detailed steps what you have done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1707319696577646677?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1707319696577646677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1707319696577646677' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1707319696577646677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1707319696577646677'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/05/cluster-fails-to-start-self-diagnosis.html' title='Cluster fails to start - self diagnosis (sanity check mysql cluster)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-6846391462423396662</id><published>2009-04-28T18:50:00.005+01:00</published><updated>2009-04-28T20:15:45.652+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>Online configuration update and a new script</title><content type='html'>If you are using the scripts from the &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; (and yes, the broken link is now fixed so it is actually possible to get the config package..), and want to tweak your configuration on a started Cluster then you can do like written below.&lt;br /&gt;&lt;br /&gt;There is also a new script in &lt;code&gt;Configurator 2.2&lt;/code&gt; (released 28th April 2009, PST1153AM , GMT07:53) that lets you check the values of different config parameters. Its use is described below.&lt;br /&gt;&lt;br /&gt;Pretend we want to extend the DataMemory from 1024M to 1536M:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;cd mysqlcluster-70/cluster/scripts&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;vi ../config/config.ini&lt;/code&gt;&lt;br /&gt;This is the master config.ini file and will be copied out to the management server(s). Don't change &lt;code&gt;/etc/mysql/config.ini&lt;/code&gt;, as that will have no effect.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Set &lt;code&gt;DataMemory=1536M&lt;/code&gt;  then save and exit&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;sh rolling-restart.sh&lt;/code&gt;&lt;/li&gt;&lt;li&gt;When it has finished, verify that the Cluster has the new settings by running &lt;code&gt;query-param.sh&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;sh query-param.sh DataMemory&lt;br /&gt;Parameter=DataMemory&lt;br /&gt;Data Node 3 :  1610612736&lt;br /&gt;Data Node 4 :  1610612736&lt;br /&gt;&lt;/code&gt;Please note that the output is in bytes.&lt;/li&gt;&lt;/ol&gt;The rolling-restart.sh script implements this &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-rolling-restart.html"&gt;procedure&lt;/a&gt; described in the reference manual.&lt;br /&gt;Many other parameters can be changed using the above steps (e.g, &lt;code&gt;MaxNoOfConcurrentOperations&lt;/code&gt; etc). Be careful though that you have memory available (the script does not check for that yet).&lt;br /&gt;&lt;br /&gt;Parameters that change the file system one way or another (&lt;code&gt;NoOfFragmentLogFiles, FragmentLogFileSize, Datadir, BackupDataDir, FileSystem*, InitFragmentLogfiles&lt;/code&gt;)  must be changed with an initial rolling restart (all parameters are listed &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-config-params-ndbd.html"&gt;here&lt;/a&gt; in the ref manual):&lt;br /&gt;&lt;br /&gt;Pretend we want to change the size of the Redolog (&lt;code&gt;NoOfFragmentLogfiles&lt;/code&gt;).&lt;br /&gt;From the beginning we have:&lt;br /&gt;&lt;code&gt;./query-param.sh NoOfFragmentLogFiles&lt;br /&gt;Parameter=NoOfFragmentLogFiles&lt;br /&gt;Data Node 3 :  6&lt;br /&gt;Data Node 4 :  6&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Then we modify our "template" config.ini and go ahead: &lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;vi ../config/config.ini&lt;br /&gt;&lt;/code&gt;This is the master config.ini file and will be copied out to the management server(s)&lt;/li&gt;&lt;li&gt;Set &lt;code&gt;&lt;span style="font-family:Georgia,serif;"&gt;NoOfFragmentLogFiles=7&lt;/span&gt;&lt;/code&gt;  then save and exit&lt;code&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;sh rolling-restart-initial.sh&lt;/code&gt;&lt;/li&gt;&lt;li&gt;When it has finished, verify that the Cluster has the new settings by running &lt;code&gt;query-param.sh&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;./query-param.sh NoOfFragmentLogFiles&lt;br /&gt;Parameter=NoOfFragmentLogFiles&lt;br /&gt;Data Node 3 : 7&lt;br /&gt;Data Node 4 : 7&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;Have fun upgrading but remember - don't try to start with a smaller configuration on an already existing configuration (i.e., it is safe to increase parameters, but be very careful if you decrease).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-6846391462423396662?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/6846391462423396662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=6846391462423396662' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6846391462423396662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6846391462423396662'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/online-configuration-update-and-new.html' title='Online configuration update and a new script'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-1742944024054042371</id><published>2009-04-27T07:58:00.003+01:00</published><updated>2009-04-27T08:05:45.089+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='ldap'/><category scheme='http://www.blogger.com/atom/ns#' term='uc2009'/><title type='text'>MC 7.0 New Features, LDAP For MySQL Cluster - UC2009 sessions</title><content type='html'>The presentations from the sessions &lt;a href="http://assets.en.oreilly.com/1/event/21/MySQL%20Cluster%207_0%20-%20New%20Features%20Presentation.pdf"&gt;&lt;span style="font-style: italic;"&gt;MySQL Cluster 7.0 - New Features&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://assets.en.oreilly.com/1/event/21/LDAP%20for%20MySQL%20Cluster%20-%20back-ndb%20Presentation.pdf"&gt;&lt;span style="font-style: italic;"&gt;LDAP For MySQL Cluster - back-ndb&lt;/span&gt;&lt;/a&gt;, and all other sessions on MySQL Cluster, are available for download from &lt;a href="http://www.mysqlconf.com/mysql2009/public/schedule/topic/MySQL+Cluster+and+High+Availability"&gt;www.mysqlconf.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-1742944024054042371?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/1742944024054042371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=1742944024054042371' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1742944024054042371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/1742944024054042371'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/70-new-features-ldap-for-mysql-cluster.html' title='MC 7.0 New Features, LDAP For MySQL Cluster - UC2009 sessions'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2617552487766557458</id><published>2009-04-25T22:31:00.004+01:00</published><updated>2009-04-25T23:18:49.092+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>Easiest way to try out new MySQL Cluster 7.0.5</title><content type='html'>Here is how to install and start MySQL Cluster 7.0.5 in eight steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to the &lt;a href="http://www.severalnines.com/config"&gt;configurator&lt;/a&gt; and setup the configuration you wish to have. Make sure you select "MySQL Cluster 7.0.x" in the first drop down.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Copy the package you either download or receive by email to one of the computers that will run one of the management servers.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:monospace;"&gt;tar xvfz&lt;/span&gt;&lt;code&gt; mysqlcluster-70.tgz&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;cd mysqlcluster-70/scripts/install&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dev.mysql.com/downloads/cluster/7.0.html"&gt;Download&lt;/a&gt; MySQL Cluster 7.0 from MySQL website and put it in mysqlcluster-70/scripts/install&lt;/li&gt;&lt;li&gt;&lt;code&gt;sh dist-tgz.sh&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;sh bootstrap.sh&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;cd .. &amp;amp;&amp;amp; sh start-cluster-initial.sh&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;Okay, step 1) requires that you setup shared ssh keys and a bit of typing and clicking, but gives you a production class configuration, and scripts to manage the cluster from a single point. Including backups and restores of MySQL Cluster!&lt;br /&gt;&lt;br /&gt;I have mostly tested the scripts on Linux - please let me know about issues on other platforms!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2617552487766557458?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2617552487766557458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2617552487766557458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2617552487766557458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2617552487766557458'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/easiest-way-to-try-out-new-mysql.html' title='Easiest way to try out new MySQL Cluster 7.0.5'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-994410373106581428</id><published>2009-04-25T10:25:00.004+01:00</published><updated>2009-04-25T10:46:33.741+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configurator'/><title type='text'>Configurator - new version 2.1</title><content type='html'>The &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt; has undergone some serious fixing as 2.0 had some issues.&lt;br /&gt;Here is a brief list of the enhancements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;error handing and progress reports&lt;/span&gt; - I have rewritten almost all scripts with better error handling and progress reports. E.g, if a node fails to start during a rolling restart, then the rolling restart script is aborted and you get a suggestion how to recover. If you run start-cluster-initial.sh on an already started cluster, it will refuse to run. There are many more changes like this to check the status of the nodes (both data nodes and sql nodes) during startup&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;download link to package&lt;/span&gt; - When you have entered the email address, then you will also get a link where to download the package, in case you experience problems with receiving the email (I have raised an issue to the hosting company about this)&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;restructure&lt;/span&gt; - I have also moved the install scripts to scripts/install and the monit scripts to scipts/extra. The install_initd_linux.sh uses chkconfig and it does not work on all linux distros. Going to fix that.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;bugs&lt;/span&gt; - fixed a number of small bugs and annoyances.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-994410373106581428?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/994410373106581428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=994410373106581428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/994410373106581428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/994410373106581428'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/configurator-new-version-21.html' title='Configurator - new version 2.1'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-4193149803205465315</id><published>2009-04-16T11:32:00.006+01:00</published><updated>2009-04-16T18:16:52.610+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><title type='text'>max_rows in cluster</title><content type='html'>If you are going to load a lot of records into Cluster, don't forget to set max_rows!&lt;br /&gt;My colleague, Yves at BigDBAhead, has also &lt;a href="http://www.bigdbahead.com/?p=96"&gt;blogged&lt;/a&gt; about this, but I also ran into the same problem recently.&lt;br /&gt;&lt;br /&gt;I did try to populate 100M records on a 4 node cluster, and the data nodes went down with the following error message in the error logs:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"2304 Array index out of range"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So the error message is crap - and my opinion is that there should be a proper error message propagated up to the mysql server. There is a &lt;a href="http://bugs.mysql.com/bug.php?id=34348"&gt;bug report&lt;/a&gt; on this.&lt;br /&gt;&lt;br /&gt;Simplified, what the error message means is that you have run out of "index slots" in the Hash Table storing the hashes of the Primary Keys. This is because each table is divided into a number of partitions, and each partition can only store X number of records in the hash table (about 100M).&lt;br /&gt;&lt;br /&gt;The workaround when creating huge tables is to set max_rows=&amp;lt;2 x the number of records that you plan to store in the table&amp;gt;.  2x is just to be safe. Internally this will create more partitions. Internally the cost of this in terms of memory is negligible.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;code&gt;CREATE TABLE t1 (&lt;br /&gt;  a INTEGER PRIMARY KEY&lt;br /&gt;) ENGINE=ndbcluster MAX_ROWS=1000000000&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-4193149803205465315?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/4193149803205465315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=4193149803205465315' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4193149803205465315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/4193149803205465315'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/maxrows-in-cluster.html' title='max_rows in cluster'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5446911657167182980</id><published>2009-04-09T18:33:00.003+01:00</published><updated>2009-04-09T18:39:37.255+01:00</updated><title type='text'>Mac OSX support for Cluster Sandbox &amp; Configurator</title><content type='html'>Now you can use the &lt;a href="http://www.severalnines.com/sandbox/"&gt;Sandboxes&lt;/a&gt; and &lt;a href="http://www.severalnines.com/config/"&gt;Configurator&lt;/a&gt; on Mac OSX.&lt;br /&gt;&lt;br /&gt;You need to download the &lt;a href="http://www.severalnines.com/downloads/sandbox/macos.sh"&gt;macos.sh&lt;/a&gt; script.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sandbox users - Copy the script into the&lt;code&gt;&lt;br /&gt;mysqlcluster-XXX/scripts/&lt;/code&gt; catalog &lt;/li&gt;&lt;li&gt;Configurator users - Copy the script into the&lt;code&gt;&lt;br /&gt;mysqlcluster-XXX/cluster/scripts/&lt;/code&gt; catalog &lt;/li&gt;&lt;/ul&gt;Then run it:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sh macos.sh&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;before you run any other script.&lt;br /&gt;&lt;br /&gt;This will convert all the LD_LIBRARY_PATH to DYLD_LIBRARY_PATH and also use 'tar xvfz' instead of 'zcat' which does not work in MAC OSX.&lt;br /&gt;&lt;br /&gt;You also need to download &lt;a href="http://developer.apple.com/technology/xcode.html"&gt;apple xcode&lt;/a&gt; and &lt;a href="http://www.versiontracker.com/dyn/moreinfo/macosx/31606"&gt;wget&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-5446911657167182980?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/5446911657167182980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=5446911657167182980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5446911657167182980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/5446911657167182980'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/mac-osx-support-for-cluster-sandbox.html' title='Mac OSX support for Cluster Sandbox &amp; Configurator'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-2357101027741488468</id><published>2009-04-09T16:51:00.004+01:00</published><updated>2009-04-09T18:27:05.879+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sandbox'/><category scheme='http://www.blogger.com/atom/ns#' term='replication'/><title type='text'>Multi-source replication with MySQL Cluster</title><content type='html'>With MySQL Cluster it is possible to aggregate data from many MySQL Servers using Replication. Here is how.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZP94gz0B_KE/SdXRGlo-kNI/AAAAAAAAAHw/c-K60cjV7Q4/s1600-h/multisource.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZP94gz0B_KE/SdXRGlo-kNI/AAAAAAAAAHw/c-K60cjV7Q4/s320/multisource.png" alt="" id="BLOGGER_PHOTO_ID_5320388445921513682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;E.g, you might have a sensor network, where each sensor writes data into a mysql server. The problem is that you have a quite few of these sensors, and you want to do aggregate this data, e.g. in order to do data mining on the combined data set.&lt;br /&gt;&lt;br /&gt;The standard MySQL server does not support multi-source (i.e, one slave server can be connected to many masters), but Cluster can be used for this, since you can have many mysql servers connected to Cluster acting as slaves.&lt;br /&gt;&lt;br /&gt;It is also possible to extend this - e.g, to replicate the aggregated data from Cluster to e.g, Infobright for datamining.&lt;br /&gt;&lt;br /&gt;I did a small PoC at home to show how to use MySQL Cluster for multi-source replication, and here is what I did:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Installed MySQL Cluster on the host computer (called barracuda)- I used the &lt;a href="http://www.severalnines.com/sandbox/index.php"&gt;MySQL Cluster 6.3  slave medium sandbox&lt;/a&gt;. The Cluster is going to act as a slave collecting data from two master mysql servers. The sandbox I am using comes with two mysql servers that are acting as slaves in this setup.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Installed &lt;a href="http://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt; and two VMs (Linux, Ubuntu)&lt;br /&gt;In each VM (server01 and server02) I installed one &lt;a href="http://dev.mysql.com/downloads/mysql/5.1.html#downloads"&gt;mysql server&lt;/a&gt;.&lt;br /&gt;These two mysql servers are acting as masters.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Creating the tables&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;on the Cluster:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE TABLE `sensor` (&lt;br /&gt;`id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`sensor_id` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;`data` varchar(1024) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`,`sensor_id`),&lt;br /&gt;KEY `sensor_id` (`sensor_id`)&lt;br /&gt;) ENGINE=ndbcluster partition by key(sensor_id);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;and on the masters:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE TABLE `sensor` (&lt;br /&gt;`id` int(11) NOT NULL AUTO_INCREMENT,&lt;br /&gt;`sensor_id` int(11) NOT NULL DEFAULT '0',&lt;br /&gt;`data` varchar(1024) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`id`,`sensor_id`),&lt;br /&gt;KEY `sensor_id` (`sensor_id`)&lt;br /&gt;) ENGINE=innodb;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;(btw - why does not innodb let me create the table if i change the order of 'id' and ' sensor_id' ???)&lt;br /&gt;Then it was just a matter of setting up the replication links between the each master and slave:&lt;br /&gt;&lt;code&gt;server01 (master1) ---&gt; barracuda (slave1)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;server02 (master2) ---&gt; barracuda (slave2)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Setup the GRANTs on master1 and master2:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;GRANT REPLICATION SLAVE ON *.* TO 'repl'@'barracuda' identified by 'password'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resetting master1 and master2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just to make it simple to have a good position to start from in the binary logs (show master status would have worked to but it would have been more to wrote..)&lt;br /&gt;&lt;code&gt;RESET MASTER&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;On slave1&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;code&gt;CHANGE MASTER TO MASTER_HOST='server01', MASTER_USER='repl', MASTER_PASSWORD='password';&lt;br /&gt;START SLAVE;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;On slave2&lt;/span&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;CHANGE MASTER TO MASTER_HOST='server02', MASTER_USER='repl', MASTER_PASSWORD='password';&lt;br /&gt;START SLAVE;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generating load on the masters&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On server01 and server02 I then started &lt;a href="http://www.severalnines.com/bencher/"&gt;bencher&lt;/a&gt; to insert data into the sensor table:&lt;br /&gt;&lt;code&gt;test@server01: src/bencher -s /tmp/mysql.sock -t 1 -l 10000000 -q "INSERT INTO sensor(sensor_id,data) VALUES (1, &amp;lt;1024B of data&amp;gt;)" &lt;/code&gt;&lt;br /&gt;&lt;code&gt;test@server02: src/bencher -s /tmp/mysql.sock -t 1 -l 10000000 -q "INSERT INTO sensor(sensor_id,data) VALUES (2, &amp;lt;1024B of data&amp;gt;)" &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And the masters where looking like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZP94gz0B_KE/Sd4JXmXx7vI/AAAAAAAAAH4/ZVwapvR4KxU/s1600-h/masters.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 150px;" src="http://4.bp.blogspot.com/_ZP94gz0B_KE/Sd4JXmXx7vI/AAAAAAAAAH4/ZVwapvR4KxU/s320/masters.png" alt="" id="BLOGGER_PHOTO_ID_5322702110640434930" border="0" /&gt;&lt;/a&gt;(please not that I did not try to stress the system that much here since I only have one computer)&lt;br /&gt;&lt;br /&gt;And the slaves on Cluster:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/Sd4J1xzyzxI/AAAAAAAAAIA/Pp7TzEOle88/s1600-h/slave.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 198px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/Sd4J1xzyzxI/AAAAAAAAAIA/Pp7TzEOle88/s320/slave.png" alt="" id="BLOGGER_PHOTO_ID_5322702629106798354" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-2357101027741488468?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/2357101027741488468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=2357101027741488468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2357101027741488468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/2357101027741488468'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/04/multi-source-replication-with-mysql.html' title='Multi-source replication with MySQL Cluster'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZP94gz0B_KE/SdXRGlo-kNI/AAAAAAAAAHw/c-K60cjV7Q4/s72-c/multisource.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-9001851259990149504</id><published>2009-03-31T20:48:00.003+01:00</published><updated>2009-03-31T21:04:26.806+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uc2009'/><title type='text'>MySQL Cluster @ UC</title><content type='html'>The UC is closing in fast and there are a number of (potentially) interesting &lt;a href="http://en.oreilly.com/mysql2009/public/schedule/topic/213"&gt;talks&lt;/a&gt; around MySQL Cluster.&lt;br /&gt;Personally, I will give two talks (sessions):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.oreilly.com/mysql2009/public/schedule/detail/6217"&gt;MySQL Cluster 6.4 (7.0) - New Features&lt;/a&gt;&lt;br /&gt;I will talk about ONLINE ADD NODE, and multithreaded data node, and the rest of the things that are new in 7.0. Please note that MySQL Cluster 6.4 changed name to 7.0, but the session title didn't.&lt;br /&gt;When and Where:  Ballroom A at 05:15pm, Tuesday, 04/21/2009&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.oreilly.com/mysql2009/public/schedule/detail/6219"&gt;LDAP for MySQL Cluster- back-ndb&lt;/a&gt;&lt;br /&gt;Together with Howard Chu, CTO of Symas, we will present OpenLDAP for MySQL Cluster&lt;span style="text-decoration: underline;"&gt;.&lt;/span&gt; Check out this &lt;a href="http://johanandersson.blogspot.com/2009/03/ldap-and-mysql-cluster.html"&gt;blog post&lt;/a&gt; for some basic information about OpenLDAP for MySQL. We will talk about how it scales, performance, limitations, etc etc.&lt;br /&gt;When and Where:  Ballroom B at 02:00pm, Thursday, 04/23/2009&lt;/li&gt;&lt;/ul&gt;A list of talks about MySQL Cluster can be found &lt;a href="http://en.oreilly.com/mysql2009/public/schedule/topic/213"&gt;here&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-9001851259990149504?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/9001851259990149504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=9001851259990149504' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/9001851259990149504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/9001851259990149504'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/03/mysql-cluster-uc.html' title='MySQL Cluster @ UC'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-6448626044528151393</id><published>2009-03-31T20:13:00.007+01:00</published><updated>2009-03-31T20:33:34.617+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ldap'/><title type='text'>LDAP and MySQL Cluster</title><content type='html'>There are two LDAP Directory Servers available that supports MySQL Cluster - &lt;a href="http://www.openldap.org/"&gt;OpenLDAP&lt;/a&gt; (supported and maintained by &lt;a href="http://www.symas.com/"&gt;Symas Corp.&lt;/a&gt;) and &lt;a href="http://www.opends.org/"&gt;OpenDS&lt;/a&gt; (Sun Microsystems).  Both of them have implemented a back-end called back-ndb that talks direclty to the data nodes. This means that they use the NDBAPI directly to access data in the cluster, thus bypassing the MySQL Server.&lt;br /&gt;&lt;br /&gt;Using MySQL Cluster as the back-end makes it possible to easily scale out the LDAP layer without using replication between LDAP servers. If you need to have more capacity in the LDAP layer, add another LDAP server (online, no service interruption), if you need more storage capacity, add data nodes (online, no service interruption). This offers incredible scalability. And no single point of failure.&lt;br /&gt;&lt;br /&gt;But since the data is stored in MYSQL Cluster, you can also use SQL to access the data, simultaneously with the LDAP accesses. See the picture below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZP94gz0B_KE/SdJvyWRAGXI/AAAAAAAAAHo/CPJMdzW4XH8/s1600-h/ldap.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 373px; height: 215px;" src="http://2.bp.blogspot.com/_ZP94gz0B_KE/SdJvyWRAGXI/AAAAAAAAAHo/CPJMdzW4XH8/s320/ldap.png" alt="" id="BLOGGER_PHOTO_ID_5319437020639009138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OpenDS actually uses &lt;a href="https://code.launchpad.net/%7Endb-bindings"&gt;ndb-bindings&lt;/a&gt; which is a Java layer (JNI wrapper) on top of the C++ NDBAPI. OpenLDAP use the Direct C++ NDBAPI directly. The use of Direct APIs makes a good foundation for high performance.&lt;br /&gt;&lt;br /&gt;Besides that there is the usual differences in functionality you can expect from two different Directory Servers (I am not going into details about that here), but both implementation has the similar layout when it comes to the data model that is used inside MySQL Cluster to support LDAP accesses. This similarity comes from the fact that I have had my fingers in both implementations :) . However, I must say that I know the implemenation of OpenLDAP better.&lt;br /&gt;&lt;br /&gt;If you want more details you should come to the &lt;a href="http://www.mysqlconf.com/"&gt;MySQL User Conference 2009&lt;/a&gt;. During the UC, I will have a &lt;a href="http://en.oreilly.com/mysql2009/public/schedule/detail/6219"&gt;session&lt;/a&gt; together with Howard Chu on OpenLDAP for MySQL Cluster. There will also be a BOF for OpenDS (TBD exaclty when, since the BoFs have not been scheduled yet when this post was written (31st of March, 2009), but keep your eyes open!&lt;br /&gt;&lt;br /&gt;If you are interested in getting started with OpenLDAP for MySQL Cluster, then you can follow this &lt;a href="http://www.severalnines.com/blog/openldap.php"&gt;quickstart guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I have also got &lt;a href="http://www.keplerproject.org/lualdap/"&gt;lualdap&lt;/a&gt; to work with OpenLDAP for MySQL Cluster. Quite cool, since it then can be accessed from the MySQL Proxy (thanks to Stephane Varoqui, Star Consultant MySQL/Sun based in Paris, for this idea)... This opens up quite some interesting things when it  comes to authentication.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-6448626044528151393?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/6448626044528151393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=6448626044528151393' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6448626044528151393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/6448626044528151393'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/03/ldap-and-mysql-cluster.html' title='LDAP and MySQL Cluster'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZP94gz0B_KE/SdJvyWRAGXI/AAAAAAAAAHo/CPJMdzW4XH8/s72-c/ldap.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-7165390876114533701</id><published>2009-03-19T20:01:00.011Z</published><updated>2009-04-14T09:13:27.661+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='benchmarking'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='online add node'/><title type='text'>online add node - preliminary numbers (2)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Scenario&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;: Grow from two data nodes to four using ONLINE ADD NODE and REORGANIZE PARTITION of a 2GB table, and UPDATE traffic&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setup for each data node:&lt;br /&gt;* Dual cpu - quad core running at 2.33GHz.&lt;br /&gt;* 8GB of RAM&lt;br /&gt;* DataMemory=4096MB&lt;br /&gt;* MaxNoOfExecutionThreads=8&lt;br /&gt;* Configuration generated by &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt;&lt;br /&gt;* Bound execution threads to cores (LockExec/Maint....Thread..)&lt;br /&gt;* Completely distributed setup.&lt;br /&gt;&lt;br /&gt;Created the following table and filled it with 2M rows which gives a table (different of last time to simplify further tests) of 2GB in size:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE TABLE `t1` (&lt;br /&gt;`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,&lt;br /&gt;`b` int(10) unsigned DEFAULT NULL,&lt;br /&gt;`c` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;`d` varbinary(768) DEFAULT NULL,&lt;br /&gt;`e` varbinary(256) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`a`),&lt;br /&gt;KEY `c` (`c`)&lt;br /&gt;) ENGINE=ndbcluster&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Baseline (two data nodes)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Random updates of 256B:&lt;br /&gt;&lt;code&gt;UPDATE t1 SET e=&amp;lt;data&amp;gt; WHERE a=&amp;lt;random_value&amp;gt;&lt;/code&gt;&lt;br /&gt;where  DATA is 256 random bytes and RANDOM_VALUE=random value between 1..2M&lt;br /&gt;&lt;br /&gt;Running with &lt;a href="http://www.severalnines.com/bencher"&gt;bencher-0.12&lt;/a&gt;:&lt;br /&gt;&lt;code&gt;src/bencher -t 20 -l 100000&lt;/code&gt;&lt;br /&gt;20 threads&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Total throughput = 18315.06 qps&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Average response time=1089us for each update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CPU Util details at the end of this post (please note I was not trying to max out the data nodes with this test).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;With reorg on + no load &lt;/span&gt;&lt;br /&gt;&lt;code&gt;mysql&gt; alter table t1 reorganize partition;&lt;br /&gt;Query OK, 0 rows affected (2 min 44.58 sec)&lt;br /&gt;Records: 0  Duplicates: 0  Warnings: 0&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;With UPDATEs and ongoing reorg &lt;/span&gt;&lt;br /&gt;ongoing reorg means: &lt;code&gt;ALTER TABLE t1 REORGANIZE PARTITIONS;&lt;/code&gt;&lt;br /&gt;20 threads each doing updates as in baseline&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Total throughput = 10907.70 qps&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Average response time=1827us for each update&lt;/span&gt;&lt;br /&gt;And the reorg took:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; alter table t1 reorganize partition;                                &lt;br /&gt;Query OK, 0 rows affected &lt;span style="font-weight: bold;"&gt;(3 min 39.45 sec)&lt;/span&gt;&lt;br /&gt;Records: 0  Duplicates: 0  Warnings: 0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Cost in performance during reorg&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Throughput decreases with about 40% during the reorg.&lt;br /&gt;Latency increases with about 68% during the reorg.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;CPU DETAILS (baseline)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZP94gz0B_KE/ScKpT9aRNSI/AAAAAAAAAG4/Lt_qWbB9qqs/s1600-h/update-2nodes.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 230px; height: 320px;" src="http://1.bp.blogspot.com/_ZP94gz0B_KE/ScKpT9aRNSI/AAAAAAAAAG4/Lt_qWbB9qqs/s320/update-2nodes.png" alt="" id="BLOGGER_PHOTO_ID_5314996670617957666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZP94gz0B_KE/ScKpbAOQloI/AAAAAAAAAHA/_zTJAM4Rb0U/s1600-h/update-test-detailed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 230px; height: 320px;" src="http://1.bp.blogspot.com/_ZP94gz0B_KE/ScKpbAOQloI/AAAAAAAAAHA/_zTJAM4Rb0U/s320/update-test-detailed.png" alt="" id="BLOGGER_PHOTO_ID_5314996791631976066" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;CPU DETAILS (with UPDATE + reorg)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZP94gz0B_KE/ScK1rm4pOiI/AAAAAAAAAHI/eY1EABA4j7Q/s1600-h/updateduringreorf.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 223px;" src="http://4.bp.blogspot.com/_ZP94gz0B_KE/ScK1rm4pOiI/AAAAAAAAAHI/eY1EABA4j7Q/s320/updateduringreorf.png" alt="" id="BLOGGER_PHOTO_ID_5315010271027739170" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZP94gz0B_KE/ScK2FiOW5_I/AAAAAAAAAHY/bgFHRAMMU28/s1600-h/updateduringreorgdetailed.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 222px;" src="http://1.bp.blogspot.com/_ZP94gz0B_KE/ScK2FiOW5_I/AAAAAAAAAHY/bgFHRAMMU28/s320/updateduringreorgdetailed.png" alt="" id="BLOGGER_PHOTO_ID_5315010716453234674" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19281624-7165390876114533701?l=johanandersson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johanandersson.blogspot.com/feeds/7165390876114533701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19281624&amp;postID=7165390876114533701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7165390876114533701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19281624/posts/default/7165390876114533701'/><link rel='alternate' type='text/html' href='http://johanandersson.blogspot.com/2009/03/online-add-node-preliminary-numbers-2.html' title='online add node - preliminary numbers (2)'/><author><name>Johan Andersson</name><uri>http://www.blogger.com/profile/09202425156709885026</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZP94gz0B_KE/ScKpT9aRNSI/AAAAAAAAAG4/Lt_qWbB9qqs/s72-c/update-2nodes.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19281624.post-5488011399031522039</id><published>2009-03-19T07:10:00.008Z</published><updated>2009-03-19T14:38:35.185Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='benchmarking'/><category scheme='http://www.blogger.com/atom/ns#' term='MySQL CLuster 7.0'/><category scheme='http://www.blogger.com/atom/ns#' term='online add node'/><title type='text'>online add node - preliminary numbers</title><content type='html'>I want to measure the time it takes to do various &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-online-add-node.html"&gt;ONLINE ADD NODE&lt;/a&gt; operations in MySQL Cluster 7.0 and especially how long time it takes to repartition the data onto the newly added nodes. So here comes the first post on the subject.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;First off: Go from two data nodes to four using &lt;code&gt;ONLINE ADD NODE&lt;/code&gt; and &lt;code&gt;REORGANIZE PARTITION&lt;/code&gt; of 2GB tables, and no traffic system.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Setup for each data node:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dual cpu - quad core running at 2.33GHz.&lt;/li&gt;&lt;li&gt;8GB of RAM&lt;/li&gt;&lt;li&gt;DataMemory=4096MB&lt;/li&gt;&lt;li&gt;MaxNoOfExecutionThreads=8 &lt;/li&gt;&lt;li&gt;Configuration generated by &lt;a href="http://www.severalnines.com/config"&gt;Configurator&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Bound execution threads to cores (LockExec/Maint....Thread..)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Completely distributed setup.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Created the following table and filled it with 3M rows which gives a table of 2GB in size:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;CREATE TABLE `t1` (&lt;br /&gt;`a` bigint(20) unsigned NOT NULL,&lt;br /&gt;`b` int(10) unsigned DEFAULT NULL,&lt;br /&gt;`c` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;`d` varbinary(1024) DEFAULT NULL,&lt;br /&gt;PRIMARY KEY (`a`),&lt;br /&gt;KEY `c` (`c`)&lt;br /&gt;) ENGINE=ndbcluster DEFAULT CHARSET=latin1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Running &lt;a href="http://www.severalnines.com/config"&gt;add_node.sh&lt;/a&gt; to add two more data nodes (5 and 6):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ndb_mgm&gt; all status&lt;br /&gt;Connected to Management Server at: localhost:1186&lt;br /&gt;Node 3: started (mysql-5.1.32 ndb-7.0.4)&lt;br /&gt;Node 4: started (mysql-5.1.32 ndb-7.0.4)&lt;br /&gt;Node 5: not connected&lt;br /&gt;Node 6: not connected&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Running the &lt;code&gt;add_node.sh&lt;/code&gt; script (no traffic to db) took 14m48.535s (bulk of the time spent in rolling restart of the data nodes 3 and 4 - there is another  way of doing this part without rolling restart, but that requires initial planning.. i will revisit that soon).&lt;br /&gt;&lt;br /&gt;After the &lt;code&gt;add_node.sh&lt;/code&gt; script finished :&lt;br /&gt;&lt;code&gt;ndb_mgm&gt; all status&lt;br /&gt;Connected 
