1. 程式人生 > >DRBD資料處理基本框架分析

DRBD資料處理基本框架分析

前言:

本文件以單主模式進行資料流分析,雙主模式就是從機也升級為主機可以進行資料讀寫操作,單主模式下,資料只能從一端也就是升級為primary的那一端進行讀寫操作,partner端是不能進行任何操作的,不能進行格式化,更不能掛載檢視primary同步過來的資料,只有把這一端升級為primary之後才可以進行常規的掛載檢視檔案、讀寫檔案操作。

第一部分:載入驅動、建立資源、啟動服務

配置核心將drbd編譯成模組,通過modprob將drbd.ko註冊進核心,通過drbdadm命令讀取配置檔案建立資源,之後啟動驅動裡面的各種收發處理執行緒,並建立網路連結。

1.1載入驅動

主要操作就是建立並註冊一個塊裝置檔案,主裝置號為147,寫入drbd的元資料資訊、初始化日誌、初始化bitmap,兩端的drbd裝置初始化完成之後,就可以啟動drbd服務了。

drbd: initialized. Version: 8.4.5 (api:1/proto:86-101) 

drbd: srcversion: D496E56BBEBA8B1339BB34A              

drbd: registered as block device major 147             

1.2建立資源、啟動服務

通過在兩端up資源的方式建立最初的網路連線,初始化各自的role,最初兩端都是secondary。在啟動服務裡面比較主要的就是通過drbd_adm_new_resource函式介面,申請網路資源,並通過配置檔案與partner建立連結。另一個主要完成的內容就是建立三個執行緒分別是drbd_receive、drbd_worker、drbd_asender。

drbd_thread_init(resource,&connection->receiver,drbd_receiver, "receiver");

drbd_thread_init(resource,&connection->worker,drbd_worker, "worker");

drbd_thread_init(resource,&connection->asender,drbd_asender, "asender");

1.2.1receiver執行緒

在receiver裡面建立網路資源並進行連結操作,同時通過drbdd函式介面阻塞接收partner傳送過來的資料,當收到資料後進行命令解析,執行對應的處理函式。

1.2.2worker執行緒

Worker函式主要處理來自sender連結串列裡面的請求資料,並通過解析命令執行對應的回撥函式進行進一步的處理操作。這裡的sender裡面的資料主要就是處理drbd_make_request函式接收的請求資料,並且是需要同步到partner端的資料。

1.2.3asender執行緒

Asender函式主要處理平時的心跳檢測,維護兩端的狀態。主要的同步資料操作還是通過receiver函式裡面的drbdd函式進行處理。

第二部分:接收請求、處理請求資料

任何塊裝置驅動的入口都是對上層提供的請求處理函式。

2.1接收請求、初始化請求佇列

驅動通過drbd_adm_new_minor函式提供drbd塊裝置的make_request_fn函式的註冊,也就是drbd_make_request函式。在drbd_adm_new_minor函式裡面完成塊裝置的申請、初始化、註冊等內容。併為每一個連結建立一個peer_device裝置,用來統一管理之後的所有資料處理。同時初始化一個工作佇列INIT_WORK(&device->submit.worker,do_submit);在do_submit函式裡面接收下面的drbd_request_prepare函式傳送過來的請求。

在drbd_make_request這個函式裡面主要進行兩步操作,第一步就是drbd_request_prepare函式。

在這個函式裡面把上層提交的BIO請求進行克隆,一份用於在本地進行提交,另一份用於進行資料同步操作。通過向初始化時建立的記憶體池申請req的方式建立,並使用BIO對這個req進行初始化,如果是寫請求最終將其連結入device->submit.writes連結串列,之後喚醒工作佇列的處理函式進行do_submit操作。

第二步是直接呼叫drbd_send_and_submit(device,req);函式對上一步返回的req進行傳送與提交操作。

2.2處理請求佇列

這裡主要通過drbd_send_and_submit(mdev,req);函式進行實現。

這個函式主要完成請求的處理,包括判斷請求裡面是否存在與暫未處理完成的請求裡面資料重疊部分,如果有就等待先前的先處理,避免出現數據不一致。判斷是否需要進行同步操作,如果需要就把請求傳送到worker處理執行緒,通過worker處理執行緒的回撥函式進行資料傳送,資料傳送通過drbd_socket的mutex鎖機制進行保護,先發送包頭部分,之後在傳送BIO裡面的資料,並且同步的資料是通過對BIO進行拆分,對BIO每個段裡面的頁進行的傳送,呼叫標準socket的傳送函式即socket->ops->sendpage。與之後的本地資料以BIO為單元進行的資料提交不同。

之後會對本地資料進行處理,本地資料處理使用克隆出來的BIO,通過drbd_submit_req_private_bio(req);最終呼叫塊裝置的generic_make_request(bio);函式進行本地資料的提交操作。