Ceph 分佈式存儲使用指南

Ceph 分佈式存儲使用指南

去年寫的東西,今年拿出來分享一下。

*注意:本文大部分參考官方文檔https://docs.ceph.com/docs/octopus/,因爲網絡原因,部署命令和官網有些許出入,更符合現在條件一些,且官方已經拋棄ceph-deploy 部署工具改用cephadm,不要傻傻看別人的老古董啦。

1. 瞭解

Ceph 是一個統一的分佈式存儲系統,設計初衷是提供較好的性能、可靠性和可擴展性。

1.1 特點
  • 高性能
    a. 摒棄了傳統的集中式存儲元數據尋址的方案,採用 CRUSH 算法,數據分佈均衡,並行度高。
    b. 考慮了容災域的隔離,能夠實現各類負載的副本放置規則,例如跨機房、機架感知等。
    c. 能夠支持上千個存儲節點的規模,支持 TB 到 PB 級的數據。


  • 高可用性
    a. 副本數可以靈活控制。
    b. 支持故障域分隔,數據強一致性。
    c. 多種故障場景自動進行修復自愈。
    d. 沒有單點故障,自動管理。



  • 高可擴展性
    a. 去中心化。
    b. 擴展靈活。
    c. 隨着節點增加而線性增長。


  • 特性豐富
    a. 支持三種存儲接口:塊存儲、文件存儲、對象存儲。
    b. 支持自定義接口,支持多種語言驅動。

2. 架構

2.1 Ceph 核心組件及概念介紹
  • Monitor
    一個 Ceph 集羣需要多個 Monitor 組成的小集羣,它們通過 Paxos 同步數據,用來保存 OSD 的元數據。
  • OSD
    OSD 全稱 Object Storage Device,也就是負責響應客戶端請求返回具體數據的進程。一個 Ceph 集羣一般都有很多個 OSD。
  • MDS
    MDS 全稱 Ceph Metadata Server,是 CephFS 服務依賴的元數據服務。
  • Object
    Ceph 最底層的存儲單元是 Object 對象,每個 Object 包含元數據和原始數據。
  • PG
    PG 全稱 Placement Grouops,是一個邏輯的概念,一個 PG 包含多個 OSD。引入 PG 這一層其實是爲了更好的分配數據和定位數據。
  • RADOS
    RADOS 全稱 Reliable Autonomic Distributed Object Store,是 Ceph 集羣的精華,用戶實現數據分配、Failover 等集羣操作。
  • Libradio
    Librados 是 Rados 提供庫,因爲 RADOS 是協議很難直接訪問,因此上層的 RBD、RGW 和 CephFS 都是通過 librados 訪問的,目前提供 PHP、Ruby、Java、Python、C 和 C++ 支持。
  • CRUSH
    CRUSH 是 Ceph 使用的數據分佈算法,類似一致性哈希,讓數據分配到預期的地方。
  • RBD
    RBD 全稱 RADOS block device,是 Ceph 對外提供的塊設備服務。
  • RGW
    RGW 全稱 RADOS gateway,是 Ceph 對外提供的對象存儲服務,接口與 S3 和 Swift 兼容。
  • CephFS
    CephFS 全稱 Ceph File System,是 Ceph 對外提供的文件系統服務。

3. 集羣部署

3.1 部署工具

網上隨便搜一個集羣部署教程都是教你用ceph-deploy進行部署的,而官網上用紅色的方框標註了一段話ceph-deploy is no longer actively maintained. It is not tested on versions of Ceph newer than Nautilus. It does not support RHEL8, CentOS 8, or newer operating systems. ceph最新的穩定版已經到了octopus,所以ceph-deploy就不再適用。

貼心的是,在octopus版本,官方爲我們提供了一個全新的工具:cephadm,通過它就可以很簡單的部署一個集羣,下面讓我們開始吧

3.2 環境準備

