1924 lines
104 KiB
HTML
1924 lines
104 KiB
HTML
<!DOCTYPE html>
|
||
<html class='v2' dir='ltr' lang='en'>
|
||
<head>
|
||
<link href='https://www.blogger.com/static/v1/widgets/2872013778-css_bundle_v2.css' rel='stylesheet' type='text/css'/>
|
||
<meta content='width=1100' name='viewport'/>
|
||
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
|
||
<meta content='blogger' name='generator'/>
|
||
<link href='http://dbmsmusings.blogspot.com/favicon.ico' rel='icon' type='image/x-icon'/>
|
||
<link href='http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html' rel='canonical'/>
|
||
<link rel="alternate" type="application/atom+xml" title="DBMS Musings - Atom" href="http://dbmsmusings.blogspot.com/feeds/posts/default" />
|
||
<link rel="alternate" type="application/rss+xml" title="DBMS Musings - RSS" href="http://dbmsmusings.blogspot.com/feeds/posts/default?alt=rss" />
|
||
<link rel="service.post" type="application/atom+xml" title="DBMS Musings - Atom" href="https://www.blogger.com/feeds/8899645800948009496/posts/default" />
|
||
|
||
<link rel="alternate" type="application/atom+xml" title="DBMS Musings - Atom" href="http://dbmsmusings.blogspot.com/feeds/4890754415665382215/comments/default" />
|
||
<!--Can't find substitution for tag [blog.ieCssRetrofitLinks]-->
|
||
<meta content='http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html' property='og:url'/>
|
||
<meta content='Partitioned consensus and its impact on Spanner’s latency' property='og:title'/>
|
||
<meta content=' In a post that I published in September , I described two primary approaches for performing consensus in distributed systems, and how the c...' property='og:description'/>
|
||
<title>DBMS Musings: Partitioned consensus and its impact on Spanner’s latency</title>
|
||
<style id='page-skin-1' type='text/css'><!--
|
||
/*
|
||
-----------------------------------------------
|
||
Blogger Template Style
|
||
Name: Ethereal
|
||
Designer: Jason Morrow
|
||
URL: jasonmorrow.etsy.com
|
||
----------------------------------------------- */
|
||
/* Content
|
||
----------------------------------------------- */
|
||
body {
|
||
font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;
|
||
color: #666666;
|
||
background: #fb5e53 url(https://resources.blogblog.com/blogblog/data/1kt/ethereal/birds-2toned-bg.png) repeat-x scroll top center;
|
||
}
|
||
html body .content-outer {
|
||
min-width: 0;
|
||
max-width: 100%;
|
||
width: 100%;
|
||
}
|
||
a:link {
|
||
text-decoration: none;
|
||
color: #2198a6;
|
||
}
|
||
a:visited {
|
||
text-decoration: none;
|
||
color: #4d469c;
|
||
}
|
||
a:hover {
|
||
text-decoration: underline;
|
||
color: #2198a6;
|
||
}
|
||
.main-inner {
|
||
padding-top: 15px;
|
||
}
|
||
.body-fauxcolumn-outer {
|
||
background: transparent none repeat-x scroll top center;
|
||
}
|
||
.content-fauxcolumns .fauxcolumn-inner {
|
||
background: #ffffff url(https://resources.blogblog.com/blogblog/data/1kt/ethereal/bird-2toned-blue-fade.png) repeat-x scroll top left;
|
||
border-left: 1px solid #fb5e53;
|
||
border-right: 1px solid #fb5e53;
|
||
}
|
||
/* Flexible Background
|
||
----------------------------------------------- */
|
||
.content-fauxcolumn-outer .fauxborder-left {
|
||
width: 100%;
|
||
padding-left: 300px;
|
||
margin-left: -300px;
|
||
background-color: transparent;
|
||
background-image: url(//themes.googleusercontent.com/image?id=0BwVBOzw_-hbMNjViMzQ0ZDEtMWU1NS00ZTBkLWFjY2EtZjM5YmU4OTA2MjBm);
|
||
background-repeat: no-repeat;
|
||
background-position: left top;
|
||
}
|
||
.content-fauxcolumn-outer .fauxborder-right {
|
||
margin-right: -299px;
|
||
width: 299px;
|
||
background-color: transparent;
|
||
background-image: url(//themes.googleusercontent.com/image?id=0BwVBOzw_-hbMNjViMzQ0ZDEtMWU1NS00ZTBkLWFjY2EtZjM5YmU4OTA2MjBm);
|
||
background-repeat: no-repeat;
|
||
background-position: right top;
|
||
}
|
||
/* Columns
|
||
----------------------------------------------- */
|
||
.content-inner {
|
||
padding: 0;
|
||
}
|
||
/* Header
|
||
----------------------------------------------- */
|
||
.header-inner {
|
||
padding: 27px 0 3px;
|
||
}
|
||
.header-inner .section {
|
||
margin: 0 35px;
|
||
}
|
||
.Header h1 {
|
||
font: normal normal 60px Times, 'Times New Roman', FreeSerif, serif;
|
||
color: #ff8b8b;
|
||
}
|
||
.Header h1 a {
|
||
color: #ff8b8b;
|
||
}
|
||
.Header .description {
|
||
font-size: 115%;
|
||
color: #666666;
|
||
}
|
||
.header-inner .Header .titlewrapper,
|
||
.header-inner .Header .descriptionwrapper {
|
||
padding-left: 0;
|
||
padding-right: 0;
|
||
margin-bottom: 0;
|
||
}
|
||
/* Tabs
|
||
----------------------------------------------- */
|
||
.tabs-outer {
|
||
position: relative;
|
||
background: transparent;
|
||
}
|
||
.tabs-cap-top, .tabs-cap-bottom {
|
||
position: absolute;
|
||
width: 100%;
|
||
}
|
||
.tabs-cap-bottom {
|
||
bottom: 0;
|
||
}
|
||
.tabs-inner {
|
||
padding: 0;
|
||
}
|
||
.tabs-inner .section {
|
||
margin: 0 35px;
|
||
}
|
||
*+html body .tabs-inner .widget li {
|
||
padding: 1px;
|
||
}
|
||
.PageList {
|
||
border-bottom: 1px solid #fb5e53;
|
||
}
|
||
.tabs-inner .widget li.selected a,
|
||
.tabs-inner .widget li a:hover {
|
||
position: relative;
|
||
-moz-border-radius-topleft: 5px;
|
||
-moz-border-radius-topright: 5px;
|
||
-webkit-border-top-left-radius: 5px;
|
||
-webkit-border-top-right-radius: 5px;
|
||
-goog-ms-border-top-left-radius: 5px;
|
||
-goog-ms-border-top-right-radius: 5px;
|
||
border-top-left-radius: 5px;
|
||
border-top-right-radius: 5px;
|
||
background: #ffa183 none ;
|
||
color: #ffffff;
|
||
}
|
||
.tabs-inner .widget li a {
|
||
display: inline-block;
|
||
margin: 0;
|
||
margin-right: 1px;
|
||
padding: .65em 1.5em;
|
||
font: normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif;
|
||
color: #666666;
|
||
background-color: #ffdfc7;
|
||
-moz-border-radius-topleft: 5px;
|
||
-moz-border-radius-topright: 5px;
|
||
-webkit-border-top-left-radius: 5px;
|
||
-webkit-border-top-right-radius: 5px;
|
||
-goog-ms-border-top-left-radius: 5px;
|
||
-goog-ms-border-top-right-radius: 5px;
|
||
border-top-left-radius: 5px;
|
||
border-top-right-radius: 5px;
|
||
}
|
||
/* Headings
|
||
----------------------------------------------- */
|
||
h2 {
|
||
font: normal bold 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif;
|
||
color: #666666;
|
||
}
|
||
/* Widgets
|
||
----------------------------------------------- */
|
||
.main-inner .column-left-inner {
|
||
padding: 0 0 0 20px;
|
||
}
|
||
.main-inner .column-left-inner .section {
|
||
margin-right: 0;
|
||
}
|
||
.main-inner .column-right-inner {
|
||
padding: 0 20px 0 0;
|
||
}
|
||
.main-inner .column-right-inner .section {
|
||
margin-left: 0;
|
||
}
|
||
.main-inner .section {
|
||
padding: 0;
|
||
}
|
||
.main-inner .widget {
|
||
padding: 0 0 15px;
|
||
margin: 20px 0;
|
||
border-bottom: 1px solid #dbdbdb;
|
||
}
|
||
.main-inner .widget h2 {
|
||
margin: 0;
|
||
padding: .6em 0 .5em;
|
||
}
|
||
.footer-inner .widget h2 {
|
||
padding: 0 0 .4em;
|
||
}
|
||
.main-inner .widget h2 + div, .footer-inner .widget h2 + div {
|
||
padding-top: 15px;
|
||
}
|
||
.main-inner .widget .widget-content {
|
||
margin: 0;
|
||
padding: 15px 0 0;
|
||
}
|
||
.main-inner .widget ul, .main-inner .widget #ArchiveList ul.flat {
|
||
margin: -15px -15px -15px;
|
||
padding: 0;
|
||
list-style: none;
|
||
}
|
||
.main-inner .sidebar .widget h2 {
|
||
border-bottom: 1px solid #dbdbdb;
|
||
}
|
||
.main-inner .widget #ArchiveList {
|
||
margin: -15px 0 0;
|
||
}
|
||
.main-inner .widget ul li, .main-inner .widget #ArchiveList ul.flat li {
|
||
padding: .5em 15px;
|
||
text-indent: 0;
|
||
}
|
||
.main-inner .widget #ArchiveList ul li {
|
||
padding-top: .25em;
|
||
padding-bottom: .25em;
|
||
}
|
||
.main-inner .widget ul li:first-child, .main-inner .widget #ArchiveList ul.flat li:first-child {
|
||
border-top: none;
|
||
}
|
||
.main-inner .widget ul li:last-child, .main-inner .widget #ArchiveList ul.flat li:last-child {
|
||
border-bottom: none;
|
||
}
|
||
.main-inner .widget .post-body ul {
|
||
padding: 0 2.5em;
|
||
margin: .5em 0;
|
||
list-style: disc;
|
||
}
|
||
.main-inner .widget .post-body ul li {
|
||
padding: 0.25em 0;
|
||
margin-bottom: .25em;
|
||
color: #666666;
|
||
border: none;
|
||
}
|
||
.footer-inner .widget ul {
|
||
padding: 0;
|
||
list-style: none;
|
||
}
|
||
.widget .zippy {
|
||
color: #cccccc;
|
||
}
|
||
/* Posts
|
||
----------------------------------------------- */
|
||
.main.section {
|
||
margin: 0 20px;
|
||
}
|
||
body .main-inner .Blog {
|
||
padding: 0;
|
||
background-color: transparent;
|
||
border: none;
|
||
}
|
||
.main-inner .widget h2.date-header {
|
||
border-bottom: 1px solid #dbdbdb;
|
||
}
|
||
.date-outer {
|
||
position: relative;
|
||
margin: 15px 0 20px;
|
||
}
|
||
.date-outer:first-child {
|
||
margin-top: 0;
|
||
}
|
||
.date-posts {
|
||
clear: both;
|
||
}
|
||
.post-outer, .inline-ad {
|
||
border-bottom: 1px solid #dbdbdb;
|
||
padding: 30px 0;
|
||
}
|
||
.post-outer {
|
||
padding-bottom: 10px;
|
||
}
|
||
.post-outer:first-child {
|
||
padding-top: 0;
|
||
border-top: none;
|
||
}
|
||
.post-outer:last-child, .inline-ad:last-child {
|
||
border-bottom: none;
|
||
}
|
||
.post-body img {
|
||
padding: 8px;
|
||
}
|
||
h3.post-title, h4 {
|
||
font: normal normal 24px Times, Times New Roman, serif;
|
||
color: #2198a6;
|
||
}
|
||
h3.post-title a {
|
||
font: normal normal 24px Times, Times New Roman, serif;
|
||
color: #2198a6;
|
||
text-decoration: none;
|
||
}
|
||
h3.post-title a:hover {
|
||
color: #2198a6;
|
||
text-decoration: underline;
|
||
}
|
||
.post-header {
|
||
margin: 0 0 1.5em;
|
||
}
|
||
.post-body {
|
||
line-height: 1.4;
|
||
}
|
||
.post-footer {
|
||
margin: 1.5em 0 0;
|
||
}
|
||
#blog-pager {
|
||
padding: 15px;
|
||
}
|
||
.blog-feeds, .post-feeds {
|
||
margin: 1em 0;
|
||
text-align: center;
|
||
}
|
||
.post-outer .comments {
|
||
margin-top: 2em;
|
||
}
|
||
/* Comments
|
||
----------------------------------------------- */
|
||
.comments .comments-content .icon.blog-author {
|
||
background-repeat: no-repeat;
|
||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==);
|
||
}
|
||
.comments .comments-content .loadmore a {
|
||
background: #ffffff url(https://resources.blogblog.com/blogblog/data/1kt/ethereal/bird-2toned-blue-fade.png) repeat-x scroll top left;
|
||
}
|
||
.comments .comments-content .loadmore a {
|
||
border-top: 1px solid #dbdbdb;
|
||
border-bottom: 1px solid #dbdbdb;
|
||
}
|
||
.comments .comment-thread.inline-thread {
|
||
background: #ffffff url(https://resources.blogblog.com/blogblog/data/1kt/ethereal/bird-2toned-blue-fade.png) repeat-x scroll top left;
|
||
}
|
||
.comments .continue {
|
||
border-top: 2px solid #dbdbdb;
|
||
}
|
||
/* Footer
|
||
----------------------------------------------- */
|
||
.footer-inner {
|
||
padding: 30px 0;
|
||
overflow: hidden;
|
||
}
|
||
/* Mobile
|
||
----------------------------------------------- */
|
||
body.mobile {
|
||
background-size: auto
|
||
}
|
||
.mobile .body-fauxcolumn-outer {
|
||
background: ;
|
||
}
|
||
.mobile .content-fauxcolumns .fauxcolumn-inner {
|
||
opacity: 0.75;
|
||
}
|
||
.mobile .content-fauxcolumn-outer .fauxborder-right {
|
||
margin-right: 0;
|
||
}
|
||
.mobile-link-button {
|
||
background-color: #ffa183;
|
||
}
|
||
.mobile-link-button a:link, .mobile-link-button a:visited {
|
||
color: #ffffff;
|
||
}
|
||
.mobile-index-contents {
|
||
color: #444444;
|
||
}
|
||
.mobile .body-fauxcolumn-outer {
|
||
background-size: 100% auto;
|
||
}
|
||
.mobile .mobile-date-outer {
|
||
border-bottom: transparent;
|
||
}
|
||
.mobile .PageList {
|
||
border-bottom: none;
|
||
}
|
||
.mobile .tabs-inner .section {
|
||
margin: 0;
|
||
}
|
||
.mobile .tabs-inner .PageList .widget-content {
|
||
background: #ffa183 none;
|
||
color: #ffffff;
|
||
}
|
||
.mobile .tabs-inner .PageList .widget-content .pagelist-arrow {
|
||
border-left: 1px solid #ffffff;
|
||
}
|
||
.mobile .footer-inner {
|
||
overflow: visible;
|
||
}
|
||
body.mobile .AdSense {
|
||
margin: 0 -10px;
|
||
}
|
||
|
||
--></style>
|
||
<style id='template-skin-1' type='text/css'><!--
|
||
body {
|
||
min-width: 1310px;
|
||
}
|
||
.content-outer, .content-fauxcolumn-outer, .region-inner {
|
||
min-width: 1310px;
|
||
max-width: 1310px;
|
||
_width: 1310px;
|
||
}
|
||
.main-inner .columns {
|
||
padding-left: 0;
|
||
padding-right: 350px;
|
||
}
|
||
.main-inner .fauxcolumn-center-outer {
|
||
left: 0;
|
||
right: 350px;
|
||
/* IE6 does not respect left and right together */
|
||
_width: expression(this.parentNode.offsetWidth -
|
||
parseInt("0") -
|
||
parseInt("350px") + 'px');
|
||
}
|
||
.main-inner .fauxcolumn-left-outer {
|
||
width: 0;
|
||
}
|
||
.main-inner .fauxcolumn-right-outer {
|
||
width: 350px;
|
||
}
|
||
.main-inner .column-left-outer {
|
||
width: 0;
|
||
right: 100%;
|
||
margin-left: -0;
|
||
}
|
||
.main-inner .column-right-outer {
|
||
width: 350px;
|
||
margin-right: -350px;
|
||
}
|
||
#layout {
|
||
min-width: 0;
|
||
}
|
||
#layout .content-outer {
|
||
min-width: 0;
|
||
width: 800px;
|
||
}
|
||
#layout .region-inner {
|
||
min-width: 0;
|
||
width: auto;
|
||
}
|
||
body#layout div.add_widget {
|
||
padding: 8px;
|
||
}
|
||
body#layout div.add_widget a {
|
||
margin-left: 32px;
|
||
}
|
||
--></style>
|
||
<!-- Google tag (gtag.js) -->
|
||
<script async='true' src='https://www.googletagmanager.com/gtag/js?id=G-WPSPKTZ8VQ'></script>
|
||
<script>
|
||
window.dataLayer = window.dataLayer || [];
|
||
function gtag(){dataLayer.push(arguments);}
|
||
gtag('js', new Date());
|
||
gtag('config', 'G-WPSPKTZ8VQ');
|
||
</script>
|
||
<link href='https://www.blogger.com/dyncss/8899645800948009496/authorization.css?zx=64628a2a-8581-41e2-b103-b6627e610902' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyncss/8899645800948009496/authorization.css?zx=64628a2a-8581-41e2-b103-b6627e610902' rel='stylesheet'/></noscript>
|
||
<meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/>
|
||
<meta name='google-adsense-platform-domain' content='blogspot.com'/>
|
||
|
||
</head>
|
||
<body class='loading variant-hummingBirds2'>
|
||
<div class='navbar section' id='navbar' name='Navbar'><div class='widget Navbar' data-version='1' id='Navbar1'><script type="text/javascript">
|
||
function setAttributeOnload(object, attribute, val) {
|
||
if(window.addEventListener) {
|
||
window.addEventListener('load',
|
||
function(){ object[attribute] = val; }, false);
|
||
} else {
|
||
window.attachEvent('onload', function(){ object[attribute] = val; });
|
||
}
|
||
}
|
||
</script>
|
||
<div id="navbar-iframe-container"></div>
|
||
<script type="text/javascript" src="https://apis.google.com/js/platform.js"></script>
|
||
<script type="text/javascript">
|
||
gapi.load("gapi.iframes:gapi.iframes.style.bubble", function() {
|
||
if (gapi.iframes && gapi.iframes.getContext) {
|
||
gapi.iframes.getContext().openChild({
|
||
url: 'https://www.blogger.com/navbar/8899645800948009496?po\x3d4890754415665382215\x26origin\x3dhttp://dbmsmusings.blogspot.com',
|
||
where: document.getElementById("navbar-iframe-container"),
|
||
id: "navbar-iframe"
|
||
});
|
||
}
|
||
});
|
||
</script><script type="text/javascript">
|
||
(function() {
|
||
var script = document.createElement('script');
|
||
script.type = 'text/javascript';
|
||
script.src = '//pagead2.googlesyndication.com/pagead/js/google_top_exp.js';
|
||
var head = document.getElementsByTagName('head')[0];
|
||
if (head) {
|
||
head.appendChild(script);
|
||
}})();
|
||
</script>
|
||
</div></div>
|
||
<div class='body-fauxcolumns'>
|
||
<div class='fauxcolumn-outer body-fauxcolumn-outer'>
|
||
<div class='cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left'>
|
||
<div class='fauxborder-right'></div>
|
||
<div class='fauxcolumn-inner'>
|
||
</div>
|
||
</div>
|
||
<div class='cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class='content'>
|
||
<div class='content-fauxcolumns'>
|
||
<div class='fauxcolumn-outer content-fauxcolumn-outer'>
|
||
<div class='cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left'>
|
||
<div class='fauxborder-right'></div>
|
||
<div class='fauxcolumn-inner'>
|
||
</div>
|
||
</div>
|
||
<div class='cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class='content-outer'>
|
||
<div class='content-cap-top cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left content-fauxborder-left'>
|
||
<div class='fauxborder-right content-fauxborder-right'></div>
|
||
<div class='content-inner'>
|
||
<header>
|
||
<div class='header-outer'>
|
||
<div class='header-cap-top cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left header-fauxborder-left'>
|
||
<div class='fauxborder-right header-fauxborder-right'></div>
|
||
<div class='region-inner header-inner'>
|
||
<div class='header section' id='header' name='Header'><div class='widget Header' data-version='1' id='Header1'>
|
||
<div id='header-inner'>
|
||
<div class='titlewrapper'>
|
||
<h1 class='title'>
|
||
<a href='http://dbmsmusings.blogspot.com/'>
|
||
DBMS Musings
|
||
</a>
|
||
</h1>
|
||
</div>
|
||
<div class='descriptionwrapper'>
|
||
<p class='description'><span>
|
||
</span></p>
|
||
</div>
|
||
</div>
|
||
</div></div>
|
||
</div>
|
||
</div>
|
||
<div class='header-cap-bottom cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
<div class='tabs-outer'>
|
||
<div class='tabs-cap-top cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left tabs-fauxborder-left'>
|
||
<div class='fauxborder-right tabs-fauxborder-right'></div>
|
||
<div class='region-inner tabs-inner'>
|
||
<div class='tabs no-items section' id='crosscol' name='Cross-Column'></div>
|
||
<div class='tabs no-items section' id='crosscol-overflow' name='Cross-Column 2'></div>
|
||
</div>
|
||
</div>
|
||
<div class='tabs-cap-bottom cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
<div class='main-outer'>
|
||
<div class='main-cap-top cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left main-fauxborder-left'>
|
||
<div class='fauxborder-right main-fauxborder-right'></div>
|
||
<div class='region-inner main-inner'>
|
||
<div class='columns fauxcolumns'>
|
||
<div class='fauxcolumn-outer fauxcolumn-center-outer'>
|
||
<div class='cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left'>
|
||
<div class='fauxborder-right'></div>
|
||
<div class='fauxcolumn-inner'>
|
||
</div>
|
||
</div>
|
||
<div class='cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
<div class='fauxcolumn-outer fauxcolumn-left-outer'>
|
||
<div class='cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left'>
|
||
<div class='fauxborder-right'></div>
|
||
<div class='fauxcolumn-inner'>
|
||
</div>
|
||
</div>
|
||
<div class='cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
<div class='fauxcolumn-outer fauxcolumn-right-outer'>
|
||
<div class='cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left'>
|
||
<div class='fauxborder-right'></div>
|
||
<div class='fauxcolumn-inner'>
|
||
</div>
|
||
</div>
|
||
<div class='cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
<!-- corrects IE6 width calculation -->
|
||
<div class='columns-inner'>
|
||
<div class='column-center-outer'>
|
||
<div class='column-center-inner'>
|
||
<div class='main section' id='main' name='Main'><div class='widget Blog' data-version='1' id='Blog1'>
|
||
<div class='blog-posts hfeed'>
|
||
|
||
<div class="date-outer">
|
||
|
||
<h2 class='date-header'><span>Friday, December 14, 2018</span></h2>
|
||
|
||
<div class="date-posts">
|
||
|
||
<div class='post-outer'>
|
||
<div class='post hentry uncustomized-post-template' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'>
|
||
<meta content='8899645800948009496' itemprop='blogId'/>
|
||
<meta content='4890754415665382215' itemprop='postId'/>
|
||
<a name='4890754415665382215'></a>
|
||
<h3 class='post-title entry-title' itemprop='name'>
|
||
Partitioned consensus and its impact on Spanner’s latency
|
||
</h3>
|
||
<div class='post-header'>
|
||
<div class='post-header-line-1'></div>
|
||
</div>
|
||
<div class='post-body entry-content' id='post-body-4890754415665382215' itemprop='description articleBody'>
|
||
<div dir="ltr" id="docs-internal-guid-752a93a8-7fff-c332-00cf-b0874cf3a4eb" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">In a </span><a href="http://dbmsmusings.blogspot.com/2018/09/newsql-database-systems-are-failing-to.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">post that I published in September</span></a><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, I described two primary approaches for performing consensus in distributed systems, and how the choice of approach affects the consistency guarantees of the system. In particular, consensus can either be </span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">unified</span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, such that all writes in the system participate in the same distributed consensus protocol, or it can be </span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">partitioned</span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, such that different subsets of the data participate in distinct consensus protocols. </span></div>
|
||
<div dir="ltr" id="docs-internal-guid-5bc41c2e-7fff-e5b7-3c83-41638e91bc81" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The primary downside of partitioned consensus was that achieving global consistency is much more complicated. Consistency guarantees require that requests submitted after previous requests complete will never “go back in time” and view a state of the system that existed prior to the completed request. Such guarantees are hard to enforce in partitioned consensus systems since different partitions operate independently from each other: Consistency requires a notion of “before” and “after” --- even for events on separate machines or separate partitions. For partitions that operate completely independently, the most natural way to define “before” and “after” is to use real time --- the time on the clocks of the different partitions. However, clocks tend to skew at the millisecond granularity, and keeping clocks in sync is nontrivial. We discussed how Google has a hardware solution that aids in clock synchronization, while other solutions attempt to use software-only clock synchronization algorithms. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">In contrast, unified consensus results in a global order of all requests. This global order can be used to implement the notion of “before” and “after” without having to rely on local clock time, which entirely avoids the need for clock synchronization. This results in stronger consistency guarantees: unified consensus systems can guarantee consistency at all times, while partitioned consensus systems can only guarantee consistency if the clock skew stays within an expected bound. For software-only implementations, it is hard to avoid occasionally violating the maximum clock skew bound assumption, and the violations themselves may not be discoverable. Therefore, unified consensus is the safer option.</span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The post led to several interesting debates, most of which are beyond the scope of this post. However, there was one interesting debate I’d like to explore more deeply in this post. In particular, the question arose: Are there any fundamental </span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">latency </span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">differences between unified-consensus systems and partitioned-consensus systems? When I read the comments to my post (both on the post itself and also external discussion boards), I noticed that there appears to be a general assumption amongst my readers that unified consensus systems must have higher latency than partitioned consensus systems. One reader even accused me of purposely avoiding discussing latency in that post in order to cover up a disadvantage of unified consensus systems. In this post, I want to clear up some of the misconceptions and inaccurate assumptions around these latency tradeoffs, and present a deeper (and technical) analysis on how these different approaches to consensus have surprisingly broad consequences on transaction latency. We will analyze the latency tradeoff from three perspectives: (1) Latency for write transactions, (2) Latency for linearizable read-only transactions and (3) Latency for serializable snapshot transactions.</span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<h3 dir="ltr" style="font-size: 18.73px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 25.84px; margin-bottom: 5.33px; margin-top: 21.33px;">
|
||
<span style="color: #434343; font-family: Arial; font-size: 18.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Latency for write transactions</span></h3>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The debate around write transactions is quite interesting since valid arguments can be made for both sides. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The partitioned-consensus side points out two latency downsides of unified consensus: (1) As mentioned in </span><a href="http://dbmsmusings.blogspot.com/2018/09/newsql-database-systems-are-failing-to.html" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">my previous post</span></a><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">, in order to avoid scalability bottlenecks, unified consensus algorithms perform consensus batch-at-a-time instead of on individual requests. They, therefore, have to pay the additional latency of collecting transactions into batches prior to running consensus. In the original Calvin paper, batch windows were 10ms (so the average latency would be 5ms); however, we have subsequently halved the batch window latency in my labs at Yale/UMD. </span><a href="http://www.fauna.com/" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">FaunaDB</span></a><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> (which uses Calvin’s unified consensus approach) also limits the batch window to 10ms. (2) For unified consensus, there will usually be one extra network hop to get the request to the participant of the consensus protocol for its local region. This extra hop is local, and therefore can be assumed to take single-digit milliseconds. If you combine latency sources (1) and (2), the extra latency incurred by the preparation stage for unified consensus is approximately 10-15ms. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">On the other hand, the unified-consensus side points out that multi-partition atomic write transactions require two-phase commit for partitioned-consensus systems. For example, let’s say that a transaction writes data in two partitions: A and B. In a partitioned-consensus system, the write that occurred in each partition achieves consensus separately. It is very possible that the consensus in partition A succeeds while in B it fails. If the system guarantees atomicity for transactions, then the whole transaction must fail, which requires coordination across the partitions --- usually via two-phase commit. Two-phase commit can result in significant availability outages (if the coordinator fails at the wrong time) unless it runs on top of consensus protocols. Thus Spanner and Spanner-derivative systems all run two-phase commit over partitioned consensus for multi-partition transactions. The latency cost of the Raft/Paxos protocol itself (once it gets started) is the same for unified and partitioned consensus, but two-phase commit requires </span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 700; vertical-align: baseline; white-space: pre-wrap;">two rounds of consensus</span><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> to commit such transactions. A single round of consensus may take between 5ms and 200ms, depending on how geographically disperse the deployment is. Since Spanner requires two sequential rounds, the minimum transaction latency is double that --- between 10ms for single-region deployments to 400ms for geographically disperse deployments. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">In practice, this two-phase commit also has an additional issue: a transaction cannot commit until all partitions vote to commit. A simple majority is not sufficient --- rather every partition must vote to commit. A single slow partition (for example, a partition undergoing leader election) stalls the entire transaction. This increases the observed long tail latency in proportion to transaction complexity.</span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">In contrast, unified consensus systems such as Calvin and its derivatives such as FaunaDB do not require two-phase commit. [Side note: a discussion of how to avoid two-phase commit in a unified consensus system can be found in </span><a href="http://www.vldb.org/pvldb/vol7/p821-ren.pdf" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">this VLDB paper</span></a><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">. FaunaDB’s approach is slightly different, but the end result is the same: no two-phase commit.] As a result, unified consensus systems such as Calvin and FaunaDB only require one round of consensus to commit all transactions --- even transactions that access data on many different machines. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The bottom line is that the better latency option between unified or partitioned consensus for write transactions is somewhat workload dependent. Unified consensus increases latency for all transactions by a little, but partitioned consensus can increase latency by a lot more for multi-partition transitions. For most applications, it is impossible to avoid multi-partition transactions. For example, many applications allow transactional interactions between arbitrary users (payments between users, exchanges between users, “friendship” status updates between users, gaming interactions, etc.). Although it is possible to group users into partitions such that many of their interactions will be with other users within that partition (e.g. partition by a user’s location), as long as arbitrary interactions are allowed, there will always be interactions between users in different partitions. These multi-partition interactions are much slower in partitioned-consensus systems. Thus, for most workloads, unified-consensus is the better latency option for write transactions.</span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<h3 dir="ltr" style="font-size: 18.73px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 25.84px; margin-bottom: 5.33px; margin-top: 21.33px;">
|
||
<span style="color: #434343; font-family: Arial; font-size: 18.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Latency for linearizable read-only transactions</span></h3>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Linearizable read-only transactions are generally sent to the consensus leader’s region and performed (or at least receive a timestamp) there [other options exist, but this is what Spanner and other systems mentioned in my previous post do]. In unified-consensus, there is only one leader region for the whole system. Linearizable read transactions that initiate from near this region will be processed with low latency, while transactions that initiate from farther away will observe correspondingly higher latency. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Meanwhile, in partitioned-consensus, there is one leader per partition, and these leaders can be located in different regions. The partitioned-consensus supporters argue that this can lead to lower latency in an array of common scenarios. An application developer can specify a location-based partitioning algorithm. All data that is usually accessed from region X should be placed in the same partition, with a consensus leader located in region X. All data that is usually accessed from region Y should be placed in the same partition, with a consensus leader located in region Y. In doing so, a larger number of read-only transactions will observe lower latency. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The downside of this approach is that it breaks the abstraction of the consensus protocol as a separate component of the system --- now the consensus protocol and data storage layer become much more intertwined, increasing the monolithicity of the system. Furthermore, consensus protocols run leader elections after a lease expires, and would have to reduce the democratic nature of this protocol in order to ensure the leader remains in the closest possible region. Finally, it increases complexity and reduces the flexibility of the partitioning protocol. As far as I know, the most well-known example of a partitioned-consensus system --- Spanner --- does not take advantage of this potential optimization for these reasons. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Consequently, although in theory, there is a potential latency advantage for partitioned-consensus systems for linearizable read-only transactions, in practice this advantage is not realized.</span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">On the other hand, there is a fundamental latency advantage for unified-consensus systems in the presence of multi-partitioned transactions. A multi-partition transaction in a partitioned-consensus system must involve more than one leader. The leaders of each partition accessed by the read transaction must communicate with each other in order to figure out a timestamp at which this linearizable read can be safely performed (see sections 4.1.4 and 4.2.2 of </span><a href="https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; vertical-align: baseline; white-space: pre-wrap;">the Spanner paper</span></a><span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">). Alternatively, a timestamp sufficiently into the future (at the end of the clock skew uncertainty bound) can be chosen at which to perform the read. Either way ---- whether it is communication across leaders (that may be located in different geographic regions) or whether it is waiting until the end of the clock skew uncertainty bound --- multi-partition reads pay an additional latency cost in order to ensure linearizability. In contrast, unified consensus systems have only a single leader region, and can perform linearizable reads across the servers in this region, without any communication with other regions or waiting for clock skew uncertainty windows to close. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /><br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<h3 dir="ltr" style="font-size: 18.73px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 25.84px; margin-bottom: 5.33px; margin-top: 21.33px;">
|
||
<span style="color: #434343; font-family: Arial; font-size: 18.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Latency for serializable snapshot read-only transactions</span></h3>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Many applications --- even if they require linearizable write transactions --- do not require linearizable read-only transactions, and instead are content to read from a recent snapshot of the database state. However, such snapshot reads must be serializable --- they should reflect the database state as of a particular transaction in the serial order, and none of the writes from transactions after that transaction. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Recall that transactions may write data on different machines / partitions. For example, a transaction, T, may write data on partition A and partition B. A serializable snapshot that includes data from both partition A and partition B must therefore include both of T’s writes to those partitions, or neither. In particular, it should include both of T’s writes if the snapshot is as of a point in time “after” T, and neither of T’s writes if the snapshot is as of a point in time “before” T. Note that this notion of “point in time” must exist --- even across partitions.Therefore, once again, there needs to be a global notion of “before” and “after” --- even for writes across different machines. As long as this notion of “before” and “after” exists, such snapshot reads can be sent to any replica to be processed there, and do not require any consensus or interaction with consensus leader regions. This is critically important to support low latency reads in a geographically disperse deployment. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">As mentioned in the introductory paragraph of this post, both unified- and partitioned-consensus systems are capable of generating global notions of “before” and “after”, and thus both types of systems are able to achieve the performance advantage of being able to perform these reads from any replica. However, as we mentioned above, unified-consensus systems can achieve this global notion of “before” and “after” without any clock synchronization, while partitioned-consensus systems use clock synchronization. Thus, unified-consensus can always achieve correct serializable snapshot reads, while partitioned-consensus can only achieve the same result if the maximum clock skew bound assumption is not violated. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<h3 dir="ltr" style="font-size: 18.73px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 25.84px; margin-bottom: 5.33px; margin-top: 21.33px;">
|
||
<span style="color: #434343; font-family: Arial; font-size: 18.66px; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space: pre-wrap;">Conclusion</span></h3>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">The latency debate between unified vs. partitioned consensus is an intricate one. However, it is clear that multi-partition transactions exacerbate the disadvantages of partitioned-consensus transactions in (at least) three dimensions:</span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<ol style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; margin-bottom: 0px; margin-top: 0px;">
|
||
<li dir="ltr" style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><div dir="ltr" style="line-height: 20.23px;">
|
||
<span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Multi-partition transactions require two-phase commit on top of the consensus protocol in partitioned-consensus systems. In many deployments, consensus across replicas is the latency bottleneck. By requiring two-phase commit on top of consensus, partitioned-consensus systems result in (approximately) double the latency (relative to unified-consensus) in such deployments, and higher long tail latency.</span></div>
|
||
</li>
|
||
<li dir="ltr" style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><div dir="ltr" style="line-height: 20.23px;">
|
||
<span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Multi-partition transactions require communication across leaders or waiting out clock skew uncertainty bounds for linearizable transactions --- even for linearizable read-only transactions. </span></div>
|
||
</li>
|
||
<li dir="ltr" style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: decimal; vertical-align: baseline; white-space: pre;"><div dir="ltr" style="line-height: 20.23px;">
|
||
<span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">Partitioned-consensus systems require clock synchronization in order to achieve low latency snapshot reads (in addition to all linearizable operations). Any incorrect assumptions of the maximum clock skew across machines may result in serializability violations (and thus incorrect results being returned).</span></div>
|
||
</li>
|
||
</ol>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">As we discussed above, it is usually impossible to avoid multi-partition transactions in most real-world applications. Furthermore, as an application scales, the number of partitions must increase, and thus the probability of multi-partition transactions is also likely to increase. Therefore, the disadvantages of partitioned-consensus systems relative to unified-consensus systems accentuate as the application scales. </span></div>
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<br style="font-variant-east-asian: normal; font-variant-numeric: normal;" /></div>
|
||
<br style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal;" />
|
||
<br />
|
||
<div dir="ltr" style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: 22.08px;">
|
||
<span style="font-family: Arial; font-size: 14.66px; font-style: italic; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">(Daniel Abadi is an advisor at FaunaDB)</span></div>
|
||
<br style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal;" />
|
||
<span style="font-size: xx-small;">[This article includes a description of work that was funded by the NSF under grant IIS-1763797. Any opinions, findings, and conclusions or recommendations expressed in this article are those of Daniel Abadi and do not necessarily reflect the views of the National Science Foundation.]</span>
|
||
<br style="font-size: 16px; font-variant-east-asian: normal; font-variant-numeric: normal;" />
|
||
<div style='clear: both;'></div>
|
||
</div>
|
||
<div class='post-footer'>
|
||
<div class='post-footer-line post-footer-line-1'>
|
||
<span class='post-author vcard'>
|
||
Posted by
|
||
<span class='fn' itemprop='author' itemscope='itemscope' itemtype='http://schema.org/Person'>
|
||
<meta content='https://www.blogger.com/profile/16753133043157018521' itemprop='url'/>
|
||
<a class='g-profile' href='https://www.blogger.com/profile/16753133043157018521' rel='author' title='author profile'>
|
||
<span itemprop='name'>Daniel Abadi</span>
|
||
</a>
|
||
</span>
|
||
</span>
|
||
<span class='post-timestamp'>
|
||
at
|
||
<meta content='http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html' itemprop='url'/>
|
||
<a class='timestamp-link' href='http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html' rel='bookmark' title='permanent link'><abbr class='published' itemprop='datePublished' title='2018-12-14T07:00:00-08:00'>7:00 AM</abbr></a>
|
||
</span>
|
||
<span class='post-comment-link'>
|
||
</span>
|
||
<span class='post-icons'>
|
||
<span class='item-control blog-admin pid-2045359914'>
|
||
<a href='https://www.blogger.com/post-edit.g?blogID=8899645800948009496&postID=4890754415665382215&from=pencil' title='Edit Post'>
|
||
<img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/>
|
||
</a>
|
||
</span>
|
||
</span>
|
||
<div class='post-share-buttons goog-inline-block'>
|
||
<a class='goog-inline-block share-button sb-email' href='https://www.blogger.com/share-post.g?blogID=8899645800948009496&postID=4890754415665382215&target=email' target='_blank' title='Email This'><span class='share-button-link-text'>Email This</span></a><a class='goog-inline-block share-button sb-blog' href='https://www.blogger.com/share-post.g?blogID=8899645800948009496&postID=4890754415665382215&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='BlogThis!'><span class='share-button-link-text'>BlogThis!</span></a><a class='goog-inline-block share-button sb-twitter' href='https://www.blogger.com/share-post.g?blogID=8899645800948009496&postID=4890754415665382215&target=twitter' target='_blank' title='Share to X'><span class='share-button-link-text'>Share to X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://www.blogger.com/share-post.g?blogID=8899645800948009496&postID=4890754415665382215&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Share to Facebook'><span class='share-button-link-text'>Share to Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://www.blogger.com/share-post.g?blogID=8899645800948009496&postID=4890754415665382215&target=pinterest' target='_blank' title='Share to Pinterest'><span class='share-button-link-text'>Share to Pinterest</span></a>
|
||
</div>
|
||
</div>
|
||
<div class='post-footer-line post-footer-line-2'>
|
||
<span class='post-labels'>
|
||
</span>
|
||
</div>
|
||
<div class='post-footer-line post-footer-line-3'>
|
||
<span class='post-location'>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class='comments' id='comments'>
|
||
<a name='comments'></a>
|
||
<h4>6 comments:</h4>
|
||
<div class='comments-content'>
|
||
<script async='async' src='' type='text/javascript'></script>
|
||
<script type='text/javascript'>
|
||
(function() {
|
||
var items = null;
|
||
var msgs = null;
|
||
var config = {};
|
||
|
||
// <![CDATA[
|
||
var cursor = null;
|
||
if (items && items.length > 0) {
|
||
cursor = parseInt(items[items.length - 1].timestamp) + 1;
|
||
}
|
||
|
||
var bodyFromEntry = function(entry) {
|
||
var text = (entry &&
|
||
((entry.content && entry.content.$t) ||
|
||
(entry.summary && entry.summary.$t))) ||
|
||
'';
|
||
if (entry && entry.gd$extendedProperty) {
|
||
for (var k in entry.gd$extendedProperty) {
|
||
if (entry.gd$extendedProperty[k].name == 'blogger.contentRemoved') {
|
||
return '<span class="deleted-comment">' + text + '</span>';
|
||
}
|
||
}
|
||
}
|
||
return text;
|
||
}
|
||
|
||
var parse = function(data) {
|
||
cursor = null;
|
||
var comments = [];
|
||
if (data && data.feed && data.feed.entry) {
|
||
for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
|
||
var comment = {};
|
||
// comment ID, parsed out of the original id format
|
||
var id = /blog-(\d+).post-(\d+)/.exec(entry.id.$t);
|
||
comment.id = id ? id[2] : null;
|
||
comment.body = bodyFromEntry(entry);
|
||
comment.timestamp = Date.parse(entry.published.$t) + '';
|
||
if (entry.author && entry.author.constructor === Array) {
|
||
var auth = entry.author[0];
|
||
if (auth) {
|
||
comment.author = {
|
||
name: (auth.name ? auth.name.$t : undefined),
|
||
profileUrl: (auth.uri ? auth.uri.$t : undefined),
|
||
avatarUrl: (auth.gd$image ? auth.gd$image.src : undefined)
|
||
};
|
||
}
|
||
}
|
||
if (entry.link) {
|
||
if (entry.link[2]) {
|
||
comment.link = comment.permalink = entry.link[2].href;
|
||
}
|
||
if (entry.link[3]) {
|
||
var pid = /.*comments\/default\/(\d+)\?.*/.exec(entry.link[3].href);
|
||
if (pid && pid[1]) {
|
||
comment.parentId = pid[1];
|
||
}
|
||
}
|
||
}
|
||
comment.deleteclass = 'item-control blog-admin';
|
||
if (entry.gd$extendedProperty) {
|
||
for (var k in entry.gd$extendedProperty) {
|
||
if (entry.gd$extendedProperty[k].name == 'blogger.itemClass') {
|
||
comment.deleteclass += ' ' + entry.gd$extendedProperty[k].value;
|
||
} else if (entry.gd$extendedProperty[k].name == 'blogger.displayTime') {
|
||
comment.displayTime = entry.gd$extendedProperty[k].value;
|
||
}
|
||
}
|
||
}
|
||
comments.push(comment);
|
||
}
|
||
}
|
||
return comments;
|
||
};
|
||
|
||
var paginator = function(callback) {
|
||
if (hasMore()) {
|
||
var url = config.feed + '?alt=json&v=2&orderby=published&reverse=false&max-results=50';
|
||
if (cursor) {
|
||
url += '&published-min=' + new Date(cursor).toISOString();
|
||
}
|
||
window.bloggercomments = function(data) {
|
||
var parsed = parse(data);
|
||
cursor = parsed.length < 50 ? null
|
||
: parseInt(parsed[parsed.length - 1].timestamp) + 1
|
||
callback(parsed);
|
||
window.bloggercomments = null;
|
||
}
|
||
url += '&callback=bloggercomments';
|
||
var script = document.createElement('script');
|
||
script.type = 'text/javascript';
|
||
script.src = url;
|
||
document.getElementsByTagName('head')[0].appendChild(script);
|
||
}
|
||
};
|
||
var hasMore = function() {
|
||
return !!cursor;
|
||
};
|
||
var getMeta = function(key, comment) {
|
||
if ('iswriter' == key) {
|
||
var matches = !!comment.author
|
||
&& comment.author.name == config.authorName
|
||
&& comment.author.profileUrl == config.authorUrl;
|
||
return matches ? 'true' : '';
|
||
} else if ('deletelink' == key) {
|
||
return config.baseUri + '/comment/delete/'
|
||
+ config.blogId + '/' + comment.id;
|
||
} else if ('deleteclass' == key) {
|
||
return comment.deleteclass;
|
||
}
|
||
return '';
|
||
};
|
||
|
||
var replybox = null;
|
||
var replyUrlParts = null;
|
||
var replyParent = undefined;
|
||
|
||
var onReply = function(commentId, domId) {
|
||
if (replybox == null) {
|
||
// lazily cache replybox, and adjust to suit this style:
|
||
replybox = document.getElementById('comment-editor');
|
||
if (replybox != null) {
|
||
replybox.height = '250px';
|
||
replybox.style.display = 'block';
|
||
replyUrlParts = replybox.src.split('#');
|
||
}
|
||
}
|
||
if (replybox && (commentId !== replyParent)) {
|
||
replybox.src = '';
|
||
document.getElementById(domId).insertBefore(replybox, null);
|
||
replybox.src = replyUrlParts[0]
|
||
+ (commentId ? '&parentID=' + commentId : '')
|
||
+ '#' + replyUrlParts[1];
|
||
replyParent = commentId;
|
||
}
|
||
};
|
||
|
||
var hash = (window.location.hash || '#').substring(1);
|
||
var startThread, targetComment;
|
||
if (/^comment-form_/.test(hash)) {
|
||
startThread = hash.substring('comment-form_'.length);
|
||
} else if (/^c[0-9]+$/.test(hash)) {
|
||
targetComment = hash.substring(1);
|
||
}
|
||
|
||
// Configure commenting API:
|
||
var configJso = {
|
||
'maxDepth': config.maxThreadDepth
|
||
};
|
||
var provider = {
|
||
'id': config.postId,
|
||
'data': items,
|
||
'loadNext': paginator,
|
||
'hasMore': hasMore,
|
||
'getMeta': getMeta,
|
||
'onReply': onReply,
|
||
'rendered': true,
|
||
'initComment': targetComment,
|
||
'initReplyThread': startThread,
|
||
'config': configJso,
|
||
'messages': msgs
|
||
};
|
||
|
||
var render = function() {
|
||
if (window.goog && window.goog.comments) {
|
||
var holder = document.getElementById('comment-holder');
|
||
window.goog.comments.render(holder, provider);
|
||
}
|
||
};
|
||
|
||
// render now, or queue to render when library loads:
|
||
if (window.goog && window.goog.comments) {
|
||
render();
|
||
} else {
|
||
window.goog = window.goog || {};
|
||
window.goog.comments = window.goog.comments || {};
|
||
window.goog.comments.loadQueue = window.goog.comments.loadQueue || [];
|
||
window.goog.comments.loadQueue.push(render);
|
||
}
|
||
})();
|
||
// ]]>
|
||
</script>
|
||
<div id='comment-holder'>
|
||
<div class="comment-thread toplevel-thread"><ol id="top-ra"><li class="comment" id="c416757684014044641"><div class="avatar-image-container"><img src="//www.blogger.com/img/blogger_logo_round_35.png" alt=""/></div><div class="comment-block"><div class="comment-header"><cite class="user"><a href="https://www.blogger.com/profile/17684854848290797842" rel="nofollow">AndyAndRachel</a></cite><span class="icon user "></span><span class="datetime secondary-text"><a rel="nofollow" href="http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html?showComment=1544809159763#c416757684014044641">December 14, 2018 at 9:39 AM</a></span></div><p class="comment-content">Can you clarify the "Latency for write transactions" section? Paragraph 2 says that consensus is possible in 10-15ms for a unified-consensus system, while paragraph 3 says consensus requires 10-400ms for a partitioned-consensus system. That seems to suggest that there are cases where the partitioned system might take (400/15)=~25x as long. I don't think that's what you're saying, right?<br> <br>To illustrate, and to make sure I'm correctly understanding, take the following example. Say that (using Calvin terms) replica A is in a US DC and replica B is in a EU DC. Say that roundtrip latency is 100ms. A client transaction is initiated from the US DC that includes writes to multiple partitions. Calvin will take ~100ms to commit that txn and ack the client (ignoring the batch accumulation time). A partitioned consensus system with a traditional 2PC protocol would take ~200ms. Is that correct? If so, then the takeaway would be that writes to geo-distributed replicas take roughly 2x as long for a partitioned-consensus system using traditional 2PC.</p><span class="comment-actions secondary-text"><a class="comment-reply" target="_self" data-comment-id="416757684014044641">Reply</a><span class="item-control blog-admin blog-admin pid-1437736139"><a target="_self" href="https://www.blogger.com/comment/delete/8899645800948009496/416757684014044641">Delete</a></span></span></div><div class="comment-replies"><div id="c416757684014044641-rt" class="comment-thread inline-thread hidden"><span class="thread-toggle thread-expanded"><span class="thread-arrow"></span><span class="thread-count"><a target="_self">Replies</a></span></span><ol id="c416757684014044641-ra" class="thread-chrome thread-expanded"><div></div><div id="c416757684014044641-continue" class="continue"><a class="comment-reply" target="_self" data-comment-id="416757684014044641">Reply</a></div></ol></div></div><div class="comment-replybox-single" id="c416757684014044641-ce"></div></li><li class="comment" id="c7069877120996111296"><div class="avatar-image-container"><img src="//www.blogger.com/img/blogger_logo_round_35.png" alt=""/></div><div class="comment-block"><div class="comment-header"><cite class="user"><a href="https://www.blogger.com/profile/16753133043157018521" rel="nofollow">Daniel Abadi</a></cite><span class="icon user blog-author"></span><span class="datetime secondary-text"><a rel="nofollow" href="http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html?showComment=1544809404464#c7069877120996111296">December 14, 2018 at 9:43 AM</a></span></div><p class="comment-content">Hi AndyAndRachel,<br><br>Thanks for coming back. Your comments on my previous post were part of the inspiration for this post.<br><br>The post states: "the preparation stage for unified consensus is approximately 10-15ms". Note the words "the preparation state". The first paragraph never estimates the total cost of consensus. </p><span class="comment-actions secondary-text"><a class="comment-reply" target="_self" data-comment-id="7069877120996111296">Reply</a><span class="item-control blog-admin blog-admin pid-2045359914"><a target="_self" href="https://www.blogger.com/comment/delete/8899645800948009496/7069877120996111296">Delete</a></span></span></div><div class="comment-replies"><div id="c7069877120996111296-rt" class="comment-thread inline-thread"><span class="thread-toggle thread-expanded"><span class="thread-arrow"></span><span class="thread-count"><a target="_self">Replies</a></span></span><ol id="c7069877120996111296-ra" class="thread-chrome thread-expanded"><div><li class="comment" id="c7688368775974297603"><div class="avatar-image-container"><img src="//www.blogger.com/img/blogger_logo_round_35.png" alt=""/></div><div class="comment-block"><div class="comment-header"><cite class="user"><a href="https://www.blogger.com/profile/17684854848290797842" rel="nofollow">AndyAndRachel</a></cite><span class="icon user "></span><span class="datetime secondary-text"><a rel="nofollow" href="http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html?showComment=1544816954468#c7688368775974297603">December 14, 2018 at 11:49 AM</a></span></div><p class="comment-content">Ha, yes, I figured you were referencing me. I do want to point out that I never "accused [you] of purposely avoiding discussing latency". That would require me to know your intent, which I'd never presume to do. My point was that to get a complete and fair understanding of the tradeoffs involved, it's essential to discuss latency in geo-distributed use cases. This latest post suggests that you agree.<br><br>Regarding comparisons of latency I'll make two points (assuming geo-distributed use cases):<br><br>1) You mentioned that "it is possible to group users into partitions such that many of their interactions will be with other users within that partition (e.g. partition by a user’s location)". I'd strengthen this; not only is it possible, it is *vital* if you want users around the world to enjoy low latencies for common operations. Every serious commerce application will do this. Today that's typically done by hosting separate DBs in each region of the world (i.e. today's architectures are already partitioned). A database worthy of the "global" adjective should give those same latency and consistency advantages for data that can be partitioned, but *also* allow cross-region transactions for data that can't be partitioned. This is not something that unified-consensus systems can do without sacrificing either consistency or latency. But partitioned-consensus systems can do this (at the cost of accepting clock-skew risk).<br><br>2) It's both possible and practical to use a distributed txn protocol that can ack the client after paying latency equivalent to only one round of consensus (at cost of more recovery work if coordinator fails). I'm not sure what's been published on this topic, and it's challenging to discuss details in a blog comment. But I will say that the latency advantage that you're asserting is due to choice of algorithm, not due to some limitation that is theoretically impossible to address. Referring back to my example in my previous comment, I fully expect that tomorrow's partitioned-consensus systems will commit that transaction in ~100ms rather than ~200ms.</p><span class="comment-actions secondary-text"><span class="item-control blog-admin blog-admin pid-1437736139"><a target="_self" href="https://www.blogger.com/comment/delete/8899645800948009496/7688368775974297603">Delete</a></span></span></div><div class="comment-replies"><div id="c7688368775974297603-rt" class="comment-thread inline-thread hidden"><span class="thread-toggle thread-expanded"><span class="thread-arrow"></span><span class="thread-count"><a target="_self">Replies</a></span></span><ol id="c7688368775974297603-ra" class="thread-chrome thread-expanded"><div></div><div id="c7688368775974297603-continue" class="continue"><a class="comment-reply" target="_self" data-comment-id="7688368775974297603">Reply</a></div></ol></div></div><div class="comment-replybox-single" id="c7688368775974297603-ce"></div></li><li class="comment" id="c1366778043625771733"><div class="avatar-image-container"><img src="//www.blogger.com/img/blogger_logo_round_35.png" alt=""/></div><div class="comment-block"><div class="comment-header"><cite class="user"><a href="https://www.blogger.com/profile/16753133043157018521" rel="nofollow">Daniel Abadi</a></cite><span class="icon user blog-author"></span><span class="datetime secondary-text"><a rel="nofollow" href="http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html?showComment=1544818106081#c1366778043625771733">December 14, 2018 at 12:08 PM</a></span></div><p class="comment-content">Don't worry --- I wasn't talking about you when I said somebody accused me of hiding latency. That was somebody else (either on Twitter or HackerNews or elsewhere --- I don't remember). But obviously our conversation on my previous post was primarily about latency, and half of the section on "Latency for linearizable read-only transactions" came out from that conversation. </p><span class="comment-actions secondary-text"><span class="item-control blog-admin blog-admin pid-2045359914"><a target="_self" href="https://www.blogger.com/comment/delete/8899645800948009496/1366778043625771733">Delete</a></span></span></div><div class="comment-replies"><div id="c1366778043625771733-rt" class="comment-thread inline-thread hidden"><span class="thread-toggle thread-expanded"><span class="thread-arrow"></span><span class="thread-count"><a target="_self">Replies</a></span></span><ol id="c1366778043625771733-ra" class="thread-chrome thread-expanded"><div></div><div id="c1366778043625771733-continue" class="continue"><a class="comment-reply" target="_self" data-comment-id="1366778043625771733">Reply</a></div></ol></div></div><div class="comment-replybox-single" id="c1366778043625771733-ce"></div></li></div><div id="c7069877120996111296-continue" class="continue"><a class="comment-reply" target="_self" data-comment-id="7069877120996111296">Reply</a></div></ol></div></div><div class="comment-replybox-single" id="c7069877120996111296-ce"></div></li><li class="comment" id="c8470378062817124341"><div class="avatar-image-container"><img src="//www.blogger.com/img/blogger_logo_round_35.png" alt=""/></div><div class="comment-block"><div class="comment-header"><cite class="user"><a href="https://www.blogger.com/profile/16753133043157018521" rel="nofollow">Daniel Abadi</a></cite><span class="icon user blog-author"></span><span class="datetime secondary-text"><a rel="nofollow" href="http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html?showComment=1544809514379#c8470378062817124341">December 14, 2018 at 9:45 AM</a></span></div><p class="comment-content">See also my conclusion where I state what you said in your comment explicitly.</p><span class="comment-actions secondary-text"><a class="comment-reply" target="_self" data-comment-id="8470378062817124341">Reply</a><span class="item-control blog-admin blog-admin pid-2045359914"><a target="_self" href="https://www.blogger.com/comment/delete/8899645800948009496/8470378062817124341">Delete</a></span></span></div><div class="comment-replies"><div id="c8470378062817124341-rt" class="comment-thread inline-thread"><span class="thread-toggle thread-expanded"><span class="thread-arrow"></span><span class="thread-count"><a target="_self">Replies</a></span></span><ol id="c8470378062817124341-ra" class="thread-chrome thread-expanded"><div><li class="comment" id="c5808292899959260124"><div class="avatar-image-container"><img src="//www.blogger.com/img/blogger_logo_round_35.png" alt=""/></div><div class="comment-block"><div class="comment-header"><cite class="user"><a href="https://www.blogger.com/profile/17684854848290797842" rel="nofollow">AndyAndRachel</a></cite><span class="icon user "></span><span class="datetime secondary-text"><a rel="nofollow" href="http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html?showComment=1544810718508#c5808292899959260124">December 14, 2018 at 10:05 AM</a></span></div><p class="comment-content">Yes, I saw that. I just wanted to make sure I understood the "Latency for write transactions" section correctly, since it was worded in a way that confused me.</p><span class="comment-actions secondary-text"><span class="item-control blog-admin blog-admin pid-1437736139"><a target="_self" href="https://www.blogger.com/comment/delete/8899645800948009496/5808292899959260124">Delete</a></span></span></div><div class="comment-replies"><div id="c5808292899959260124-rt" class="comment-thread inline-thread hidden"><span class="thread-toggle thread-expanded"><span class="thread-arrow"></span><span class="thread-count"><a target="_self">Replies</a></span></span><ol id="c5808292899959260124-ra" class="thread-chrome thread-expanded"><div></div><div id="c5808292899959260124-continue" class="continue"><a class="comment-reply" target="_self" data-comment-id="5808292899959260124">Reply</a></div></ol></div></div><div class="comment-replybox-single" id="c5808292899959260124-ce"></div></li></div><div id="c8470378062817124341-continue" class="continue"><a class="comment-reply" target="_self" data-comment-id="8470378062817124341">Reply</a></div></ol></div></div><div class="comment-replybox-single" id="c8470378062817124341-ce"></div></li></ol><div id="top-continue" class="continue"><a class="comment-reply" target="_self">Add comment</a></div><div class="comment-replybox-thread" id="top-ce"></div><div class="loadmore hidden" data-post-id="4890754415665382215"><a target="_self">Load more...</a></div></div>
|
||
</div>
|
||
</div>
|
||
<p class='comment-footer'>
|
||
<div class='comment-form'>
|
||
<a name='comment-form'></a>
|
||
<p>
|
||
</p>
|
||
<a href='https://www.blogger.com/comment/frame/8899645800948009496?po=4890754415665382215&hl=en&saa=85391&origin=http://dbmsmusings.blogspot.com' id='comment-editor-src'></a>
|
||
<iframe allowtransparency='true' class='blogger-iframe-colorize blogger-comment-from-post' frameborder='0' height='410px' id='comment-editor' name='comment-editor' src='' width='100%'></iframe>
|
||
<script src='https://www.blogger.com/static/v1/jsbin/3790099508-comment_from_post_iframe.js' type='text/javascript'></script>
|
||
<script type='text/javascript'>
|
||
BLOG_CMT_createIframe('https://www.blogger.com/rpc_relay.html');
|
||
</script>
|
||
</div>
|
||
</p>
|
||
<div id='backlinks-container'>
|
||
<div id='Blog1_backlinks-container'>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div></div>
|
||
|
||
</div>
|
||
<div class='blog-pager' id='blog-pager'>
|
||
<span id='blog-pager-newer-link'>
|
||
<a class='blog-pager-newer-link' href='http://dbmsmusings.blogspot.com/2019/01/its-time-to-move-on-from-two-phase.html' id='Blog1_blog-pager-newer-link' title='Newer Post'>Newer Post</a>
|
||
</span>
|
||
<span id='blog-pager-older-link'>
|
||
<a class='blog-pager-older-link' href='http://dbmsmusings.blogspot.com/2018/09/newsql-database-systems-are-failing-to.html' id='Blog1_blog-pager-older-link' title='Older Post'>Older Post</a>
|
||
</span>
|
||
<a class='home-link' href='http://dbmsmusings.blogspot.com/'>Home</a>
|
||
</div>
|
||
<div class='clear'></div>
|
||
<div class='post-feeds'>
|
||
<div class='feed-links'>
|
||
Subscribe to:
|
||
<a class='feed-link' href='http://dbmsmusings.blogspot.com/feeds/4890754415665382215/comments/default' target='_blank' type='application/atom+xml'>Post Comments (Atom)</a>
|
||
</div>
|
||
</div>
|
||
</div></div>
|
||
</div>
|
||
</div>
|
||
<div class='column-left-outer'>
|
||
<div class='column-left-inner'>
|
||
<aside>
|
||
</aside>
|
||
</div>
|
||
</div>
|
||
<div class='column-right-outer'>
|
||
<div class='column-right-inner'>
|
||
<aside>
|
||
<div class='sidebar section' id='sidebar-right-1'><div class='widget Image' data-version='1' id='Image1'>
|
||
<h2>Daniel Abadi</h2>
|
||
<div class='widget-content'>
|
||
<img alt='Daniel Abadi' height='449' id='Image1_img' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhjq7IZ-b9X74S5hxbSo0XZg6tWgFnU-Tkkg2SrZbH0sRSvLi37d5oAaTx5gj3DQG6jxEcvzmQIyduk9EiMPxzlvHVgl33-67YLUpDn-ns_DrXBNbQxKRAx1EDfjo5kmrW1qGIhnxdJgZw/s1600/dan_2019.jpg' width='315'/>
|
||
<br/>
|
||
</div>
|
||
<div class='clear'></div>
|
||
</div><div class='widget Profile' data-version='1' id='Profile1'>
|
||
<h2>About Me</h2>
|
||
<div class='widget-content'>
|
||
<dl class='profile-datablock'>
|
||
<dt class='profile-data'>
|
||
<a class='profile-name-link g-profile' href='https://www.blogger.com/profile/16753133043157018521' rel='author' style='background-image: url(//www.blogger.com/img/logo-16.png);'>
|
||
Daniel Abadi
|
||
</a>
|
||
</dt>
|
||
<dd class='profile-textblock'>Daniel Abadi is the Darnell-Kanal Professor of Computer Science at University of Maryland, College Park. He is best-known for the development of the storage and query execution engines of the C-Store (column-oriented database) prototype, which was commercialized by Vertica and eventually acquired by Hewlett-Packard in 2011, for his HadoopDB research on fault tolerant scalable analytical database systems which was commercialized by Hadapt and acquired by Teradata in 2014, and deterministic, scalable, transactional, distributed systems such as Calvin which is currently being commercialized by <a href="https://fauna.com/">Fauna</a>. Abadi has been a recipient of a
|
||
Churchill Scholarship, a NSF CAREER Award, a Sloan Research Fellowship, a VLDB Best Paper Award, two VLDB <b>10 year</b> Best Paper Awards, the 2008 SIGMOD Jim Gray Doctoral Dissertation Award, the 2013-2014 Yale Provost's Teaching Prize, and the 2013 VLDB Early Career Researcher Award. He received his PhD in 2008 from MIT.
|
||
He blogs at <a href="http://dbmsmusings.blogspot.com">DBMS Musings</a> and tweets at <a href="http://www.twitter.com/daniel_abadi">@daniel_abadi</a>.</dd>
|
||
</dl>
|
||
<a class='profile-link' href='https://www.blogger.com/profile/16753133043157018521' rel='author'>View my complete profile</a>
|
||
<div class='clear'></div>
|
||
</div>
|
||
</div></div>
|
||
<table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'>
|
||
<tbody>
|
||
<tr>
|
||
<td class='first columns-cell'>
|
||
<div class='sidebar section' id='sidebar-right-2-1'><div class='widget BlogArchive' data-version='1' id='BlogArchive1'>
|
||
<h2>Blog Archive</h2>
|
||
<div class='widget-content'>
|
||
<div id='ArchiveList'>
|
||
<div id='BlogArchive1_ArchiveList'>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2021/'>
|
||
2021
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2021/03/'>
|
||
March
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/'>
|
||
2019
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(8)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/12/'>
|
||
December
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/10/'>
|
||
October
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/08/'>
|
||
August
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/07/'>
|
||
July
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/06/'>
|
||
June
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/05/'>
|
||
May
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2019/01/'>
|
||
January
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate expanded'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy toggle-open'>
|
||
|
||
▼ 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2018/'>
|
||
2018
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(3)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate expanded'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy toggle-open'>
|
||
|
||
▼ 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2018/12/'>
|
||
December
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
<ul class='posts'>
|
||
<li><a href='http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html'>Partitioned consensus and its impact on Spanner’s ...</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2018/09/'>
|
||
September
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2018/03/'>
|
||
March
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2017/'>
|
||
2017
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(3)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2017/10/'>
|
||
October
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2017/04/'>
|
||
April
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2015/'>
|
||
2015
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2015/10/'>
|
||
October
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2012/'>
|
||
2012
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(4)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2012/11/'>
|
||
November
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2012/10/'>
|
||
October
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2012/06/'>
|
||
June
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2012/05/'>
|
||
May
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/'>
|
||
2011
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(6)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/12/'>
|
||
December
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/10/'>
|
||
October
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/07/'>
|
||
July
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/05/'>
|
||
May
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/03/'>
|
||
March
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2011/02/'>
|
||
February
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/'>
|
||
2010
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(8)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/12/'>
|
||
December
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/08/'>
|
||
August
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/07/'>
|
||
July
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/04/'>
|
||
April
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/03/'>
|
||
March
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2010/01/'>
|
||
January
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/'>
|
||
2009
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(21)</span>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/12/'>
|
||
December
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/11/'>
|
||
November
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(1)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/10/'>
|
||
October
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/09/'>
|
||
September
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/08/'>
|
||
August
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(2)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/07/'>
|
||
July
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(5)</span>
|
||
</li>
|
||
</ul>
|
||
<ul class='hierarchy'>
|
||
<li class='archivedate collapsed'>
|
||
<a class='toggle' href='javascript:void(0)'>
|
||
<span class='zippy'>
|
||
|
||
► 
|
||
|
||
</span>
|
||
</a>
|
||
<a class='post-count-link' href='http://dbmsmusings.blogspot.com/2009/06/'>
|
||
June
|
||
</a>
|
||
<span class='post-count' dir='ltr'>(8)</span>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
<div class='clear'></div>
|
||
</div>
|
||
</div></div>
|
||
</td>
|
||
<td class='columns-cell'>
|
||
<div class='sidebar section' id='sidebar-right-2-2'><div class='widget Followers' data-version='1' id='Followers1'>
|
||
<h2 class='title'>Followers</h2>
|
||
<div class='widget-content'>
|
||
<div id='Followers1-wrapper'>
|
||
<div style='margin-right:2px;'>
|
||
<div><script type="text/javascript" src="https://apis.google.com/js/platform.js"></script>
|
||
<div id="followers-iframe-container"></div>
|
||
<script type="text/javascript">
|
||
window.followersIframe = null;
|
||
function followersIframeOpen(url) {
|
||
gapi.load("gapi.iframes", function() {
|
||
if (gapi.iframes && gapi.iframes.getContext) {
|
||
window.followersIframe = gapi.iframes.getContext().openChild({
|
||
url: url,
|
||
where: document.getElementById("followers-iframe-container"),
|
||
messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER,
|
||
messageHandlers: {
|
||
'_ready': function(obj) {
|
||
window.followersIframe.getIframeEl().height = obj.height;
|
||
},
|
||
'reset': function() {
|
||
window.followersIframe.close();
|
||
followersIframeOpen("https://www.blogger.com/followers/frame/8899645800948009496?colors\x3dCgt0cmFuc3BhcmVudBILdHJhbnNwYXJlbnQaByM2NjY2NjYiByMyMTk4YTYqByNmZmZmZmYyByM2NjY2NjY6ByM2NjY2NjZCByMyMTk4YTZKByNjY2NjY2NSByMyMTk4YTZaC3RyYW5zcGFyZW50\x26pageSize\x3d21\x26hl\x3den\x26origin\x3dhttp://dbmsmusings.blogspot.com");
|
||
},
|
||
'open': function(url) {
|
||
window.followersIframe.close();
|
||
followersIframeOpen(url);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
});
|
||
}
|
||
followersIframeOpen("https://www.blogger.com/followers/frame/8899645800948009496?colors\x3dCgt0cmFuc3BhcmVudBILdHJhbnNwYXJlbnQaByM2NjY2NjYiByMyMTk4YTYqByNmZmZmZmYyByM2NjY2NjY6ByM2NjY2NjZCByMyMTk4YTZKByNjY2NjY2NSByMyMTk4YTZaC3RyYW5zcGFyZW50\x26pageSize\x3d21\x26hl\x3den\x26origin\x3dhttp://dbmsmusings.blogspot.com");
|
||
</script></div>
|
||
</div>
|
||
</div>
|
||
<div class='clear'></div>
|
||
</div>
|
||
</div></div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div class='sidebar no-items section' id='sidebar-right-3'></div>
|
||
</aside>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div style='clear: both'></div>
|
||
<!-- columns -->
|
||
</div>
|
||
<!-- main -->
|
||
</div>
|
||
</div>
|
||
<div class='main-cap-bottom cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
<footer>
|
||
<div class='footer-outer'>
|
||
<div class='footer-cap-top cap-top'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
<div class='fauxborder-left footer-fauxborder-left'>
|
||
<div class='fauxborder-right footer-fauxborder-right'></div>
|
||
<div class='region-inner footer-inner'>
|
||
<div class='foot no-items section' id='footer-1'></div>
|
||
<table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'>
|
||
<tbody>
|
||
<tr>
|
||
<td class='first columns-cell'>
|
||
<div class='foot no-items section' id='footer-2-1'></div>
|
||
</td>
|
||
<td class='columns-cell'>
|
||
<div class='foot no-items section' id='footer-2-2'></div>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<!-- outside of the include in order to lock Attribution widget -->
|
||
<div class='foot section' id='footer-3' name='Footer'><div class='widget Attribution' data-version='1' id='Attribution1'>
|
||
<div class='widget-content' style='text-align: center;'>
|
||
Ethereal theme. Powered by <a href='https://www.blogger.com' target='_blank'>Blogger</a>.
|
||
</div>
|
||
<div class='clear'></div>
|
||
</div></div>
|
||
</div>
|
||
</div>
|
||
<div class='footer-cap-bottom cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
<!-- content -->
|
||
</div>
|
||
</div>
|
||
<div class='content-cap-bottom cap-bottom'>
|
||
<div class='cap-left'></div>
|
||
<div class='cap-right'></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script type='text/javascript'>
|
||
window.setTimeout(function() {
|
||
document.body.className = document.body.className.replace('loading', '');
|
||
}, 10);
|
||
</script>
|
||
|
||
<script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/1363620594-widgets.js"></script>
|
||
<script type='text/javascript'>
|
||
window['__wavt'] = 'AAPvtVnUy5O8sq8Nkpizbhm8Krw_:1789171375126';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d8899645800948009496','//dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html','8899645800948009496');
|
||
_WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '8899645800948009496', 'title': 'DBMS Musings', 'url': 'http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html', 'canonicalUrl': 'http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html', 'homepageUrl': 'http://dbmsmusings.blogspot.com/', 'searchUrl': 'http://dbmsmusings.blogspot.com/search', 'canonicalHomepageUrl': 'http://dbmsmusings.blogspot.com/', 'blogspotFaviconUrl': 'http://dbmsmusings.blogspot.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': false, 'httpsEnabled': true, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'G-WPSPKTZ8VQ', 'analytics4': true, 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22DBMS Musings - Atom\x22 href\x3d\x22http://dbmsmusings.blogspot.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22DBMS Musings - RSS\x22 href\x3d\x22http://dbmsmusings.blogspot.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22DBMS Musings - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/8899645800948009496/posts/default\x22 /\x3e\n\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22DBMS Musings - Atom\x22 href\x3d\x22http://dbmsmusings.blogspot.com/feeds/4890754415665382215/comments/default\x22 /\x3e\n', 'meTag': '', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/1890a9484e710b1c', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'item', 'postId': '4890754415665382215', 'pageName': 'Partitioned consensus and its impact on Spanner\u2019s latency', 'pageTitle': 'DBMS Musings: Partitioned consensus and its impact on Spanner\u2019s latency'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'Ethereal', 'localizedName': 'Ethereal', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': false, 'variant': 'hummingBirds2', 'variantId': 'hummingBirds2'}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Partitioned consensus and its impact on Spanner\u2019s latency', 'description': ' In a post that I published in September , I described two primary approaches for performing consensus in distributed systems, and how the c...', 'url': 'http://dbmsmusings.blogspot.com/2018/12/partitioned-consensus-and-its-impact-on.html', 'type': 'item', 'isSingleItem': true, 'isMultipleItems': false, 'isError': false, 'isPage': false, 'isPost': true, 'isHomepage': false, 'isArchive': false, 'isLabelSearch': false, 'postId': 4890754415665382215}}]);
|
||
_WidgetManager._RegisterWidget('_NavbarView', new _WidgetInfo('Navbar1', 'navbar', document.getElementById('Navbar1'), {}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false, 'lightboxEnabled': true, 'lightboxModuleUrl': 'https://www.blogger.com/static/v1/jsbin/700075392-lbx.js', 'lightboxCssUrl': 'https://www.blogger.com/static/v1/v-css/828616780-lightbox_bundle.css'}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_ImageView', new _WidgetInfo('Image1', 'sidebar-right-1', document.getElementById('Image1'), {'resize': true}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_ProfileView', new _WidgetInfo('Profile1', 'sidebar-right-1', document.getElementById('Profile1'), {}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-right-2-1', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_FollowersView', new _WidgetInfo('Followers1', 'sidebar-right-2-2', document.getElementById('Followers1'), {}, 'displayModeFull'));
|
||
_WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull'));
|
||
</script>
|
||
</body>
|
||
</html> |