<?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"
	>

<channel>
<title>Scalien | Blog</title>
<atom:link href="http://blog.scalien.com/feed.xml" rel="self" type="application/rss+xml" />
<link>http://blog.scalien.com</link>
<description>The Scalien blog about Keyspace and other distributed systems</description>
<language>en</language>
<item>
<title>Keyspace 1.7.1: fixes memleak issue in all client libs</title>
<link>http://blog.scalien.com//2010/06/18/keyspace-1.7.1-fixes-memleak-issue-in-all-client-libs</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/06/18/keyspace-1.7.1-fixes-memleak-issue-in-all-client-libs</guid>
<pubDate>Fri, 18 Jun 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Thanks for <a href="http://groups.google.com/group/keyspace/browse_thread/thread/8a064f2d3077e52?hl=en">Phil White</a> for reporting a memleak in the client libs. We fixed it and are <a href="http://scalien.com/downloads/">releasing 1.7.1 as a hotfix</a>.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.7: new HTTP API, C# client libs</title>
<link>http://blog.scalien.com//2010/06/17/keyspace-1.7-new-http-api-csharp-client-libs</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/06/17/keyspace-1.7-new-http-api-csharp-client-libs</guid>
<pubDate>Thu, 17 Jun 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Keyspace 1.7.0 is out the door. Changes include:
<ol>
<li>
New HTTP API: the old comma-separated parameter list is gone, instead you specify named parameters like:
</p><p>
<span class="code">http://localhost:8080/set?key=name&value=mtrencseni</span>
</p><p>
Check out the updated <a href="http://scalien.com/documentation/http_api.html">HTTP API docs</a> for more details.
</li>
<li>
New C# client libs. I haven't written up API docs for it yet, will get to it soon. The <a href="http://scalien.com/releases/keyspace/keyspace-windows-1.7.0.zip">Windows package</a> now includes a bin/csharp folder with two files: <span class="code">keyspace_client.dll</span> and <span class="code">KeyspaceClient.dll</span>. In your C# project, add <span class="code">KeyspaceClient.dll</span> as a reference and make sure <span class="code">keyspace_client.dll</span> is in your project's working directory.
</li>
</p><p>
<li>
fixed a bug in SingleKeyspace where commands were not OK'd until a SUBMIT was submitted by the client.
</li>
</ol>
</p><p>
Back to work on our secret new scalable database project.
</p>]]></content:encoded>
</item>
<item>
<title>Catching up with Keyspace</title>
<link>http://blog.scalien.com//2010/05/10/catching-up-with-keyspace</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/05/10/catching-up-with-keyspace</guid>
<pubDate>Mon, 10 May 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
What happens when a node is lagging behind the others? For example, suppose we have a n=3 cluster, with node 1 and 2 in replication round 50.000, but node 3 is back at round 1.000.
</p><p>
There are two ways for a lagging node to do catch-up in Keyspace.
</p><p>
<ol>
<li>
<b>Replicated log catchup</b>
</p><p>
This is the simpler case. If the master node, suppose it's node 1, knows what happened in replication round 1.000 and onward, then it can just replay it for node 3. However, nodes cannot remember replication rounds indefinitely, because their database file would grow indefinitely --- they have to delete old replication rounds. The number of rounds stored is controlled by the (undocumented) configuration setting <span class="code">rlog.cacheSize</span>, which is 100.000 by default. So in this case, the master node would just replay its replicated log to node 3, which would eventually catch up to the majority.
</p><p>
You can see this in action by starting an n=3 configuration with only 2 nodes, and then to send individual <span class="code">SET</span> commands, say 50.000, and then starting up the third node. If you open its HTTP console, and hit refresh in your browser, you will see its replication round increase as it catches up in the background.
</li>
<li>
<b>Database catchup</b>
</p><p>
Database catchup is what happens when Replicated log catchup is not possible, because the majority is too far ahead. In this case, the lagging node will delete its local database and copy over the entire database from the master.
</p><p>
Here we ran into an interesting problem. To ensure the database file's recoverability in case of a crash (and because Paxos requires strong commit semantics), we have to use BerkeleyDB's so called Transactional Data Store, or TDS for short. With TDS however, every read is transactional, whether you like it or not. This poses a problem, because when the master sends the contents of its entire database to the lagging node, it will open a transaction. That transaction, by default, will lock the entire database effectively blocking the master for writes. At first, we tried to use <a href="http://en.wikipedia.org/wiki/Multiversion_concurrency_control">Multiversion Concurrency Control (MVCC)</a> instead of locking. Unfortunately, BDB's MVCC is dead-slow, which again effectively blocks the master.
</p><p>
The solution ended up turning on BDB's <span class="code">DB_READ_UNCOMMITTED</span> flag. This means the database is not locked by the thread sending the database to the lagging node over the network, as we're at the lowest <a href="http://en.wikipedia.org/wiki/Isolation_%28database_systems%29">level of isolation</a>. However, the database may be read in an inconsistent state: it is possible that the database was at replication round 50.000 when we started to send it, but was at 50.100 when we finished, and some of those modification may have been visible to the iterator thread.
</p><p>
We work around this by storing the <span class="code">paxosID</span> (replication round) and a per-round <span class="code">commandID</span> with each <span class="code">key => value</span> pair when it is written. This is also sent over to the lagging node. Finally, the lagging node will set its paxosID to the round when the catch up started, 50.000 for the example above. Then, using regular Replicated log catchup it will receive replication rounds 50.000 - 50.100, and using the paxosID and commandID's in its database, it knows which changes it must peform, and which changes were already in its database due to the <span class="code">DB_READ_UNCOMMITTED</span> flag. The actual logic is:
<pre>
if (storedPaxosID > paxosID ||
(storedPaxosID == paxosID && storedCommandID >= commandID))
	// don't perform command
</pre>
</li>
</ol>
</p><p>
The end-result is a perfect replica, without blocking the master!
</p><p>
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.6.2 now featuring ASCII Art</title>
<link>http://blog.scalien.com//2010/05/05/keyspace-1.6.2-now-featuring-ascii-art</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/05/05/keyspace-1.6.2-now-featuring-ascii-art</guid>
<pubDate>Wed, 05 May 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Today we're releasing Keyspace 1.6.2. Get the package from our <a href="http://scalien.com/downloads">downloads</a> section or directly from the <a href="http://github.com/scalien/keyspace">github repository</a>.
</p><p>
One the one hand, 1.6.2 includes a number of important bugfixes. It turns out BerkeleyDB will throw <span class="code">DB_PAGE_NOTFOUND</span> errors if you have highly concurrent deletes and gets with <span class="code">DB_READ_UNCOMMITTED</span> turned on, which is how we use BDB in Keyspace.
</p><p>
On the other hand, this release finally includes the official SWIG based Perl client, which a number of people have used for. I'll write up the docs for Perl in a few days. For now, build it with <span class="code">make perllib</span> and check in <span class="code">bin/perl</span>.
</p><p>
At last, the funkiest addition: the <span class="code">keyspace-config</span> shell script, which will create your Keyspace config files for you --- with ASCII Art to cheer you up! Here's a sample session:
<pre style="font-size:10px">
~/Code/Keyspace $ ./keyspace-config 
</p><p>
Welcome to the Keyspace configuration file generator!
-----------------------------------------------------
</p><p>
-> This script will ask you a bunch of questions and then generate the Keyspace configuration files.
-> The files are only generated at the end, you can always start over by hitting CTRL+C.
</p><p>
Is this a replicated or a single configuration? [R/s]: r
How many nodes will the Keyspace cluster consist of? [3]: 
Will you be running all Keyspace nodes on the *same* host (eg. for testing)? [Y/n]: n
</p><p>
-> Assuming identical Keyspace configurations on all 3 nodes!
</p><p>
What is the IP address (or domain name) of the 0. node? 192.168.137.50
What is the IP address (or domain name) of the 1. node? 192.168.137.51
What is the IP address (or domain name) of the 2. node? 192.168.137.52
Where should Keyspace store the database files? [/var/keyspace]: 
Port number for Paxos replication? [10000]: 
Port number for HTTP? [8080]: 
Port number for Keyspace protocol? [7080]: 
</p><p>
-> Writing configuration file of the 0. node to keyspace.0.conf
-> Writing configuration file of the 1. node to keyspace.1.conf
-> Writing configuration file of the 2. node to keyspace.2.conf
</p><p>
-> The connection string on the client side is: 192.168.137.50:7080, 192.168.137.51:7080, 192.168.137.52:7080
</p><p>
Do you wish to see an informative ascii art describing your configuration? [Y/n]: 
                                                                                                      
  client(s)                         client(s)                         client(s)                       
                                                                                                      
    ^                                 ^                                 ^                             
    |                                 |                                 |                             
    |            node 0               |            node 1               |            node 2           
    |     +-------------------+       |     +-------------------+       |     +-------------------+   
    |     +   192.168.137.50  |       |     +   192.168.137.51  |       |     +   192.168.137.52  |   
    |     |                   |       |     |                   |       |     |                   |   
    |     +   /var/keyspace   |       |     +   /var/keyspace   |       |     +   /var/keyspace   |   
    |     |                   |       |     |                   |       |     |                   |   
    |     |                   |       |     |                   |       |     |                   |   
   7080 --+ Keyspace          |      7080 --+ Keyspace          |      7080 --+ Keyspace          |   
    |     |                   |       |     |                   |       |     |                   |   
   8080 --+ HTTP              |      8080 --+ HTTP              |      8080 --+ HTTP              |   
          |                   |             |                   |             |                   |   
          |                   |             |                   |             |                   |   
          |                   |             |                   |             |                   |   
  10000 --+ Paxos             |     10000 --+ Paxos             |     10000 --+ Paxos             |   
    |     |                   |       |     |                   |       |     |                   |   
  10001 --+ PaxosLease        |     10001 --+ PaxosLease        |     10001 --+ PaxosLease        |   
    |     |                   |       |     |                   |       |     |                   |   
  10002 --+ Catchup           |     10002 --+ Catchup           |     10002 --+ Catchup           |   
    |     |                   |       |     |                   |       |     |                   |   
    |     +-------------------+       |     +-------------------+       |     +-------------------+   
    |                                 |                                 |                             
    |                                 |                                 |                             
    |                                 |                                 |                             
----+-------- [replication] ----------+-------- [replication] ----------+-------- [replication] ------
</p><p>
</p><p>
-> Writing ascii art to keyspace_art.txt
-> Done.
</pre>
</p><p>
Cheers!
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace on Github</title>
<link>http://blog.scalien.com//2010/04/14/keyspace-on-github</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/04/14/keyspace-on-github</guid>
<pubDate>Wed, 14 Apr 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We created a <a href="http://github.com/scalien/keyspace">Github repo for Keyspace</a>, pull a local copy using:
</p><p>
<span class="code">git clone http://github.com/scalien/keyspace.git</a>
</p><p>
The SVN migration went smoothly with github preserving the versions history, which is impressive. So far we're very happy with both git and github.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.6.1: Java, PHP and Ruby libraries</title>
<link>http://blog.scalien.com//2010-04-01/keyspace-1.6.1-java-php-ruby-libraries</link>
<guid isPermaLink='false'>http://bytepawn.com//2010-04-01/keyspace-1.6.1-java-php-ruby-libraries</guid>
<pubDate>Thu, 01 Apr 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Great news, we're releasing <a href="http://scalien.com/downloads/">Keyspace 1.6.1</a>. The server binary has not changed other than the version number bump, but the package now includes client libraries for Java, PHP and Ruby. In specifying the client interfaces we tried to adhere to the local customs of the language. If you have any comments, suggestions or bug reports, please do so on the <a href="http://groups.google.com/group/keyspace">Keyspace Google Groups</a>.
</p><p>
Installation and programming are covered in the appropriate parts of the documentation:
</p><p>
<ul>
<li><a href="http://scalien.com/documentation/python_api.html">Python API</a></li>
<li><a href="http://scalien.com/documentation/java_api.html">Java API</a></li>
<li><a href="http://scalien.com/documentation/php_api.html">PHP API</a></li>
<li><a href="http://scalien.com/documentation/ruby_api.html">Ruby API</a></li>
</ul>
</p><p>
Coming up: support for .NET, possibly a Windows friendly C++ version of the client libraries.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace Roadmap</title>
<link>http://blog.scalien.com//2010-03-31/keyspace-roadmap</link>
<guid isPermaLink='false'>http://bytepawn.com//2010-03-31/keyspace-roadmap</guid>
<pubDate>Wed, 31 Mar 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
As <a href="http://groups.google.com/group/keyspace/browse_thread/thread/f8139f0a1f439a55">Jon Stephens pointed out on the Keyspace Google Group</a>, it's time for us to write a Keyspace roadmap.
</p><p>
First, where is <a href="http://scalien.com">Scalien</a>, the company behind Keyspace heading?
</p><p>
Scalien was founded in 2009 January by Attila and myself, and we're still a 2-man operation. We are currently in the process of turning Keyspace into a product. This is a long and bumpy road and we're nowhere near the end. We're working with a handful or partners and potential partners identifying the use-cases where Keyspace (or something Keyspace-based) makes sense. We also have a number of other projects, for example <a href="http://mediafilter.hu">Mediafilter</a> is a hungarian social media monitoring service, also in the process of <a href="http://en.wiktionary.org/wiki/productization">productization</a>.
</p><p>
Scalien is currently not making a profit, we're bootstrapping with out own money and projects. Things are looking up, it looks like we will be small-bussiness-profitable by the end of 2010. Scalien has no venture capital, nor am I planning to pursue this until we have a clear product strategy with a few sales to show for Keyspace.
</p><p>
As a final note, recently a company called <a href="http://wandisco.com">WANdisco</a> started followning the <a href="http://twitter.com/scalien">Scalien user on Twitter</a>. It turns out WANDisco is a company selling Paxos-based SVN and CVS replication, they've been at it since 5+ years and they seem fairly successful. I've checked out their product, it looks great. Replicating SVN has occured to me in the past, I've even sent our a project proposal about it a year ago to a company I worked for that uses SVN and suffers from downtimes (I didn't know about WANdisco then). We're not going to compete with WANdisco, but they're a good use-case showing that Paxos-based replication can be turned into a product.
</p><p>
Now, on to Keyspace features. First a bulleted list:
</p><p>
<span style="text-decoration: underline">Big Things</span>
<ul>
<li>storage engine</li>
<li>data model</li>
<li>transaction support</li>
<li>dynamic cluster reconfiguration</li>
<li>web admin console</li>
</ul>
</p><p>
<span style="text-decoration: underline">Little Things</span>
<ul>
<li>Java, PHP client (done, need to add documentation)</li>
<li>Ruby client (almost done)</li>
<li>.NET client</li>
<li>Linux distro packages</li>
</ul>
</p><p>
Storage engine and data model: I've been promising a storage engine for more than 6 months now, and there are 2 obstacles in my way: first, I keep getting distracted by other Keyspace issues, and second, writing a storage engine requires knowledge of the data model that it must support. So these two tasks are actually interrelated. I feel the present barebones key-value data model in Keyspace is not enough, but we have yet to figure out what the right model is (Key-value on steroids like Bigtable? STL over the network like Redis? Relational?). So this is currently in waiting-for-the-spark or waiting-for-the-bussiness-use-case mode.
</p><p>
Transaction support: has been requested a number of times, and I agree that it would make sense, and it could be added to the current Keyspace codebase in about a month. I plan to do this real soon now.
</p><p>
Dynamic cluster reconfiguration and web admin console: these features have been requested by clients, so they will come out sometime in 2010, most likely around summer.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.6, Python libs, new docs</title>
<link>http://blog.scalien.com//2010/03/24/keyspace-1.6-python-libs-new-docs</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/03/24/keyspace-1.6-python-libs-new-docs</guid>
<pubDate>Wed, 24 Mar 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Today we're releasing <a href="http://scalien.com/downloads">version 1.6 of Keyspace</a>.
</p><p>
The major news is that we started using <a href="http://www.swig.org">SWIG (Simplified Wrapper and Interface Generator)</a> to wrap our fully-featured C client library for different languages. With 1.6, <em>we're releasing the Python client library</em>, check it out! Next up is Java.
</p><p>
There's <em>new documentation</em> at <a href="http://scalien.com/documentation">http://scalien.com/documentation</a>, and includes sections on installing, configuring and running Keyspace, and explains both the C and the Python client API.
</p><p>
Before 1.6 the safe script was neccesary as it deleted the BerkeleyDB file in some catchup scenarios. This has been moved to the executable, so <em>the safe script is no longer neccesary</em>! For more about catchup, see the <a href="http://scalien.com/documentation/understanding.html">Understanding Keyspace</a> section of the docs.
</p><p>
We also changed around the configuration file to make more sense. You now have to specify <i>mode = single</i> or <i>mode = replicated</i>, and only have to specify <i>paxos.endpoints</i> in <i>mode = replicated</i>. Please check the <a href="http://scalien.com/documentation/configuration.html">Configuration</a> section of the docs for more.
</p><p>
We also changed some default values of the configuration, such as <i>database.pageSize</i>, <i>database.cacheSize</i> and <i>database.logBufferSize</i>. See the <a href="http://scalien.com/documentation/configuration.html#tuning">Tuning</a> section of the docs for more.
</p><p>
So, new in 1.6:
<ul>
<li>added Python libs with SWIG</li>
<li>safe script is no longer neccecary</li>
<li>new docs: http://scalien.com/documentation</li>
<li>improved catchup behaviour for larger databases</li>
<li>put back multithreaded writes to avoid master lease losses</li>
<li>added database.warmCache (default true)</li>
<li>bugfixes</li>
</ul>
Configuration file cleanup:
<ul>
<li>added mode = {replicated, single}</li>
<li>default pageSize = 64K</li>
<li>default database.cacheSize = 500M</li>
<li>default database.logBufferSize = 250M</li>
</ul>
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.5 - Recommended for Production Usage</title>
<link>http://blog.scalien.com//2010/03/09/keyspace-1.5-recommended-for-production-usage</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/03/09/keyspace-1.5-recommended-for-production-usage</guid>
<pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Great news: we are releasing Keyspace 1.5, the most stable and feature complete version of Keyspace to date. We are very excited as we have reached a point where all issues related to replication and catch-up have been resolved, this version is suitable for general production deployment! Keyspace 1.5 has seen tons of testing on our dedicated test cluster, and it has performed like a charm.
</p><p>
<a href="http://scalien.com/downloads">Download 1.5 here.</a>
</p><p>
For the end-user, the only visible change is the removal of the <i>submit</i> parameter from the commands (such as <i>keyspace_client_set()</i>), since this can be derived from the use of <i>keyspace_client_begin()</i> before the commands are issued in batch.
</p><p>
More good news: we have starting wrapping the C/C++ client library, which itself has reached a very stable state, using <a href="http://www.swig.org">SWIG, the Simplified Wrapper and Interface Generator</a>. We are planning to release fully featured Python, PHP, Java libraries next week. In parallel, we are finally going to write up proper manuals starting today.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.4.1</title>
<link>http://blog.scalien.com//2010/02/17/keyspace-1.4.1</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/02/17/keyspace-1.4.1</guid>
<pubDate>Wed, 17 Feb 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We are releasing Keyspace 1.4.1, a bugfix release, mostly fixing TCP speed issues we were having. It turns out our client protocol was "interfering" with Nagle's algorithm and causing performance problems on some platforms. Also, under Windows we ran into a Windows bug, where if you filled up the socket buffers Windows would use delayed ACKs, which again caused performance issues.
</p><p>
<a href="http://scalien.com/downloads">Download 1.4.1 here.</a>
</p><p>
Here are some performance numbers from a n=3 node Keyspace setup on Windows over a 100Mbit LAN:
</p><p>
VALUE LENGTH = 100 bytes long<br/>
batch set: 30487 tx/sec<br/>
single set: 1777 tx/sec<br/>
batch get: 45662 tx/sec<br/>
single get: 6734 tx/sec<br/>
</p><p>
VALUE LENGTH = 1000 bytes long<br/>
batch set: 2443 tx/sec<br/>
single set: 845 tx/sec<br/>
batch get: 8888 tx/sec<br/>
single get: 3137 tx/sec<br/>
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.4 Released - Major improvements</title>
<link>http://blog.scalien.com//2010-02-12/keyspace-1.4-released-major-improvements</link>
<guid isPermaLink='false'>http://bytepawn.com//2010-02-12/keyspace-1.4-released-major-improvements</guid>
<pubDate>Fri, 12 Feb 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We released <a href="http://scalien.com/downloads">Keyspace 1.4</a>, which fixes a <i>lot of</i> issues/bugs both in the server and the C/C++ client libraries.
</p><p>
Notable changes in the server:
<ul>
<li>Improved stability on Windows<li>
<li>PaxosLease now uses TCP instead of UDP, in an effort to make master leases last longer</li>
<li>Servers now explicitly store 100.000 Paxos rounds in their local DB to help lagging nodes, in effect eliminating the need for our previous truncation hack, at the expense of disk space</li>
<li>More info printed in HTTP hello message</li>
<li>7 seconds sleep() on startup uses a timer instead of a blocking sleep, making the server responsive during the time</li>
<li>Max. value size decreased to 100K</li>
<li>Configuration files have not changed</li>
<li>Much more...</li>
</ul>
Note: Some metadata stored in the database changed, so make sure all your nodes are in sync before switching to 1.4.
</p><p>
Notable changes in the C/C++ client library:
<ul>
<li>We rewrote much of the client library</li>
<li>It now handles failovers in the nodes, without the application having to call the library again</li>
<li>Application can specify global and master timeouts:</li>
<li>Global timeout: the client library will return no matter what within this time</li>
<li>Master timeout: the client library will return if the master is lost and no new master is found within this time</li>
<li>Failure conditions can be queried from the client library: transport status, connectivity status, timeout status and command status</li>
<li>Much much more...</li>
</ul>
</p><p>
We are planning to write up proper documentation on the new client library next week, stay tuned!
</p><p>
A number of people have requested we go on github - thanks for the suggestions - we're discussing it with Attila.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.3.1 with minor fixes</title>
<link>http://blog.scalien.com//2010-01-25/keyspace-1.3.1-with-minor-fixes</link>
<guid isPermaLink='false'>http://bytepawn.com//2010-01-25/keyspace-1.3.1-with-minor-fixes</guid>
<pubDate>Mon, 25 Jan 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
This is a maintenance releasing fixing some minor bugs:
<ol>
<li>now domain names as well as IP addresses can be specified in paxos.endpoints</li>
<li>the client config erronously referred to paxos.endpoints, which was in reality keyspace.endpoints (port numbers of keyspace protocol)</li>
<li>Linux build was broken</li>
</ol>
</p><p>
<a href="http://scalien.com/downloads">Download 1.3.1 here</a>.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.3 release - stable Windows port</title>
<link>http://blog.scalien.com//2010-01-18/keyspace-1.3.0-release-stable-windows-port</link>
<guid isPermaLink='false'>http://bytepawn.com//2010-01-18/keyspace-1.3.0-release-stable-windows-port</guid>
<pubDate>Mon, 18 Jan 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We are releasing Keyspace 1.3, the major addition is a stable Windows port (supports XP, Vista, Seven, Server 2003 and 2008) and includes some minor bugfixes.
</p><p>
<a href="http://scalien.com/downloads">Click here to download Keyspace 1.3</a>. 
</p><p>
<img style="margin-left: 50px;" src="/images/windows_logo.jpg" width="174" />
</p><p>
For this port we had to port our (readyness notification) event based, networking subsystem to Windows' <a href="http://msdn.microsoft.com/en-us/library/aa365198%28VS.85%29.aspx">Completion Ports API</a>, which was more challenging than we expected as the intended use for the API is asynchronous I/O, which is slightly different than our model. After lots of coding and one all-nighter we prevailed! I'll share more details in a later post.
</p><p>
The next big step is getting rid of BerkeleyDB. Coding is already on its way and I'll post some details about our storage engine architecture soon (currently codenamed Blocksmith).
</p><p>
Back to work.
</p><p>
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace Windows Beta</title>
<link>http://blog.scalien.com//2010/01/08/keyspace-windows-beta</link>
<guid isPermaLink='false'>http://bytepawn.com//2010/01/08/keyspace-windows-beta</guid>
<pubDate>Fri, 08 Jan 2010 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
As promised, we are releasing the beta Windows port of Keyspace this week.
</p><p>
<a href="http://scalien.com/releases/keyspace/keyspace-win-beta.zip">Click here to download the Keyspace Windows beta</a>.
</p><p>
This is a non-versioned beta release, which will be followed by a regular 1.3 release next week after we have done some more testing on <a href="http://aws.amazon.com/">Amazon</a>.
</p><p>
The release includes Visual Studio C++ 2008 Express Edition project files so Windows developers can get straight to work. Also included are the necessary BerkeleyDB include and lib files ('include' and 'lib' folders, respectively). The 'bin' folder contains statically linked binaries in case somebody wants to test it out without compiling. If it doesn't run, you may have to install the appropriate <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en">Visual Studio redistributables</a>, which I put in the 'redist' folder for your convenience.
</p><p>
Technically, the Windows port uses the <a href="http://msdn.microsoft.com/en-us/library/aa365198%28VS.85%29.aspx">Completion Ports API</a> to achieve high-performance network I/O. Thanks to our layered architecture (for platform-independence) we didn't have to modify application logic at all. Based on preliminary testing the performance numbers should be equivalent to the ones in our <a href="http://scalien.com/whitepapers">whitepapers</a>.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace Licensing</title>
<link>http://blog.scalien.com//2009/12/14/keyspace-licensing</link>
<guid isPermaLink='false'>http://bytepawn.com//2009/12/14/keyspace-licensing</guid>
<pubDate>Mon, 14 Dec 2009 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Over the last months, we have learned more and more about software licensing relevant to Keyspace. We have finally arrived at what we believe is the a good solution for Keyspace and Scalien.
</p><p>
From now on, the Keyspace server and all C/C++ code including the C/C++ libraries are licensed under the <b>Affero GPL</b>, as they were originally. The Python and PHP libraries are licensed under the <b>BSD</b>, allowing you to use them freely with your application as you wish. The 1.2.0 version, which was licensed under the BSD license, has been removed from the site to avoid confusion and protect the Keyspace source code.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.2 Release</title>
<link>http://blog.scalien.com//2009/10/01/keyspace-1.2-release</link>
<guid isPermaLink='false'>http://bytepawn.com//2009/10/01/keyspace-1.2-release</guid>
<pubDate>Thu, 01 Oct 2009 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We are releasing version 1.2 of <a href="http://scalien.com/keyspace">Keyspace</a>, our consistently replicated key-value store. The major news is the <b>release of Python and PHP client libraries</b>. Here's the full list of changes.
</p><p>
<ol>
<li>Added Python and PHP client libraries; this means we have C, Python and PHP covered.</li>
<li>Added HTTP JSON API; For example, <span class="code">http://localhost:8080/json/listkeys?/test</span> returns the following JSON object: <span class="code">{"/test":["/test/i:0","/test/i:1","/test/i:2"]}</span>.</li>
<li>Fixed some bugs in server code.</li>
<li>Fixed some bugs in Python code.</li>
<li>Removed deprecated latency command.</li>
</ol>
</p><p>
<a href="http://scalien.com/downloads">Download 1.2 here.</a>
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.1 Release</title>
<link>http://blog.scalien.com//2009/09/09/keyspace-1.1-release</link>
<guid isPermaLink='false'>http://bytepawn.com//2009/09/09/keyspace-1.1-release</guid>
<pubDate>Wed, 09 Sep 2009 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We are releasing version 1.1 of <a href="http://scalien.com/keyspace">Keyspace</a>, our consistently replicated key-value store, a major improvement over 1.0.x.
</p><p>
<ol>
<li>New PaxosLease algorithm does not require clock synchronization.</li>
<li>Added COUNT and DIRTYCOUNT commands.</li>
<li>Added /html/ part to HTTP interface, which pretty prints the list output.</li>
<li>Added possibility to reverse list direction.</li>
<li>The http://server:port/ welcome page prints the version number and master information.</li>
<li>Added database.numReaders config option.</li>
</ol>
</p><p>
<a href="http://scalien.com/downloads">Download 1.1 here</a>.
</p><p>
The most important is: <b>Keyspace no longer requires clock synchrony!</b>
This should make Keyspace as a distributed database much more attractive to new users.
The new PaxosLease algorithm is described in the
<a href="http://scalien.com/whitepapers/">PaxosLease whitepaper</a>.
</p><p>
In other news, <a href="http://hnwatch.scalien.com">Hacker News Watch</a> runs on Keyspace.
</p><p>
</p><p>
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.0.1 Hotfix Release</title>
<link>http://blog.scalien.com//2009/07/17/keyspace-1.0.1-hotfix-release</link>
<guid isPermaLink='false'>http://bytepawn.com//2009/07/17/keyspace-1.0.1-hotfix-release</guid>
<pubDate>Fri, 17 Jul 2009 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
We are releasing 1.0.1 today, which fixes some minor issues users experienced.
</p><p>
<ol>
<li>Keyspace would not start without a config file in default mode. Resolution: fixed.</li>
<li>Keyspace printed a non-informative error message when a directory 'keyspace' was present and it tried to create the database file 'keyspace'. Resolution: More informative error message.</li>
<li>Some Linux optimizations were accidentally removed in the 1.0 release. Resolution: added to 1.0.1</li>
</ol>
</p><p>
<a href="http://scalien.com/downloads">Download 1.0.1 here</a>.
</p>]]></content:encoded>
</item>
<item>
<title>Keyspace 1.0 Beta Release</title>
<link>http://blog.scalien.com//2009/07/15/keyspace-1.0-beta-release</link>
<guid isPermaLink='false'>http://bytepawn.com//2009/07/15/keyspace-1.0-beta-release</guid>
<pubDate>Wed, 15 Jul 2009 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Today <a href="http://scalien.com">we are</a> releasing the <a href="http://scalien.com/keyspace">Keyspace 1.0 Beta</a>. Keyspace is a consistently replicated, highly-available fault-tolerant key-value store. A pictorial explanation <a href="http://scalien.com/keyspace">can be found here</a>.
</p><p>
The relevant links are:
<ul>
<li><a href="http://scalien.com/keyspace">Keyspace features at a glance</a></li>
<li><a href="http://scalien.com/documentation">Documentation</a></li>
<li><a href="http://scalien.com/whitepapers">Whitepapers</a></li>
<li><a href="http://scalien.com/downloads">Downloads</a></li>
<li><a href="http://scalien.com/license">License</a></li>
<li><a href="http://scalien.com/help">Help</a></li>
<li><a href="http://scalien.com/faq">FAQ</a></li>
</ul>
</p><p>
In a few words, <strong>consistent replication</strong> means it's <em>not eventually consistent</em>, it's <em>always consistent</em> or always in-sync. When the server acknowledges an operation, then you can be certain that it has hit the disk on a majority of the nodes and you will never see a state not reflecting that write.
</p><p>
Since Keyspace is replicated, the database is <strong>highly-available and fault-tolerant</strong>. A minority of nodes can fail without the overall database service being affected. This is of course the main feature of any replicated data store: if the cleaning crew accidentally pulls the plug on one of your servers or a disk fails, then your system keeps going without service outage.
</p><p>
Keyspace is a <strong>high-performance</strong>, asynchronous, event-driven C/C++ UNIX server. Even with n=3 replication we can handle 100.000 writes a second on fast Linux PCs with SCSI disks. This is an order of magnitude faster than naive key-value store implementations in Java, Erlang or Python. <a href="http://scalien.com/whitepapers">See the whitepaper for more.</a>
</p><p>
With Keyspace, you have a sensible <strong>upgrade path</strong>. You can use Keyspace in single-server mode, in which case it's reduced to a TCP wrapper around Berkeley DB. Later, you can reconfigure it to use replication. Keyspace has its own TCP protocol, which is used by the client libraries, and a built-in HTTP server and HTTP protocol so you can issue <span class="code">http://localhost/set?key,value</span> type requests using your browser for testing. <a href="http://svn.scalien.com/keyspace/trunk/API">More about the API.</a>
</p><p>
<a href="http://scalien.com/downloads">You can download</a> source code and compile Keyspace or use the Debian package for quick installation and <span class="code">/etc/init.d/</span> sweetness. Included are the usual help files, client libraries and some sample code. Keyspace is distributed under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">Affero GPL license (AGPL)</a>.
</p><p>
What's missing in this release? Currently, our C/C++ client library is production quality. We are finishing up PHP, Python, Java and .NET libraries, the exact order is a function of <a href="http://scalien.com/help">user requests</a>.
</p><p>
This is a beta release, where one of the goals is to gauge user interest. If you find Keyspace interesting or useful, please <a href="http://scalien.com/help">drop us a line</a>.
</p>]]></content:encoded>
</item>
<item>
<title>Scaliens! Scaliens! Scaliens!</title>
<link>http://blog.scalien.com//2009/06/02/scaliens-scaliens-scaliens</link>
<guid isPermaLink='false'>http://bytepawn.com//2009/06/02/scaliens-scaliens-scaliens</guid>
<pubDate>Tue, 02 Jun 2009 00:00:00 +0000</pubDate>
<dc:creator><a href="http://blog.scalien.com/ecard/mtrencseni">Marton Trencseni</a></dc:creator>
<content:encoded><![CDATA[<p>
Welcome to the Scalien Blog!
</p><p>
<a href="http://scalien.com">Scalien</a> was formalized as an LLC in Janurary of 2009 by <a href="/ecard/mtrencseni">Marton Trencseni</a> and <a href="/ecard/agazso">Attila Gazso</a>. Our goal is to create a distributed stack of open-source components, enabling developers to create scalable, highly-available applications able to meet their customer's expectations. Our products fit in with the 'cloud computing' paradigm, although we're not looking to become cloud providers. More precisely, sites looking to become cloud providers in the future will be looking for basic distributed software such as databases and filesystems to run their own infrastructure on.
</p><p>
<center>
<img src="http://scalien.com/images/egg.jpg" />
<img src="http://scalien.com/images/egg.jpg" />
<img src="http://scalien.com/images/egg.jpg" />
</center>
</p><p>
Over the last 6 months, we've been busy with the basic building block of our distributed stack, a replicated, highly-available key-value store called <a href="http://scalien.com">Keyspace</a>. Keyspace has similarities to <a href="http://labs.google.com/papers/chubby.html">Google's Chubby</a> server, the most important being that both use Leslie Lamport's Paxos distributed consensus algorithm as the basic primitive. The first public beta of Keyspace is available for download under the <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">Affero GPL license (AGPL)</a>. To the best of our knowledge, Keyspace is the only  consistently replicated (Paxos-based) high-performance key-value store on the market.
</p><p>
Once the dust settles, we will begin to implement the second layer of our stack, which will add the essential property of scalability (in Keyspace, all nodes store the same data). This product will most likely be called Keyscale, and will also be licensed under the AGPL. We hope to have an early version of Keyscale finished at the end of 2009, or early 2010. Then, we'll get back to our original idea, and use these technologies to create a useful, general-purpose distributed filesystem.
</p><p>
Back to work.
</p>]]></content:encoded>
</item>
</channel>
</rss>