本次部署我用了三臺Ubuntu 18.04 虛擬機,因爲中間2G內存部署遇到過內存不足的情況,所以推薦配置爲4核8G。每臺虛擬機擁有兩塊20G硬盤,一塊作爲系統盤,一塊用來作爲ceph的硬盤來使用。之後三臺機器全部安裝docker。然後我修改了主機名,因爲沒有dns,所以在三臺設備hosts中指定了:

192.168.3.4 ceph-master
192.168.3.5 ceph-node1
192.168.3.6 ceph-node2
3.3 基礎環境安裝

下載cephadm,並給予執行權限,檢查一下可用性。

$ curl  --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm
$ chmod u+x ./cephadm
$ ./cephadm -h

沒有問題的話,下一步添加ceph的官方軟件源。

$ ./cephadm add-repo --release octopus

這裏要注意了,官方源的服務器在國外,用這個源安裝可能需要一晚上,所以我們要修改成國內的鏡像源

$ vim /etc/apt/sources.list.d/ceph.list
原來是:deb https://download.ceph.com/debian-octopus/ bionic main
修改成:deb https://mirrors.aliyun.com/ceph/debian-octopus/ bionic main
保存退出,執行:apt update

不出意外此時會報錯,原因是這個鏡像源的key沒有經過認證,這時候我們手動添加一下,然後重新update

$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys *把key寫在這
$ rm -f /etc/apt/trusted.gpg.d/ceph.release.gpg #幹掉這個空白的密鑰
$ apt update    

然後安裝cephadm到系統,其實就是調用apt進行了一個安裝

$ ./cephadm install
$ which cephadm  #檢查安裝結果
3.4 開始部署集羣

首先創建一個ceph的配置文件存放地點,這裏要提示的一點就是以前的版本很多配置都需要寫到配置文件裏,現在這個版本配置文件只有很少的東西,全是用命令進行配置。

$ mkdir -p /etc/ceph

官網上的指導到這裏就可以進行部署了,不過我們這裏還需要進行一步操作:拉取docker鏡像。拉取鏡像的過程其實是在這個部署流程裏的,可是由於網絡原因,所以我們需要手動從國內源拉取。還要注意的是,你的docker鏡像加速器可能並不好用,原因就不在這說了,我們要這樣拉取:

$ docker pull dockerhub.azk8s.cn/ceph/ceph:v15

拉取完成後就開始進行集羣的正式部署了

$ cephadm bootstrap --mon-ip *<mon-ip>*  #<mon-ip>是你的master節點IP地址 例如:
# ./cephadm bootstrap --mon-ip 192.168.3.6

等待結束後,會給你一個用戶名和密碼,訪問一下這個地址,發現已經部署好了。

3.5 添加節點

既然是分佈式存儲,只有一臺master節點是萬萬不能的,我們需要添加節點

添加節點很簡單,先用部署過程中生成的key配置免密登陸:

$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-node1
$ ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-node2

然後添加節點

$ ceph orch host add ceph-node1
$ ceph orch host add ceph-node2

至此我們的集羣就部署完成了,下一節會說OSD的相關東西。

4. OSD的創建管理與使用

4.1 OSD是什麼

ceph-osd 是 Ceph 分佈式對象存儲系統的對象存儲守護進程。它負責把對象存儲到本地文件系統,並使之通過網絡可訪問。說白了就是通過這個進程可以讓你節點上的硬盤可以在ceph裏用。再說白了,添加OSD就是把你的硬盤添加到ceph集羣。

4.2 查看有哪些可用的osd

使用這條命令,就可以查看,True的就是可以用來添加的。官網對OSD的要求是:

  • 設備必須沒有分區。
  • 設備不得具有任何LVM狀態。
  • 不得安裝設備。
  • 該設備不得包含文件系統。
  • 該設備不得包含Ceph BlueStore OSD。
  • 設備必須大於5 GB。
