Ceph編譯安裝教程


Ceph官方版本目前支持的糾刪碼很有限,實驗室這塊希望能夠整合我們自主開發的糾刪碼BRS(Binary Reed–Solomon encoding),所以需要編譯Ceph環境。Ceph官方目前推薦的安裝方式都是通過Ceph-deploy的工具來安裝配置,搭建起來十分簡單。目前直接通過Ceph源碼進行編譯安裝的中文教程有太多坑了。筆者親身通過編譯Ceph搭建環境之后,對這個流程進行了一個完整的小結,后續的童鞋可以做一個簡單的參考。

1.Ceph簡介

Ceph 的初創來自Sage Weil 博士的 PhD 論文,論文 “Ceph: A Scalable, High-Performance Distributed File System”詳細的闡述了 Ceph 的設計架構。
簡而言之,Ceph 作為一個分布式存儲系統設計的目標定位為:

  • 可輕松擴展到數PB級別的容量(Ceph目前的版本可以輕松支持EB級別的存儲容量)
  • 能夠自動適應多種工作負載的高性能(每秒輸入/輸出操作[IOPS]和帶寬)
  • 高可靠性
  • 提供了對象,塊,文件系統一整套存儲解決方案,大大降低運維的成本

筆者認為Ceph作為一個優秀的分布式存儲系統,未來分布式存儲系統提供了設計基礎。自Linux內核2.6.34版開始,Ceph.ko已經集成到Linux內核之中,作為分布式文件系統的備選項之一。同時Ceph也是OpenStack中優秀的開源存儲解決方案,支持通過Ceph作為塊存儲或對象存儲進行讀寫訪問。

2.編譯Ceph的源碼

Ceph的源碼可以去Github之上clone下來,或者去Ceph官網下載。這里重點提一下Ceph的版本問題,Ceph在Hammer版本之后,采取了新的版本命名規則:

  • x.0.z - 開發版
  • x.1.z - 候選版
  • x.2.z - 穩定、修正版

目前對Ceph進行二次開發的版本基本上是基於穩定TLS版本來做,實驗室選取了兩個版本進行了開發。10.2.6版本與12.2.1版本,本文基於10.2.6的版本進行編寫。(12.2.1版本不在使用autotools作為編譯工具,同時添加了Mgr等新的組件,配置文件的編寫方式也略有不同。)

由於實驗室擬態系統的要求與設定,這里筆者選擇了混用64位的Ubuntu 14.04與64位的Centos進行編譯安裝,二者流程大同小異,不同之處我會重點標記。通過cd 進入Ceph的源碼目錄,依次執行如下命令

 1.  ./install-deps.sh     //安裝對應的Ceph依賴包
 2   ./autogen.sh          //調用autotools腳本,生成configure和makefile文件
 3.  ./configure           //這步是很麻煩的一步,由於第一步並不會完全安裝好所有依賴,需要讀者見招拆招,按照終端提示安裝依賴。
    (注:Centos系列不會存在類似問題,嫌麻煩的可以直接用Centos進行編譯安裝)   
 4.  make                  //進入漫長的等待,多核可以添加-j{cpu核數} 如make -j4
 5.  make install          //安裝Ceph  

PS:編譯Ceph時需要超大的內存與硬盤空間,所以建議待安裝節點的內存和硬盤空間要足夠大,否則會出現:

virtual memory exhausted: Cannot allocate memoryfull disk等問題。

3.配置搭建Ceph的環境,啟用Mon節點

編譯成功后,也不要高興得太早了,接下來我們按下面配置架構圖來構建Ceph集群。
ceph集群圖.png

