0%

延續上篇文章 (Ceph Network Architecture 研究(一))[https://www.hwchiu.com/ceph-network-i.html#more],本文將繼續探討 Async 這種網路類型底層真的架構與概念,所以本文章也不會有太硬的程式碼解讀,反而會比較偏向概念性的分析。

從上一篇文章中我們可知道,底層網路實現提供了包含 Messenger, Connection 等介面供上層應用層去使用。
接下來

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AsyncConnection.cc
AsyncConnection.h
AsyncMessenger.cc
AsyncMessenger.h
Event.cc
Event.h
EventEpoll.cc
EventEpoll.h
EventKqueue.h
EventSelect.cc
EventSelect.h
PosixStack.cc
PosixStack.h
Stack.cc
Stack.h
net_handler.cc
net_handler.h

從上述的檔案來看,我們大致上可以猜到 AsyncMessenger 以及 AsyncConnection的涵義,而 Event 一系列的檔案應該就是最底層的 I/O 的處理。

Read more »

本 blog 目前是採用 hexo 作為主要開發,然而 hexo 我覺得最大的缺點就是屬於靜態網頁類型,所以只要每次換一個開發裝置,譬如桌電,筆電等,就必須要將整個環境重新建置。
整個 hexo 是由 nodejs 所組成的,所以其實在安裝上也不會有什麼太大的麻煩,但就是覺得相同的事情做過很多次,其實還滿蠢的。
所以決定採用 docker 的方式,將該開發環境做成一個 docker image,之後有需要直接抓取該 image 下來使用即可。

因此本文接下來將著重在如何使用 docker 指令創立一個 image,並且將其上傳到 docker hub上。

Read more »

此篇文章主要研究目前很熱門的 scale out storage 軟體 ceph 的網路架構。
由於 scale-out 的特性,不同節點彼此之間需要透過網路來交換資料,所以 ceph
這邊提供了 public network 以及 cluster network 兩種不同的用途的網路架構。

其中 cluster network 是用來傳輸資料用的,當各節點有資料要同步時,流量都是走這個網路來交換,
public network則是處理剩下的流量,譬如外面的資料讀取(read/write)等。

因此接下來將針對 Ceph 內部的網路架構進行研究,並且最後選擇一種類型進行更進一步的研究。

Read more »

本文主要嘗試分析 drbd(9.0) 於 kernel運行時的效能分析,希望藉由 perf 這個 tool 來分析整個程式運行的狀況,藉此觀察其運行時各 function 的比例。

Testing Environment

為了進行效能上的分析,首要條件就是先將 DRBD 給衝到效能瓶頸才有機會去觀察,所以本文採用下列的環境與工具來進行這項作業

Read more »

Introduction

本篇文章主要講述如何再 Ubuntu 16.04 with kernel 4.4.3 的環境下安裝 drbd 9.0 並進行簡單的設定與操作。

Install

這邊為了方便日後的研究,這邊安裝的方式是抓取 source code 下來,然後進行編譯安裝,由於 drbd v8.4.5 後將 module 以及相關的 utils 是分開在不同的 git repostory,所以我們會有兩個 project 來編譯及安裝。
首先到官網的 git 首頁可以看到滿滿的 projects,這邊我們會需要的兩個 project 分別是 drbd-9.0 以及 drbd-utils
接下來就說明這兩個 project 要如何編譯及安裝

Read more »

Introduction

本文主要分析 drbdkernel space 中關於 networking 這一部分用到的所有資料結構,這些資料結構主要分成兩個部分,一部分是通用的,一部分則是 TCP 連線專用的

通用

  • struct drbd_resource
  • struct drbd_connection
  • struct drbd_path
  • struct drbd_listener
  • struct drbd_transport
  • struct drbd_transport_ops
  • struct drbd_transport_class

TCP專用

  • struct drbd_tcp_transport
  • struct dtt_listener
  • struct dtt_socket_container
  • struct dtt_path

Environment

  • Drbd 9.0
  • Using TCP as DRBD Transport
Read more »

Introduction

本文延續之前研究 drbd 9.0 網路的工作流程,這篇文章主要在研究其 kernel space 中的行為與邏輯。

從之前 drbdsetup 那邊可以觀察到,這三個指令的結構如下,其中要特別注意的就是
DRBD_ADM_CONNECT, DRBD_ADM_NEW_PEER 以及 DRBD_ADM_NEW_PATH
這三個數值其實是給 netlink 使用的,在 kernel 端會去註冊遇到三種類型的 netlink 應該要怎麼處理。

1
2
3
4
5
0397     {"connect", CTX_PEER_NODE,
0398 DRBD_ADM_CONNECT, DRBD_NLA_CONNECT_PARMS,
0399 F_CONFIG_CMD,
0400 .ctx = &connect_cmd_ctx,
0401 .summary = "Attempt to (re)establish a replication link to a peer host." },

1
2
3
4
5
0403     {"new-peer", CTX_PEER_NODE,
0404 DRBD_ADM_NEW_PEER, DRBD_NLA_NET_CONF,
0405 F_CONFIG_CMD,
0406 .ctx = &new_peer_cmd_ctx,
0407 .summary = "Make a peer host known to a resource." },
1
2
3
4
5
6
7
8
9
0415     {"new-path", CTX_PEER_NODE,
0416 DRBD_ADM_NEW_PATH, DRBD_NLA_PATH_PARMS,
0417 F_CONFIG_CMD,
0418 .drbd_args = (struct drbd_argument[]) {
0419 { "local-addr", T_my_addr, conv_addr },
0420 { "remote-addr", T_peer_addr, conv_addr },
0421 { } },
0422 .ctx = &path_cmd_ctx,
0423 .summary = "Add a path (endpoint address pair) where a peer host should be reachable." },
Read more »

Architecture

整個 DRBD 分成 kernel space 跟 user space。
主要的功能都在 kernal space,在 9.0 版本中包含了兩個 kernel module(商業版還在多一個RDMA),其中 drbd_transport_tcp.ko專心負責 TCP 連線的部分,剩下的功能都在 drbd.ko 中實現。
而 user space 則是負責提供用戶一個方便的操作,如drbdadm這方面的工具,當用戶執行如 drbdadm up r0 這些指令後,最後會透過 drbdsetup 將必要的資訊透過 netlink的方式送往 kernel space,而先前的 kernel module 則會在 insert 時就註冊許多 netlink event,每種type都有對應的 handler來處理。
如下圖呈現

img

Read more »

Install LXR on Ubuntu 16.04

In this article, I will write down a example to descrip how to setup the LXR(Linux Cross Reference) with multiple projects support. In this configuration, your can view multiple projects’ refernce in one LXR service.
For this article, I use the Ceph and DRBD for my LXR projtects.

Read more »