1. 程式人生 > >深入淺出分散式檔案儲存系統之 Ceph 的實現

深入淺出分散式檔案儲存系統之 Ceph 的實現

一、何為分散式檔案檔案系統
       分散式檔案系統(Distributed File System)是指檔案系統管理的物理儲存資源不一定直接連線在本地節點上,而是通過計算機網路與節點相連,它的設計是基於客戶端/伺服器模式。

       圖片.png

        如上圖所示,應用伺服器和檔案伺服器分別存在於網路當中,而這裡的網路,可以是統一子網,也可以是不同子網。伺服器對檔案的存取,均在網路進行,這樣就可以突破常用儲存裝置的容量限制。

二、常用分散式檔案系統的介紹

        1、Lustre

         lustre是一個大規模的、安全可靠的,具備高可用性的叢集檔案系統,它是由SUN公司開發和維護。該專案主要的目的就是開發下一代的叢集檔案系統,可以支援超過10000個節點,數以PB的數量儲存系統。

        2、Hadoop

         hadoop不僅僅是一個用於儲存的分散式檔案系統,而其設計更是用來在由通用計算裝置組成的大型叢集上執行分散式應用的框架。目前主要應用於大資料、區塊鏈等領域。

        3、FastDFS

         FastDFS是一個開源的分散式檔案系統,它對檔案進行管理,功能包括:檔案儲存、檔案同步、檔案訪問(檔案上傳、檔案下載)等,解決了大容量儲存和負載均衡的問題。特別適合以檔案為載體的線上服務, 如相簿網站,視訊網站等等。

        4、Ceph

         Ceph是一個具有高擴充套件、高可用、高效能、可以提供物件儲存、塊儲存、檔案儲存的分散式檔案系統,它可以提供 PD 級別的儲存空間,理論上說,是無上限的。

三、Ceph 介紹

         Ceph是一個具有高擴充套件、高可用、高效能的分散式儲存系統,根據場景劃分可以將Ceph分為物件儲存、塊裝置儲存和檔案系統服務。在虛擬化領域裡,比較常用到的是Ceph的塊裝置儲存,比如在OpenStack專案裡,Ceph的塊裝置儲存可以對接OpenStack的cinder後端儲存、Glance的映象儲存和虛擬機器的資料儲存。比較直觀的是Ceph叢集可以提供一個raw格式的塊儲存來作為虛擬機器例項的硬碟。
         Ceph相比其它儲存的優勢點在於它不單單是儲存,同時還充分利用了儲存節點上的計算能力,在儲存每一個數據時,都會通過計算得出該資料儲存的位置,儘量將資料分佈均衡。同時由於Ceph本身的良好設計,採用了CRUSH演算法、HASH環等方法,使得它不存在傳統的單點故障的問題,且隨著規模的擴大效能並不會受到影響。

四、Ceph 構成

         Ceph的核心構成包括:Ceph OSD(物件存出裝置)、Ceph Monitor(監視器) 、Ceph MSD(元資料伺服器)、Object、PG、RADOS、Libradio、CRUSH、RDB、RGW、CephFS

         OSD全稱 Object Storage Device,真正儲存資料的元件,一般來說每塊參與儲存的磁碟都需要一個 OSD 程序,如果一臺伺服器上又 10 塊硬碟,那麼該伺服器上就會有 10 個 OSD 程序。

         MON:MON通過儲存一系列叢集狀態 map 來監視叢集的元件,使用 map 儲存叢集的狀態,為了防止單點故障,因此 monitor 的伺服器需要奇數臺(大於等於 3 臺),如果出現意見分歧,採用投票機制,少數服從多數。

         MDS全稱 Ceph Metadata Server,元資料伺服器,只有 Ceph FS 需要它。

         Object:Ceph 最底層的儲存單元是 Object 物件,每個 Object 包含元資料和原始資料。

         PG全稱 Placement Grouops,是一個邏輯的概念,一個PG包含多個OSD。引入PG這一層其實是為了更好的分配資料和定位資料。

         RADOS:全稱Reliable Autonomic Distributed Object Store,是Ceph叢集的精華,可靠自主分散式物件儲存,它是 Ceph 儲存的基礎,保證一切都以物件形式儲存。

         LibradioLibrados是Rados提供庫,因為RADOS是協議很難直接訪問,因此上層的RBD、RGW和CephFS都是通過librados訪問的,目前僅提供PHP、Ruby、Java、Python、C和C++支援。

         CRUSH是Ceph使用的資料分佈演算法,類似一致性雜湊,讓資料分配到預期的地方。

         RBD:全稱 RADOS block device,它是 RADOS 塊裝置,對外提供塊儲存服務。

         RGW全稱 RADOS gateway,RADOS閘道器,提供物件儲存,介面與 S3 和 Swift 相容。

         CephFS:提供檔案系統級別的儲存。