這部分應該是最讓人頭疼的部分了。編譯安裝Ceph和直接通過包管理器安裝Ceph的可大有不同。如/etc/ceph/的配置目錄就自己新建,默認的/var/log/ceph路徑也需要通過mkdir新建,否則Ceph會直接丟棄日志文件。

  • 編輯/etc/ceph/ceph.conf

    • (1) 為集群分配唯一的集群id

       uuidgen   //生成uuid
      
    • (2) 編輯fsid

       fsid = {UUID}   //填寫生成的uuid
      
      • 例如:

        fsid = 236e7afe-7c61-41a0-b577-89df547fcef5
        
    • (3) 把初始監視器寫入 Ceph 配置文件

      mon initial members = {hostname}[,{hostname}]
      
      • 例如:

        mon initial members = slave1
        
    • (4) 把初始監視器的 IP 地址寫入 Ceph 配置文件、並保存。

      mon host = {ip-address}[,{ip-address}]
      
      • 例如:

         mon host = 192.168.1.4
        
    • (5) 為此集群創建密鑰環、並生成監視器密鑰。

      ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
      
    • (6) 生成管理員密鑰環,生成 client.admin 用戶並加入密鑰環。

      ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
      
    • (7) 把 client.admin 密鑰加入 ceph.mon.keyring 。

      ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
      
    • (8) 用規划好的主機名、對應 IP 地址、和 FSID 生成一個監視器圖,並保存為 /tmp/monmap 。

      monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
      
      • 例如:

        monmaptool --create --add slave1 192.168.1.4 --fsid  236e7afe-7c61-41a0-b577-89df547fcef5 /tmp/monmap
        
    • (9) 在監視器主機上分別創建數據目錄。

      sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
      
      • 例如:

        sudo mkdir /var/lib/ceph/mon/ceph-slave1
        
    • (10) 用監視器圖和密鑰環組裝守護進程所需的初始數據。

       ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
      
      • 例如:

        ceph-mon --mkfs -i slave1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
        
    • (11) 仔細斟酌 Ceph 配置文件,公共的全局配置包括這些:

      [global]
      fsid = {cluster-id}
      mon initial members = {hostname}[, {hostname}]
      mon host = {ip-address}[, {ip-address}]
      auth cluster required = none   //這里為了方便搭建測試環境,關閉了ceph的安全認證,建議在實際運行環境之中開啟。
      auth service required = none
      auth client required = none
      
    • (12) 建一個空文件 done ,表示監視器已創建、可以啟動了:

      sudo touch /var/lib/ceph/mon/ceph-slave1/done
      
      • 啟動監視器。

        在 Ubuntu 上用 Upstart :

        sudo ceph-mon --id=slave1 [cluster={cluster-name}]
        

        要使此守護進程開機自啟,需要創建兩個空文件,像這樣:

        sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/upstart
        

        例如:

        sudo touch /var/lib/ceph/mon/ceph-slave1/upstart
        

        在 Debian/CentOS/RHEL 上用 sysvinit :

        sudo /etc/init.d/ceph start mon.slave1
        
    • (13) 驗證下 Ceph 已經創建了默認存儲池。

      ceph osd lspools
      

      可以看到這樣的輸出:

      1 rbd     // Ceph會默認搭建一個rbd的存儲池
      

      確認下集群在運行。

      ceph -s
      

      你應該從輸出里看到剛剛啟動的監視器在正常運行,並且應該會看到一個健康錯誤:它表明歸置組卡在了 stuck inactive 狀態。輸出大致如此:

      cluster a7f64266-0894-4f1e-a635-d0aeaca0e993
      health HEALTH_ERR 64 pgs stuck inactive; 64 pgs stuck unclean; no osds
      monmap e1: 1 mons at {slave1=192.168.1.4:6789/0}, election epoch 1, quorum 0 slave1
      osdmap e1: 0 osds: 0 up, 0 in
      pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
           0 kB used, 0 kB / 0 kB avail
           64 creating
      

      目前集群處於ERR狀態,由於osd尚未啟動,pgs沒有分配。接下來我們要開始啟動osd,將pgs分配到osd之上,可以讓集群恢復健康。

4.編輯CrushMap,啟用osd節點

