packages feed

happs-tutorial-0.8: templates/maciddatasafety.st

<h3>Keeping your MACID data safe</h3>

<p>If you are using php, ruby on rails, or one of the other popular web frameworks, your user data is likely
   in a mysql database. If you have outsourced your server hosting,
   maybe you have a database administrator that takes backups for you on a regular basis.
   That probably helps you sleep at night, assuming that you can really trust that your dba is doing their job.</p>

<p>As we learned in the previous lesson, if you are using Happstack with MACID, your data is 
   right there on your filesystem, by default in the directory called <i>_local</i>.

<p>~/happs-tutorial>ls _local/happs-tutorial_state/
<br>current-0000000000 events-0000000000 events-0000000001 events-0000000002        

<p>If there is money on the line, you are going to want to be careful with this directory.

<p>When <a href="/tutorial/macid-migration">migrating MACID data</a> to a new schema, you are also going to want to be extra cautious.

<p>For now, since you don't have any valuable data, the following procedure is probably enough
   to remind yourself to be careful while learning about Happstack in the tutorial sandbox.

<ul>
  <li>Stop Happstack by doing ctrl-c if you are running the ./happs-tutorial app from a shell
      or ctrl-c and completely exiting ghci if you are doing runInGhci within ghci.
  <li>~/happs-tutorial> mv _local _local.20081001-0917am.bak
  <li>Start the Happstack application again. All users, profiles, jobs, and sessions should be gone,
      and a new _local directory with nothing in it should have been created.
      A fresh start.
  <li>If you want your old data back, backup your existing _local directory somewhere safe
      (or just rm -rf if you want to get rid of it)
      , and rename the .bak directory back to _local
</ul>

The above procedure raises some questions.

<p>Q: Do you have to shut down the Happstack server every time you migrate data to a new schema?

<p>A: No, but online migrations are a topic that will be covered in a future chapter.</p>

<p>Q: Is MACID safe? Could I wake up one day with corrupted data under _local and no way to recover from it?
<p>A: Let's be realistic. 
      Compared to, say, mysql, Happstack hasn't been stress-tested much in critical high-volume web sites. 
      On the other hand, stress testing is on the docket for the Happstack team and when more data is known
      I'll be including it in this tutorial. </p>
<p> That said, the unix filesystem is pretty good at not losing your data -- 
    a point <a href="http://www.paulgraham.com/vwfaq.html">famously</a> made by startup guru Paul Graham,
    who created viaweb (now yahoo stores) with all the application state in flat files.</p>

<p>If you use Windows or Mac, you probably believe these filesystem are pretty reliable too.</p>

<p>Taking a closer look at what is under _local...</p>
<p>thartman@thartman-laptop:~/happs-tutorial/_local/happs-tutorial_state>ls -lth
<br>total 12K
<br>-rw-r--r-- 1 thartman thartman   0 Oct  1 13:55 events-0000000003
<br>-rw-r--r-- 1 thartman thartman   0 Oct  1 11:55 events-0000000002
<br>-rw-r--r-- 1 thartman thartman 792 Oct  1 11:04 events-0000000001
<br>-rw-r--r-- 1 thartman thartman 491 Oct  1 11:00 events-0000000000
<br>-rw-r--r-- 1 thartman thartman  25 Oct  1 10:59 current-0000000000
<br>thartman@thartman-laptop:~/happs-tutorial/_local/happs-tutorial_state></p>


<p> MACID serialization works by writing state change event data
    one file at a time. At server startup, Happstack "replays" all the information here
    in the order specified by the file names.
    This is similar to the <a href="http://en.wikipedia.org/wiki/Transaction_log">database transaction log</a>
    used by many rdbms systems.</p>
<p> So, if I woke up one morning with my Happstack application in a corrupt, non-startable state and 
    my inbox full of angry customer email, probably what I would do is move files, one at a time,
    out of the serialization directory, last-file created first, and keep trying to restart Happstack.</p>

<p> Q: What if my hard drive dies and I can't get my data back?</p>
<p>    A: Like with any other data storage system, if there's valuable data, you need to be making backups.
       In the case of Happstack data stored under _local, I would probably be <a href="http://www.rsync.net">rsyncing</a>
       the _local directory to a remote server, or maybe multiple remote servers for extra safety.
       For now I am not worried
       about securing data, but when that day comes I'm pretty confident I'll be ok.</p>
      
<p> Let's now populate our web application with <a href="/tutorial/macid-dummy-data">dummy data</a>.</p>