root@ceph-master:~# ceph orch device ls
HOST         PATH      TYPE   SIZE  DEVICE  AVAIL  REJECT REASONS
ceph-master  /dev/vda  hdd   20.0G          False  Insufficient space (<5GB) on vgs, LVM detected, locked
ceph-master  /dev/vdb  hdd   20.0G          False  Insufficient space (<5GB) on vgs, LVM detected, locked
ceph-node1   /dev/vda  hdd   20.0G          False  locked, LVM detected, Insufficient space (<5GB) on vgs
ceph-node1   /dev/vdb  hdd   20.0G          False  locked, LVM detected, Insufficient space (<5GB) on vgs
ceph-node2   /dev/vdb  hdd   20.0G          True
ceph-node2   /dev/vda  hdd   20.0G          False  Insufficient space (<5GB) on vgs, LVM detected, locked
4.3 添加osd

添加OSD官方給了三個方法,但是我這裏只前兩種,原因是這兩種比較簡單而且有效。需要注意的是,添加了OSD之後子節點會啓動一個docker的OSD進程。所以,這兒又有個坑,你要添加osd的子節點每臺都要從官方拉取docker鏡像,速度可想而知,所以在添加之前在每臺節點上都用國內鏡像源拉取下來。

第一種:添加全部可用存儲設備,這個操作可以一鍵添加你所有節點的可用存儲,簡單有效:

$ ceph orch apply osd --all-available-devices  

第二種:單個添加,指定要添加的設備,在有些特殊情況下,比如上邊所示的false的vdb硬盤,是我之前對硬盤進行了一些操作,導致ceph識別爲不可用,但是我知道這塊盤是沒有問題的,就可以手動添加進去:

$ ceph orch daemon add osd *<host>*:*<device-path>*
# example:
$ ceph orch daemon add osd ceph-node1:/dev/vdb
4.4 刪除osd

osd的添加很容易,但是刪除就沒那麼簡單了因爲添加過程會有一系列的創建過程自動執行,而刪除每一條都需要我們手動幹掉,以下是刪除步驟:

1.刪除 CRUSH 圖的對應 OSD 條目,它就不再接收數據了。

   $ ceph osd crush remove {name}

2.刪除 OSD 認證密鑰:

   $ ceph auth del osd.{osd-num}

ceph-{osd-num} 路徑裏的 ceph 值是 $cluster-$id ,如果集羣名字不是 ceph ,這裏要更改。

3.停止正在運行的osd

   $ ceph osd stop {osd-num}

4.刪除 OSD 。

   $ ceph osd rm {osd-num}
   #example
   $ ceph osd rm 1

5.Pool的創建,管理與使用

在創建pool之前,要了解兩個概念 Pool和PG:

Pool是一個抽象的存儲池,它是PG之上的一層邏輯
它規定了數據冗餘的類型以及對應的副本分佈策略。目前實現了兩種pool類型:replicated類型和Erasure Code類型。
關係說明:
(1) 一個pool由多個PG構成,一個PG只能屬於一個POOL
(2) 同一個Pool中的PG具有相同的類型,比如,如Pool爲副本類型,則Pool中所有的PG都是多副本的

簡單來說,pool就是ceph存儲數據時的邏輯分區
PG是OSD之上的一層邏輯,可視其爲一個邏輯概念。從名字可理解PG是一個放置策略組,它是對象的集合,該集合裏的所有對象都具有相同的放置策略:對象的副本都分佈在相同的OSD列表上。
關係說明:
(1) PG有主從之分,對於多副本而言,一個PG的主從副本分佈在不同的OSD上;
(2) 一個對象只能屬於一個PG,一個PG包含很多個對象
(3) 一個PG對應於一個OSD列表,PG的所有對象對存放在對應的OSD列表上
這裏的對象是rados object,而非用戶對象
5.1 Pool創建

理解了Pool和PG的概念以後(可能有點不好理解,但是理不理解都行,不耽誤使用),我們就可以進行創建了:

