-
Notifications
You must be signed in to change notification settings - Fork 0
/
ceph-network-ii.html
439 lines (325 loc) · 25.9 KB
/
ceph-network-ii.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#222" media="(prefers-color-scheme: dark)"><meta name="generator" content="Hexo 7.0.0-rc1">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha256-HtsXJanqjKTc8vVQjO4YMhiqFoXkfBsjBWcX91T1jr8=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
<script class="next-config" data-name="main" type="application/json">{"hostname":"www.hwchiu.com","root":"/","images":"/images","scheme":"Gemini","darkmode":true,"version":"8.17.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12},"copycode":{"enable":false,"style":null},"bookmark":{"enable":false,"color":"#222","save":"auto"},"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"stickytabs":false,"motion":{"enable":true,"async":false,"transition":{"menu_item":"fadeInDown","post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"i18n":{"placeholder":"Searching...","empty":"We didn't find any results for the search: ${query}","hits_time":"${hits} results found in ${time} ms","hits":"${hits} results found"}}</script><script src="/js/config.js"></script>
<meta name="description" content="延續上篇文章 (Ceph Network Architecture 研究(一))[https://www.hwchiu.com/ceph-network-i.html#more],本文將繼續探討 Async 這種網路類型底層真的架構與概念,所以本文章也不會有太硬的程式碼解讀,反而會比較偏向概念性的分析。 從上一篇文章中我們可知道,底層網路實現提供了包含 Messenger, Connection">
<meta property="og:type" content="article">
<meta property="og:title" content="Ceph Network Architecture 研究(二)">
<meta property="og:url" content="https://www.hwchiu.com/ceph-network-ii.html">
<meta property="og:site_name" content="Hwchiu Learning Note">
<meta property="og:description" content="延續上篇文章 (Ceph Network Architecture 研究(一))[https://www.hwchiu.com/ceph-network-i.html#more],本文將繼續探討 Async 這種網路類型底層真的架構與概念,所以本文章也不會有太硬的程式碼解讀,反而會比較偏向概念性的分析。 從上一篇文章中我們可知道,底層網路實現提供了包含 Messenger, Connection">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="http://i.imgur.com/yiDGubn.jpg">
<meta property="og:image" content="http://i.imgur.com/4k6Rmpo.jpg">
<meta property="og:image" content="http://i.imgur.com/yAzGB06.jpg">
<meta property="og:image" content="http://i.imgur.com/l9h13kc.jpg">
<meta property="article:published_time" content="2017-05-25T02:15:21.000Z">
<meta property="article:modified_time" content="2023-06-23T05:16:12.602Z">
<meta property="article:author" content="Hwchiu">
<meta property="article:tag" content="Network">
<meta property="article:tag" content="SourceCode">
<meta property="article:tag" content="Ceph">
<meta property="article:tag" content="SOS">
<meta property="article:tag" content="ScaleOut">
<meta property="article:tag" content="SDS">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http://i.imgur.com/yiDGubn.jpg">
<link rel="canonical" href="https://www.hwchiu.com/ceph-network-ii.html">
<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"en","comments":true,"permalink":"https://www.hwchiu.com/ceph-network-ii.html","path":"ceph-network-ii.html","title":"Ceph Network Architecture 研究(二)"}</script>
<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>Ceph Network Architecture 研究(二) | Hwchiu Learning Note</title>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-54006186-1"></script>
<script class="next-config" data-name="google_analytics" type="application/json">{"tracking_id":"UA-54006186-1","only_pageview":false}</script>
<script src="/js/third-party/analytics/google-analytics.js"></script>
<noscript>
<link rel="stylesheet" href="/css/noscript.css">
</noscript>
</head>
<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
<div class="headband"></div>
<main class="main">
<div class="column">
<header class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="Toggle navigation bar" role="button">
<span class="toggle-line"></span>
<span class="toggle-line"></span>
<span class="toggle-line"></span>
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<i class="logo-line"></i>
<p class="site-title">Hwchiu Learning Note</p>
<i class="logo-line"></i>
</a>
<p class="site-subtitle" itemprop="description">kubernetes, sdn, linux,devops</p>
<img class="custom-logo-image" src="/uploads/hwchiu.jpg" alt="Hwchiu Learning Note">
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger" aria-label="Search" role="button">
</div>
</div>
</div>
<nav class="site-nav">
<ul class="main-menu menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-home fa-fw"></i>Home</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>About</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>Tags</a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>Archives</a></li><li class="menu-item menu-item-sitemap"><a href="/sitemap.xml" rel="section"><i class="fa fa-sitemap fa-fw"></i>Sitemap</a></li>
</ul>
</nav>
</header>
<aside class="sidebar">
<div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
<ul class="sidebar-nav">
<li class="sidebar-nav-toc">
Table of Contents
</li>
<li class="sidebar-nav-overview">
Overview
</li>
</ul>
<div class="sidebar-panel-container">
<!--noindex-->
<div class="post-toc-wrap sidebar-panel">
<div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#Event"><span class="nav-number">1.</span> <span class="nav-text">Event</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#File-Event"><span class="nav-number">1.1.</span> <span class="nav-text">File_Event</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Time-Event"><span class="nav-number">1.2.</span> <span class="nav-text">Time_Event</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#External-Event"><span class="nav-number">1.3.</span> <span class="nav-text">External_Event</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Worker-and-Network-Stack"><span class="nav-number">1.4.</span> <span class="nav-text">Worker and Network Stack</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#AsyncConnection"><span class="nav-number">1.5.</span> <span class="nav-text">AsyncConnection</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#AsyncMessenger"><span class="nav-number">1.6.</span> <span class="nav-text">AsyncMessenger</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Summary"><span class="nav-number">2.</span> <span class="nav-text">Summary</span></a></li></ol></div>
</div>
<!--/noindex-->
<div class="site-overview-wrap sidebar-panel">
<div class="site-author animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image" alt="Hwchiu"
src="/uploads/avatar.jpg">
<p class="site-author-name" itemprop="name">Hwchiu</p>
<div class="site-description" itemprop="description">kubernetes/SDN/DevOps</div>
</div>
<div class="site-state-wrap animated">
<nav class="site-state">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">352</span>
<span class="site-state-item-name">posts</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">115</span>
<span class="site-state-item-name">tags</span></a>
</div>
</nav>
</div>
<div class="links-of-author animated">
<span class="links-of-author-item">
<a href="https://github.com/hwchiu" title="GitHub → https://github.com/hwchiu" rel="noopener me" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
</span>
<span class="links-of-author-item">
<a href="mailto:sppsorrg@gmail.com" title="E-Mail → mailto:sppsorrg@gmail.com" rel="noopener me" target="_blank"><i class="fa fa-envelope fa-fw"></i>E-Mail</a>
</span>
<span class="links-of-author-item">
<a href="https://twitter.com/hw_chiu" title="Twitter → https://twitter.com/hw_chiu" rel="noopener me" target="_blank"><i class="fab fa-twitter fa-fw"></i>Twitter</a>
</span>
<span class="links-of-author-item">
<a href="https://www.facebook.com/technologynoteniu" title="FB Page → https://www.facebook.com/technologynoteniu" rel="noopener me" target="_blank"><i class="fab fa-facebook fa-fw"></i>FB Page</a>
</span>
<span class="links-of-author-item">
<a href="https://www.youtube.com/channel/UCoYY8K9fbfDtTY7m68UCATA/videos" title="YouTube → https://www.youtube.com/channel/UCoYY8K9fbfDtTY7m68UCATA/videos" rel="noopener me" target="_blank"><i class="fab fa-youtube fa-fw"></i>YouTube</a>
</span>
<span class="links-of-author-item">
<a href="https://instagram.com/hwchiu" title="Instagram → https://instagram.com/hwchiu" rel="noopener me" target="_blank"><i class="fab fa-instagram fa-fw"></i>Instagram</a>
</span>
</div>
</div>
</div>
</div>
</aside>
</div>
<div class="main-inner post posts-expand">
<div class="post-block">
<article itemscope itemtype="http://schema.org/Article" class="post-content" lang="en">
<link itemprop="mainEntityOfPage" href="https://www.hwchiu.com/ceph-network-ii.html">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
<meta itemprop="name" content="Hwchiu">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hwchiu Learning Note">
<meta itemprop="description" content="kubernetes/SDN/DevOps">
</span>
<span hidden itemprop="post" itemscope itemtype="http://schema.org/CreativeWork">
<meta itemprop="name" content="Ceph Network Architecture 研究(二) | Hwchiu Learning Note">
<meta itemprop="description" content="">
</span>
<header class="post-header">
<h1 class="post-title" itemprop="name headline">
Ceph Network Architecture 研究(二)
</h1>
<div class="post-meta-container">
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2017-05-25 10:15:21" itemprop="dateCreated datePublished" datetime="2017-05-25T10:15:21+08:00">2017-05-25</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2023-06-23 13:16:12" itemprop="dateModified" datetime="2023-06-23T13:16:12+08:00">2023-06-23</time>
</span>
<span class="post-meta-item" title="Views" id="busuanzi_container_page_pv">
<span class="post-meta-item-icon">
<i class="far fa-eye"></i>
</span>
<span class="post-meta-item-text">Views: </span>
<span id="busuanzi_value_page_pv"></span>
</span>
</div>
</div>
</header>
<div class="post-body" itemprop="articleBody"><p>延續上篇文章 (Ceph Network Architecture 研究(一))[<a href="https://www.hwchiu.com/ceph-network-i.html#more]%EF%BC%8C%E6%9C%AC%E6%96%87%E5%B0%87%E7%B9%BC%E7%BA%8C%E6%8E%A2%E8%A8%8E">https://www.hwchiu.com/ceph-network-i.html#more],本文將繼續探討</a> <strong>Async</strong> 這種網路類型底層真的架構與概念,所以本文章也不會有太硬的程式碼解讀,反而會比較偏向概念性的分析。</p>
<p>從上一篇文章中我們可知道,底層網路實現提供了包含 <strong>Messenger</strong>, <strong>Connection</strong> 等介面供上層應用層去使用。<br>接下來</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">AsyncConnection.cc</span><br><span class="line">AsyncConnection.h</span><br><span class="line">AsyncMessenger.cc</span><br><span class="line">AsyncMessenger.h</span><br><span class="line">Event.cc</span><br><span class="line">Event.h</span><br><span class="line">EventEpoll.cc</span><br><span class="line">EventEpoll.h</span><br><span class="line">EventKqueue.h</span><br><span class="line">EventSelect.cc</span><br><span class="line">EventSelect.h</span><br><span class="line">PosixStack.cc</span><br><span class="line">PosixStack.h</span><br><span class="line">Stack.cc</span><br><span class="line">Stack.h</span><br><span class="line">net_handler.cc</span><br><span class="line">net_handler.h</span><br></pre></td></tr></table></figure>
<p>從上述的檔案來看,我們大致上可以猜到 <strong>AsyncMessenger</strong> 以及 <strong>AsyncConnection</strong>的涵義,而 <strong>Event</strong> 一系列的檔案應該就是最底層的 I/O 的處理。</p>
<span id="more"></span>
<h2 id="Event"><a href="#Event" class="headerlink" title="Event"></a>Event</h2><p>這邊先從最底層開始看起,首先是 <strong>Event</strong>。<br>整個 <strong>Event</strong> 代表了底層 I/O 的處理,目前支援三種實作方式,分別是</p>
<ul>
<li>Epool</li>
<li>Kqueue</li>
<li>Select</li>
</ul>
<p>在這三種實作上面,又提供了三種 <strong>EventType</strong> 供上層使用,分別是</p>
<ul>
<li>File_Event</li>
<li>Time_Event</li>
<li>External_Event</li>
</ul>
<h3 id="File-Event"><a href="#File-Event" class="headerlink" title="File_Event"></a>File_Event</h3><p>File event 是最常見也是最普遍使用的,針對每一個 <strong>file descriptor</strong> 進行設定,該 <strong>file descriptor</strong> 關注的是 <strong>read event</strong> 還是 <strong>write event</strong> 以及當該 <strong>event</strong> 發生時,應該要進行什麼樣的處理。</p>
<h3 id="Time-Event"><a href="#Time-Event" class="headerlink" title="Time_Event"></a>Time_Event</h3><p>Time event 本身跟 <strong>file descriptor</strong> 無關,單純的是依照時間來驅動的事件,對於每一種 <strong>Time Event</strong> 則會有兩個設定,一個是多久(ms)之後要執行該事件,以及該執行的事件是什麼,這邊都是使用 function pointer 來指向該事件。</p>
<h3 id="External-Event"><a href="#External-Event" class="headerlink" title="External_Event"></a>External_Event</h3><p>External event 實際上跟 Time event 是相同的,可以視為時間是 0ms 的 Time event,就是馬上執行該事件。</p>
<p>整體架構如下圖,系統中會有一個 <strong>Event Center</strong>,底層支援各種 I/O 的實作,此外,本身會提供介面供上層使用,可以接受上述三種事件的註冊。<br>待一切都準備就緒後,就會開始透過底層 I/O 的事件去處理這三種事件,譬<br>如有封包到來的時候呼叫對應的函式處理,亦或是時間到的時候執行對應的<br> <strong>Time event</strong>。</p>
<p><img src="http://i.imgur.com/yiDGubn.jpg"></p>
<h3 id="Worker-and-Network-Stack"><a href="#Worker-and-Network-Stack" class="headerlink" title="Worker and Network Stack"></a>Worker and Network Stack</h3><p>上述看完了 <strong>EventCenter</strong>的概念後,我們知道每個 <strong>EventCenter</strong>專門用來負責底層的 I/O 處理,那這邊為了提高整體的效率,採用了 <strong>ThreadPool</strong>的概念,事先根據系統上的能力創造一批固定數量的 <strong>Thread</strong>,這邊統稱為 <strong>Worker</strong>,這些 <strong>Worker</strong> 的數量可以動態的增加,減少。<br>然後每一個 <strong>Worker</strong> 都配上一個 <strong>EventCenter</strong>,盡可能的讓所有的 <strong>Worker</strong>去平均分擔所有的 Network I/O 負擔。<br>在這群 <strong>Worker</strong> 之上存在一層 <strong>Network Stack</strong>,此 <strong>Stack</strong> 會掌管所有的 <strong>Workers</strong>,包含其創建/增加/刪除等行為。</p>
<p>綜合以上概念,目前認知的架構圖如下。<br><img src="http://i.imgur.com/4k6Rmpo.jpg"></p>
<h3 id="AsyncConnection"><a href="#AsyncConnection" class="headerlink" title="AsyncConnection"></a>AsyncConnection</h3><p>接下來看到 <strong>AsyncConnection</strong> ,此物件代表者任意兩個 <strong>ceph node</strong>之間的連線,可以是 <strong>osd<->osd</strong>,也可以是 <strong>mon<->mon</strong>亦或是 <strong>osd<->mon</strong>。<br>此物件本身除了代表連線外,跟網路傳輸相關的功能,如發送封包,接收封包等事情都會在這邊提供一個介面供更上層的應用(OSD)來使用。<br>不過這邊只是中介層而已,真正收送發包的還是上述提到 <strong>EventCenter</strong><br>在處理。</p>
<p>由於系統上可以同時存在非常多條 <strong>connections</strong>,為了讓這些 <strong>connections</strong>能夠同時運作且不會互相影響,這邊配給<strong>每一個connection</strong>一個<strong>worker</strong>來處理。<br>由於 <strong>connection</strong>的數量基本上都會比<strong>worker</strong>還要多,因此在配對上就是盡量平均分擔下去,盡量讓每一個<strong>worker</strong>負擔相同數量的<strong>connection</strong>。</p>
<p>所以看到這邊已經可以大概理解,系統上每一條 <strong>connection</strong> 都配上一個 <strong>thread</strong> 來處理,而每一個 <strong>thread</strong> 實際上可能會負責不少條 <strong>connection</strong>,這邊採用數量的方式來分散這些 <strong>connection</strong>,若能夠根據實際負擔作為分散的權重也許可以讓每個<br> <strong>thread</strong> 的負擔更為平均。</p>
<p>因此看到這邊,目前的架構圖如下,圖中的 <strong>Async Connections</strong>只是一個抽象的概念,描述眾多的 <strong>Async Connection</strong>而已。</p>
<p><img src="http://i.imgur.com/yAzGB06.jpg"></p>
<h3 id="AsyncMessenger"><a href="#AsyncMessenger" class="headerlink" title="AsyncMessenger"></a>AsyncMessenger</h3><p>最後出場的就是 <strong>AsyncMessenger</strong>,其概念與之前講述過的 <strong>Messenger</strong>一樣,管理所有的 <strong>AsyncConnections</strong>,同時是最直接供上層應用程式的物件。<br>每個 <strong>AsyncMessenger</strong>都可以被註冊 <strong>Dispatcher</strong>,接者當底下的 <strong>connection</strong> 有收到來自遠方的封包(<strong>Messege</strong>)時,就呼叫對應的 <strong>Dispatcher</strong> 來處理。</p>
<p>所以整體架構如下圖。</p>
<p><img src="http://i.imgur.com/l9h13kc.jpg"></p>
<h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><p>到這邊大致上已經對 <strong>Async</strong> 系列有一個基本的認識了,不過這基本上只局限於 <strong>async+poxis</strong> 類型而已,對於 <strong>RDMA</strong> 以及 <strong>DPDK</strong> 則因為這兩種運作方式的不同,其真正運作的方式又是截然不同的,這部分可以從原始碼中看到 <strong>RDMA/DPDK</strong> 都有額外的資料夾,且資料夾內又有為數不少的檔案可以大略猜測出來。</p>
<p>接下來的文章會比較偏技術性質,會直接看進這些程式碼內,透過這些程式碼能夠更瞭解整體的架構以及實作細節,順便學習增廣見聞。</p>
</div>
<footer class="post-footer">
<div class="followme">
<span>Welcome to my other publishing channels</span>
<div class="social-list">
<div class="social-item">
<a target="_blank" class="social-link" href="https://twitter.com/hw_chiu">
<span class="icon">
<i class="fab fa-twitter"></i>
</span>
<span class="label">Twitter</span>
</a>
</div>
<div class="social-item">
<a target="_blank" class="social-link" href="https://t.me/technologynote">
<span class="icon">
<i class="fab fa-telegram"></i>
</span>
<span class="label">Telegram</span>
</a>
</div>
<div class="social-item">
<a target="_blank" class="social-link" href="/atom.xml">
<span class="icon">
<i class="fa fa-rss"></i>
</span>
<span class="label">RSS</span>
</a>
</div>
</div>
</div>
<div class="post-tags">
<a href="/tags/Network/" rel="tag"># Network</a>
<a href="/tags/SourceCode/" rel="tag"># SourceCode</a>
<a href="/tags/Ceph/" rel="tag"># Ceph</a>
<a href="/tags/SOS/" rel="tag"># SOS</a>
<a href="/tags/ScaleOut/" rel="tag"># ScaleOut</a>
<a href="/tags/SDS/" rel="tag"># SDS</a>
</div>
<div class="post-nav">
<div class="post-nav-item">
<a href="/docker-build-image.html" rel="prev" title="Docker image for Hexo (一)">
<i class="fa fa-chevron-left"></i> Docker image for Hexo (一)
</a>
</div>
<div class="post-nav-item">
<a href="/ceph-network-iii.html" rel="next" title="Ceph Network Architecture 研究(三)">
Ceph Network Architecture 研究(三) <i class="fa fa-chevron-right"></i>
</a>
</div>
</div>
</footer>
</article>
</div>
<div class="comments utterances-container"></div>
</div>
</main>
<footer class="footer">
<div class="footer-inner">
<div class="copyright">
©
<span itemprop="copyrightYear">2023</span>
<span class="with-love">
<i class="fa fa-heart"></i>
</span>
<span class="author" itemprop="copyrightHolder">Hwchiu</span>
</div>
<div class="busuanzi-count">
<span class="post-meta-item" id="busuanzi_container_site_uv">
<span class="post-meta-item-icon">
<i class="fa fa-user"></i>
</span>
<span class="site-uv" title="Total Visitors">
<span id="busuanzi_value_site_uv"></span>
</span>
</span>
<span class="post-meta-item" id="busuanzi_container_site_pv">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="site-pv" title="Total Views">
<span id="busuanzi_value_site_pv"></span>
</span>
</span>
</div>
<div class="powered-by">Powered by <a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/" rel="noopener" target="_blank">NexT.Gemini</a>
</div>
</div>
</footer>
<div class="back-to-top" role="button" aria-label="Back to top">
<i class="fa fa-arrow-up fa-lg"></i>
<span>0%</span>
</div>
<noscript>
<div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
<script src="/js/comments.js"></script><script src="/js/utils.js"></script><script src="/js/motion.js"></script><script src="/js/next-boot.js"></script>
<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script class="next-config" data-name="utterances" type="application/json">{"enable":true,"repo":"hwchiu/blog-comment","issue_term":"pathname","theme":"github-light"}</script>
<script src="/js/third-party/comments/utterances.js"></script>
</body>
</html>