{ "metadata": { "name": "", "signature": "sha256:67dd71593aa7be832238de5f48750cd8a5240e367fd967059075c6dcadc7c61b" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analysis of Distributed Storage Systems w/ Continuous Time Markov Chains (CTMCs)\n", "\n", "\n", "## Introduction\n", "This lab will walk you through an interesting use of CTMCs in the analysis of data centers. The explosion of data on the internet resulted, naturally, in an explosion of data centers. Massive data centers of constantly failing nodes pose interesting challenges for us EECS ninjas. As a result, distributed storage is a very active area of research these days. Hope you enjoy!\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#standard imports, and potentially useful functions\n", "from __future__ import division\n", "import random\n", "import numpy as np\n", "from numpy import zeros\n", "import matplotlib.pyplot as plt\n", "import scipy\n", "from numpy.linalg import svd, norm\n", "\n", "def nullspace(A, atol=1e-13, rtol=0):\n", " A = np.atleast_2d(A)\n", " u, s, vh = svd(A)\n", " tol = max(atol, rtol * s[0])\n", " nnz = (s >= tol).sum()\n", " ns = vh[nnz:].conj().T\n", " return ns\n", "\n", "def nSample(distribution, values, n):\n", " rand = [random.random() for i in range(n)]\n", " rand.sort()\n", " distribution = distribution.copy()\n", " samples = []\n", " samplePos, distPos, cdf = 0, 0, distribution[0]\n", " while samplePos < n:\n", " if rand[samplePos] < cdf:\n", " samplePos += 1\n", " samples.append(values[distPos])\n", " else:\n", " distPos += 1\n", " cdf += distribution[distPos]\n", " return samples\n", "\n", "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 0: Reading\n", "If you haven't already, read Chapter 13.5 of Probability in EECS on CTMCs. The chapter is concise, so don't worry if you can't quite grasp everything on your first pass. This lab will walk you through everything you need to know about CTMCs, but the book will be a good place to start. You may also want to very briefly review Reed-Solomon erasure codes form CS 70. Hopefully this will be a nice review of last week's material :)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 1: CTMCs\n", "\n", "There are several differences between Continuous Time Markov Chains and their discrete time counterparts, but a good place to start is by thinking of a CTMC as a DTMC where the transitions between states can happen at any time, and that the transition times are exponentially \n", "distributed. We will explore this more thoroughly through the following example.\n", "\n", "
\"CTMC\"
\n", "
Figure 1
\n", "\n", "Let us consider a single node in a data center that can exist only in two possible states: either it is *working* or it is *in repair*. If the data storage node is in a *working* state, the data stored on the node is secure and the node itself is happily responding to user read/write requests. If the node is in a *repair* state, some problem has occured and the data stored on the node has become corrupted (data loss). Let us further model the transitions between the two states as a Markov process (i.e. satisfiying the Markov property).\n", "\n", "If we model the process in discrete time and only consider transition probabilities between the two states, the result is the uninformative model presented below:\n", "\n", "
\"CTMC\"
\n", "
Figure 2
\n", "\n", "This model obfuscates the time it takes to transition between states, traditionally called the *firing times*. We would hope that our data storage node would take a very long time before failing, and that it would take comparatively little time to be fully repaired once it has failed.\n", "\n", "There can be more sophisticated discrete time models (which you might want to think about when simulating CTMCs later in the lab), but why would we limit ourselves to a discrete time model for something which is clearly occuring in continuous time, and no immediate discrete time analog presents itself? Thus let us consider how we might construct a continuous time model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Markov Property in Continuous Time\n", "\n", "Let us consider the Markov process $\\{X_t, t \\geq 0\\}$ over a countable or finite state space $\\mathcal{X}$. In Satisfying the Markov Property, we have that\n", "### $$P[X_{t+\\epsilon} = i \\ | \\ X_t, X_u:u < t] = P[X_{t+\\epsilon} = i \\ | \\ X_t] \\ \\ \\ \\forall \\ i \\ \\in \\ \\mathcal{X}$$\n", "\n", "Let us use this property to answer the following question and help us integrate the notion of *firing times* into our model:\n", "\n", "#### 1. How long does our process remain in a given state? Suppose $X_0 = x$. What is the distribution of $T_{x}$, the time of departure from state $x$? Prove that this departure time will be memoryless i.e. that $Pr(T_x > s + r \\ | \\ T_x > s) = Pr(T_X > r)$, for $s, r \\geq 0$. Conclude that the departure times must be exponentially distributed (the only continuous distribution which satisfies the memorylessness property).\n", "\n", "Hint: For this proof you will need to use the *time invariance* property of Markov Chains we have described in this class thus far. In DTMCs, time invariance says $P(X_{n+1} = x \\ | \\ X_{n}) = P(X_1 = x \\ | \\ X_0)$, and for CTMCs we have $P(X_t = x, t \\in [s,s+r] \\ | \\ X_s = x) = P(X_t = x, t \\in [0,r] \\ | \\ X_0 = x)$. Processes which satisfy this property make up an important class of stochastic process known as *stationary* processes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your answer here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now know that the departure times will be exponentially distributed and can return to our example from earlier. We have to tools to create a useful model for the state of our data storage node. When a node is working, its failure is exponentially distributed with rate $\\lambda$, at which point it will be under repair. The repair time is exponentially distributed with rate $\\mu$, which will return the node to a working condition. The rate of failure $\\lambda$ will be a function of the hardware and software in the storage node (which are prone to crashes and bugs), and $\\mu$ will be a function of the time it takes to detect the failure, fix it, and replace the data that was originally on the node. We would hope that our storage center nodes would satisfy $\\mu >> \\lambda$.\n", "\n", "
\"CTMC\"
\n", "
Figure 3
\n", "\n", "Suppose we had a slightly different CTMC where sometimes a node fails irreparably and ends up in a *Dead* state.\n", "\n", "
\"CTMC\"
\n", "
Figure 4
\n", "\n", "Use Figure 4 and your intuition to answer question 2:\n", "\n", "#### 2. What is the rate of transition out of state 'Working' in the CTMC in Figure 4?\n", "#### 3. What is the conditional probability of transition to state 'Repair' given that our CTMC is exiting state 'Working'? What is the conditional probaility of transition to state 'Dead'?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your answer here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Specifying the Rate Matrix $Q$\n", "\n", "The rate matrix $Q$ of the CTMC in Figure 3 (assuming Working as state 1 and Repair as state 2) is\n", "#### $$\\begin{bmatrix} -\\lambda & \\lambda \\\\ \\mu & -\\mu \\end{bmatrix}$$\n", "\n", "In general, the $i,j^{th}$ element of the rate matrix $Q_{ij}$ specifies the rate at which the chain is leaving state $i$ and entering state $j$ for $i \\neq j$. The diagonal elements of the matrix $Q_{ii} = -\\sum_{j} Q_{ij}$. Why is the rate matrix represented as such? Intuitively, the rate matrix in continuous time represents the rates of flow in and out of the states in a CTMC, or the average rates of transition in and out of each state. If the rate of flow out of state $i$ is $\\sum_{j} Q_{ij}$, then the rate of flow into state $i$ must be the same, and hence we write $Q(i,i) = -\\sum_{j} Q_{ij}$, denoting the flow from all other states into state $i$. We can then determine the invariant distribution through conservation of flow (not unlike Kirchoff's Current Law)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Finding the Invariant Distribution (if one exists)\n", "\n", "Let $\\pi = [\\pi(\\text{Working}), \\ \\ \\pi(\\text{Repair})]$ denote the vector of probabilities of being in a *Working* or *Repair* state respectively. We can then use this conservation of flow idea to solve for the invariant distribution of the initial markov chain:\n", "#### $$ \\lambda \\cdot \\pi(\\text{Working}) = \\mu \\cdot \\pi(\\text{Repair}) $$\n", "#### $$ \\pi(\\text{Working}) + \\pi(\\text{Repair}) = 1 $$\n", "#### If this conservation of rate does not make sense to you, stare at it for a while and it will.\n", "\n", "Let us plug in the numbers $\\lambda = \\frac{1}{10}$ and $\\mu = 10$, which says that the time until node failure is exponentially distributed with mean time 10 years, and the time for repair is exponentially distributed with mean time 1.2 months. In this example, repair happens 100 times faster than failure on average. We can calculate the invariant distribution:\n", "\n", "#### $$ \\frac{\\pi(\\text{Working})}{\\pi(\\text{Repair})} = \\frac{\\mu}{\\lambda} = 100 \\implies \\frac{1 - \\pi(\\text{Repair})}{\\pi(\\text{Repair})} = 100 \\implies \\pi(\\text{Repair}) = \\frac{1}{101}, \\ \\ \\ \\pi(\\text{Working}) = \\frac{100}{101}$$\n", "\n", "In general, we can calculate the invariant distribution of a CTMC by solving the following system of equations:\n", "#### $$ \\pi Q = 0 $$\n", "#### $$ 1^\\intercal \\pi = \\sum_i \\pi(i) = 1 $$\n", "\n", "---\n", "\n", "The follwing code simulates the CTMC in Figure 3 when $\\lambda = \\frac{1}{10}$ and $\\mu = 10$ for 10,000 years and shows that the long term fraction of time spent in the two state *Working* and *Repair* does indeed converge to the values calculated above when $\\lambda = \\frac{1}{10}$ and $\\mu = 10$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Note: this is probably not how you should write your code for larger state spaces; it doesn't scale well.\n", "\n", "lambd = 1.0 / 10.0 # Node failure occurs at rate of approximately 1 every 10 years\n", "mu = 10.0 # Node repair occurs at a rate of approximately 1 every 1.2 months\n", "\n", "TotalTime = 0.0; WorkTime = 0.0; RepairTime = 0.0\n", "WorkFrac = np.array([]);RepairFrac = np.array([]) # Fraction of time spent working and in repair respectively\n", "Work = 0; Repair = 1; state = Work # We start the simulation with a working node\n", "while TotalTime < 1.0e4: # Simulating for 10,000 years\n", " rate = [lambd,mu][state]\n", " JumpTime = random.expovariate(rate) # JumpTime ~ Exp(rate)\n", " TotalTime += JumpTime\n", " if state is Work:\n", " WorkTime += JumpTime\n", " else:\n", " RepairTime += JumpTime\n", "\n", " RepairFrac = np.r_[RepairFrac, RepairTime / TotalTime]\n", " WorkFrac = np.r_[WorkFrac, WorkTime / TotalTime]\n", "\n", " state = [Repair,Work][state]\n", "\n", "fig = figure(figsize = (16,4))\n", "plot(np.linspace(0,1e4,len(WorkFrac)),WorkFrac)\n", "title('Fraction of Time for which Node is Working')\n", "ylim([0.95,1])\n", "xlabel('Years')\n", "fig = figure(figsize = (16,4))\n", "plot(np.linspace(0,1e4,len(WorkFrac)),RepairFrac)\n", "title('Fraction of Time for which Node is in Repair')\n", "ylim([0,0.05])\n", "xlabel('Years')\n", "print \"Overall Fraction of Time Spent Working: \", WorkFrac[-1]\n", "print \"Overall Fraction of Time Spent in Repair: \", RepairFrac[-1]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Overall Fraction of Time Spent Working: 0.989900161219\n", "Overall Fraction of Time Spent in Repair: 0.010099838781\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nm4473j/+8Q+TlJRkjDHm008/NUOGDDHbt2+v1S0oKMhUVlaaBQsWmPj4eLNr1y5TXFxsrrrqKnPj\njTfWmv/EiRNNaWmpKSsr83arqqoyzz//vImPj/duRzXTa4wxQ4cONfHx8Wb79u3m8OHDJiUlxcyc\nOdMYY8ymTZtMSEiIWb16tamoqDD33HOPCQgIMCtWrDhungAAp4eaWQBoIMYY/fSnP1VERIQiIiJ0\n1VVXefvdf//9at68uZo0aSJJmjBhgiIiIuR2u3XXXXepvLxcW7dulST9/e9/16OPPqqEhARJUq9e\nvdSiRYuTzn/NmjUqKSnRzJkz5e/vr2HDhmnMmDFavHixd5irrrpKffv2lZ+fnyZMmKDPP//8uNN6\n5ZVXNGbMGA0fPlx+fn665557dPjwYX300Ue18lsfOnXqpIkTJ8rlcmn8+PHas2ePfvOb3yggIEAj\nRoxQYGCgduzYIWOM5s+frz/+8Y9q3ry5QkJCdP/992vJkiXHne7R6TtZnlwul+68805FR0d711NN\nF110kbZv364DBw5o1apVmjJlinJzc1VSUqKVK1ce0/z1oYceUpMmTdSrVy8lJSVpw4YNx6Trn//8\np0aMGKFrr71Wfn5+atGihZKSkrzpOdX15dGsWTP9+te/1oMPPnjMvF5++WVNmTJFvXv3VmBgoObM\nmaOPP/5Yu3fv1jvvvKMePXroqquukp+fn6ZPn16rifyzzz6r+++/X126dJHb7db999+vzz//XNnZ\n2XWmR7ItEzZu3KjDhw+rbdu2J2yePmTIEH355ZcqKirSqlWrNGTIEMXHxys/P9/bbeDAgfL399fL\nL7+su+++W7GxsQoODtacOXO0ZMmSWrXpaWlpCgoKqrUun3zySf3hD3/QypUr1blz5+Omw+Vy6eab\nb1Z8fLyaNm2q8ePHe5f7a6+9piuuuEKDBg1SQECAHnnkEUc04wYApyCYBYAG4nK5tGzZMhUUFKig\noEBLly719qvZFFiS/vCHP6hbt25q3ry5IiIiVFRUpO+++06SlJOTo7i4uNOe/549e46ZT8eOHb0P\nP3K5XGrbtq23X1BQkIqLi487rby8PHXo0KFW3tq3b6/c3Nxa3erD0WmSpNatWx+Tzvz8fJWWlurC\nCy/0XjAYPXq0d7mdzKnk6ejlV1NQUJD69u2rlStXeu/dHDRokFavXn3cezlrBoPNmjU77rLOzs4+\nYVAlHbtsTrS+apoyZYr27dunt956q9Y6ysvLU8eOHb3/g4OD1bJlS+Xm5iovL08xMTG1plNzWeze\nvVvTpk3zLnfPfcg1l93xBAcH65VXXtGzzz6rqKgojRkzxnvR5mixsbGKjo7WqlWrtGrVKg0ePFiS\nNGjQIK1atUoffPCBt6n90Xnp0KGDqqqqtG/fvuOm3+OJJ57Q7bffftKnW9dcdzWX+549e2otp6Cg\noO91TzYA4PgIZgGgEaoZVKxatUq///3v9eqrr6qwsFAFBQUKDw/31qK1b9/+pPehHk9UVJSys7Nr\n1cbt3r1b0dHR32tau3fv9v43xig7O/t7Tau+tGrVSkFBQdq8ebP3gkFhYaH3XsmTOZU8nSxAHzp0\nqFasWKH169erX79+Gjp0qNLT07V27VpvoHU6OnTooJ07d572eHUJDAzUQw89pFmzZtUqC1FRUcrK\nyvL+Lykp0f79+xUTE6N27drVqmX1LJua6fzb3/7mXe4FBQUqKSnRRRdddNL0jBw5UsuXL9fevXvV\ntWvXOl9LNGTIEK1cuVIff/yxBg0aJMk+sXvlypVavXq1dxkfnZdvvvlG/v7+tYL/463L5cuX63e/\n+12tC02nIyoqSjk5Od7/hw8frnU/LQDghyGYBYBG7tChQ/L391erVq1UUVGhRx55pFZA9rOf/Uyz\nZs3yNq394osvdODAAUm2pu5Ewc+AAQPUrFkzPf7446qsrFRmZqbeeustpaamSjq9ZsHjx4/X22+/\nrffff1+VlZV64okn1LRpU2+AcTrTq6/myG63W7fccoumT5/ufYVLbm6uli9ffkrjn0qeTmbo0KFa\ntGiRunfvroCAAKWkpOjvf/+7Onfu/L1q6K6//nplZGTo1VdfVVVVlfbv33/c5sin68Ybb1RZWZnS\n09O93a677jq98MIL2rBhg8rLy/XAAw/ooosuUocOHXTZZZdp06ZN+ve//62qqio9/fTTtV4r9Ytf\n/EKzZ8/W5s2bJUlFRUV69dVXT5qOb7/9VsuWLVNJSYkCAgIUHBwsPz+/Ew4/ZMgQLVq0SNHR0QoJ\nCZEkXXzxxVq0aJEOHjyogQMHevPy5JNPKisrS8XFxXrggQeUmpoqt7vu06Du3bsrPT1dt99+e62H\nox3tRMt+3LhxevPNN/Xxxx+roqJCaWlpjeLp4gBwriCYBYBG5ugaoksvvVSXXnqpLrjgAsXGxioo\nKKhW89e77rpL48eP18iRIxUeHq5bbrnF+8TetLQ0TZw4UREREXrttddqvXolMDBQb775pt599121\nbt1aU6dO1YsvvqgLLrjAm46j03KimsgLLrhAL730ku644w61bt1ab7/9tt588035+/ufdNyT5f/o\nfqeaJkmaO3eu4uPjddFFFyk8PFwjRozQtm3bTmnep5Knkxk4cKDKysq8NYSJiYkKCgo6plb2VPPc\noUMHvfPOO3riiSfUsmVLJScn64svvjhmuFOdrofb7dYjjzyigoICb7fhw4frt7/9rcaNG6eoqCjt\n2rXLe79xq1at9Oqrr2rmzJlq1aqVduzYoYsvvtg77k9/+lPNmDFDqampCg8PV8+ePfXee++dNC1H\njhzRk08+qejoaLVs2VKrVq3SX//61xOON3ToUOXn59ead1JSksrKynThhReqadOmkqTJkyfrxhtv\n1JAhQ9S5c2c1a9ZMzzzzTJ3LydOtV69eeuutt3TLLbd481DXcq65Hrp3765nnnlGqampioqKUmho\nqNq0aXPce6wBAKfPZU5yiXDy5Ml6++231aZNG23cuPG4w9x5551699131axZMy1cuFDJycmSpPT0\ndE2fPl3V1dX62c9+phkzZtR/DgAAAByguLhYERER2rFjR617eAEA389Ja2ZvvvnmWs2OjvbOO+9o\nx44d2r59u/72t7/ptttuk2Tf7zZ16lSlp6dr8+bNWrx4sbZs2VJ/KQcAAGjk3nzzTZWWlqqkpET3\n3HOPevXqRSALAPXkpMHs4MGDFRERccL+b7zxhiZOnCjJ3n9VWFiovXv3au3atYqPj1dsbKwCAgKU\nmpqqZcuW1V/KAQAAGrk33nhD0dHRio6O1s6dO0/4aigAwOk79Rt/TiA3N7fW4+xjYmKUm5t7zCsf\nYmJi9Mknn/zQ2QEAADjG/PnzNX/+/IZOBgCck+rlAVA8mQ8AAAAAcDb94JrZ6OjoWu+Wy8nJUUxM\njCorK2t1z87OPuYF65IUEBCvqqr6fWceAAAAAKBxiIuL044dO+p9uj84mL3iiis0b948paamas2a\nNWrevLnatm2rli1bavv27crKylJUVJReeeUVLV68+Jjxq6p2UrOLc0JaWprS0tIaOhnAD0I5xrmC\nsoxzBWUZ54JTfT3f6TppMHvddddp5cqV+u6779S+fXs9/PDDqqyslCTdeuutuuyyy/TOO+8oPj5e\n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\n0EMPHTOPM5EpAAAAAMC5rc5g1t/fX/PmzdOoUaNUXV2tKVOmKDExUc8995wk6dZbb9XmzZs1adIk\nuVwu9ejRQwsWLJAk7du3T2PHjpUkVVVVacKECRo5cuQZzg4AAAAA4HxQZzNjAAAAAAAaozqfZnym\npaenq2vXrkpISNDcuXMbMinAMbKzszVs2DB1795dPXr00NNPPy1JOnDggEaMGKELLrhAI0eOVGFh\noXecOXPmKCEhQV27dtXy5cu93f/3v/+pZ8+eSkhIqPUuZuBsqa6uVnJysi6//HJJlGM4U2Fhoa6+\n+molJiaqW7du+uSTTyjLcKQ5c+aoe/fu6tmzp66//nqVl5dTltHoTZ48WW3btlXPnj293eqz3JaX\nl+vaa69VQkKCLrroIu3evfvkiTINpKqqysTFxZldu3aZiooKk5SUZDZv3txQyQGOkZeXZ9avX2+M\nMebQoUPmggsuMJs3bzb33nuvmTt3rjHGmMcee8zMmDHDGGPMpk2bTFJSkqmoqDC7du0ycXFx5siR\nI8YYY/r162c++eQTY4wxo0ePNu+++24D5AjnsyeeeMJcf/315vLLLzfGGMoxHOmmm24yCxYsMMYY\nU1lZaQoLCynLcJxdu3aZTp06mbKyMmOMMePHjzcLFy6kLKPR++CDD8y6detMjx49vN3qs9z++c9/\nNrfddpsxxpglS5aYa6+99qRparCa2bVr1yo+Pl6xsbEKCAhQamqqli1b1lDJAY4RGRmp3r17S5JC\nQkKUmJio3NxcvfHGG5o4caIkaeLEiXr99dclScuWLdN1112ngIAAxcbGKj4+Xp988ony8vJ06NAh\n9e/fX5J00003eccBzoacnBy98847+tnPfibzf3eWUI7hNEVFRVq1apUmT54syT7XIzw8nLIMxwkL\nC1NAQIBKS0tVVVWl0tJSRUVFUZbR6A0ePFgRERG1utVnua05rXHjxmnFihUnTVODBbO5ublq3769\n939MTIxyc3MbKjlAnbKysrR+/XoNGDBA+/btU9u2bSVJbdu21b59+yRJe/bsUUxMjHccT5k+unt0\ndDRlHWfVr371K/3+97+X2+3b5VOO4TS7du1S69atdfPNN6tPnz665ZZbVFJSQlmG47Ro0UJ33323\nOnTooKioKDVv3lwjRoygLMOR6rPc1owPPRcsDxw4UOf8GyyYdblcDTVr4LQUFxdr3Lhx+tOf/qTQ\n0NBa/VwuF2UZjdpbb72lNm3aKDk52VsrezTKMZygqqpK69at0y9/+UutW7dOwcHBeuyxx2oNQ1mG\nE+zcuVNPPfWUsrKytGfPHhUXF+ull16qNQxlGU7UEOW2wYLZ6OhoZWdne/9nZ2fXitKBxqCyslLj\nxo3TjTfeqJ/+9KeS7FWnvXv3SpLy8vLUpk0bSceW6ZycHMXExCg6Olo5OTm1ukdHR5/FXOB89tFH\nH+mNN95Qp06ddN111+n999/XjTfeSDmG48TExCgmJkb9+vWTJF199dVat26dIiMjKctwlM8++0yD\nBg1Sy5Yt5e/vr6uuukoff/wxZRmOVB/nE54YMDo6Wt98840kewGzqKhILVq0qHP+DRbM9u3bV9u3\nb1dWVpYqKir0yiuv6Iorrmio5ADHMMZoypQp6tatm6ZPn+7tfsUVV+gf//iHJOkf//iHN8i94oor\ntGTJElVUVGjXrl3avn27+vfvr8jISIWFhemTTz6RMUYvvviidxzgTJs9e7ays7O1a9cuLVmyRD/+\n8Y/14osvUo7hOJGRkWrfvr22bdsmScrIyFD37t11+eWXU5bhKF27dtWaNWt0+PBhGWOUkZGhbt26\nUZbhSPVxPnHllVceM63XXntNw4cPP3kCfvBjrX6Ad955x1xwwQUmLi7OzJ49uyGTAhxj1apVxuVy\nmaSkJNO7d2/Tu3dv8+6775r9+/eb4cOHm4SEBDNixAhTUFDgHefRRx81cXFxpkuXLiY9Pd3b/bPP\nPjM9evQwcXFx5o477miI7AAmMzPT+zRjyjGc6PPPPzd9+/Y1vXr1MmPHjjWFhYWUZTjS3LlzTbdu\n3UyPHj3MTTfdZCoqKijLaPRSU1NNu3btTEBAgImJiTHPP/98vZbbsrIyc80115j4+HgzYMAAs2vX\nrpOmyWXMCW6iAgAAAACgkWqwZsYAAAAAAHxfBLMAAAAAAMchmAUAAAAAOA7BLAAAAADAcQhmAQAA\nAACOQzALAAAAAHAcglkAAH4AY4wGDx6s9PR0b7dXX31Vo0ePbsBUAQBw7uM9swAA/ECbNm3SNddc\no/Xr16uyslJ9+vTRe++9p06dOp32tKqqquTv738GUgkAwLmFYBYAgHowY8YMNWvWTCUlJQoJCdHu\n3bv15ZdfqrKyUmlpabriiiuUlZWlm266SSUlJZKkefPmaeDAgcrMzNSsWbPUokULbd26VevWrdM1\n11yj3NxcVVdXa9asWRo/fnwD5xAAgMaFYBYAgHpQWlqqPn36KDAwUGPGjFH37t01YcIEFRYWasCA\nATj9fBwAAAHQSURBVFq/fr1cLpfcbreaNGmi7du36/rrr9enn36qzMxMjRkzRps2bVLHjh31r3/9\nS++9957+9re/SZIOHjyosLCwBs4hAACNC8EsAAD15KGHHlJISIj+3//7fyorK/M2Fy4oKNB7772n\nyMhITZ06VRs2bJCfn5+2b9+u4uJiZWZm6pFHHtH7778vSdq+fbtGjhypa6+9VmPGjNHFF1/ckNkC\nAKBR4qYcAADqidvtltvtljFGS5cuVUJCQq3+aWlpateunV588UVVV1eradOm3n7BwcHe3wkJCVq/\nfr3efvttPfjggxo+fLhmzZp11vIBAIAT8DRjAADq2ahRo/T00097/69fv16SbS4cGRkpSVq0aJGq\nq6uPO35eXp6aNm2qCRMm6J577tG6devOfKIBAHAYamYBAKhHLpdLs2bN0vTp09WrVy8dOXJEnTt3\n1htvvKFf/vKXGjdunBYtWqRLL71UISEhtcbz2Lhxo+6991653W4FBgbqr3/9a0NkBQCARo17ZgEA\nAAAAjkMzYwAAAACA4xDMAgAAAAAch2AWAAAAAOA4BLMAAAAAAMchmAUAAAAAOA7BLAAAAADAcQhm\nAQAAAACOQzALAAAAAHCc/w/7CqU60Y2RJQAAAABJRU5ErkJggg==\n", "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n5cuXa/z48f7v43XXXSev1ytJSkhI0AcffKDDhw9r5syZ+v73v699+/adtBzHf9cBAN8MYRYAziLH\ncXTdddcpMjJSkZGRuuGGG/zvPfzww4qIiFCTJk0kSRMmTFBkZKQCAgJ077336tixY/6w86c//Um/\n/OUvlZiYKEnq3bu3WrVqVef8165dq6KiIj300EMKCgrS0KFDNWrUKC1atMg/zA033KD+/fsrMDBQ\nEyZM0KZNm2qc1pIlSzRq1ChdeeWVCgwM1H333aejR4/qo48+qra89aFLly6aOHGiPB6Pxo8fr7y8\nPP3f//2fgoODNWzYMIWEhCgrK0uO4+iFF17Qb37zG0VERKhZs2Z6+OGHtXjx4hqne3z56lomj8ej\nadOmKSYmxv85VTVo0CBlZmbq4MGDWr16tSZNmqTc3FwVFRXpvffe0+WXX15t+JkzZ6pJkybq3bu3\n+vTpo08//fSEcr366qsaNmyYbrrpJgUGBqpVq1b+MOvxeE758/IJCwvTI488okcfffSEeb3yyiua\nNGmS+vbtq5CQEM2ZM0dr1qzRrl27lJaWpl69eumGG25QYGCgpk+fXq2L/B//+Ec9/PDD6t69uwIC\nAvTwww9r06ZNys7OrrU8krVWfv755zp69Kjat29/0u7pNdWnk63Dmsb99a9/rcjISLVo0UIfffSR\n/vrXv0qyAw/79+/Xo48+qqCgIHXp0kV33XVXtXrTv39//7Lfe++9Kikp8XfXvvHGG/3rYvz48UpM\nTNS6detOurzHf9cBAN8MYRYAziKPx6Nly5YpPz9f+fn5ev311/3vVe0KLEm//vWv1aNHD0VERCgy\nMlKHDh3S/v37JUk5OTmKj48/7fnn5eWdMJ9OnTopLy/PX7727dv732vatKkKCwtrnNaePXvUsWPH\nassWFxen3Nzcaq/Vh+PLJElt27Y9oZxff/21iouLddFFF/kPGFxzzTX+9VaXU1mm49dfVU2bNlX/\n/v313nvv6f3339fll1+uSy+9VB9++KH/eVVVw2BYWFiN6zo7O7vWi3md6udV1aRJk7Rv3z6tWLGi\n2mfka431CQ8PV+vWrZWbm6s9e/YoNja22nSqrotdu3bpnnvu8a9333nIVdddTcLDw7VkyRL98Y9/\nVHR0tEaNGuU/aHMqjl+HRUVFNQ7n8Xh0//33Kz8/Xzt37lSTJk383bV37dqlvLw8f9kjIyM1Z84c\n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\n", "text": [ "" ] } ], "prompt_number": 98 }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. Determine the rate matrix $Q$ and calculate the invariant distribution of the following CTMC. Simulate the Markov Chain and see that the fraction of time spent in each state converges to $\\pi$. There exists something called \"the embedded Markov Chain,\" $\\tilde{Q}$, which may be useful for this simulation, if you want to make things a bit more efficient.\n", "\n", "$\\tilde{Q}_{ij}$ encodes the conditional probability of transitioning from state $i$ to state $j$ given that the CTMC is transitioning out of state $i$ (http://en.wikipedia.org/wiki/Continuous-time_Markov_chain#Embedded_Markov_chain). What you are effectively doing is only looking at the process when an event occurs. \n", "
\"CTMC\"
\n", "
Figure 5
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your answer here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 2: Erasure Codes\n", "\n", "Suppose our storage system has an object made up of $k$ source data symbols that we would like to protect with a Reed-Solomon erasure code. We encode them into $n$ total encoded symbols, giving us $r = n - k$ repair symbols. Recall that Reed-Solomon codes satisfy the Maximum Distance Seperable (MDS) property, that the $k$ source symbols can be recovered from any $k$ of the total $n$ encoded symbols. We denote this as an $[n,k,r]$ MDS code, and can be largely seen as a black box for this lab. The important thing to note is that if there are ever less than $k$ symbols available, the the data is lost permanently; otherwise, the data can always be recovered." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Part 3: MTTLD Analysis in Data Center\n", "\n", "
\"CTMC\"
\n", "
Figure 6
\n", "\n", "Our storage system maintains source data at the granularity of objects. The source data is partitioned into objects as it arrives, and is stored within the storage system. Each object is partitioned into $k$ source fragments. An erasure encoder is used to generate $r=n-k$ additional repair fragments from the $k$ source fragments, and each of these $n=k+r$ source and repair fragments are stored in a different node.\n", "\n", "The Continuous Time Markov Chain depicted above describes the life of one object in the storage system. Every object starts in state $n$, where every fragment of the data is available. As nodes in the storage system go through the process of failure and repair, there may at some times be fewer than $n$ fragments avaialable. For example, if a node with one fragment of an object in state $n$ fails, then it will lose a fragment and fall into state $n-1$ until it has been repaired or another fragment of data is lost, whichever comes first. The state of the object in the above CTMC is equal to the number of fragments of an object that are currently avaialable. You will notice that once a piece of data has $k-1$ fragments available, further fragments can no longer be generated (hence there are no arrows leaving state $k-1$). When there are only $k-1$ fragments of an object available in the storage system, that piece of data is considered lost, and Facebook, Google, Amazon, Dropbox, Apple, Microsoft, EMC, NetApp, Akamai, Rackspace, etc. all agree that losing data is a very bad thing.\n", "\n", "Thus, we can use a metric known as Mean Time to Loss of Data (MTTLD) to compare different storage and repair policies and pick the ones which gives us the most reliability at the lowest cost. We can derive this metric from the CTMC above as follows:\n", "\n", "1. Calculate the expected escape time of the CTMC, or equivalently, the expected hitting time of state $k-1$ starting from state $n$. This will give us the mean time to loss of a particular piece of data.\n", "2. Divide that number by the total number of objects in the storage system to find the overall MTTLD. It is important to note that this calculation assumes that each of the objects in our system are acting independently.\n", "\n", "#### 5. Determine the general form of the balance equations to calculate the mean hitting time to a certain state in a CTMC. Let $T_l$ denote the first time the CTMC hits state $l$. Then write the balance equations needed to calculate $\\mathbb{E}[T_l \\ | \\ X_0 = i]$. Express your equations in terms of the $i,j^{\\text{th}}$ components of the rate matrix and the embedded Markov Chain matrix, $Q_{ij}$ and $\\tilde{Q}_{ij}$ respectively.\n", "\n", "Hint: Use the balance equations to calculate hitting times for a DTMC as your guide. Don't forget to incorporate the expected time spent at each state. The final form of your solution should be:\n", "$$ \\mathbb{E}[T_l \\ | \\ X_0 = i] = \\begin{cases} \\underline{\\hspace{3cm}} & \\text{if $i \\neq l$} \\\\ \\underline{\\hspace{3cm}} & \\text{if $i = l$} \\end{cases}$$\n", "\n", "#### 6. Determine an expression for the Mean Time to Loss of an object (the expected escape time of a single instance of the Markov Chain in Figure 6).\n", "\n", "Assume $\\mu >> \\lambda$ and $\\mu >> 1$\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Your answer here\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Congratulations! You now know how to model (mini) data centers! You should use this knowledge to help Ben with `Bitdiddlers, Inc.` He'll need it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "References:\n", "\n", "[1] The Facebook Paper - XORing Elephants\n", "\n", "[2] The Google storage paper - Availability in Globally Distributed Storage Systems\n", "\n", "[3] The MSFT Azure paper - Erasure Coding in Windows Azure Storage" ] } ], "metadata": {} } ] }