創建pool有很多選項,我只挑目前我用得到的來說:

$ ceph osd pool create test_data
$ ceph osd pool create test_metadata 32 32

這樣就創建了兩個pool,如果你願意的話呢,後邊可以跟上兩個數字,兩個數字就代表的是PG的數量和PGP的數量了,默認是32,一般不需要修改,根據我有限的條件下測試,不影響性能。

5.2 刪除pool

刪除pool也是比較坑的,默認規則不讓刪除,網上查的都是寫配置文件裏,實測沒用。

首先要打開允許刪除pool的開關,然後試着刪除發現不讓刪,要重複兩遍pool的名字再寫保證書再刪除就可以了,刪除完以後記得把允許刪除關閉,防止誤刪除後數據丟失。

root@ceph-master:~# ceph tell mon.\* injectargs '--mon-allow-pool-delete=true'
mon.ceph-master: mon_allow_pool_delete = 'true'
mon.ceph-master: {}
mon.ceph-node1: mon_allow_pool_delete = 'true'
mon.ceph-node1: {}
mon.ceph-node2: mon_allow_pool_delete = 'true'
mon.ceph-node2: {}

root@ceph-master:~# ceph osd pool rm test_data
Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool speedtest.  If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it.

root@ceph-master:~# ceph osd pool rm test_data test_data --yes-i-really-really-mean-it
pool 'speedtest' removed
root@ceph-master:~# ceph tell mon.\* injectargs '--mon-allow-pool-delete=false'
5.3 性能測試
$ rados bench -p $poolname 60  write  [ --no-cleanup ]  #測試寫性能,不刪除寫入的數據用來測試讀取性能
$ rados bench -p $poolname 60  [ seq | rand ]  #測試讀取性能
$ rados -p $poolname cleanup #清理測試寫性能時寫入的數據
5.4 pool調優

這個地方差點把我折騰死,研究了一天半,因爲速度始終達不到期望值。後來我發現是兩個原因導致的:

  1. 硬盤自身原因,ceph對寫入的硬盤是沒有操作系統緩存的,開始我是用dd測試硬盤速度的時候沒關緩存,得到了200m/s的驚人寫入速度,後來關掉了緩存測了一下,實際速度差不了多少,不過這個地方還需要後研究。

  2. 副本數設置,默認是3份副本,實際上會佔用大量的寫入,這也是ceph的特性,所以目前想達到原來的速度只有一個辦法,那就是如下所示設置副本數爲1,也就是沒有備份,聽起來相當不安全但是確實速度提升到了硬盤速度
$ ceph osd pool set $poolname size 1 設置副本數量
$ ceph osd pool set $poolname min_size 1 設置副本數量最小值,低於這個值不寫入

到了這裏我們就完成了基本的基礎環境部署,接下來就可以按照自己的需求進行使用了。

6.CEPHFS的創建、管理與使用

Ceph文件系統或CephFS是在Ceph的分佈式對象存儲RADOS之上構建的POSIX兼容文件系統

6.1 創建cephfs

創建池後,可以使用以下命令啓用文件系統:fs new

$ ceph fs new <fs_name> <metadata> <data>

例如創建一個名字叫fstest的fs,元數據用fstest_metadata,數據存在fstest_data:

$ ceph fs new fstest fstest_metadata fstest_data
$ ceph fs ls
name: fstest, metadata pool: fstest_metadata, data pools: [fstest_data ]

這樣我們的fs就創建完成了,可能有的做到這ls出來的結果跟我的不一樣,那你就是沒有啓動MDS,你可以多等一會,只要docker鏡像拉下來在本地,會自己啓動的。

$ ceph orch apply mds <fs_name>

如果在本地存在ceph docker鏡像的情況下,一段時間後仍未啓動MDS,使用以上命令手動啓動MDS,可以通過在集羣各服務器上執行docker ps |grep mds查看MDS容器是否運行。
這裏又引申出一個概念MDS

