learn.lianglianglee.com/专栏/ZooKeeper源码分析与实战-完/index.html
2022-08-14 03:40:33 +08:00

204 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>note-submit</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/PDF">PDF</a>
</li>
<li>
<a href="/专栏">专栏</a>
</li>
<li>
<a href="/恋爱必修课">恋爱必修课</a>
</li>
<li>
<a href="/文章">文章</a>
</li>
<li>
<a href="/极客时间">极客时间</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content"
style="max-width: 960px; margin: 0 auto; overflow-x: auto; overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><!--add content-->
<h1>ZooKeeper源码分析与实战-完</h1>
<ul>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\00 开篇词:选择 ZooKeeper一步到位掌握分布式开发.md.html'>00 开篇词:选择 ZooKeeper一步到位掌握分布式开发</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\01 ZooKeeper 数据模型:节点的特性与应用.md.html'>01 ZooKeeper 数据模型:节点的特性与应用</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\02 发布订阅模式:如何使用 Watch 机制实现分布式通知.md.html'>02 发布订阅模式:如何使用 Watch 机制实现分布式通知</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\03 ACL 权限控制:如何避免未经授权的访问?.md.html'>03 ACL 权限控制:如何避免未经授权的访问?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\04 ZooKeeper 如何进行序列化?.md.html'>04 ZooKeeper 如何进行序列化?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\05 深入分析 Jute 的底层实现原理.md.html'>05 深入分析 Jute 的底层实现原理</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\06 ZooKeeper 的网络通信协议详解.md.html'>06 ZooKeeper 的网络通信协议详解</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\07 单机模式:服务器如何从初始化到对外提供服务?.md.html'>07 单机模式:服务器如何从初始化到对外提供服务?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\08 集群模式:服务器如何从初始化到对外提供服务?.md.html'>08 集群模式:服务器如何从初始化到对外提供服务?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\09 创建会话:避开日常开发的那些“坑”.md.html'>09 创建会话:避开日常开发的那些“坑”</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\10 ClientCnxn客户端核心工作类工作原理解析.md.html'>10 ClientCnxn客户端核心工作类工作原理解析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\11 分桶策略:如何实现高效的会话管理?.md.html'>11 分桶策略:如何实现高效的会话管理?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\12 服务端是如何处理一次会话请求的?.md.html'>12 服务端是如何处理一次会话请求的?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\13 Curator如何降低 ZooKeeper 使用的复杂性?.md.html'>13 Curator如何降低 ZooKeeper 使用的复杂性?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\14 Leader 选举:如何保证分布式数据的一致性?.md.html'>14 Leader 选举:如何保证分布式数据的一致性?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\15 ZooKeeper 究竟是怎么选中 Leader 的?.md.html'>15 ZooKeeper 究竟是怎么选中 Leader 的?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\16 ZooKeeper 集群中 Leader 与 Follower 的数据同步策略.md.html'>16 ZooKeeper 集群中 Leader 与 Follower 的数据同步策略</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\17 集群中 Leader 的作用:事务的请求处理与调度分析.md.html'>17 集群中 Leader 的作用:事务的请求处理与调度分析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\18 集群中 Follow 的作用:非事务请求的处理与 Leader 的选举分析.md.html'>18 集群中 Follow 的作用:非事务请求的处理与 Leader 的选举分析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\19 Observer 的作用与 Follow 有哪些不同?.md.html'>19 Observer 的作用与 Follow 有哪些不同?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\20 一个运行中的 ZooKeeper 服务会产生哪些数据和文件?.md.html'>20 一个运行中的 ZooKeeper 服务会产生哪些数据和文件?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\21 ZooKeeper 分布式锁:实现和原理解析.md.html'>21 ZooKeeper 分布式锁:实现和原理解析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\22 基于 ZooKeeper 命名服务的应用:分布式 ID 生成器.md.html'>22 基于 ZooKeeper 命名服务的应用:分布式 ID 生成器</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\23 使用 ZooKeeper 实现负载均衡服务器功能.md.html'>23 使用 ZooKeeper 实现负载均衡服务器功能</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\24 ZooKeeper 在 Kafka 和 Dubbo 中的工业级实现案例分析.md.html'>24 ZooKeeper 在 Kafka 和 Dubbo 中的工业级实现案例分析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\25 如何搭建一个高可用的 ZooKeeper 生产环境?.md.html'>25 如何搭建一个高可用的 ZooKeeper 生产环境?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\26 JConsole 与四字母命令:如何监控服务器上 ZooKeeper 的运行状态?.md.html'>26 JConsole 与四字母命令:如何监控服务器上 ZooKeeper 的运行状态?</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\27 crontab 与 PurgeTxnLog线上系统日志清理的最佳时间和方式.md.html'>27 crontab 与 PurgeTxnLog线上系统日志清理的最佳时间和方式</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\28 彻底掌握二阶段提交三阶段提交算法原理.md.html'>28 彻底掌握二阶段提交三阶段提交算法原理</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\29 ZAB 协议算法:崩溃恢复和消息广播.md.html'>29 ZAB 协议算法:崩溃恢复和消息广播</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\30 ZAB 与 Paxos 算法的联系与区别.md.html'>30 ZAB 与 Paxos 算法的联系与区别</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\31 ZooKeeper 中二阶段提交算法的实现分析.md.html'>31 ZooKeeper 中二阶段提交算法的实现分析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\32 ZooKeeper 数据存储底层实现解析.md.html'>32 ZooKeeper 数据存储底层实现解析</a></li>
<li><a href = '\专栏\ZooKeeper源码分析与实战-完\33 结束语 分布技术发展与 ZooKeeper 应用前景.md.html'>33 结束语 分布技术发展与 ZooKeeper 应用前景</a></li>
</ul>
</div>
</div>
<div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194"
integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw=="
data-cf-beacon='{"rayId":"70996b2f083d3d60","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}'
crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>