ceph儲存 ceph集群osd故障自我檢測

2021-09-22 16:29:49 字數 2890 閱讀 3367

心跳是用於osd節點間檢測對方是否故障的,以便及時發現故障節點進入相應的故障處理流程。故障檢測需要在故障的發現時間和心跳帶來的負載之間做權衡,如果心跳頻率太高則過多的心跳報文會影響系統效能,如果心跳頻率過低則會延長發現故障節點的時間,從而影響系統的可用性。

在大規模部署的場景中,如果任意兩個osd節點間都建立心跳連線將帶來巨大的負擔。尤其,當新加入乙個osd節點時這個負擔就會幾倍地增加。ceph中每個osd只和以下兩類節點建立心跳連線:一類是同個pg下的osd節點之間,因為屬於同個pg的osd節點會儲存同份資料的副本,如若出現故障則會直接影響資料的可用性。另一類是osd的左右兩個相鄰的節點,這兩個節點同自己物理上存在比較緊密的聯絡,例如可能連線在同台交換機。另外,如果建立心跳的peer數目少於osd_heartbeat_min_peers,那麼osd會繼續同離他較近的幾個osd建立心跳連線。

osd節點會監聽public、cluster、front和back四個埠,其中front和back兩個埠都是用於心跳的,cluster埠用來監聽來自osd peer的連線,public用來監聽來自monitor和client的連線。如果啟動osd時沒有提供back的ip位址,則back使用cluster的ip位址;而front不單獨提供ip位址,直接使用public的ip位址。另外,osd單獨建立了乙個名為hbclient的messenger,作為心跳的客戶端,單獨用來建立連線傳送心跳報文。心跳報文優先傳送給back連線。

**注釋

// ceph-osd.cc 啟動osd時建立messengersosd::maybe_update_heartbeat_peers() 確定同哪些peer建立心跳連線,剔除已經down掉的節點的心跳連線osd::_add_heartbeat_peer() 同給定的peer建立心跳連線osdserveice::get_con_osd_hb() 獲取peer的front和back連線配置

osd使用t_heartbeat執行緒定時向peer osds傳送心跳報文,傳送報文的時間間隔在0.5~6.5之間,由osd_heartbeat_interval配置選項決定。心跳報文會同時向peer osd的front和back埠傳送。心跳報文分兩種型別一種是ping型別,另一種是reply型別。ping型別的報文是osd主動傳送給peer osd的報文,而reply是peer osd回應給自己的報文。兩種型別的心跳報文都攜帶時間戳,但它們的時間戳代表的含義不一樣。ping型別報文的時間戳是傳送報文時的時間,而reply型別報文的時間戳是從ping報文中讀取出來的,不是代表它自己的傳送時間而是代表它對應的ping報文的傳送時間。osd接收到reply報文時將記錄報文的時間戳,並以此來判斷是否超時。

對每個peer節點,如果其最近的應答的時間(最近的reply報文的時間戳)位於cutoff之前(即超時grace秒),則將其加入到failure_queue佇列。osd會定時向monitor匯報自己的狀態,在匯報狀態時將failure_queue佇列中peer傳送給monitor,由monitor將其標記為down狀態。monitor在接收到osd對peer的故障報告後,通過paxos演算法決定是否將peer osd標記為down狀態。如果將peer osd標記為down狀態,那麼將更新osd map,osd接收到osd map更新的訊息後,斷開和peer osd的心跳連線。

如果在向monitor報告故障之後但在接收到osd down訊息之前,再次接收到peer osd對心跳報文的回應,則將peer osd從failure_queue佇列中移除,並通知monitor該節點依舊存活著。

**注釋

void osd::heartbeat_entry() // t_heartbeat執行緒入口函式,定時向心跳peers傳送心跳報文void osd::heartbeat()mapfailure_queue; // 檢測到peer長時間沒心跳時,將peer加入到failure_queue佇列mapfailure_pending; // 故障報告給monitor的peer osdvoid send_failures();

void send_still_alive(epoch_t epoch, const entity_inst_t &i);

void osd::note_down_osd(int peer)

void osd::handle_osd_ping(mosdping *m) // 處理mosdping訊息配置

option(osd_heartbeat_interval, opt_int, 6) // (seconds) how often we ping peersoption(osd_heartbeat_grace, opt_int, 20) // (seconds) how long before we decide a peer has failed

ceph增加osd流程

假如需要新增乙個主機名 osd4 ip 192.168.0.110的osd 1.在osd4建立掛載目錄及放置配置檔案的目錄 ssh 192.168.0.110 這裡是從mon主機ssh到osd4主機 mkdir ceph osd.4 mkdir etc ceph 2.在osd4上格式化ext4的sd...

Ceph 手動搭建ceph集群

hostname ipmon id 磁碟快journal ceph1 192.168.1.1 0 dev sdb2 dev sdb1 ceph2 192.168.1.2 1 dev sdb2 dev sdb1 ceph3 192.168.1.3 2 dev sdb2 dev sdb1 使用yum來安...

ceph運維 新增osd

ceph osd create 獲取osd的id號,假設輸出的是2 ssh osd2 登入到要新增到集群的主機 sudo mkdir var lib ceph osd ceph 2 建立新的osd目錄 sudo mkfs.btrfs dev sdb 如果檔案系統用的不是btrfs,在終端輸入mkfs...