6.2 ceph-mds

ceph-mds 是 Ceph 分佈式文件系統的元數據服務器守護進程。一或多個 ceph-mds 例程協作着管理文件系統的命名空間、協調到共享 OSD 集羣的訪問。一張圖看懂mds是怎麼回事

../_images/cephfs-architecture.svg

6.3 身份驗證

要僅授予rw訪問指定目錄的權限,我們在使用以下語法爲客戶端創建密鑰以及控制權限。

$ ceph fs authorize *file_system_name* client.*client_name* /*specified_directory* rw

例如:

root@ceph-master:~# ceph fs authorize fstest client.node2 / rw
[client.node2]
    key = AQDwqoZeSVKiCBAASIdy3DAYnCXKwoTTnuZASA==
6.4 掛載cephfs

創建完成後就需要進行掛載了,掛載有兩種方式,一種是用Linux自帶的mount進行掛載,另一種是用fuse提供的掛載工具,官方說mount掛載性能高,fuse比較簡單,所以我這裏寫用mount掛載

mount默認是不支持ceph的,所以這裏需要安裝ceph插件

$ apt install ceph-common -y  #安裝
$ which mount.ceph            #檢查

安裝完成後就可以用你的密鑰對和用戶在節點進行掛載了

$ mount -t ceph 192.168.3.6:6789:/ /mnt/fstest -o name=node2,secret=AQDwqoZeSVKiCBAASIdy3DAYnCXKwoTTnuZASA==

掛載完成測試

6.5 爲fs增加和刪除pool
$ ceph fs add_data_pool <file system name> <pool name/id>
$ ceph fs rm_data_pool <file system name> <pool name/id>
6.6 刪除fs

先去節點上關閉所有mds再刪除,待補充

7. 塊設備的創建、管理與使用

7.1 創建塊存儲Pool

先創建一個Pool,再轉換成塊存儲Pool

$ ceph osd pool create <pool-name>
$ rbd pool init <pool-name>
7.2 創建塊設備映像

必須先在]創建映像,然後才能將塊設備添加到節點。要創建塊設備映像,請執行以下操作:

$ rbd create --size {megabytes} {pool-name}/{image-name}

例如,要創建一個名爲10GB的映像ubuntu.qcow2,該映像將信息存儲在images Pool中,請執行以下操作:

$ rbd create --size 1024 ubuntu.qcow2/images
7.3 創建塊存儲Pool用戶
ceph auth get-or-create client.libvirt mon 'profile rbd' osd 'profile rbd pool=images'
7.4 聯動kvm
    <disk type='network' device='disk'>
      <driver name='qemu'/>
      <auth username='libvirt'>
        <secret type='ceph' uuid='186367af-91ba-4de6-a2d0-233dbfa722c4'/>
      </auth>
      <source protocol='rbd' name='images_data/ubuntu.qcow2'>
        <host name='192.168.3.4' port='6789'/>
      </source>
      <target dev='vdc' bus='virtio'/>
      <address type='pci' domain='000' bus='0' slot='a' function=''/>
    </disk>

8 總結

花了五天時間學習,踩坑,終於完成了。我做了一個測試,創建了一個集羣,用塊存儲給集羣節點當第二塊盤,這塊盤又當成了OSD創建了cephfs掛載在master上,相當於套了個娃,但是也證明這個東西是沒啥問題的,不過光在性能上就花費了兩天時間,高性能還是要大集羣才能發揮威力。

遇到的坑和解決辦法

這些解決的方法在教程裏都已經寫得很清楚了,只是單獨列出來注意一下。

  1. 外網速度慢的問題:key的問題,docker pull慢的問題
  2. 添加OSD慢的問題
  3. kernel掛載出錯的問題
  4. pool刪除的問題ceph tell mon.\* injectargs '--mon-allow-pool-delete=true'
  5. 速度慢的問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章