五、Ceph 部署

        1、Ceph拓撲結構

        圖片.png

        2、伺服器規劃

         圖片.png

        3、伺服器環境準備

             a、配置主機名、IP地址解析,分別在 6 臺伺服器中執行以下命令:        

    echo -e "192.168.20.144 ceph-a" >> /etc/hosts
    echo -e "192.168.20.145 ceph-b" >> /etc/hosts
    echo -e "192.168.20.146 ceph-c" >> /etc/hosts
    echo -e "192.168.20.147 ceph-d" >> /etc/hosts
    echo -e "192.168.20.148 ceph-e" >> /etc/hosts
    echo -e "192.168.20.149 ceph-f" >> /etc/hosts

             b、配置免密登陸

               掃描伺服器 A 到 F的金鑰,其目的主要是避免在進行 ssh 連線或者在後面執行 ceph 類命令出現 yes/no 的互動,在 Ceph-A 中執行以下命令:

    for i in {a..f}; do ssh-keyscan ceph-$i >/root/.ssh/known_hosts; done

               如下圖:

               圖片.png              

               在 Ceph-A 生成私鑰,在 Ceph-A 中執行以下命令:     

    ssh-keygen -f /root/.ssh/id_rsa -N ''

               如圖:

               圖片.png

               說明:-f 引數指定私鑰檔案路徑, -N 引數宣告該過程為非互動式,也就是不用我們手動按回車鍵等

               將私鑰檔案拷貝到 Ceph-B 到 Ceph-F 伺服器中,執行以下命令:             

    for i in {b..f}; do ssh-copy-id ceph-$i; done

             c、配置 NTP 網路時間同步服務

               在 6 臺伺服器中安裝 chrony 軟體包,在伺服器 A 執行以下命令即可:

    for i in {a..f}; do ssh ceph-$i yum -y install chrony ; done

               配置 Ceph-A 為 NTP 伺服器:

    [[email protected] ~]# vim /etc/chrony.conf

              圖片.png

             如圖,修改圖中的三個部分

             ①、註釋掉預設的 NTP 伺服器,新增國內的 NTP 伺服器,這裡新增的是北京郵電大學的 NTP 伺服器。

             ②、允許 192.168.20.0/24 網段進行時間同步。

             ③、本地時間伺服器層級,取消註釋即可。

             配置 Ceph-B 到 Ceph-F 伺服器通過 Ceph-A 進行時間同步

    [[email protected] ~]# vim /etc/chrony.conf

             圖片.png

             如圖,將圖中紅框內(也就是剛才配置的 Ceph-A)的 NTP 伺服器新增進去即可,其他沒用的註釋。

             儲存並退出,並將改配置檔案複製到 Ceph-C 到 Ceph-F 中:       

     [[email protected] ~]# for i in {c..f}; do scp /etc/chrony.conf ceph-$i:/etc/; done

             重啟 Ceph-A 到 Ceph-F 的 chrony 服務,在 Ceph-A 中執行以下命令:

    [[email protected] ~]# for i in {a..f}; do ssh ceph-$i systemctl restart chronyd; done

             同步 Ceph-A 的時間

    [[email protected] ~]# ntpdate ntp.sjtu.edu.cn

             圖片.png

             同步 Ceph-B 到 Ceph-F 的時間,在 Ceph-A 中執行即可:           

    [[email protected] ~]# for i in {b..f}; do ssh ceph-$i ntpdate 192.168.20.144; done

             圖片.png

        4、配置 yum 源

          之前我們有部署本地 yum 倉庫,這裡,我們使用之前配置的 yum 倉庫。

          移除系統自帶的 repo 檔案,編輯 /etc/yum.repos.d/localhost.repo 檔案,將下面內容新增到該檔案中:

    [Centos-Base]
   name=Centos-Base-Ceph
   baseurl=http://192.168.20.138
   enable=1
   gpgcheck=1
   priority=2
   type=rpm-md
   gpgkey=http://192.168.20.138/ceph-key/release.asc

         清空元資料快取並重建

     [[email protected] ~]# yum clean all
     [[email protected] ~]# yum makecache

        5、安裝 Ceph 服務,這裡將 Ceph-A 做為 admin 管理端

           a、在 Ceph-A 中安裝 ceph-deploy       

     [[email protected] ~]# yum -y install ceph-deploy

           b、在 Ceph-A 中建立 ceph 的工作目錄並進入

     [[email protected] ~]# mkdir /etc/ceph && cd /etc/ceph

           c、Ceph-A 到 Ceph-C 中建立叢集節點配置檔案,Ceph-D 到 Ceph-F 伺服器暫有他用,以下操作,均不涉及在內。         

     [[email protected] ~]# ceph-deploy new ceph-{a..c}

           如圖:

           圖片.png

           d、在 Ceph-A 到 Ceph-C 三個節點中安裝 ceph 軟體包         

     [[email protected] ceph]# ceph-deploy install ceph-{a..c}

           如圖:

           圖片.png

           e、初始化 mon 服務

     [[email protected] ceph]# ceph-deploy mon create-initial

           如圖:

           圖片.png

           f、建立 OSD 裝置

              在伺服器規劃中,我們一共規劃了 4 塊硬碟,其中 sda 用作系統盤,那麼還剩下 sdb、sdc、sdd 三塊硬碟,這裡,我們將 sdb 硬碟做為日誌盤,而 sdc 和 sdd 做為資料盤。

              ①、將 Ceph-A 到 Ceph-C 的 sdb 硬碟格式化為gpt格式               

     [[email protected] ~]# for i in {a..c}; do ssh ceph-$i parted /dev/sdb mklabel gpt; done

                  說明:如果這裡這條命令有報錯,則需要把此命令拆分成下面兩條命令,然後分別到 Ceph-A、Ceph-B、Ceph-C中單獨執行。

     parted /dev/sdb 
     mklabel gpt

              ②、給硬碟 sdb 建立分割槽

     [[email protected] ~]# for i in {a..c}; do ssh ceph-$i parted /dev/sdb mkpart primary 1M 50%; done
     [[email protected] ~]# for i in {a..c}; do ssh ceph-$i parted /dev/sdb mkpart primary 50% 100%; done

                  分割槽成功與否,可以使用 lsblk 命令進行檢視:

         [[email protected] ~]# lsblk

                 如圖:

                 圖片.png

              ③、為分割槽 sdb1 和 sdb2 分配屬主屬組為 ceph            

        [[email protected] ~]# for i in {a..c}; do ssh ceph-$i chown ceph.ceph /dev/sdb?; done

                注意:此處有可能會出現下面的錯誤              

        [ceph-a][ERROR  ]admin_socket:exception getting command descriptions:[Errno 2]No such file or directory

                解決方案如下:

        編輯 ceph.conf ,在最下面加入如下行:
        public_network = 192.168.20.0/24
        儲存並退出,再執行以下命令,將配置檔案覆蓋推送到三臺伺服器節點:
        [[email protected] ceph]# ceph-deploy --overwrite-conf config push ceph-a ceph-b ceph-c

              ④、此時,我們可以檢視一下 ceph 狀態,使用命令 ceph health              

        [[email protected] ceph]# ceph health

                正常情況下會輸出 HEALTH_OK ,如果不是,有可能會有以下情況

        ceph:health_warn clock skew detected on mon

                出現此錯誤,說明我們的伺服器時間同步有問題,我們可以先進行時間同步               

        [[email protected] ~]# for i in {b..f}; do ssh ceph-$i ntpdate 192.168.20.144; done

                如果時間同步後,還是沒有解決,則使用以下解決辦法:

        [[email protected] ceph]# vim ceph.conf
        在global欄位下新增:
        mon clock drift allowed = 2
        mon clock drift warn backoff = 30    
        2、向需要同步的 mon 節點推送配置檔案:
        [[email protected] ceph]# ceph-deploy --overwrite-conf config push ceph-a ceph-b ceph-c
        這裡是向Ceph-A、Ceph-B、Ceph-C推送,也可以後跟其它不連續節點
        3. 重啟 mon 服務(centos7環境下)
        [[email protected] ceph]# for i in {a..c}; do ssh ceph-$i systemctl restart ceph-mon.target; done
        4.驗證:
        [[email protected] ceph]# ceph health
        顯示 OK ,就說明正常了

              ⑤、初始化 sdc、sdd 硬碟,清空硬碟資料              

        [[email protected] ceph]# for i in {a..c}; do ceph-deploy disk zap ceph-$i /dev/sdc; done
        [[email protected] ceph]# for i in {a..c}; do ceph-deploy disk zap ceph-$i /dev/sdd; done

                如圖:

                圖片.png

                注意:在 13.2.0 之前的版本中,應使用以下命令:    

        [[email protected] ceph]# for i in {a..c}; do ceph-deploy disk zap ceph-$i:/dev/sdc ceph-$i:/dev/sdd; done

                但是上面的命令在本例 13.2.2 版本不適合,否則,會有下面的報錯,這個坑,花了好長時間,才發現是命令格式錯誤(官方文件也一樣,不是最新版的,很多地方並不適用於最新版)

                圖片.png

              ⑥、建立 OSD 儲存空間,這裡把 sdb1 做為 sdc 的日誌盤,把 sdb2 做為 sdd 的日誌盤

         [[email protected] ceph]# for i in {a..c}; do ceph-deploy osd create --data /dev/sdc --journal /dev/sdb1 ceph-$i; done
         [[email protected] ceph]# for i in {a..c}; do ceph-deploy osd create --data /dev/sdd --journal /dev/sdb2 ceph-$i; done

                  如圖:

                  圖片.png

                  --data:指定資料盤

                  --journal:指定日誌盤

                  此處也存在命令格式問題,如果是 13.2.0 之前的版本,則使用下面命令:               

         [[email protected] ceph]# for i in {a..c}; do ceph-deploy osd create ceph-$i:sdc:/dev/sdb1; done
         [[email protected] ceph]# for i in {a..c}; do ceph-deploy osd create ceph-$i:sdc:/dev/sdb1; done

                 如果在本例中使用上面命令,則會報以下錯誤,如圖

                 圖片.png

        經過上述步驟,我們的 Ceph 算是安裝完成,下面,我們簡單的說下 Ceph 應用,更詳細的應用後期章節再進行解析。