你的初始監視器可以正常運行后就可以添加 osd 了。要想讓集群達到 active + clean 狀態,必須安裝足夠多的 osd 來處理pgs,在完成Mon啟動之后,集群就有了默認的 CrushMap,但現在此圖還是空的,里面沒有任何 osd 映射到 Ceph 節點,所以我們要先啟動osd節點,之后編輯CrushMap,並將其導入Mon節點。

  • (1) 准備OSD。

    ssh {node-name}
    sudo ceph-disk prepare --cluster {cluster-name} --cluster-uuid {uuid} --fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]
    
    • 例如:

      ssh slave1
      sudo ceph-disk prepare --cluster ceph --cluster-uuid  236e7afe-7c61-41a0-b577-89df547fcef5 --fs-type xfs /dev/sbb1
      
  • (2) 激活 osd,並啟動osd設備:

    sudo ceph-disk activate {data-path} [--activate-key {path}]
    sudo start osd.{id}    
    
    • 例如:

      sudo ceph-disk activate /dev/sdb1
      

接下來依次啟動圖中的3個osd節點,此次osd節點雖然啟動了,但是並沒有加入到CrushMap之中進行映射,接下來我們需要導出Mon上的CrushMap,並進行編輯,之后導回到Mon中。

  • (3) 從Mon節點獲取 CrushMap的二進制文件:

    ceph osd getcrushmap -o crushmapbinary 
    
  • (4) 通過CrushMap的二進制文件反編譯它,成為文本文件:

    cephtool -d crushmapbinary -o crushmap.txt
    
  • (5) 接下來編輯crushmap.txt,主要添加osd device與osd的權重進行配置:
    在 CrushMap里聲明一個設備,在設備列表后面新建一行,輸入 device 、之后是唯一的數字 ID 、之后是相應的 ceph-osd 守護進程例程名字。

    device {num}  {osd.name}
    
    • 例如:
      添加好我們之前activate的osd設備

       device  0 osd.0
       device  1 osd.1
       device  2 osd.2
      

    接下來我們要給這些osd設備分配權重
    CrushMap主要有 4 個主要類型。
    設備 由任意對象存儲設備組成,即對應一個 ceph-osd 進程的存儲器。
    桶類型: 定義了 CRUSH 分級結構里要用的桶類型( types ),桶由逐級匯聚的存儲位置(如行、機櫃、機箱、主機等等)及其權重組成。
    桶例程: 定義了桶類型后,還必須聲明主機的桶類型、以及規划的其它故障域。
    規則: 由選擇桶的方法組成。
    目前我們只要大概有個概念,接下來我們只需要簡單的將我們的設備添加到CrushMap之中:

    root default {
      id -1           # do not change unnecessarily
      # weight 3.240
      alg straw
      hash 0  # rjenkins1
      item slave1 weight 1.00
      item slave2 weight 1.00
      item slave3 weight 1.00
     }
    
     host slave1 {
      id -4
      alg straw
      hash 0
      item osd.0 weight 1.00
    }
    
    host slave2 {
      id -2
      alg straw
      hash 0
      item osd.1 weight 1.00
    }
    
    host slave3 {
      id -3
      alg straw
      hash 0
      item osd.2 weight 1.00
    }
    
  • (6) 重新編譯這個新的CRUSH map

    crushtool -c crushmap.txt -o crushmap-compiled
    
  • (7) 將新的CRUSH map 應用到ceph 集群中

    ceph osd setcrushmap -i crushmap-compiled
    
  • (8)再次確認Ceph集群的運行狀態。

     ceph -s
    
     cluster a7f64266-0894-4f1e-a635-d0aeaca0e993
     health HEALTH_OK  64 pgs stuck active and clean; 3 osds
     monmap e1: 1 mons at {node1=192.168.0.1:6789/0}, election epoch 1, quorum 0 node1
     osdmap e1: 3 osds: 3 up, 3 in
     pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
          3465 kB used, 923421 kB / 919956 kB avail
          64 active and clean
    

    我們可以確認,Ceph集群已經恢復健康,我們已經成功編譯安裝了Ceph。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM