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

<channel>
	<title>SoftLayer Blog &#187; database</title>
	<atom:link href="http://blog.softlayer.com/tag/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.softlayer.com</link>
	<description>A Behind the Scenes Look at the Best Hosting Provider in the World</description>
	<lastBuildDate>Wed, 15 May 2013 15:33:34 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>MongoDB Performance Analysis: Bare Metal v. Virtual</title>
		<link>http://blog.softlayer.com/2012/mongodb-performance-analysis-bare-metal-v-virtual/</link>
		<comments>http://blog.softlayer.com/2012/mongodb-performance-analysis-bare-metal-v-virtual/#comments</comments>
		<pubDate>Thu, 20 Dec 2012 15:30:32 +0000</pubDate>
		<dc:creator>Harold Hannon</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[10gen]]></category>
		<category><![CDATA[bare metal]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[engineered servers]]></category>
		<category><![CDATA[IOPS]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[platform]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=10070</guid>
		<description><![CDATA[Developers can be cynical. When &#8220;the next great thing in technology&#8221; is announced, I usually wait to see how it performs before I get too excited about it &#8230; Show me how that &#8220;next great thing&#8221; compares apples-to-apples with the competition, and you&#8217;ll get my attention. With the launch of MongoDB at SoftLayer, I&#8217;d guess [...]]]></description>
			<content:encoded><![CDATA[<p>Developers can be cynical. When &#8220;the next great thing in technology&#8221; is announced, I usually wait to see how it performs before I get too excited about it &#8230; Show me how that &#8220;next great thing&#8221; compares apples-to-apples with the competition, and you&#8217;ll get my attention. With the launch of <a href="https://www.softlayer.com/solutions/big-data/mongodb">MongoDB</a> at SoftLayer, I&#8217;d guess a lot of developers outside of SoftLayer and 10gen have the same &#8220;wait and see&#8221; attitude about the new platform, so I put our new <a href="https://www.softlayer.com/solutions/big-data/mongodb/pricing">MongoDB engineered servers</a> to the test.</p>
<p>When I shared <a href="http://blog.softlayer.com/2012/mongodb-architectural-best-practices/">MongoDB architectural best practices</a>, I referenced a few of the significant optimizations our team worked with 10gen to incorporate into our engineered servers (<a href="http://knowledgelayer.softlayer.com/questions/585/Engineered+MongoDB+Installations">cheat sheet</a>). To illustrate the impact of these changes in MongoDB performance, we ran 10gen&#8217;s recommended <a href="http://www.mongodb.org/display/DOCS/JS+Benchmarking+Harness">benchmarking harness</a> (freely available for download and testing of your own environment) on our three tiers of engineered servers alongside equivalent shared virtual environments commonly deployed by the MongoDB community. We&#8217;ve made a pretty big deal about the performance impact of running MongoDB on optimized bare metal infrastructure, so it&#8217;s time to put our money where our mouth is.</p>
<h3>The Testing Environment</h3>
<p style="margin-top:5px; padding-top:0;">For each of the available SoftLayer MongoDB engineered servers, data sets of 512kb documents were preloaded onto single MongoDB instances. The data sets were created with varying size compared to available memory to allow for data sets that were both larger (2X) and smaller than available memory. Each test also ensured that the data set was altered during the test run frequently enough to prevent the queries from caching all of the data into memory.</p>
<p>Once the data sets were created, <a href="http://jmeter.apache.org/">JMeter</a> server instances with 4 cores and 16GB of RAM were used to drive &#8216;benchrun&#8217; from the 10gen benchmarking harness. This diagram illustrates how we set up the testing environment (click for a better look):</p>
<p><a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/mongodbtestsetup.png"><img class="centered" src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/mongodbtestsetup_s.png" alt="MongoDB Performance Analysis Setup"/></a></p>
<p>These Jmeter servers function as the clients generating traffic on the MongoDB instances. Each client generated random query and update requests with a ratio of six queries per update (The update requests in the test were to ensure that data was not allowed to fully cache into memory and never exercise reads from disk). These tests were designed to create an extreme load on the servers from an exponentially increasing number of clients until the system resources became saturated, and we recorded the resulting performance of the MongoDB application.</p>
<p>At the Medium (MD) and Large (LG) engineered server tiers, performance metrics were run separately for servers using 15K SAS hard drive data mounts and servers using SSD hard drive data mounts. If you missed the post <a href="http://blog.softlayer.com/2012/big-data-at-softlayer-the-importance-of-iops/">comparing the IOPS statistics between different engineered server hard drive configurations</a>, be sure to check it out. For a better view of the results in a given graph, click the image included in the results below to see a larger version.</p>
<style type="text/css">
  .perfan {width:305px; float:left; padding:5px; margin:5px; size:6px; font-weight:bold; text-align:center; color:#972f2c;}
  .perfan img {margin-left:auto; margin-right:auto;}
  .comparison {float:left; margin-left:10px; margin-right:10px;}
  h3{font-size:16px;color:#972F2c;}
 </style>
<h3>Test Case 1: Small MongoDB Engineered Servers vs Shared Virtual Instance</h3>
<p style="margin-top:5px; padding-top:0; margin-bottom:0;padding-bottom:0;"><strong>Servers</strong></p>
<div class="comparison">Small (SM) MongoDB Engineered Server<br />
Single 4-core Intel 1270 CPU<br />
64-bit CentOS<br />
8GB RAM<br />
2 x 500GB SATAII &#8211; RAID1<br />
1Gb Network</div>
<div class="comparison">Virtual Provider Instance<br />
4 Virtual Compute Units<br />
64-bit CentOS<br />
7.5GB RAM<br />
2 x 500GB Network Storage &#8211; RAID1<br />
1Gb Network</div>
<div style="clear:both; height:1px; margin:0; padding:0;">&nbsp;</div>
<p style="margin-bottom:0;padding-bottom:0;"><strong>Tests Performed</strong></p>
<div style="margin-left:10px;">Small Data Set (8GB of .5mb documents)<br />
200 iterations of 6:1 query-to-update operations<br />
Concurrent client connections exponentially increased from 1 to 32<br />
Test duration spanned 48 hours</div>
<div class="perfan">Average Read Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan1.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan1.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Read Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan2.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan2.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Average Write Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan3.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan3.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Write Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan4.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan4.jpg" alt="MongoDB Performance Analysis"/></a></div>
<p><span id="more-10070"></span></p>
<h3>Test Case 2: Medium MongoDB Engineered Servers vs Shared Virtual Instance</h3>
<p style="margin-top:5px; padding-top:0; margin-bottom:0;padding-bottom:0;"><strong>Servers (15K SAS Data Mount Comparison)</strong></p>
<div class="comparison">Medium (MD) MongoDB Engineered Server<br />
Dual 6-core Intel 5670 CPUs<br />
64-bit CentOS<br />
36GB RAM<br />
2 x 64GB SSD &#8211; RAID1 (Journal Mount)<br />
4 x <strong>300GB 15K SAS</strong> &#8211; RAID10 (Data Mount)<br />
1Gb Network &#8211; Bonded</div>
<div class="comparison">Virtual Provider Instance<br />
26 Virtual Compute Units<br />
64-bit CentOS<br />
30GB RAM<br />
2 x 64GB Network Storage &#8211; RAID1 (Journal Mount)<br />
4 x 300GB Network Storage &#8211; RAID10 (Data Mount)<br />
1Gb Network</div>
<div style="clear:both; height:1px; margin:0; padding:0;">&nbsp;</div>
<p style="margin-bottom:0;padding-bottom:0;"><strong>Tests Performed</strong></p>
<div style="margin-left:10px;">Small Data Set (32GB of .5mb documents)<br />
200 iterations of 6:1 query-to-update operations<br />
Concurrent client connections exponentially increased from 1 to 128<br />
Test duration spanned 48 hours</div>
<div class="perfan">Average Read Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan5.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan5.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Read Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan6.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan6.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Average Write Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan7.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan7.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Write Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan8.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan8.jpg" alt="MongoDB Performance Analysis"/></a></div>
<p style="margin-top:5px; padding-top:0; margin-bottom:0;padding-bottom:0;"><strong>Servers (SSD Data Mount Comparison)</strong></p>
<div class="comparison">Medium (MD) MongoDB Engineered Server<br />
Dual 6-core Intel 5670 CPUs<br />
64-bit CentOS<br />
36GB RAM<br />
2 x 64GB SSD &#8211; RAID1 (Journal Mount)<br />
4 x <strong>400GB SSD</strong> &#8211; RAID10 (Data Mount)<br />
1Gb Network &#8211; Bonded</div>
<div class="comparison">Virtual Provider Instance<br />
26 Virtual Compute Units<br />
64-bit CentOS<br />
30GB RAM<br />
2 x 64GB Network Storage &#8211; RAID1 (Journal Mount)<br />
4 x 300GB Network Storage &#8211; RAID10 (Data Mount)<br />
1Gb Network</div>
<div style="clear:both; height:1px; margin:0; padding:0;">&nbsp;</div>
<p style="margin-bottom:0;padding-bottom:0;"><strong>Tests Performed</strong></p>
<div style="margin-left:10px;">Small Data Set (32GB of .5mb documents)<br />
200 iterations of 6:1 query-to-update operations<br />
Concurrent client connections exponentially increased from 1 to 128<br />
Test duration spanned 48 hours</div>
<div class="perfan">Average Read Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan9.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan9.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Read Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan10.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan10.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Average Write Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan11.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan11.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Write Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan12.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan12.jpg" alt="MongoDB Performance Analysis"/></a></div>
<h3>Test Case 3: Large MongoDB Engineered Servers vs Shared Virtual Instance</h3>
<p style="margin-top:5px; padding-top:0; margin-bottom:0;padding-bottom:0;"><strong>Servers (15K SAS Data Mount Comparison)</strong></p>
<div class="comparison">Large (LG) MongoDB Engineered Server<br />
Dual 8-core Intel E5-2620 CPUs<br />
64-bit CentOS<br />
128GB RAM<br />
2 x 64GB SSD &#8211; RAID1 (Journal Mount)<br />
6 x <strong>600GB 15K SAS</strong> &#8211; RAID10 (Data Mount)<br />
1Gb Network &#8211; Bonded</div>
<div class="comparison">Virtual Provider Instance<br />
26 Virtual Compute Units<br />
64-bit CentOS<br />
64GB RAM (Maximum available on this provider)<br />
2 x 64GB Network Storage &#8211; RAID1 (Journal Mount)<br />
6 x 600GB Network Storage &#8211; RAID10 (Data Mount)<br />
1Gb Network</div>
<div style="clear:both; height:1px; margin:0; padding:0;">&nbsp;</div>
<p style="margin-bottom:0;padding-bottom:0;"><strong>Tests Performed</strong></p>
<div style="margin-left:10px;">Small Data Set (64GB of .5mb documents)<br />
200 iterations of 6:1 query-to-update operations<br />
Concurrent client connections exponentially increased from 1 to 128<br />
Test duration spanned 48 hours</div>
<div class="perfan">Average Read Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan13.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan13.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Read Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan14.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan14.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Average Write Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan15.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan15.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Write Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan16.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan16.jpg" alt="MongoDB Performance Analysis"/></a></div>
<p style="margin-top:5px; padding-top:0; margin-bottom:0;padding-bottom:0;"><strong>Servers (SSD Data Mount Comparison)</strong></p>
<div class="comparison">Large (LG) MongoDB Engineered Server<br />
Dual 8-core Intel E5-2620 CPUs<br />
64-bit CentOS<br />
128GB RAM<br />
2 x 64GB SSD &#8211; RAID1 (Journal Mount)<br />
6 x <strong>400GB SSD</strong> &#8211; RAID10 (Data Mount)<br />
1Gb Network &#8211; Bonded</div>
<div class="comparison">Virtual Provider Instance<br />
26 Virtual Compute Units<br />
64-bit CentOS<br />
64GB RAM (Maximum available on this provider)<br />
2 x 64GB Network Storage &#8211; RAID1 (Journal Mount)<br />
6 x 600GB Network Storage &#8211; RAID10 (Data Mount)<br />
1Gb Network</div>
<div style="clear:both; height:1px; margin:0; padding:0;">&nbsp;</div>
<p style="margin-bottom:0;padding-bottom:0;"><strong>Tests Performed</strong></p>
<div style="margin-left:10px;">Small Data Set (64GB of .5mb documents)<br />
200 iterations of 6:1 query-to-update operations<br />
Concurrent client connections exponentially increased from 1 to 128<br />
Test duration spanned over 48 hours</div>
<div class="perfan">Average Read Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan17.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan17.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Read Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan18.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan18.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Average Write Operations per Second<br />
by Concurrent Client<br />
<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan19.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan19.jpg" alt="MongoDB Performance Analysis"/></a></div>
<div class="perfan">Peak Write Operations per Second<br />
by Concurrent Client<a href="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan20.png"><img src="http://cdn.softlayer.com/innerlayer/mongodbperformanceanalysis/perfan20.jpg" alt="MongoDB Performance Analysis"/></a></div>
<h3>Impressions from Performance Testing</h3>
<p style="margin-top:5px; padding-top:0;">The results speak for themselves. Running a Mongo DB <a href="https://www.softlayer.com/bigdata">big data</a> solution on a shared virtual environment has significant drawbacks when compared to running MongoDB on a single-tenant bare metal offering.  Disk I/O is by far the most limiting resource for MongoDB, and relying on shared network-attached storage (with much lower disk I/O) makes this limitation very apparent. Beyond the average and peak statistics above, performance varied much more significantly in the virtual instance environment, so it&#8217;s not as consistent and predictable as a bare metal.</p>
<p style="margin-bottom:0; padding-bottom:0;"><strong>Highlights:</strong></p>
<ul style="margin-top:5px; padding-top:0;">
<li>When a working data set is smaller than available memory, query performance increases.</li>
<li>The number of clients performing queries has an impact on query performance because more data is being actively cached at a rapid rate.
<li>The addition of a separate Journal Mount volume significantly improves performance. Because the Small (SM) engineered server does not include a secondary mount for Journals, whenever MongoDB began to journal, the disk I/O associated with journalling was disruptive to the query and update operations performed on the Data Mount.</li>
<li>The best deployments in terms of operations per second, stability and control were the configurations with a RAID10 SSD Data Mount and a RAID1 SSD Journal Mount. These configurations are available in both our Medium and Large offerings, and I&#8217;d highly recommend them.</li>
</ul>
<p>-Harold</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2012/mongodb-performance-analysis-bare-metal-v-virtual/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Big Data at SoftLayer: The Importance of IOPS</title>
		<link>http://blog.softlayer.com/2012/big-data-at-softlayer-the-importance-of-iops/</link>
		<comments>http://blog.softlayer.com/2012/big-data-at-softlayer-the-importance-of-iops/#comments</comments>
		<pubDate>Mon, 17 Dec 2012 20:00:31 +0000</pubDate>
		<dc:creator>Kelly Hurst</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[comparison]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[data set]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[disk I/O]]></category>
		<category><![CDATA[engineered servers]]></category>
		<category><![CDATA[hard drives]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[IOPS]]></category>
		<category><![CDATA[journal]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[operations]]></category>
		<category><![CDATA[output]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[RAID]]></category>
		<category><![CDATA[rate]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[speed]]></category>
		<category><![CDATA[SSD]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=10220</guid>
		<description><![CDATA[The jet flow gates in the Hoover Dam can release up to 73,000 cubic feet &#8212; the equivalent of 546,040 gallons &#8212; of water per second at 120 miles per hour. Imagine replacing those jet flow gates with a single garden hose that pushes 25 gallons per minute (or 0.42 gallons per second). Things would [...]]]></description>
			<content:encoded><![CDATA[<p>The jet flow gates in the Hoover Dam can release up to 73,000 cubic feet &mdash; the equivalent of 546,040 gallons &mdash; of water per second at 120 miles per hour. Imagine replacing those jet flow gates with a single garden hose that pushes 25 gallons per minute (or 0.42 gallons per second). Things would get ugly pretty quickly. In the same way, a massive &#8220;big data&#8221; infrastructure can be crippled by insufficient IOPS.</p>
<p><a href="http://en.wikipedia.org/wiki/IOPS">IOPS</a> &mdash; Input/Output Operations Per Second &mdash; measure computer storage in terms of the number of read and write operations it can perform in a second. IOPS are a primary concern for database environments where content is being written and queried constantly, and when we take those database environments to the extreme (big data), the importance of IOPS can&#8217;t be overstated: If you aren&#8217;t able perform database reads and writes quickly in a big data environment, it doesn&#8217;t matter how many gigabytes, terabytes or petabytes you have in your database &#8230; You won&#8217;t be able to efficiently access, add to or modify your data set.</p>
<p>As we worked with <a href="http://www.10gen.com/">10gen</a> to create, test and tweak SoftLayer&#8217;s <a href="http://www.softlayer.com/solutions/big-data/mongodb/pricing">MongoDB engineered servers</a>, our primary focus centered on performance. Since the performance of massively scalable databases is dictated by the read and write operations to that database&#8217;s data set, we invested significant resources into maximizing the IOPS for each engineered server &#8230; And that involved a lot more than just swapping hard drives out of servers until we found a configuration that worked best. Yes, &#8220;Disk I/O&#8221; &mdash; the amount of input/output operations a given disk can perform &mdash; plays a significant role in big data IOPS, but many other factors limit big data performance. How is performance impacted by network-attached storage? At what point will a given CPU become a bottleneck? How much RAM should included in a base configuration to accommodate the load we expect our users to put on each tier of server? Are there operating system changes that can optimize the performance of a platform like MongoDB?</p>
<p>The resulting engineered servers are a testament to the blood, sweat and tears that were shed in the name of creating a reliable, high-performance big data environment. And I can prove it.</p>
<p>Most shared virtual instances &mdash; the scalable infrastructure many users employ for big data &mdash; use network-attached storage for their platform&#8217;s storage. When data has to be queried over a network connection (rather than from a local disk), you introduce latency and more &#8220;moving parts&#8221; that have to work together. Disk I/O might be amazing on the enterprise SAN where your data lives, but because that data is not stored on-server with your processor or memory resources, performance can sporadically go from &#8220;Amazing&#8221; to &#8220;I Hate My Life&#8221; depending on network traffic. When I&#8217;ve tested the IOPS for network-attached storage from a large competitor&#8217;s virtual instances, I saw an average of around 400 IOPS per mount. It&#8217;s difficult to say whether that&#8217;s &#8220;not good enough&#8221; because every application will have different needs in terms of concurrent reads and writes, but it certainly could be better. We performed some internal testing of the IOPS for the hard drive configurations in our Medium and Large MongoDB engineered servers to give you an apples-to-apples comparison.</p>
<p>Before we get into the tests, here are the specs for the servers we&#8217;re using:</p>
<style type="text/css">
  .comparison {float:left; margin-left:10px; margin-right:10px;}
  table th{background-color: #972f2c; color:#fff; padding:2px;}
 </style>
<div class="comparison"><strong>Medium (MD) MongoDB Engineered Server</strong><br />
Dual 6-core Intel 5670 CPUs<br />
CentOS 6 64-bit<br />
36GB RAM<br />
1Gb Network &#8211; Bonded</div>
<div class="comparison"><strong>Large (LG) MongoDB Engineered Server</strong><br />
Dual 8-core Intel E5-2620 CPUs<br />
CentOS 6 64-bit<br />
128GB RAM<br />
1Gb Network &#8211; Bonded</div>
<div style="clear:both; height:1px; margin:0; padding:0;">&nbsp;</div>
<p>The numbers shown in the table below reflect the average number of IOPS we recorded with a 100% random read/write workload on each of these engineered servers. To measure these IOPS, we used a tool called <a href="http://freecode.com/projects/fio">fio</a> with an 8k block size and iodepth at 128. Remembering that the virtual instance using network-attached storage was able to get 400 IOPS per mount, let&#8217;s look at how our &#8220;base&#8221; configurations perform:</p>
<table style="margin:0 auto; border:0;">
<tr>
<th colspan="2">Medium &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 4 x 300GB 15k SAS RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>2937</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>1306</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>1720</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>772</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>19659</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8869</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th colspan="2">Medium &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 4 x 400GB SSD RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>30269</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>13124</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>33757</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>14168</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>19644</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8882</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th colspan="2">Large &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 6 x 600GB 15k SAS RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>4820</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>2080</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>2461</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>1099</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>19639</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8772</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<th colspan="2">Large &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 6 x 400GB SSD RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>32403</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>13928</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>34536</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>15412</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>19578</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8835</td>
</tr>
</table>
<p>Clearly, the 400 IOPS per mount results you&#8217;d see in SAN-based storage can&#8217;t hold a candle to the performance of a physical disk, regardless of whether it&#8217;s SAS or SSD. As you&#8217;d expect, the &#8220;Journal&#8221; reads and writes have roughly the same IOPS between all of the configurations because all four configurations use 2 x 64GB SSD drives in RAID1. In both configurations, SSD drives provide better Data mount read/write performance than the 15K SAS drives, and the results suggest that having more physical drives in a Data mount will provide higher average IOPS. To put that observation to the test, I maxed out the number of hard drives in both configurations (10 in the 2U MD server and 34 in the 4U LG server) and recorded the results:</p>
<table style="margin:0 auto;">
<tr>
<th colspan="2">Medium &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 10 x 300GB 15k SAS RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>7175</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>3481</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>6468</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>1763</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>18383</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8765</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th colspan="2">Medium &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 10 x 400GB SSD RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>32160</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>12181</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>34642</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>14545</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>19699</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8764</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th colspan="2">Large &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 34 x 600GB 15k SAS RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>17566</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>11918</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>9978</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>6526</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>18522</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8722</td>
</tr>
<tr>
<td>&nbsp;</td>
</tr>
<tr>
<th colspan="2">Large &#8211; 2 x 64GB SSD RAID1 (Journal) &#8211; 34 x 400GB SSD RAID10 (Data)</th>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/logs</td>
<td>34220</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/logs</td>
<td>15388</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data</td>
<td>35998</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data</td>
<td>17120</td>
</tr>
<tr>
<td>Random Read IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>17998</td>
</tr>
<tr>
<td>Random Write IOPS &#8211; /var/lib/mongo/data/journal</td>
<td>8822</td>
</tr>
</table>
<p>It should come as no surprise that by adding more drives into the configuration, we get better IOPS, but you might be wondering why the results aren&#8217;t &#8220;betterer&#8221; when it comes to the IOPS in the SSD drive configurations. While the IOPS numbers improve going from four to ten drives in the medium engineered server and six to thirty-four drives in the large engineered server, they don&#8217;t increase as significantly as the IOPS differences in the SAS drives. This is what I meant when I explained that several factors contribute to and potentially limit IOPS performance. In this case, the limiting factor throttling the (ridiculously high) IOPS is the RAID card we are using in the servers. We&#8217;ve been working with our RAID card vendor to test a new card that will open a little more headroom for SSD IOPS, but that replacement card doesn&#8217;t provide the consistency and reliability we need for these servers (which is just as important as speed).</p>
<p>There are probably a dozen other observations I could point out about how each result compares with the others (and why), but I&#8217;ll stop here and open the floor for you. Do you notice anything interesting in the results? Does anything surprise you? What kind of IOPS performance have you seen from your server/cloud instance when running a tool like fio?</p>
<p>-Kelly</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2012/big-data-at-softlayer-the-importance-of-iops/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Big Data at SoftLayer: MongoDB</title>
		<link>http://blog.softlayer.com/2012/big-data-at-softlayer-mongodb/</link>
		<comments>http://blog.softlayer.com/2012/big-data-at-softlayer-mongodb/#comments</comments>
		<pubDate>Tue, 04 Dec 2012 15:25:56 +0000</pubDate>
		<dc:creator>Duke Skarda</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Executive Blog]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[10gen]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[bare metal]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[custom]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[global]]></category>
		<category><![CDATA[horizontal]]></category>
		<category><![CDATA[launch]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[on-demand]]></category>
		<category><![CDATA[product]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[specialized]]></category>
		<category><![CDATA[volume]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=9955</guid>
		<description><![CDATA[In one day, Facebook&#8217;s databases ingest more than 500 terabytes of data, Twitter processes 500 million Tweets and Tumblr users publish more than 75 million posts. With such an unprecedented volume of information, developers face significant challenges when it comes to building an application&#8217;s architecture and choosing its infrastructure. As a result, demand has exploded [...]]]></description>
			<content:encoded><![CDATA[<p>In one day, Facebook&#8217;s databases ingest more than <a href="http://gigaom.com/data/facebook-is-collecting-your-data-500-terabytes-a-day/">500 terabytes of data</a>, Twitter processes <a href="http://news.cnet.com/8301-1023_3-57541566-93/report-twitter-hits-half-a-billion-tweets-a-day/">500 million Tweets</a> and Tumblr users publish more than <a href="http://www.tumblr.com/about">75 million posts</a>. With such an unprecedented volume of information, developers face significant challenges when it comes to building an application&#8217;s architecture and choosing its infrastructure. As a result, demand has exploded for &#8220;big data&#8221; solutions &mdash; resources that make it possible to process, store, analyze, search and deliver data from large, complex data sets. In light of that demand, SoftLayer has been working in strategic partnership with <a href="http://www.10gen.com/">10gen</a> &mdash; the creators of <a href="http://www.mongodb.org/">MongoDB</a> &mdash; to develop a high-performance, on-demand, big data solution. Today, we&#8217;re excited to announce the launch of specialized <a href="https://www.softlayer.com/solutions/big-data/mongodb">MongoDB servers</a> at SoftLayer.</p>
<p>If you&#8217;ve configured an infrastructure to accommodate big data, you know how much of a pain it can be: You choose your hardware, you configure it to run NoSQL, you install an open source NoSQL project that you think will meet your needs, and you keep tweaking your environment to optimize its performance. Assuming you have the resources (and patience) to get everything running efficiently, you&#8217;ll wind up with the horizontally scalable database infrastructure you need to handle the volume of content you and your users create and consume. SoftLayer and 10gen are making that process a whole lot easier.</p>
<p>Our new MongoDB solutions take the time and guesswork out of configuring a big data environment. We give you an easy-to-use system for designing and ordering everything you need. You can start with a single server or roll out multiple servers in a single replica set across multiple data centers, and in under two hours, an <em>optimized</em> MongoDB environment is provisioned and ready to be used. I stress that it&#8217;s an &#8220;optimized&#8221; environment because that&#8217;s been our key focus. We collaborated with 10gen engineers on hardware and software configurations that provide the most robust performance for MongoDB, and we incorporated many of their MongoDB best practices. The resulting &#8220;engineered servers&#8221; are <a href="https://www.softlayer.com/solutions/big-data/">big data</a> powerhouses:</p>
<p><a href="http://www.softlayer.com/solutions/big-data/mongodb/pricing"><img class="centered" src="http://cdn.softlayer.com/innerlayer/mongodbfullconfig.jpg" alt="MongoDB Configs"/></a></p>
<p>From each engineered server base configuration, you can customize your MongoDB server to meet your application&#8217;s needs, and as you choose your upgrades from the base configuration, you&#8217;ll see the thresholds at which you should consider upgrading other components. As your data set&#8217;s size and the number of indexes in your database increase, you&#8217;ll need additional RAM, CPU, and storage resources, but you won&#8217;t need them in the same proportions &mdash; certain components become bottlenecks before others. Sure, you could upgrade all of the components in a given database server at the same rate, but if, say, you update everything when you only <em>need</em> to upgrade RAM, you&#8217;d be adding (and paying for) unnecessary CPU and storage capacity.</p>
<p>Using our new <a href="http://www.softlayer.com/Sales/orderMongoDbReplicaSet">Solution Designer</a>, it&#8217;s very easy to graphically design a complex multi-site replica set. Once you finalize your locations and server configurations, you&#8217;ll click &#8220;Order,&#8221; and our automated provisioning system will kick into high gear. It deploys your server hardware, installs CentOS (with OS optimizations to provide MongoDB performance enhancements), installs MongoDB, installs MMS (MongoDB Monitoring Service) and configures the network connection on each server to cluster it with the other servers in your environment. A process that may have taken days of work and months of tweaking is completed in less than four hours. And because everything is standardized and automated, you run much less risk of human error.</p>
<p><a href="http://www.softlayer.com/Sales/orderMongoDbReplicaSet"><img class="centered" src="http://cdn.softlayer.com/innerlayer/solutiondesigner.jpg" alt="MongoDB Configs"/></a></p>
<p>One of the other massive benefits of working so closely with 10gen is that we&#8217;ve been able to integrate 10gen&#8217;s MongoDB Cloud Subscriptions into our offering. Customers who opt for a MongoDB Cloud Subscription get additional MongoDB features (like SSL and SNMP support) and support direct from <em>the</em> MongoDB authority. As an added bonus, since the 10gen team has an intimate understanding of the SoftLayer environment, they&#8217;ll be able to provide even better support to SoftLayer customers!</p>
<p>You shouldn&#8217;t have to sacrifice agility for performance, and you shouldn&#8217;t have to sacrifice performance for agility. Most of the &#8220;big data&#8221; offerings in the market today are built on virtual servers that can be provisioned quickly but offer meager performance levels relative to running the same database on bare metal infrastructure. To get the performance benefits of dedicated hardware, many users have chosen to build, roll out and tweak their own configurations. With our MongoDB offering, you get the on-demand availability and flexibility of a cloud infrastructure with the raw power and full control of dedicated hardware. </p>
<p>If you&#8217;ve been toying with the idea of rolling out your own big data infrastructure, life just got a lot better for you.</p>
<p>-Duke</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2012/big-data-at-softlayer-mongodb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tips and Tricks &#8211; How to Secure WordPress</title>
		<link>http://blog.softlayer.com/2012/tips-and-tricks-how-to-secure-wordpress/</link>
		<comments>http://blog.softlayer.com/2012/tips-and-tricks-how-to-secure-wordpress/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 15:15:27 +0000</pubDate>
		<dc:creator>Lee Thompson</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[secure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tricks]]></category>
		<category><![CDATA[users]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=7531</guid>
		<description><![CDATA[As a hobby, I dabble in WordPress, so I thought I&#8217;d share a few security features I use to secure my WordPress blogs as soon as they&#8217;re installed. Nothing in this blog will be earth-shattering, but because security is such a priority, I have no doubt that it will be useful to many of our [...]]]></description>
			<content:encoded><![CDATA[<p>As a hobby, I dabble in WordPress, so I thought I&#8217;d share a few security features I use to secure my WordPress blogs as soon as they&#8217;re installed. Nothing in this blog will be earth-shattering, but because security is such a priority, I have no doubt that it will be useful to many of our customers. Often, the answer to the question, &#8220;How much security do I need on my site?&#8221; is simply, &#8220;More,&#8221; so even if you have a solid foundation of security, you might learn a new trick or two that you can incorporate into your next (or current) WordPress site.</p>
<h3>Move wp-config.php</h3>
<p style="margin-top:5px; padding-top:0;">The first thing I do is change the location of my <code>wp-config.php</code>. By default, it&#8217;s installed in the WordPress parent directory. If the config file is in the parent directory, it can be viewed and accessed by Apache, so I move it out of web/root. Because you&#8217;re changing the default location of a pretty significant file, you need to tell WordPress how to find it in <code>wp-load.php</code>. Let&#8217;s say my WordPress runs out of /webroot on my host &#8230; I&#8217;d need to make a change around Line 26:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> ABSPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'wp-config.php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** The config file resides in ABSPATH */</span>
        <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span> ABSPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'wp-config.php'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>ABSPATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/wp-config.php'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>ABSPATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/wp-settings.php'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** The config file resides one level above ABSPATH but is not part of another install*/</span>
        <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>ABSPATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/wp-config.php'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>The code above is the default setup, and the code below is the version with my subtle update incorporated.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> ABSPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'wp-config.php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** The config file resides in ABSPATH */</span>
        <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span> ABSPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'../wp-config.php'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>ABSPATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'..//wp-config.php'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span> <span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>ABSPATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/wp-settings.php'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #009933; font-style: italic;">/** The config file resides one level above ABSPATH but is not part of another install*/</span>
        <span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>ABSPATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'../wp-config.php'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>All we&#8217;re doing is telling the application that the <code>wp-config.php</code> file is one directory higher. By making this simple change, you ensure that only the application can see your <code>wp-config.php</code> script.</p>
<h3>Turn Down Access to /wp-admin</h3>
<p style="margin-top:5px; padding-top:0;">After I make that change, I want to turn down access to <code>/wp-admin</code>. I allow users to contribute on some of my blogs, but I don&#8217;t want them to do so from <code>/wp-admin</code>; only users with admin rights should be able to access that panel. To limit access to <code>/wp-admin</code>, I recommend the plugin <a href="http://cartpauj.icomnow.com/projects/ucan-post-plugin/">uCan Post</a>. This plugin creates a page that allows users to write posts and submit them within your theme.</p>
<p>But won&#8217;t a user just be able to navigate to <code>http://site.com/wp-admin</code>? Yes &#8230; Until we add a simple function to our theme&#8217;s <code>functions.php</code> file to limit that access. At the bottom of your <code>functions.php</code> file, add this:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">############ Disable admin access for users ############
</span>
add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin_init'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'no_more_dashboard'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">function</span> no_more_dashboard<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>current_user_can<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'manage_options'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'DOING_AJAX'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'/wp-admin/admin-ajax.php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  wp_redirect<span style="color: #009900;">&#40;</span>site_url<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">###########################################################</span></pre></div></div>

<p>Log in as a non-admin user, and you&#8217;ll get redirected to the blog&#8217;s home page if you try to access the admin panel. Voila!</p>
<h3>Start Securing the WordPress Database</h3>
<p style="margin-top:5px; padding-top:0;">Before you go any further, you need to look at WordPress database security. This is the most important piece in my opinion, and it&#8217;s not just because I&#8217;m a DBA. WordPress never needs all permissions. The only permissions WordPress needs to function are <code>ALTER</code>, <code>CREATE</code>, <code>CREATE TEMPORARY TABLES</code>, <code>DELETE</code>, <code>DROP</code>, <code>INDEX</code>, <code>INSERT</code>, <code>LOCK TABLES</code>, <code>SELECT</code> and <code>UPDATE</code>.</p>
<p>If you run WordPress and MySQL on the same server the permissions grant would look something like:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">GRANT ALTER, CREATE, CREATE TEMPORARY TABLES, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, UPDATE ON <span style="color: #000000; font-weight: bold;">&lt;</span>DATABASE<span style="color: #000000; font-weight: bold;">&gt;</span>.<span style="color: #000000; font-weight: bold;">*</span> TO <span style="color: #000000; font-weight: bold;">&lt;</span>USER<span style="color: #000000; font-weight: bold;">&gt;@</span><span style="color: #ff0000;">'localhost'</span> IDENTIFIED BY <span style="color: #ff0000;">'&lt;PASSWORD&gt;'</span>;</pre></div></div>

<p>If you have a separate database server, make sure the host of the webserver is allowed to connect to the database server:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">GRANT ALTER, CREATE, CREATE TEMPORARY TABLES, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, UPDATE ON <span style="color: #000000; font-weight: bold;">&lt;</span>DATABASE<span style="color: #000000; font-weight: bold;">&gt;</span>.<span style="color: #000000; font-weight: bold;">*</span> TO <span style="color: #000000; font-weight: bold;">&lt;</span>USER<span style="color: #000000; font-weight: bold;">&gt;@</span><span style="color: #ff0000;">'&lt;ip of web server'</span> IDENTIFIED BY <span style="color: #ff0000;">'&lt;PASSWORD&gt;'</span>;</pre></div></div>

<p>The password you use should be random, and you should not need to change this. DO NOT USE THE SAME PASSWORD AS YOUR ADMIN ACCOUNT.</p>
<p>By taking those quick steps, we&#8217;re able to go a long way to securing a default WordPress installation. There are other plugins out there that are great tools to enhance your blog&#8217;s security, and once you&#8217;ve got the fundamental security updates in place, you might want to check some of them out. <a href="http://wordpress.org/extend/plugins/login-lockdown/">Login LockDown</a> is designed to stop brute force login attempts, and <a href="http://wordpress.org/extend/plugins/secure-wordpress/">Secure WordPress</a> has some great additional features. </p>
<p>What else do you do to secure your WordPress sites?</p>
<p>-Lee</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2012/tips-and-tricks-how-to-secure-wordpress/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Cloudant: Tech Partner Spotlight</title>
		<link>http://blog.softlayer.com/2012/cloudant-tech-partner-spotlight/</link>
		<comments>http://blog.softlayer.com/2012/cloudant-tech-partner-spotlight/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 15:50:06 +0000</pubDate>
		<dc:creator>Guest Blog</dc:creator>
				<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Partner Marketplace]]></category>
		<category><![CDATA[Apache CouchDB]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[grow]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[partner marketplace]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=7245</guid>
		<description><![CDATA[This is a guest blog from our featured Technology Partners Marketplace company, Cloudant. Cloudant enables you to build next-generation data-driven applications without having to worry about developing, managing, and scaling your data layer. Company Website: https://cloudant.com/ Tech Partners Marketplace: http://www.softlayer.com/marketplace/cloudant Cloudant: Data Layer for the Big Data Era The recipe for big data app success: [...]]]></description>
			<content:encoded><![CDATA[<p class="attribution">This is a guest blog from our featured Technology Partners Marketplace company, <a href="https://cloudant.com">Cloudant</a>. Cloudant enables you to build next-generation data-driven applications without having to worry about developing, managing, and scaling your data layer.</p>
<div class="yt560"><iframe src="http://www.youtube.com/embed/n5IuA_A9Z_M?hd=1" frameborder="0" width="560" height="349"></iframe></div>
<div class="more-info"><strong>Company Website:</strong> <a href="https://cloudant.com/">https://cloudant.com/</a><br />
<strong>Tech Partners Marketplace:</strong> <a href="http://www.softlayer.com/marketplace/cloudant">http://www.softlayer.com/marketplace/cloudant</a></div>
<h3>Cloudant: Data Layer for the Big Data Era</h3>
<p>The recipe for big data app success: Start small. Iterate fast. Grow to epic proportions. </p>
<p style="margin-bottom:0;">Unfortunately, most developers&#8217; databases come up short when they try to simultaneously &#8220;iterate fast&#8221; and &#8220;grow to epic proportions&#8221; &mdash; those two steps are most often at odds. I know &#8230; I&#8217;ve been there. In a recent past life, I attacked petabyte-per-second data problems as a particle physicist at the <a href="http://en.wikipedia.org/wiki/Large_Hadron_Collider">Large Hadron Collider</a> together with my colleagues and Cloudant co-founders, Alan Hoffman and Adam Kocoloski. Here are some lessons we learned the hard way:</p>
<ol style="margin-top:10px; margin-bottom:10px; padding-top:0; padding-bottom:0;">
<li><strong>Scaling a database yourself is brutally hard</strong> (both application level sharding and the master-slave model). It is harder with SQL than it is with NoSQL databases, but either way, the &#8220;scale it yourself&#8221; approach is loaded with unknowns, complications and operational expense.</li>
<li><strong>Horizontal scaling on commodity hardware is a must.</strong> We got very good at this and ended up embedding <a href="http://couchdb.apache.org/">Apache CouchDB</a> behind a horizontal scaling framework to scale arbitrarily and stay running 24&#215;7 with a minimal operational load.</li>
<li><strong>The data layer must scale.</strong> It should be something that applications grow into, not out of.</li>
</ol>
<p>That last point inspired Alan, Adam and me to co-found Cloudant.</p>
<p><strong>What is Cloudant?</strong><br />
Cloudant is a scalable data layer (as a service) for Big Data apps. Built on CouchDB, JSON, and MapReduce, it lets developers focus on new features instead of the drudgery of growing or migrating databases. The Cloudant Data Layer is already big: It collects, stores, analyzes and distributes application data across a global network of secure, high-performance data centers, delivering low-latency and non-stop data access to users no matter where they&#8217;re located. You get to focus on your code; we&#8217;ve got data scalability and availability covered for you. </p>
<p><strong>Scaling Your App on Cloudant</strong><br />
Cloudant is designed to support fast app iteration by developers. It&#8217;s based on the CouchDB NoSQL database where data is encapsulated and transferred as JSON documents. You don&#8217;t need to design and redesign SQL data models or migrate databases in order to create new app features. You don&#8217;t need to write object-relational mapping code either. The database resides behind an HTTP layer and provides a rich permission model, so you can access, secure and share your data via a RESTful API. </p>
<p>Your app is a tenant within a multi-tenant data layer that is already big and scalable. You get a URL end point for your data layer, get data in and out of it via HTTP, and we scale and secure it around the globe. Global data distribution and intelligent routing minimizes latency between your users and the data, which can add 100s of milliseconds per request (we&#8217;ve measured!). Additionally, Cloudant has an advanced system for prioritizing requests so that apps aren&#8217;t affected by &#8216;noisy neighbors&#8217; in a multi-tenant system. We also offer a single-tenant data layer to companies who want it &mdash; your very own white-labeled data cloud. As your data volume and IO requests rise (or fall), Cloudant scales automatically, and because your data is replicated to multiple locations, it&#8217;s always available. Start small and grow to epic proportions? <em>Check.</em></p>
<p style="margin-bottom:0;"><strong>Other Data Management Gymnastics</strong><br />
The Cloudant Data Layer also makes it easy to add advanced functionality to your apps:</p>
<ul style="margin-top:10px;">
<li>Replicate data (all of it or sub-sets) to data centers, computers or even mobile devices for local processing (great for analytics) or off-line access (great for mobile users). Re-synching is automatic.</li>
<li>Perform advanced analytics with built-in MapReduce and full-text indexing and search.</li>
<li>Distribute your code with data &mdash; Cloudant can distribute and serve any kind of document, even HTML5 and other browser-based code, which makes it easy to scale your app and move processing from your back-end to the browser.</li>
</ul>
<p><strong>Why We Run on SoftLayer</strong><br />
Given the nature of our service, people always ask us where we have our infrastructure, and we&#8217;re quick to tell them we chose SoftLayer because we&#8217;re fanatical about performance. We measured latencies for different data centers run by other cloud providers, and it&#8217;s no contest: SoftLayer provides the lowest and most predictable latencies. Data centers that are thousands of miles apart perform almost as if they are on the same local area network. SoftLayer&#8217;s rapidly expanding global presence allows Cloudant to replicate data globally throughout North America, Europe and Asia (with plans to continue that expansion as quickly as SoftLayer can build new facilities).</p>
<p>The other major draw to SoftLayer was the transparency they provide about our infrastructure. If you run a data layer, IO matters! SoftLayer provisions dedicated hardware for us (rather than just virtual machines), and they actually tell us exactly what hardware we are running on, so we can tweak our systems to get the most bang for our buck. </p>
<p><strong>Get Started with Cloudant for Free</strong><br />
If you&#8217;re interested to see what the Cloudant Data Layer could do for your app, sign up at <a href="https://cloudant.com">cloudant.com</a> to get your <a href="https://cloudant.com/#!/solutions/cloud">FREE</a> global data presence created in an instant.</p>
<p>-Michael Miller, <a href="https://cloudant.com/">Cloudant</a></p>
<div class="tpm-note">This guest blog series highlights companies in SoftLayer&#8217;s <a href="http://www.softlayer.com/marketplace">Technology Partners Marketplace</a>. <br/>These <a href="http://blog.softlayer.com/partner-marketplace/">Partners</a> have built their businesses on the SoftLayer Platform, and we&#8217;re excited for them to tell their stories. New Partners will be added to the Marketplace each month, so stay tuned for many more come.</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2012/cloudant-tech-partner-spotlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Citrusleaf: Tech Partner Spotlight</title>
		<link>http://blog.softlayer.com/2011/citrusleaf-technology-partner-spotlight/</link>
		<comments>http://blog.softlayer.com/2011/citrusleaf-technology-partner-spotlight/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 14:15:26 +0000</pubDate>
		<dc:creator>Guest Blog</dc:creator>
				<category><![CDATA[Partner Marketplace]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[dedicated]]></category>
		<category><![CDATA[drives]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[hybrid]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[managed]]></category>
		<category><![CDATA[marketplace]]></category>
		<category><![CDATA[partner]]></category>
		<category><![CDATA[SSD]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=5254</guid>
		<description><![CDATA[This is a guest blog from Citrusleaf&#8217;s Brian Bulkowski. Citrusleaf is a database technology company. They offers a new type of NoSQL database based on the best practices of proven database and distributed technology. The company&#8217;s NoSQL database platform, Citrusleaf 2.0, solves a key problem that challenges today&#8217;s most data intensive, mission-critical businesses: how to [...]]]></description>
			<content:encoded><![CDATA[<p class="attribution">This is a guest blog from Citrusleaf&#8217;s Brian Bulkowski. <a href="http://citrusleaf.com">Citrusleaf </a>is a database technology company. They offers a new type of NoSQL database based on the best practices of proven database and distributed technology. The company&#8217;s NoSQL database platform, Citrusleaf 2.0, solves a key problem that challenges today&#8217;s most data intensive, mission-critical businesses: how to optimally store and access terabytes of schema free data in real-time, with high throughput, ACID compliance, and 24&#215;7 uptime.</p>
<div class="yt560"><iframe width="560" height="349" src="http://www.youtube.com/embed/x7rnqJ39Ing?hd=1" frameborder="0" allowfullscreen></iframe></div>
<div class="more-info"><strong>Company Website:</strong> <a href="http://citrusleaf.com/">http://citrusleaf.com/</a><br/><strong>Tech Partners Marketplace:</strong> <a href="http://www.softlayer.com/marketplace/citrusleaf">http://www.softlayer.com/marketplace/citrusleaf</a></div>
<h3>Citrusleaf and SoftLayer: Taking NoSQL to the Next Level</h3>
<p>Citrusleaf is the NoSQL OLTP (transaction-oriented) database behind some of the world&#8217;s largest advertising platforms. Our record of reliability and performance is the reason our customers choose us over any other database. We specialize in low-latency transactions on terabyte sized, billion-object databases. We fit well with analytics systems such as Hadoop or SQL-based &#8220;ETL&#8221; analytics architectures. Since Citrusleaf is fully reliable like a traditional database and has the speed of a cache, complexity is greatly reduced which leads to higher reliability and substantial cost savings.</p>
<p>Customers store actionable data for their internet applications on our platform. A typical use case is a server-side user data store. The advertising industry has moved to server-based user information storage as end users have become concerned about &#8220;tracking cookies&#8221; and other browser-side storage. Sophisticated advertising platforms are capable of associating users even after cookies have been cleared &ndash; through logins at partner sites, IP addresses and browser fingerprints. In the case where the user has elected not to be &#8220;tracked,&#8221; session management techniques allow &#8220;frequency capping&#8221; to limit the repetition of ads.</p>
<p><span id="more-5254"></span></p>
<p>Citrusleaf&#8217;s clear strengths in the high-volume advertising use case can also be applied to other scenarios like online social gaming and internet scale applications. Our interface is simple: primary key lookups, an extension of the memcache interface with sophisticated eviction, document orientation, and database scanning. The result of the interface&#8217;s simplicity is that powerful applications can be written and maintained quickly and easily.</p>
<p>One of the keys to our technology is the rapid adoption of fast transactional storage. With a database that is capable of millions of transactions per second &ndash; 300,000 per node, and linearly scalable &ndash; configurations with SSD storage are the most cost efficient. Since SSDs can&#8217;t be provisioned on a minute-by-minute basis like traditional cloud infrastructure (the disks can take over 20 minutes to clear), SSDs fit well with a dedicated or managed hosting approach. SoftLayer has aggressively rolled out SSD capabilities in their data centers, and we work closely with them to source the most appropriate SSD models and vendors.</p>
<p>SoftLayer&#8217;s mixture of managed hosting, dedicated and cloud infrastructure in the same data center allows the rapid provisioning of database machines alongside the flexibility of a cloud system. That kind of flexibility and power is what we absolutely need to be successful, and we&#8217;re happy to have found it at SoftLayer.</p>
<p>If you&#8217;ve ever been interested to learn a little more about NoSQL and how it might reinvent the way you look at databases, visit <a href="http://citrusleaf.com">http://citrusleaf.com</a> to learn a little and let us know if you have any questions.</p>
<p>-Brian Bulkowski, <a href="http://citrusleaf.com">Citrusleaf</a></p>
<div class="tpm-note">This guest blog series highlights companies in SoftLayer&#8217;s <a href="http://www.softlayer.com/marketplace">Technology Partners Marketplace</a>. <br/>These <a href="http://blog.softlayer.com/partner-marketplace/">Partners</a> have built their businesses on the SoftLayer Platform, and we&#8217;re excited for them to tell their stories. New Partners will be added to the Marketplace each month, so stay tuned for many more come.</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2011/citrusleaf-technology-partner-spotlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Introduction to Redis</title>
		<link>http://blog.softlayer.com/2011/an-introduction-to-redis/</link>
		<comments>http://blog.softlayer.com/2011/an-introduction-to-redis/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 15:15:07 +0000</pubDate>
		<dc:creator>Tim Ariyeh</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[commands]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[solution]]></category>
		<category><![CDATA[storage]]></category>
		<category><![CDATA[store]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=5174</guid>
		<description><![CDATA[I recently had the opportunity to get re-acquainted with Redis while evaluating solutions for a project on the Product Innovation team here at SoftLayer. I&#8217;d actually played with it a couple of times before, but this time it &#8220;clicked.&#8221; Or my brain broke. Either way, I see a lot of potential for Redis now. No [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had the opportunity to get re-acquainted with <a href="http://redis.io/">Redis</a> while evaluating solutions for a project on the Product Innovation team here at SoftLayer. I&#8217;d actually played with it a couple of times before, but this time it &#8220;clicked.&#8221; Or my brain broke. Either way, I see a lot of potential for Redis now.</p>
<p>No one product is a perfect fit for all of your data storage needs, of course. There are such fundamental tradeoffs to be made in designing storage architectures that you should be immediately suspicious of any product that claims to fit every need.</p>
<p>The best solutions tend to be products that actually embrace these tradeoffs. Redis, for instance, has sacrificed a small amount of data durability in exchange for being awesome.</p>
<h3>What is it?</h3>
<p>Redis is a <a href="http://en.wikipedia.org/wiki/Redis_%28data_store%29">key/value store</a>, but describing it that way is sort of like calling a helicopter a &#8220;vehicle.&#8221; It&#8217;s a technically correct description, but it leaves out some important stuff.</p>
<p>You can think of it like a sophisticated older brother of Memcached. It presents a flat keyspace, and you can set those keys to string values. Another feature of Memcached is the ability to perform remote atomic operations, like &#8220;incr&#8221; and &#8220;append.&#8221; These are really handy, because you have the ability to modify remote data without fetching, and you have an assurance that you&#8217;re the only one performing that operation at that instant.</p>
<p>Redis takes this concept of remote commands on data and goes completely nuts with it. The database is aware of data structures like hashes, lists and sets in addition to simple string values. You can sort, union, intersect, slice and dice to your heart&#8217;s content without fetching any data. Redis is a data structure server. You can treat it like remote memory, and this has an awesome immediate benefit for a programmer: your code and brain are already optimized for these data types.</p>
<p>But it&#8217;s not just about making storage simpler. It&#8217;s fast, too. Crazy fast. If you make intelligent use of its data structures, it&#8217;s possible to serve a lot of traffic from relatively modest hardware. Redis 2.4 can easily handle ~50k list appends a second on my notebook. With batching, it can <a href="http://antirez.com/post/everything-about-redis-24.html">append 2 million items to a list on a remote host in about 1.28 seconds</a>.</p>
<p>It allows the remote, atomic and performant manipulation of data structures. It took me a little while to realize exactly how useful that is.</p>
<h3>What&#8217;s wrong with it?</h3>
<p>Nothing. Move along.</p>
<p>OK, it&#8217;s a little short on durability. Redis uses memory as its primary store and periodically flushes to disk. A common configuration is to do so every second.</p>
<p>That <em>sounds</em> pretty reasonable. If a server goes down, you could lose a second of data. Keep in mind, however, how many operations Redis can perform in a second. If you&#8217;re in a high-volume environment, that could be a lot of data. It&#8217;s not for your financial transactions.</p>
<p>It also supports relatively limited availability options. Currently, it only supports master/slave replication. Clustering support is planned for an upcoming release. It&#8217;s looking pretty powerful, but it will take some real-world testing to know its performance impact.</p>
<p>These challenges should be taken into consideration, and it&#8217;s probably clear if you&#8217;re in a situation where the current tradeoffs aren&#8217;t a good fit.</p>
<p>In my experience, a lot of developers seriously overestimate the consequences of their application losing small amounts of data. Also consider whether or not the chance of losing a second (or less) of data genuinely represents a bigger threat to your application than any other compromises you might have made.</p>
<p><strong>More Information</strong><br />
You can check out the <a href="http://redis.io/documentation">slightly aging docs</a> or browse <a href="https://github.com/antirez/redis">the impressively simple source</a>. There are probably already <a href="http://redis.io/clients">bindings for your language of choice</a> as well.</p>
<p>-Tim</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2011/an-introduction-to-redis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Learning the Language of Hosting</title>
		<link>http://blog.softlayer.com/2011/learning-the-language-of-hosting/</link>
		<comments>http://blog.softlayer.com/2011/learning-the-language-of-hosting/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 16:15:21 +0000</pubDate>
		<dc:creator>Rachel Katz</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Introductions]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[American Heart Association]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[fundraising]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[managed]]></category>
		<category><![CDATA[new job]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[work]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/?p=4980</guid>
		<description><![CDATA[It&#8217;s been a little over a month since I started at SoftLayer &#8230; And what a difference a month makes. In the course of applying for the Social Media Coordinator position I now hold, I was asked to write a few sample blogs. One was supposed to be about what SoftLayer does, and I answered [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a little over a month since I started at SoftLayer &#8230; And what a difference a month makes. In the course of applying for the Social Media Coordinator position I now hold, I was asked to write a few sample blogs. One was supposed to be about what SoftLayer does, and I answered it to the best of my abilities at the time. Looking back on my answer, I must admit I had no idea what I was getting into. </p>
<p>On the plus side, comparing what I know now with what I thought I knew then shows how much a person with zero background in hosting can learn in a short period of time. To give you an idea of where I came from, let&#8217;s look at a few theoretical conversations:</p>
<p style="margin-bottom:0; padding-bottom:0;"><strong>Pre-SoftLayer</strong></p>
<table>
<tr>
<td><em>Friend:</em></td>
<td>What does SoftLayer do?</td>
</tr>
<tr>
<td><em>Rachel:</em></td>
<td>They are a hosting provider.</td>
</tr>
<tr>
<td><em>Friend:</em></td>
<td>What is a hosting provider?</td>
</tr>
<tr>
<td><em>Rachel:</em></td>
<td>It&#8217;s sort of like an Internet landlord that rents data space to clients &#8230; I think.</td>
</tr>
</table>
<p style="margin-bottom:0; padding-bottom:0;"><strong>Present Day</strong></p>
<table>
<tr>
<td><em>Friend:</em></td>
<td>What is it you do?</td>
</tr>
<tr>
<td><em>Rachel:</em></td>
<td>I&#8217;m the Social Media Coordinator for SoftLayer Technologies.</td>
</tr>
<tr>
<td><em>Friend:</em></td>
<td>What does SoftLayer do?</td>
</tr>
<tr>
<td valign="top"><em>Rachel:</em></td>
<td>SoftLayer is a hosting provider, however that is a generalization. We have data centers around the country and are expanding worldwide. The company offers dedicated, cloud and hybrid environments that allow us to handle companies outsourced IT. We are infrastructure experts.</td>
</tr>
</table>
<p>That would be a little bit of a cookie cutter explanation, but it gives a lot more context to the business, and it would probably soar above the head of my non-technical inquisitive friend.</p>
<p>During my first week on the job, I visited one of SoftLayer&#8217;s data centers &#8230; And that &#8220;data center&#8221; term turned out to be a little tricky for me to remember. For some reason, I always wanted to call the data center a &#8220;database center.&#8221; It got to the point where Kevin challenged me to a piggy bank deal. </p>
<p>SoftLayer is raising money for the American Heart Association, and everyone has a little piggy bank at their desk. One of the piggy banks essentially became a &#8220;swear jar&#8221; &#8230; except not for swearing. Every time I said &#8220;database center,&#8221; I had to put a dollar in the piggy bank. The deal was extended when I was trying to remember that  1 byte (big B) = 8 bits (little b):</p>
<p><a href="http://cdn.softlayer.com/innerlayer/piggy.JPG"><img class="centered" src="http://cdn.softlayer.com/innerlayer/piggys.jpg" alt="AHA Piggy Bank"/></a></p>
<p>With money on the line, I&#8217;m happy to say that I haven&#8217;t confused &#8220;database centers&#8221; or bits and bytes again &#8230; And the piggy bank on the left-hand side of the picture above proves it!</p>
<p>Back to the DC (data center!) tour: I learned about how CRAC units are used to pull air underneath the floor and cool the &#8220;cold aisles&#8221; in the DC. I learned about the racks and how our network architecture provides private, public, and out–of–band management networks on the back end to customers in a way unique to SoftLayer. Most importantly, I learned the difference between managed, dedicated, cloud and hosting environments that incorporate all of those different kinds of hosting. This is a far cry from focusing on getting the terminology correct.</p>
<p>I&#8217;m still not an expert on all things SoftLayer, and I&#8217;m pretty sure I&#8217;ll end up with my very own acronym dictionary, but I must admit that I absorbed more information in the past month than I thought possible. I have to thank my ninja sensei, <a href="http://blog.softlayer.com/author/khazard/">Kevin</a>, for taking the time to answer my questions. It felt like school again &#8230; especially since there was a whiteboard in use! </p>
<p>Kevin, enjoy your empty piggy bank!</p>
<p>-Rachel</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2011/learning-the-language-of-hosting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL Slow? Check for Fragmentation.</title>
		<link>http://blog.softlayer.com/2011/mysql-slow-check-for-fragmentation/</link>
		<comments>http://blog.softlayer.com/2011/mysql-slow-check-for-fragmentation/#comments</comments>
		<pubDate>Wed, 08 Jun 2011 13:30:21 +0000</pubDate>
		<dc:creator>Lee Thompson</dc:creator>
				<category><![CDATA[Customer Service]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[administrator]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[fragmentation]]></category>
		<category><![CDATA[fragmented]]></category>
		<category><![CDATA[managed hosting]]></category>
		<category><![CDATA[managed services]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/2011/</guid>
		<description><![CDATA[Let&#8217;s say you have a website and you notice that any calls to your MySQL database take longer to render. If you don&#8217;t have a Database Administrator (DBA), this can be pretty frustrating. SoftLayer&#8217;s Managed Hosting line of business employs some of the best DBAs in the country and is one of the only managed [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say you have a website and you notice that any calls to your MySQL database take longer to render. If you don&#8217;t have a Database Administrator (DBA), this can be pretty frustrating. SoftLayer&#8217;s <a href="http://www.softlayer.com/managed-ps">Managed Hosting</a> line of business employs some of the best DBAs in the country and is one of the only managed hosting providers that offers MySQL and MsSQL DBA services, and I don&#8217;t just say that because I&#8217;m one of them &#8230; We&#8217;ve got the certifications to prove it. <img src='http://blog.softlayer.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Given my area of expertise, I wanted to share a few some simple tips with you to help you tweak variables and improve the performance of your MySQL server. Given that every application is different, this isn&#8217;t necessarily a one-size-fits-all solution, but it&#8217;ll at least give you a starting point for troubleshooting.</p>
<p><strong>First: Get mysqltuner.pl.</strong> This is a fine script by Major Hayden that will give you some valuable information regarding the performance of your MySQL server. </p>
<p><strong>Second: Look for fragmented tables.</strong> What are fragmented tables? If there are random insertions into or deletions from the indexes of a table, the indexes may become fragmented. Fragmentation means that the physical ordering of the index pages on the disk is not close to the index ordering of the records on the pages or that there are many unused pages in the 64-page blocks that were allocated to the index. The symptoms of fragmented tables can be that table can take more disk space than needed or the results may return slower with more disk I/O than needed. <a href="http://www.innodb.com/">INNODB</a> users need to check the fragmentation often because when INNODB marks data as deleted, it never overwrites the blocks with new data &#8230; It just marks them as unusable. As a result, the data size is artificially inflated and data retrieval is slowed. </p>
<p>Fortunately, there is a way to see your table fragmentation and that is to run a query against the <code>information_schemea</code> to show all tables that are fragmented and the percentage of fragmentation:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">SELECT TABLE_SCHEMA, TABLE_NAME, CONCAT<span style="color: #7a0874; font-weight: bold;">&#40;</span>ROUND<span style="color: #7a0874; font-weight: bold;">&#40;</span>data_length <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #000000;">1024</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000;">1024</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #ff0000;">'MB'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> DATA, CONCAT<span style="color: #7a0874; font-weight: bold;">&#40;</span>ROUND<span style="color: #7a0874; font-weight: bold;">&#40;</span>data_free  <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #000000;">1024</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000;">1024</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>, <span style="color: #ff0000;">'MB'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>FREE from information_schema.TABLES where TABLE_SCHEMA NOT IN <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'information_schema'</span>,<span style="color: #ff0000;">'mysql'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> and Data_free <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000;">0</span>;</pre></div></div>

<p>Fixing the fragmentation is easy, but there are a few caveats. When defragmenting a table, it will lock the table, so make sure you can afford the lock. To fix fragmented tables, you can simply run <code>optimize table &lt;table name&gt;;</code> to rebuild the table and all indexes or you can change the engine of the table with <code>alter table &lt;table name&gt; engine = INNODB;</code></p>
<p>I have written a simple bash script in bash to go through, defragment and optimize your tables:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">MYSQL_LOGIN</span>=<span style="color: #ff0000;">'-u&lt;user name&gt; --password=&lt;passowrd&gt;'</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> db <span style="color: #000000; font-weight: bold;">in</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;SHOW DATABASES;&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> mysql <span style="color: #007800;">$MYSQL_LOGIN</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;Database&quot;</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;information_schema&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000; font-weight: bold;">do</span>
        <span style="color: #007800;">TABLES</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;USE <span style="color: #007800;">$db</span>; SHOW TABLES;&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> mysql <span style="color: #007800;">$MYSQL_LOGIN</span> <span style="color: #000000; font-weight: bold;">|</span>  <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> Tables_in_<span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Switching to database <span style="color: #007800;">$db</span>&quot;</span>
        <span style="color: #000000; font-weight: bold;">for</span> table <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$TABLES</span>
        <span style="color: #000000; font-weight: bold;">do</span>
                <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot; * Optimizing table <span style="color: #007800;">$table</span> ... &quot;</span>
                <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;USE <span style="color: #007800;">$db</span>; OPTIMIZE TABLE <span style="color: #007800;">$table</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> mysql <span style="color: #007800;">$MYSQL_LOGIN</span> <span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null
                <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;done.&quot;</span>
        <span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>You&#8217;d be surprised how much of an impact table fragmentation has on MySQL performance, and this is an easy way to quickly troubleshoot your database that &#8220;isn&#8217;t as fast as it used to be.&#8221; If you follow the above steps and still can&#8217;t make sense of what&#8217;s causing your database to lag, our Managed Hosting team is always here to work with you to get your servers back in shape &#8230; And with the flexibility of month-to-month contract terms and the ability to add managed capabilities to specific pieces of your infrastructure, we have to earn your business every month with spectacular service.</p>
<p>-Lee</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2011/mysql-slow-check-for-fragmentation/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>3 Bars &#124; 3 Questions: SoftLayer Managed Hosting</title>
		<link>http://blog.softlayer.com/2011/3-bars-3-questions-softlayer-managed-hosting/</link>
		<comments>http://blog.softlayer.com/2011/3-bars-3-questions-softlayer-managed-hosting/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 13:30:44 +0000</pubDate>
		<dc:creator>Tam Vu</dc:creator>
				<category><![CDATA[3 Bars 3 Questions]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[3 Bars]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[managed hosting]]></category>
		<category><![CDATA[managed server]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[sales engineering]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://blog.softlayer.com/2011/</guid>
		<description><![CDATA[I know you expected to see a video interview with Paul Ford the next time a 3 Bars &#124; 3 Questions episode rolled across your desk, but I snuck past him for a chance in the spotlight this week. Kevin and I jumped on a quick video chat to talk about the Sales Engineering team, [...]]]></description>
			<content:encoded><![CDATA[<p>I know you expected to see a video interview with Paul Ford the next time a <a href="http://blog.softlayer.com/category/3-bars-3-questions/">3 Bars | 3 Questions</a> episode rolled across your desk, but I snuck past him for a chance in the spotlight this week. Kevin and I jumped on a quick video chat to talk about the Sales Engineering team, and because of our recent <a href="http://www.softlayer.com/press/release/881/softlayer-launches-managed-hosting">release</a> of SoftLayer Managed Hosting, two of the three questions ended up being about that news:</p>
<div class="yt560"><iframe width="560" height="349" src="http://www.youtube.com/embed/54gnFBTKBrM" frameborder="0" allowfullscreen></iframe></div>
<p>You should be seeing a blog from <a href="http://blog.softlayer.com/author/nday/">Nathan</a> in the next half hour or so with more detail about how we approached managed hosting, so you&#8217;ll have all the background you need to springboard into that post after you watch this video.</p>
<p>If you&#8217;ve heard everything you need to hear about managed hosting and want to start the process of adding it to servers on your account, visit <a href="http://www.softlayer.com/solutions/managed-hosting/">http://www.softlayer.com/solutions/managed-hosting/</a> or chat with a sales rep, and they can help you get squared away. If you&#8217;re not sure whether it&#8217;s a good fit, ask for a sales engineer to consult &#8230; They&#8217;re a great group with a pretty awesome manager. <img src='http://blog.softlayer.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Paul, sorry for stealing your spot in the 3 Bars | 3 Questions rotation! I&#8217;m handing the baton back over to you to talk about TechWildcatters and the Technology Partners Marketplace in the next episode.</p>
<p>-Tam</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.softlayer.com/2011/3-bars-3-questions-softlayer-managed-hosting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