六、使用 RBD(RADOS 塊裝置)

        1、首先,我們瞭解一下 Ceph 的儲存方式,Ceph 共支援三種儲存方式:

           a、塊儲存,這也是使用最多的儲存方式。

           b、CephFS:這種儲存方式瞭解就行,不建議在生產環境中使用,因為還不夠成熟。

           c、物件儲存:該儲存方式也是瞭解就行,現階段還不夠成熟穩定。僅支援 OpenStack Swift 和 Amazon S3 兩種介面,後期有需要,我們再講解。

        2、其次,我們瞭解一下什麼是 ceph 塊儲存:      

           a、Ceph 塊裝置也叫做 RADOS 裝置,即:RADOS block device(RBD)。

           b、RBD 驅動已經很好的整合在 Linux 核心中。

           c、RBD 提供了企業功能,如快照、COW克隆等等。

           d、RBD 還支援記憶體快取,從而能夠大大提高效能。

           e、Linux 核心可以直接房訪問 Ceph 塊儲存。

           f、KVM 可用藉助於 librdb 訪問。

        3、使用 RBD

           ①、檢視儲存池             

    [[email protected] ceph]# ceph osd lspools

             一般來說,都會有一個預設的 0 號儲存池,但是呢,在小弟在這裡檢視的時候,卻沒有預設的 0 號儲存池,不知道是不是官方已將其移除,還需後續繼續觀察。

           ②、建立 ceph OSD 儲存池             

    [[email protected] ~]# ceph osd pool create cephrbd 512

              如圖:

              圖片.png

              這裡,cephrbd 是儲存池的名稱。             

                   ● 通常在建立pool之前,需要覆蓋預設的 pg_num,官方推薦:

                   若少於5個OSD, 設定 pg_num 為128。

                   5~10個OSD,設定 pg_num 為512。

                   10~50個OSD,設定 pg_num 為4096。

                   超過50個OSD,可以參考 pgcalc 計算。

           ③、建立名為demi-img的映象,大小為10G              

    [[email protected] ~]# rbd create cephrbd/demo-img --image-feature layering --size 10G

              cephrbd/demo-img:表示在儲存池 cephrbd 中建立 demo-img 的映象

              --image-feature:該選項指定使用特性,不用全部開啟。我們的需求僅需要使用快照、分層儲存等特性,開啟layering即可

           ④、檢視 cephrbd 儲存池中是否有映象存在             

       [[email protected] ~]# rbd ls cephrbd

              如圖:

                圖片.png

           ⑤、檢視映象資訊         

       [[email protected] ~]# rbd info cephrbd/demo-img

              如圖

              圖片.png

        關於 Ceph 更多的應用,小弟會在後期文章中進行細述,今天,我們就到此結束。

七、Ceph 部署總結

       Ceph 的部署,總體來說還是比較簡單,雖然說,看似簡單,但是越簡單的東西,我們更加需要重視,因為我們認為越簡單的地方,才是我們在日常運維中越容易踩坑的地方。就比如,上面部署過程中,遇到的幾個問題,就連官方文件中都沒有體現出來,導致小弟在填坑時花了不少心思,但好歹還是找出問題所在了。