{ "cells": [ { "cell_type": "markdown", "id": "b3167c7f", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# CAP Theorem Applied\n", "\n", "* Peter Silva, 2023\n" ] }, { "cell_type": "markdown", "id": "9160eaed", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "### CAP Theorem \n", " * Originally proposed by Eric A. Brewer in 2000. \n", " * Proved in 2002 by Gilbert & Lynch.\n", " * Definitions from Gilbert & Lynch\n", " \n", "### Definitions\n", "* Consistency - _any read operation that begins after a write operation completes must return that value, or the result of a later write operation_ \n", "* Availability - _every request received by a non-failing node in the system must result in a response_ \n", "* Partition (Tolerance) - _the network will be allowed to lose arbitrarily many messages sent from one node to another_ " ] }, { "cell_type": "markdown", "id": "1ce1e254", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Cap Theorem\n", "\n", "* An ideal distributed system will feature all Consistency, Availability, and Partition Tolerance. \n", "\n", "* In reality, the best one can do is 2 out of three. " ] }, { "cell_type": "markdown", "id": "0bc777a6", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Proof\n", "\n", "* walk through: Gilbert & Lynch (Thanks to MWhittaker): https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/ ?\n", "\n", "* Real usage of CAP theoream involves looking at what is pragmatic in real-life cases." ] }, { "cell_type": "markdown", "id": "bc391fe2", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Storage/State\n", "\n", "* What is a File System? -- an ordered list of writes (with a path)\n", "\n", "* What is a SQL Database? -- an ordered list of writes (with indices)\n", "\n", "* What is a File? - an ordered list of bytes, with an id (path.)\n", "\n", "* What is an Object (in object storage context) -- an ordered list of bytes, with an id (opaque hash)" ] }, { "cell_type": "markdown", "id": "26baf6e2", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## They Are All Units of Synchronization\n", "* Traditional databases and file systems are just really large files. \n", "* files and objects are the same thing\n", "* They are units of synchronization/state.\n", "* Consistency == order == synchronization == global state.\n", "* When Distributed...\n", " * User expectation is coherence/consistency\n", " * Coherence is the same thing as shared state.\n", "* Amdahl's Law tells us that scaling global state is really, really hard.\n" ] }, { "cell_type": "code", "execution_count": 96, "id": "e53833fe", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.patches import Circle, Rectangle, Polygon, Arrow, FancyArrow, FancyArrowPatch\n", "\n", "def three_circles(ax, x, y, box_bg, arrow1):\n", " patches = [\n", " Circle( (x,y), 0.3, fc=box_bg),\n", " Circle( (x+2,y), 0.3, fc=box_bg),\n", " Circle( (x+1, y-1), 0.3, fc=box_bg),\n", " FancyArrow( x+0.4, y, 1.2, 0, fc=arrow1, width=0.05, head_width=0.05, head_length=0 ),\n", " FancyArrow( x+0.25, y-0.3, 0.4, -0.4, fc=arrow1, width=0.05, head_width=0.05, head_length=0),\n", " FancyArrow( x+1.7, y-0.3, -0.4, -0.4, fc=arrow1, width=0.05, head_width=0.05, head_length=0),\n", " ]\n", " \n", " for p in patches:\n", " ax.add_patch(p)\n", " plt.text(x-0.15,y+0.4, 'G1', fontsize=20)\n", " plt.text(x+1.85,y+0.4, 'G2', fontsize=20)\n", " plt.text(x+0.70,y-1.6, 'Client', fontsize=20)\n", " \n", "def create_base(box_bg = '#CCCCCC',\n", " arrow1 = '#88CCFF',\n", " arrow2 = '#88FF88',\n", " supervised=True):\n", " \n", " fig = plt.figure(figsize=(8, 4.2), facecolor='w')\n", " ax = plt.axes((0, 0, 1, 1),\n", " xticks=[], yticks=[], frameon=False)\n", " ax.set_xlim(0, 8)\n", " ax.set_ylim(0, 6)\n", "\n", " x=3\n", " y=3\n", " three_circles(ax, x,y,box_bg,arrow1)\n", "\n" ] }, { "cell_type": "code", "execution_count": 95, "id": "703693f9", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Assuming a file system can do 100000 IOPS\n", "distance between data centres=600, speed of light=300000 km/s, time to travel (1way)=0.002 sec. \n" ] } ], "source": [ "# Proof of IOPS ceiling\n", "SAN_iops=100000\n", "time_for_1_iop=1/SAN_iops\n", "distance=600\n", "c=300000\n", "tprop=distance/c\n", "max_iops=1/(2*(time_for_1_iop+tprop))\n", "\n", "print( f\"Assuming a file system can do {SAN_iops} IOPS\")\n", "print( f\"distance between data centres={distance}, speed of light={c} km/s, time to travel (1way)={tprop} sec. \" )\n" ] }, { "cell_type": "code", "execution_count": 92, "id": "4db28587", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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pfo5OvJI6++ZU+fdkSNHTPXq1dOsMyAgwGzbts1af9GiRenGUalSpQxn3kTuYjYz5FleXl569NFH9emnn+rYsWNav369mjVrlqLcrFmzZIyRZN+a44gbLS7e3t6qVq2add8SY4z+/fdf/f7774qMjFR8fLxefvllSdJLL72Ual3NmjXTyy+/rIkTJ0qS+vXrp927d6tYsWJ25a5cuaIePXpYV7Z69uyZ6dakrLj5alhWt/n4449bdR07dkzHjx9XaGjoLcWWfDyKJAUEBFjPixQposDAQKtL26RJk9SuXbtcmUmsc+fOql69uqTrx9mNsTy9e/dWoUKF0l13yJAh+uijj6zXfn5+uu+++3THHXcoIiJCa9as0eXLlxUTE6MRI0bo9OnTmjx5coYxGWPUs2dPLVmyRDabTXfddZeqVKkiY4z27t2bpc9l9erV1nMvLy917do103Vk5L333rPr0ujt7a1mzZqpdOnSOn/+vNasWaNz584pMTFRU6ZM0fHjx/X99987tD9jxozRm2++Ken/xsx5enpq586d2r59uyQpPDxcnTp10rZt26zxeKn5z3/+Y9e6VaRIETVs2FAlSpRQTEyMduzYob1798oYoy+//FL//POPli5dmmHXw6ioKLVr104nTpyQj4+PmjRpotDQUF26dCnF1fUDBw6oZcuW1uyMNptNtWvXVrVq1eTr66tTp05p/fr1unTpkv755x+1bt1aP/30U4atYtL1Founn35aklSpUiXVr19fBQoU0MGDB/Xrr7/KGKOoqCh17NhRBw4cSDGz4I2ZCX/44Qf9888/ktKebaxKlSoZxuMqsuu4SExMVPv27bVt2zZrWfXq1a1ZGWNiYhQREaFdu3alOTvnwIEDNWnSJEnSt99+qylTpsjPzy/d+JN3L37kkUdSfH/16tXLrptp+fLlVadOHQUFBSk+Pl5nz57Vnj17dOzYsRR1+/v7W8eFI9+TqR0rOXXeRUdH64EHHtCRI0cUGBio5s2bKyQkRH///bdWr16tuLg4Xbx4UW3bttWff/6p7du3q2vXroqPj1doaKgaNWqkggULat++fdq0aZOk662aPXv21MqVK9PdNnKR8/IowN7NLTPG2N/b44knnkh1vfLlyxtJJjAw0Fy7ds0Y43jLzNNPP22WLl1qrl69mur7CQkJZsaMGcbPz89I11tojh49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aIxRfHy8IiMjtXXrVn300Ue33EVQut660LVrV61evVr//e9/7badm93NkrdsONqdL3m55P/cU3Oju1R2Sn5s3MpNK1OT059HdkzRnR2tDxn9sHHk75YbceTGlOa3i5z6e7zwwgtav3692rZta9cSEx0drRUrVmjEiBGqXLmyWrZsqT179qRb/8CBA63nN3c127Bhg9XjoGTJkmrbtm2a9Tz88MPaunWrHnnkEXl5eVnLr127pnXr1unNN99U/fr1Vb9+fa1fvz79nXZQXjzeOT9cE8kMXEKhQoWsK067d+/Wyy+/bH2JZfbeMje899571vPx48dr8eLF6tmzp6pVq6bAwEC7L3Qp4x9VN4uNjVWPHj3s7l5/9epV9evXL0vx3qrkCUNkZKT+/PPPLNXz+++/272+9957bymunPCf//zHLmncsGFDrm07efclR7vzJS+X0f1rckLyv+GuXbvsjtlb5Qqfx81J1oULF1Ik4Bk90rureVbieOGFFzIdgzHGad2xbkc5eVzce++9Wr58uU6fPq0FCxbo+eefV926de2Sm9WrV6tBgwb69ddf04zxkUcesboVLlu2zO7eNMnvLdOvX78MuzbXqFFD8+fP19mzZ7VkyRK99NJLatSokd0FuW3btqlFixb67rvv0q3LEXnlvIPrI5mBy0ietHz11VeSrg/ey2hAa2r+/vtvHTlyRNL1PrBp3Qjzhujo6Aybs2/20ksvWVfVSpUqZX1x//TTT04ZmH7zj5yvv/46S/XMnTvXeh4aGmp3VT8vuf/++63nad18Lick707k6ODp48ePW8+Dg4OzPaaMJB9QGxsbq++//z7b6naFzyMwMFDe3t7W6xvfDbkt+Q12nRUD/k9uHBfBwcHq2rWrpkyZom3btun06dP64IMPrOP+2rVreuqpp9Jcv0CBAurZs6ek612AZ86cKen6xbcbk6vYbDY98cQTDsfk7++v9u3b6+2339Zvv/2myMhIffXVV9Z3fVJSkp555hlrDFpW5ZXzDq6PZAYuo1WrVipRooTdsoceesjhPvPJJe+bXqlSpRSDJm+2ceNGGWMcrn/FihVWwuLm5qa5c+fa3d34pZdespsUIDeEhYWpTZs21uvPP/880xMBbN++XevWrbNe37iTeF7k4+NjPU/+DzOn1alTx3r+22+/ObRO8iuvGc32lROaNGliN0vPlClTHO5KmRFX+Tzuvvtu6/mKFStyZZs3a9CggfV83bp12dpClt3yS3ec3D4ugoOD9eyzz2rRokXWsn379uno0aNprpNaV7N58+ZZ3+/33XffLY3T9Pf3V58+fbR69WrruzQyMtJu8P4NmT0u8sJ5B9dHMgOX4e7urh49etgty2oXs+RN+VevXs2w/CeffOJw3WfPnlXfvn2t5Ofll19W06ZNNWDAAHXp0kXS9emab+6ClhuGDx9uPT916pRGjBjh8Lrx8fEaOHCgtV+FChWy+yea1+zcudN6nnzq0ZyWvJVj2bJl1lS7aYmIiLDGf928fm6x2Wx2rZNbtmzR5MmTM11PQkJCiqmUk+/Pjh07tGvXrnTruHbtmubNm5fq+jmpQ4cO1vNPP/1UMTExubLd5Bo3bmx1Gbp8+bKmTZuW6zE4KvnFgtt5kgBnHReNGjWym1zl9OnTaZatUaOGGjZsKOl668b69evtxs+kNfA/s8LCwuxmB0stpsweF3nhvIPrI5mBS3nttde0ZcsW65HegMb0hIWFWVeQ9u7dq7/++ivNst9++62WLFnicN1PPPGEIiIiJF2/N0ryaYGnTZumkiVLSrp+v5qXX345K+FnWatWrdS3b1/r9Ycffmg3digtCQkJ6tatm7Zt22Ytmzp1aoYzumWHuLg4DRkyxG46zowcOHDAbmac5PdxyWlt2rSxroLGxsbqhRdeSLOsMUbPPfec4uLiJF2/X1KrVq1yI8wUevbsaffD4uWXX9bnn3/u8PrHjx9Xy5YtrW4uN1SuXFlNmza1Xj/77LPp/sh5/fXXrQTQ398/xQWMnPLUU09ZicTJkyf1zDPPONwaGxkZaTcteFZ5e3vbHS+vvvpqhgPAk0vvB292Sz5986lTp3Jtu7ktu4+LjGbnu+H8+fN2k2dkNBvek08+aT1/5ZVXtHnzZknXu1HfuIiWXpyOSEhIsOuym1pMmT0u8sJ5B9dHMgOXEhgYaM2oUr9+/SzfqyU4ONjq0pGUlKRHHnkkxTSoSUlJ+uijj9SrVy+5u7vbXXFKy8cff2wlPn5+fpo7d67d4MmgoCDNnDnTSqQ++OCDXG9anzp1qmrWrGm9Hj58uLp27ZrqfXaMMVq/fr3uuusuLVy40Frev3//LLeKZdaNv0O5cuXUrVs3LVu2LM2rdwkJCfrmm2/UvHlzqz+3n5+fnn322VyJVbre6vfWW29Zr7/55hs9+eSTKe7fcunSJfXv399uIO3bb7+dqftMZCebzaaZM2eqQoUKkq73v3/qqafUsWNHbdmyJc0fGHv37tULL7ygihUrpjnL0VtvvWWdqxs2bFDXrl1TtFjFxcXptdde06RJk6xlo0aNyvabeKYlICDArjVqxowZ6tixow4ePJhqeWOMNm3apCFDhig0NPSWxw/cMHToUOvq96VLl3Tvvfdq2rRpVsJ7s6ioKH3xxReqV6+e3n333WyJwRHJ71ezYMGCTHXDdSXZfVw8+uijat++vb777rs0u/meOHFC3bp1s/7mFSpUUPny5dONs1u3btY9v5J3/+rZs2eG3WyHDx+uJk2aaObMmWmODT179qyeeOIJK5nx9/dPdRbK5MfF/Pnz092ulHfOO7g27jODfGvcuHFq06aNkpKStGPHDtWoUUONGzdW2bJldfnyZW3YsMH64h4/frw+//xzu4HJNztw4ICGDRtmvZ48eXKqd6pv2bKlXnzxRU2aNEnGGPXt21d79uzJtYHffn5+WrdunTp16mSNf1m4cKEWLlyomjVrqnLlygoICNDZs2e1ffv2FIO2//Of/9j94MwtcXFx+vbbb/Xtt9/K09NTtWvXVpkyZVS4cGElJCTo1KlT+uOPP+z+GXt4eOjLL7/M8KaK2e3RRx/V+vXrrZuFfvHFF/r222/VokULFStWTGfOnNHq1avtZsh74YUXMrz7dE4LCgrSpk2b1LVrV+vYWLJkiZYsWaI77rhD9erVU0hIiNzc3BQREaF9+/alOCdSm32sUaNGeuutt6xujosXL1bp0qXVokUL3XnnnTp//rzWrl1rd4W4c+fO+s9//pODe5tS3759dfToUY0dO1aStHTpUi1btkzVq1dX9erV5e/vrytXrujUqVPasWNHtt+TR7o++9uiRYvUqlUrhYeHKzo6WgMHDtTw4cPVqFEjlSxZUjabTefOndOBAwd06NAha3xTixYtsj2etHTp0kUjRoyQMUZLly5VzZo1dc8999j9/bt165Zr93fKSdl5XCQlJWnZsmVatmyZPD09Vb16dVWsWFEBAQG6dOmSjh8/rs2bN1t/U3d3d33wwQcZxujr66vHH388RZfoAQMGZLiuMUYbN27Uxo0b5e7urkqVKqlq1arWjWZPnjyp3377zS6hfu+991Kdbrxr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2rt3b5rbL1WqlAIDA3NyFwEgTTaT1i2BASCPWbx4sYYOHaojR444VL5x48Z6++231bhxY7vlx44dU1hYmMPbHTVqlEaPHp2ZUIFclx3nx+jRozVmzJhMbXfGjBnq27dvptYBgOxCNzMALqNjx446cOCAFi5cqIEDB6pGjRoKCQmRh4eHChUqpNDQUD3wwAMaPXq09u3bp40bN6ZIZHKaI3dSz4r33ntPlSpVUtWqVTV58mRJkjFGgwYNUvny5VW/fn399ddfVvk333xT5cuXV7Vq1ayr8GvXrtXDDz+cI/HdipiYGHXp0kXly5dXixYtFBkZmaJMZvd1586datiwoapXr6569eo51PUqL8nKceQK5wcAZDsDAMg2zZo1S/f9hIQEEx0dnak6V65caR544AETFxdnjDHm9OnTxhhjFi1aZLp27WqMMebHH3+0nu/evds0aNDAxMfHmx07dpj69esbY4xZs2aNVSYv+eCDD8zQoUONMcZMmTLFep5cZvf18OHD5s8//zTGGHPgwAETFhaWG7vikAsXLpjExMR0y2R0HAEArqNlBgBywd9//63Ro0erUqVK2rFjR6bW/eyzzzRixAh5enpKkooWLSrpereiXr16Sbp+Vf7XX3+VMUaLFy9W9+7d5eHhodq1aysuLk7//vuvXZ2rV6/WPffco6ioKPXt21dDhgxR8+bNVaFCBW3atEndunVTxYoVNWLEiGzY+/Ql34/evXtr8eLF6ZZxZF8rVKigcuXKSZIqVaqky5cvKzEx0a7OxMRE9ezZU1WrVlWNGjU0Y8YMSdIff/yhJk2aqG7duuratasuX74sSfrtt9/UoEED1apVSy1btszy/m7YsEFVqlTRhAkTFBERkeV6AAB0MwOAHJOYmKglS5aoY8eO6tixowoXLqw//vhDTZs2zVQ9R44c0S+//KK7775bbdq00eHDhyVJ//zzj0qWLClJcnNzU1BQkKKiouyWS9cHaJ86dcp6vWrVKo0cOVKLFy+2brp46dIlrV27VqNHj1bHjh319ttva+/evZo3b16q3b46d+5sTYyQ/LF161ZJ0uDBg1N9f9GiRSnqSh5v4cKFdeHChXTLZGZfJemHH35QvXr15O7ubrd8586dCg8P1/79+7Vnzx516dJFcXFxGjZsmBYtWqTt27erYcOGmjp1qmJjY9WzZ09Nnz5du3bt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g86fP682bdtp+/Ztuq//62rxxGuK+vuI5r/+uCL+3KMxY8bo5Zdf5io2LImJiXrrrbc0evRo3VGhph59c46K3Fleq6eP15ovx6lu3Xr6ecVyFS5c2NmhAoBLIpkBAAcdOXJEFStWVMnKddVn8mL5h5SQJCXEx+mXz0dr/cy31aBhI82dM1thYWFOjhbOdvToUT3es5f++H2zmvV5RS0HjpKHp5ckKfrsP5r5n446dXC7Dh8+rAoVKjg5WgBwTYziAwAHVahQQcuXL1fChX/1frca2rPqe0mSh6eX2g2eoIGfr9PhY6dUo2ZNffXVVzk+MBt5kzFGM2bMUM1atXTkxL8a+Pl6tR083kpk9vyyQO93q6GEC/9qxYoVJDIAcAtomQGATIqKitLAgU9p4cLvVbdDHz047AP5FPSXJMVcjtbiSc9r2+Kv1LlzF33++WcKDg52csTILZGRkXryyYH68ccfVK9jX3Uc+r7dsbHovee0fclMde36sD777FMVKVLEyREDgGsjmQGALDDGaNasWRry7LPyLlREj7w5W2Vq32u9v2fV9/pxwkD5+Xhp1syv1LZtWydGi9ywfPly9enbT1dj49Xp1c9V/b4u1nvhOzZowajeir0UpY+mTlWvXr0YYA8A2YBuZgCQBTabTX369NHuXbtUKayUPh/YTMs/elUJ8XGSpBotu+r5eXtUuGwttWvXTkOGPKurV686OWrkhKtXr2rw4CG6//77VbhcbT03b4+VyCTEx2n51BH6fGAzVQorpT27d6t3794kMgCQTWiZAYBblJiYqHfffVevv/66NWNV0bAqkq634Gya/5F++mA4UzjfhrZt26Yej/dU+LFjeuD599TwkWesROX00f367o2eOv3XXr355psaPnw4M90BQDajZQYAbpG7u7teeeUV/f777/Iz1/Rhz7r67dupMsbIZrPpnseG6Nk523XVVkANGjTQxIkTlZiY6OywcQsSExM1YcIENWzYUFfdfPXsnO1q9Ohg2Ww2GWP067wPNbVXPfkpRr///rteeeUVEhkAyAG0zABANrp27ZpeeullTZ36oSo1aquub3yZ6hTODRvdozmzZzGFswsKDw/X4z176ffNm1KdcnnBmH46vPlnDRnyrN55520VKFDAyREDwO2LZAYAcsCKFSvUp28/Xb4Wq06vfq4aLbta7x3buVHfvdFL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aZK1/po1a4wks2bNGrvthIeHG0lmxowZ1rI+ffoYLy8vU6VKFfP+++/b7feIESNMxYoVzfTp082KFStMhw4djCSzdevWDD/nm/fp4MGDplChQqZcuXJm1qxZZunSpaZ79+5Gknn77bdTxH7nnXeahx56yCxevNjMmTPHlC9f3vj7+5u//vrLKlupUiVTvnx5M3v2bLNu3Trz/fffm6FDh6bY7+QuXbpkPD09zYQJE6xlgwYNMgUKFDB+fn4mLi7OGHP9KrjNZjMff/yx3T6VKVPG3H333Wb+/Plm2bJlpnnz5sbDw8Murn379pmAgABTo0YNM2vWLPPzzz+boUOHGjc3NzN69OgU+1qmTBnz+OOPm6VLl5pvvvnGlC5d2lSoUMEkJCSk+xnfd999JigoyCxfvtzUqlXLuLu7m5CQEPPUU0/ZtcAcPHjQSDIfffRRijqGDRtmbDabuXbtmjHGmFdeecVIMpcvX05RNjg42HTv3j3dmG5umdmzZ4+58847TaNGjczZs2etcjl13PXt29dMnz7drFy50qxcudKMHTvWFChQwIwZM8auXGhoqClZsqQpXbq0+fLLL82yZcvM448/biSZd9991yqXmfNdkilZsqSpWbOm+frrr83q1avNzp07zfLly40k079/f7Np0yazadMm8+eff9qt16xZswz3LTUXLlwwAQEBpnPnzinemzZtmgkICDCnTp2ytnNzy0x8fLypV6+eqVatmvnjjz/MpUuXzLZt20zt2rVN3bp1rfMBgPOQzACwcyOZSf7j3xhjateunaJbRXx8vAkJCTFdunRJs76EhAQTHx9v+vfvb+rUqWP3XkxMjKlTp44JCwsz+/fvN8WKFTPNmjVL8SM1rWTm2WeftSvXqVMnI8n897//TRF73bp1rdeZTWZuTthu7Lcks337dmt5VFSUcXd3Ny+++GKan0da+9StWzfj7e1tTpw4YVfu/vvvN76+vubChQt2sdetW9ckJSVZ5W50iRowYIAx5np3KElmypQpGcZys3vvvdfcd9991uvy5cub4cOHGzc3N7Nu3TpjjDFz5841kszhw4ft9qlYsWImOjraWhYREWHc3NzMxIkTrWVt27Y1pUqVsksojDFmyJAhxsfHx5w7d85uXx944AG7cvPnzzeSzKZNm9Ldj0qVKhkfHx9TqFAhM2HCBLNmzRrzzjvv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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "create_base()\n", "plt.text(1.5, 4, 'Max IOPS for Coherent Filesystem',fontsize=24)\n", "plt.text(3.3, 3.3, '|<-- 600km == 0.002 sec. -->|', fontsize=7)\n", "plt.text(2.5, 1.0, f\"maximum iops when {distance} km apart: {int(max_iops)}\", fontsize=12)\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "6ea5f011", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Pick any 2, Which two?\n", "\n", "* CA: Consistency and Availability\n", "* AP: Availabilty and Partition Tolerance.\n", "* CP: Consistency and Partition Tolerance" ] }, { "cell_type": "markdown", "id": "26bebd15", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Choosing CA:\n", "* At best, you need a quorum system.\n", "* quorum means obtaining a consensus among the existing nodes about the current state.\n", "* usually means voting for primaries (at best, sharded masters) and triggering a pause to vote for a new primary whenever it goes down.\n", "* The system as a whole, cannot respond to queries while voting is in progress, and so is unavailable.\n", "* but at least it is up after the vote is done, in spite of the formerly primary node dying.\n" ] }, { "cell_type": "markdown", "id": "b843815d", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Quorum and Voting:\n", "* Multiple Algorithms:\n", " * Paxos: \"Paxos is exceptionally difficult to understand\"\n", " * \"few people were comfortable with Paxos even among seasoned researchers\"\n", "\n", "* papers like \"In Search of an Understandable Consensus Algorithm (Extended Version)\" resulted in RAFT\n", "\n", "* Things you want:\n", " * quickly convergent?\n", " * a single leader elected?\n", " * low overhead once leader in place.\n", " * quick detection of loss of leader.\n", " * known behaviour when: flapping, partitioning, WAN.\n", "\n", "* If it partitions, tradeoffs:\n", " * AP: both sides will elect new leaders and \"fork\" the file system (writing inconsistently thereafter.) OR:\n", " * CA: One side will know it has a minority of nodes and shutdown (losing a lot of nodes, but hoping the other side is still up.) OR:\n", " * CP: both sides refuse to write. (no A for writing.)\n", " \n", " " ] }, { "cell_type": "markdown", "id": "1a58bd02", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Choosing AP:\n", "\n", "* incoming requests are routed to the nodes that remain up. They provide the data they have.\n", "* you don't need a master. nodes receive updates, and tell the others, \n", "* changes propagate through the cluster... eventually consistent.\n", "* no voting, no loss of availability." ] }, { "cell_type": "markdown", "id": "9499457e", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "### Voting Failure Modes\n", "\n", "\n", "| Number of Masters | < 1 | 1 | >1 |\n", "|-------------------|----------------------------|--------------------------|--------------|\n", "| All Talk | Down wait | Up OK | Bickering |\n", "| Partitioned | Unstable LR | Unstable LR | LR |\n", "\n", "(LR... partitioned into left and right clusters.)\n" ] }, { "cell_type": "markdown", "id": "c2fb9b08", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Choosing CP:\n", " * as long as the backups can reach the primary, all can answer read requests.\n", " * when a write is received, the backup passes it to the primary.\n", " * when a backup loses access to the primary, for coherency, it must stop answering. It no longer knows.\n", " * A Manual intervention would be required to tell the backup that it is now the primary in order for availability to be restored, because there is no way to tell the difference between a primary failure and a network partition.\n" ] }, { "cell_type": "markdown", "id": "a1b6bb55", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Bringing Amdahl & CAP Together\n", "\n", "* Amdahl's Law is about dealing with large numbers of processors sharing resources.\n", " \n", "* CAP is about tradeoffs inherent using different methods of sharing resources." ] }, { "cell_type": "markdown", "id": "f335b812", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Almost-Coherent File System or DB Performance\n", "\n", "* A bandaid on Traditional single node \n", "* a synchronized file system is going to have ordered operations, it is going to be a 1:1 connection with shared state.\n", "* usually a \"journal\" to sync between sides.\n", "* in the meantime, readers on the wrong side get the _wrong_ data. \n", "* sometimes you establish an upper bound (if you hit it, you hang so that it doesn't get too out of sync.)\n", "* synchronization is a struggle against Amdahl's Law.\n", "* will not scale." ] }, { "cell_type": "markdown", "id": "58fa5584", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Universal Write Scaling\n", "\n", "* obtain delegation for a subdomain, write locally.\n", "\n", " * write behind cache ... the write will get to the other side eventually, but G1 and G2 will be out of synch for a while. \n", "\n", " * sharding (dividing domain so every node is writing locally.) \n", " * route requests to appropriate shard.\n", "\n", "* locks over smaller subsets --> more write parallelism.\n", "* writes must be localized (no solution for scaled distributed writes.)\n", "\n" ] }, { "cell_type": "markdown", "id": "3df85e5c", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Non-Shared Approaches.\n", "\n", "* the only thing that does scale.\n", "* transfer files or objects, rather than synchronizing file systems. maximally distributed synchronization.\n", " * explicit sharding.\n", "* any number of transfers can occur in parallel.\n", "* the underlying file systems are local stores.\n", " * are not the same, they just contain the same files, eventually.\n", " * are not synchronized at any point, they receive a sum of changes that add up to the same stored state.\n", "* lag can occur, but can run an unlimited number of processes to do transfers, none limited by propagation delay. Transfers occur in parallel to the degree desired.\n", "* Because the transfers are independent, no fundamental performance limit, beyond the perfomance of hardware on each end, and the pipe between.\n" ] }, { "cell_type": "markdown", "id": "4b5061d6", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "## Examples of Non-Shared Approaches\n", "\n", "### Object Stores\n", "\n", "* An object is a self-contained item that can be distributed.\n", "* Every object is equivalent to a db or a file system. \n", "* with many objects, state is distributed among subsets of nodes, not global.\n", "* distribution of objects (with lag) is much easier to achieve than a coherent view.\n", "* Different Object Stores lean in different directions in CAP.\n", "* requires application adaptation, perhaps profound.\n" ] }, { "attachments": { "CAP-Theorem-is-a-concept-that-a-distributed-storage-system-can-only-have-2-of-the-3.jpg": { "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAIiAtgDASIAAhEBAxEB/8QAHAABAAIDAQEBAAAAAAAAAAAAAAUGBAcIAwEC/8QAWhAAAQQBAgQDBAYEBg0HCwUAAQACAwQFBhEHEiExE0FRFCJhcQgVMkKBkSNSYqEWM3JzgrEJJDQ3Q1N0g5KisrPBFzhjdZOj0iU2REVXdpSVtNHwGDVUwtP/xAAbAQEAAgMBAQAAAAAAAAAAAAAAAQMCBAUGB//EADQRAQACAgEDBAAEAwcFAQAAAAABAgMRBBIhMQUTQVEGImGBFDJxFSMzQpGhsVLR4fDxJP/aAAwDAQACEQMRAD8A4yREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREF+4HcLs9xY1kNP4WSKtHFH4925MCY68W4G+w+04k7BvTc+YAJG989gvokcM8k/T2fbndYZattFcdBPI5scn3usb42Ag92guLex6hS/0dJXcPvoX6y19j2Mgy9185htbe8OXlgh/wBGRzyPi4rjVzi5xc4kknck+aDoXivoXgZmeGuT13wl1RPTtYsxOtYK9IS8sfK2P3BJ7+4LwdwXtO23QrnhFeOBWjXa94tad0sYy6vattdb28q7Pfl6+XuNIHxIQdT8J/o08OMnwkwtbVNZ7NbZ3EzZCCU3JWOhaeXlIiDg0iMTQ8wIPVx/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hMhmPB1FkLsslSl7PK4ytcIADzhpYPsO7kdviFo7RlytjtYYXIXH+HWq5CCaZ+xdysbI1zjsOp6A9kHQH9kZAHHDE7DbfTkG/wD8RZXM63n9NXXeleIXFXHZnSGVGToQYWGrJMIZIgJRNO8t2e1pPR7eu23VaMQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQERTeldKal1VadW03gcllpGDeQVKzpBGPVxA2aPidghraFRbgw3AbOH39TaiwOBaDs6Bs5u2Nvg2AOYD8HPaVbMZwl4aY4A3LGpdQStP2jJFQiPzYBK4j5PCqtnx18y3sPpvKzfyUlzn5ourqGE0RjC04zh9p2N7dvftMluFxHmRPI5n5NA+Gyl62YsUz/5Op4jG9Nv7QxVat09P0bG+g/IKmebjjw6WP8Ocq380xDj+OCeRu8cMjx23a0lZowOdI3GFyRHwqv8A/suvn6w1Y/vqfM/hekH9RWMdQ59zi52cyZJ6km2/r+9YTzq/EL6/hnL83hyDYx9+u8ssUrMLmjctfE5pH5hY23w2XZsWrNUxNDY9SZhjW9mi7IB+XMvzb1Lmro2yNwZEbbEXoWWRt8RI126n+Or9MZ/DOf4tDjT8UXWt6ppvIsDMpofSloDrvHi2VHH5ureGT+agMnw34XZMk/UOYwjyOhxuT542n1LJ2vcR8PEHzVleXjlq5PQOZTxET/SXNP4pst25bgRVmHNpnXNGZ2xPs+XqPpvJ8mtewyxn5ucwKhav4Za60rWdczGnbYoN6e31i2zV/wC2iLmA/Anf4K+uStvEuXl4ubDP95WYU5ERZKBERAREQERe1StYuWY6tSvLYnkPKyOJhc9x9AB1JQeS+LZeL4Ka3mAkzkWP0rCRuTm7IglHTf8AucB0/wD3asNDhboShscxqnMZqQfaixdNtWI/KaYud+cIVd81KeZRMxDSaLoitiOHePj5KHD6pZcO02VyFixJ+Ubo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jOzmOHmFfgz2xT+iYnTnNfFubjHoullcZY1/papHW8NzTnsXC3ZtZ7jt7VC0DYQPcQC3/BvO32XN20yu1S8XjcLYnYiIsgREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB9CeSLbf0d9F1snkJ9aZ+rHYwmFka2GtMzdl+6RvHCR2LGj9I/4BrT9sKLWisblZixWy3ilY7yvfB7R/wDAHTjM7fjaNVZitvC1w9/GU5B/qzStPXzbGduhe4CeXtetWL1ya5bldNPO8ySPd3c4ncleK4ubLOS25fR/T+DTh4YpHn5kREVTfEREBERAREQEREBERAREQEREBEWbgsZYzGVgx1Ysa+V3V7zs2NoG7nuPk1oBJPoE8sb2ilZtbxCU0jia0rJc3lo3OxdNwaYwdjZlPVsQPp03cfJo9SF+8tfs5PIS3bTgZJD2A2a0AbBoHkAAAB5ABZeobtWV8OPxgczF0WmOsD0Mh+9K79p56n0Gw7AKKWtmybnpjw8fy+VPJydU+PgREVDVEREBERAREQfqWvWyNGTF3jywyHmil23MEnk/5eRHmPiAtd5KnYx16albj8OaF3K8f8R6g9wfMLYSw9UY4ZfEmzG3e/Rj36d5YB1I+be4/Z39Arsd/iXP5vH3HXVQURFe5YiIgIiICIiAiIgIiICIiAiIgIiIM7B5Szh8lHeqiN5aHMkilZzxzRuBa+N7T0cxzSWkeYK1jxo0RW07frZ/TzXu0xmC51QFxe6nMOslSQ/rM3BaT9pha7vzAbAUpiDi79C9pfURP1HlmtZNIG8zqkzd/CssH6zCTuB9pjnt+8tri5/btqfEsqzpzMil9YaeyWldTX9PZeNrLlKUxvLDux47tew/eY5pDmnza4HzUQuysEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQSemcLkdR6hoYHEwePevzsggZvsC5x23J8gO5PYAErqyerjMNjKGl8E7nxWHjMMMvLsbUpO8thw9Xu6j0aGN+6tefRwwAw+nMjruzGBcumTF4guHVjOUe0zD091zYgf25PMK8rn8zL/kh678O8HUTyL/ALCIi571giIgIiICIiAiIgIiICIiAiIgIiICuNKI4DSzT9nJZmPmd5GKpv7o+chHN/Ja39ZQ2kMX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ucDuBJKGck9Jx7R2Y9z4bvIO3LHfdceoEQt+totG4cS9LUnVoERFkwEREBERAREQEREBERAREQEREBERAREQFn4PE381fFLHwiSQMdJI5zgyOKNo3dI97iGsY0dS4kAL3xuGY7Fy53NX4cLgIHcsuQsAkPd/i4WD3ppf2G9u7i0dVrviPxKdmMfJpnStWbD6ZLwZWPcDayDmndr7Lx0I36iJvuN6facOY0Zc8U7R5bnG4lss7ntCa4jcQqGJxtrSOg7ZmbZjdBmM41pa640nrBX36sr9OrujpPPZvunTy+r4tC1ptO5dulK0jVRERYsxERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQTGlNSZzSuYZltP5Kahba0sLmbFsjD3Y9p3a9h82uBB8wtw6f1ho7WobDcNTR+oXdw9xGLtu/ZcdzWcfR28f7TBsFodfFnS9qTuFWXDTLGrQ6DzeIyWFueyZSnLVlLQ9ocNw9p7Oa4dHNPk4Eg+RWCqFojibqTTFEYh3s2awXNzHFZNhlgaT3MZBD4XdftRuaT579lsbD5zQOq+UYrLnTORf3x2alHs5d6R2wA3b+dbHt+s7utzHyIt5crNwL0717wxkUjnMFl8JLHHlcfPVEreeF7hvHM39Zjxu17fi0kKOWxExLQms1nUiIilAiIgIiICIiAiIgIiICLOwmHyubueyYjHWb0+25ZDGXco9Tt2HxPRfMxf0RpRp/hFnxlsg3/1VgpGTEH0ls9Yo/6HikeYCwvkrXzK7Hhvkn8sPxicdfy1+OhjKc9y1IfcihYXuP4Dy+K+5/UGjdCgtvS19VagZ2xtObejWdt/6ROw/pCD3jiO3QgyNPRa/wBZcVc/m8fPhcTDBpvAzdJKGOLgbDfLx5SS+b5OPID1DWqgFaeTkTbtXs6mDgVp3v3lP621hn9ZZRt/PXjOYmeHWgjaI4K0flHFG3ZrG/ADqep3JJUAEXxazoeBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREFq0dxA1fpKJ1bB5ueKjId5aEzWz1JT6ugkDo3H4lu/wAVecbxV0pk+WPVGj5MbKdgbun5yB8XOrTFzXH4NkjHwWnUHdZVvaviVd8VL/zRt0JQGkM0R/B/XeHe8jcVstvjph8zJ+g/KUrNvaP1PTq+2SYS5JTJ2Fuuzx4HfKVnMw/gVzcVnYbL5bC3G3MPlL2OsMO7Zqlh0Tx8nNIKvrybR5al/T8c+OzcxBBII2I7goqXU4y8SIf7p1I7LAjY/W9SDIEj52GPKz6/GfKkk5DSGjciTv1fj5K/XfffavJGPX4dfltbHKj5hrT6bb4ssqKBPF7HSAeLw3wDCPOvdut3+fPM792y+f8AK1iv/Z3i/wD5ha/8an+Kow/s7L9wn0UCOLuNYCY+G+Ckcf8AH3rjmj8GytO/4ryscZr+22P0To7Hnyc2pPYPcd/HmkHlt28yn8VVMenZPtY1NY3SepsjXNqngsg+qPtWTA5sLfi6R2zR+JWs7XGjiNIA2pnYcQBvscTjq1Fw/pwRtd+9VDPagz2oLPtOdzeSys/+Mu2nzO/N5JWE8r6hdX03/qs3nfr6Zwu/8I9c4Cm9vevRmORnPwHs/NGD8HyNVfyHE/ROKaW6e0rdztgdrOcn8GH5+zwO5vzmI+C0yiptnvb5bWPh4qfG1v1jxJ1lqmp9X5LLuhxYO7cbRiZVqA+RMMQa1x6/acC74qnr6iq22YiI8PiIihIiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIg/9k=" } }, "cell_type": "markdown", "id": "5c040b89", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "![CAP-Theorem-is-a-concept-that-a-distributed-storage-system-can-only-have-2-of-the-3.jpg](attachment:CAP-Theorem-is-a-concept-that-a-distributed-storage-system-can-only-have-2-of-the-3.jpg)\n", "\n", "* Source: Fotis Nikolaidis from \"Tromos : a software development kit for virtual storage\n", "systems\" (PhD thesis 2020/01/17)" ] }, { "cell_type": "markdown", "id": "2f097463", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Cloud Solves This!\n", "\n", "* cloud vendors talk about \"availability zones\" there is no HA or synch across availabilty zones, they talk about times like 15 minutes, to do periodic synching. Object syncing takes time (and money.)\n", "* 2006, HP DC Consolidation project established 200 miles as the longest distance between Data Centres. So that would give them 500 IOPS or so on a synchronous store.\n", "* Note, putting a file system or a db inside a single object store means no scaling. \n", "* Individual objects don't scale, using many objects does." ] }, { "cell_type": "markdown", "id": "d4c68303", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "from: https://aws.amazon.com/rds/features/multi-az/\n", "\n", "* *Failover time depends on length of replica lag*\n", "* *Any data updates that occurred after the latest restorable time (typically within the last 5 minutes) will not be available*\n", "\n", "From Google: https://cloud.google.com/compute/docs/disks#repds\n", "* *Regional persistent disks have storage qualities that are similar to zonal persistent disks. However, regional persistent disks provide durable storage and replication of data between two zones in the same region.*\n", "* *Zonal SSD PD multi-writer mode Throughput per GB (MB/s): 0.48*\n", "\n", "\n", "the google performance numbers are within a zone (multi-DC but not too far apart.) not multi-zone.\n", "\n" ] }, { "cell_type": "markdown", "id": "2f016ef3", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "### Sarracenia: File Systems Flying in Formation\n", "\n", "* Another distributed approach\n", "* transfers files between file systems without synchronizing.\n", "* Every file is equivalent to an object, a db or a file system.\n", "* no locking, architecturally unlimited scaling.\n", "* generalized buffering and parallelism of transfer at scale.\n", "* file systems at all nodes are totally independent, limited only by local hardware on each node. \n", "* transfers limited by bandwidth, not latency.\n", "* works with legacy code un-changed, or new (agnostic.)\n", "* In terms of CAP--> heavily AP.\n" ] }, { "cell_type": "markdown", "id": "7ee8541d", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Thanks!" ] }, { "cell_type": "markdown", "id": "23f98a0c", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "\n", "Sources:\n", "\n", "* https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/ (An Illustrated Proof of the CAP Theorem, referring to Gilbert & Lynch's paper which is a dead link. )\n", "* https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing\n", "* https://www.youtube.com/watch?v=eWMgsk7mpFc&ab_channel=IBMTechnology\n", "* https://eax360.com/distributed-coordination-algorithms/ - Distributed Coordination Algorithms\n", "* https://raft.github.io/raft.pdf In search of an Understandable Consensus Algorithm (Extended Version) Diego Ongaro and John Ousterhout.\n", "* https://www.cs.ubc.ca/~bestchai/teaching/cs416_2020w2/lectures/lecture-mar23.pdf - fun practical talk about practical CAP.\n", "* https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf - Impossibility of Distributed Consensus with One Faulty\n", "Process - MICHAEL J. FISCHER, NANCY A. LYNCH, MICHAEL S. PATERSON\n", "\n" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.7" } }, "nbformat": 4, "nbformat_minor": 5 }