title: How to design and verify distributed systems?
body: <p>I've been working on <a href="http://dimdwarf.sourceforge.net/" rel="noreferrer">a project</a>, which is a combination of an application server and an object database, and is currently running on a single machine only. Some time ago I read <a href="http://www.vldb.org/conf/2007/papers/industrial/p1150-stonebraker.pdf" rel="noreferrer">a paper</a> which describes a distributed relational database, and got some ideas on how to apply the ideas in that paper to my project, so that I could make a high-availability version of it running on a cluster using a <a href="http://en.wikipedia.org/wiki/Shared_nothing_architecture" rel="noreferrer">shared-nothing architecture</a>.</p>
  
  <p>My problem is, that I don't have experience on designing distributed systems and their protocols - I did not take the advanced CS courses about distributed systems at university. So I'm worried about being able to design a protocol, which does not cause deadlock, starvation, <a href="http://www.venturanetworksinc.com/splitbrain.htm" rel="noreferrer">split brain</a> and other problems.</p>
  
  <p><strong>Question:</strong> Where can I find good material about designing distributed systems? What methods there are for verifying that a distributed protocol works right? Recommendations of books, academic articles and others are welcome.</p>