天天看點

Ceph叢集概念以及部署

一、Ceph基礎:

  1、基礎概念:

    ceph 是一個開源的分布式存儲,同時支援對象存儲、塊裝置、檔案系統

    ceph是一個對象(object)式存儲系統,它把每一個待管理的資料流(檔案等資料)切分偉一到多個固定大小(預設4M)的對象資料,并以其為原子單元(原子是構成元素的最小單元)完成資料的讀寫

    對象資料的底層存儲服務是由多個存儲主機(host)組成的存儲叢集,該叢集也被稱之為RADOS(reliable automatic distributed object store)存儲叢集,即可靠的、自動化的、分布式的對象存儲系統

    librados是RADOS存儲叢集的API,支援C/C++/JAVA/Python/ruby/go/php等多種程式設計語言用戶端

  2、ceph的設計思想:

    ceph的設計宗旨在實作以下目标:

      每一元件皆可擴充

      無單點故障

      基于軟體(而非專業裝置)并且開源(無供應商)

      在現有的廉價硬體上運作

      盡可能自動管理,減少使用者幹預

  3、ceph版本:

    x.0.z - 開發版

    x.1.z - 候選版

    x.2.z - 穩定、修正版

  4、ceph叢集角色定義:

    參考:https://docs.ceph.com/en/latest/start/intro/ 和 http://docs.ceph.org.cn/start/intro/

  

Ceph叢集概念以及部署

   5、ceph叢集的組成部分:

    若幹的Ceph OSD(對象存儲守護程序)

    至少需要一個Ceph Monitor 螢幕 (數量最好為奇數1,3,5,7........)

    兩個或以上的Ceph管理器 managers,運作Ceph檔案系統用戶端時還需要高可用的Ceph Metadata Server(檔案系統中繼資料伺服器)

    RADOS Cluster:由多台host存儲伺服器組成的ceph叢集

    OSD(Object Storage Daemon):每台存儲伺服器的磁盤組成的存儲空間

    Mon(Monitor):Ceph的螢幕,維護OSD和PG的叢集狀态,一個Ceph叢集至少有一個Mon節點,可以是一三五七等這樣的奇數個

    Mgr(Manager):負責跟蹤運作時名額和Ceph叢集的目前狀态,包括存儲使用率,目前性能名額和系統負載等

  6、Ceph叢集術語詳細介紹:

    6.1 Monitor(ceph-mon)ceph螢幕:

      軟體包名&程序名:ceph-mon  

      在一個主機上運作的一個守護程序,用于維護叢集狀态映射(maintains maps of the cluster state),比如ceph 叢集中有多少存儲池、每個存儲池有多少PG 以及存儲池和PG的映射關系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,這些映射是Ceph 守護程式互相協調所需的關鍵群集狀态,此外螢幕還負責管理守護程式和用戶端之間的身份驗證(認證使用cephX 協定)。通常至少需要三個螢幕才能實作備援和高可用性。

    6.2 Managers

      軟體包&程序名:ceph-mgr    

      在一個主機上運作的一個守護程序,Ceph Manager 守護程式(ceph-mgr)負責跟蹤運作時名額和Ceph 叢集的目前狀态,包括存儲使用率,目前性能名額和系統負載。Ceph Manager 守護程式還托管基于python 的子產品來管理和公開Ceph 叢集資訊,包括基于Web的Ceph 儀表闆和REST API。高可用性通常至少需要兩個管理器。

    6.3 Ceph OSDs(對象存儲守護程式ceph-osd)

      軟體包名&程序名:ceph-osd

      提供存儲資料,作業系統上的一個磁盤就是一個OSD 守護程式,OSD 用于處理ceph叢集資料複制,恢複,重新平衡,并通過檢查其他Ceph OSD 守護程式的心跳來向Ceph螢幕和管理器提供一些監視資訊。通常至少需要3 個Ceph OSD 才能實作備援和高可用性。

    6.4 MDS(ceph中繼資料伺服器ceph-mds)

      軟體包名&程序名:ceph-mds

      代表ceph檔案系統(NFS/CIFS)存儲中繼資料(即Ceph塊裝置和Ceph對象存儲不使用MDS)

    6.5 Ceph的用戶端管理工具

      例如:rados、ceph、rbd  推薦使用部署專用節點對ceph進行管理、更新和後期維護,友善權限管理,避免一些不必要的誤操作發生

    6.6 Ceph的其他相關術語請參考:http://docs.ceph.org.cn/glossary/

  7、Ceph邏輯組織架構:

    7.1 Pool:存儲池 ,分區、存儲池的大小取決于底層的存儲空間

    7.2 PG(Placement group):一個pool内部可以有多個PG存在,pool和PG都是抽象的邏輯概念,一個pool中有多少個PG可以通過公式計算

    7.3 OSD(Object Storage Daemon,對象儲存設備):每一塊磁盤都是一個osd,一個主機由一個或多個osd組成

   8、向Ceph寫入資料的大緻流程:

    Ceph叢集部署好了之後,要先建立存儲池才能向ceph寫入資料,檔案在向ceph儲存之前要先進行一緻性hash計算,計算後會把檔案儲存在某個對應的PG中,此檔案一定屬于某個pool的一個PG,再通過PG儲存在OSD上。資料對象在寫到主OSD之後再同步到從OSD以實作資料的高可用

Ceph叢集概念以及部署

   根據上圖總結一下存儲檔案到Ceph的流程:

    1、計算檔案到對象的映射:假設file為用戶端要讀寫的檔案,得到oid(object id)= ino + ono (其中ino:inode number ,file的中繼資料序列号 ,file的唯一ID;ono:object number,file切分産生的某個object的序号,預設以4M切分一個塊的大小)

    2、通過hash算法計算出檔案對應的pool中的PG:通過一緻性hash計算Object到PG,Object-》PG映射hash(oid)&mask-》pgid

    3、通過CRUSH把對象映射到PG中的OSD:通過CRUSH算法計算PG到OSD,PG——》OSD映射:[CRUSH(pgid)——》(osd1,osd2,osd3)]

    4、PG中的主OSD将對象寫入到硬碟

    5、主OSD将資料同步給備份OSD即從OSD,并等待備份OSD傳回确認

    6、主OSD将寫入完成傳回給用戶端

  9、Ceph中繼資料儲存方式:

    9.1 xattrs(擴充屬性):是将中繼資料儲存在對象對應檔案的擴充屬性中并儲存到系統盤上,這要求支援對象存儲的本地檔案系統(一般是XFS)支援擴充屬性

    9.2 omap(object map:對象映射):是将中繼資料儲存在本地檔案系統之外的獨立key-value存儲系統中,在使用filestore時是leveldb;在使用bluestore時是rocksdb

    9.3 filestore與leveldb

      Ceph早期基于filestore使用google的leveldb儲存對象中繼資料。Leveldb是一個持久化存儲的KV系統,與Redis不同的是,leveldb不會像Redis一樣将資料放在記憶體中進而占據打兩的記憶體空間,而是将大部分資料存儲到磁盤上,但是需要把磁盤格式化為檔案系統(XFS)

      Filestore将資料儲存到與Posix相容的檔案系統(Btrfs,XFS,Ext4),缺點:性能、對象屬性與磁盤本地的檔案系統屬性比對存在限制

Ceph叢集概念以及部署

    9.4 bluestore與rocksdb

      由于levelDB依賴磁盤檔案系統的支援,後期facebook對levelDB進行改進為RocksDB(https://github.com/facebook/rocksdb)。RocksDB将對象資料的中繼資料儲存在RocksDB,在目前OSD中劃分出一部分空間,格式化為BlueFS檔案系統用于儲存RocksDB中的中繼資料資訊(稱為BlueStore)并實作中繼資料的高可用,BlueStore的最大優點就是建構在裸磁盤裝置之上,并對諸如OSD等新的儲存設備做了很多優化工作

      RocksDB通過中間層BlueRocksDB通路檔案系統接口,這個檔案系統與傳統的Linux檔案系統(例如Ext4,XFS)不同,它不是VFS下面的通用檔案系統,而是一個使用者态的邏輯。BlueFS通過函數接口(API,非POSIX)的方式為BlueRocksDB提供類似檔案系統的能力

Ceph叢集概念以及部署

      以上各子產品的作用:

        Allocator:負責裸裝置的空間管理配置設定

        RocksDB:基于leveldb的開發的一款KV資料庫,BlueStore将中繼資料全部存放至RocksDB中,這些中繼資料包括存儲預寫日志、資料對象中繼資料、Ceph的omap資料資訊、以及配置設定器的中繼資料

        BlueRocksEnv:這是RocksDB與BlueFS的互動接口,RocksDB提供了檔案操作的接口EnvWrapper(Env封裝器),可以通過繼承實作該接口來定義底層的讀寫操作,BlueRocksEnv就是繼承EnvWrapper實作對BlueFS的讀寫

        BlueFS:BlueFS是BlueStore針對RocksDB開發的輕量級檔案系統,用于存放RocksDB産生的.sst和.log檔案

        BlockDevice:BlueStore抛棄了傳統的ext4、xfs檔案系統,使用直接管理裸盤的方式;BlueStore支援同時使用多種不同類型的裝置,在邏輯上BlueStore将存儲空間劃分為三層:慢速(Slow)空間,高速(DB)空間,超高速(WAL)空間,不同空間可以指定不同的裝置類型,當然也可使用同一塊裝置

      BlueStore的優勢:BlueStore的設計考慮了FileStore中存在的一些硬傷,抛棄了傳統的檔案系統直接管理裸裝置,縮短了IO路徑,同時采用ROW的方式,避免了日志雙寫的問題,在寫入性能上有了極大的提高

  10、CRUSH算法簡介:

    CRUSH:Controllers replication under scalable hashing:可控的、可複制的、可伸縮的一緻性hash算法,CRUSH是一種分布式算法,類似于一緻性hash算法,用于為RADOS存儲叢集控制資料的配置設定

    Ceph使用CRUSH算法來存放和管理資料,它是Ceph的智能資料分發機制。Ceph使用CRUSH算法來準确計算資料應該被儲存到哪裡,以及應該從哪裡讀取。和儲存中繼資料不同的是,CRUSH按需計算出中繼資料,是以它就消除了對中心式伺服器/網關的需求,它使得Ceph用戶端能夠計算出中繼資料,該過程也稱為CRUSH查找,然後和OSD直接通信

    這裡就會有一個問題,為什麼要這麼設計CRUSH算法?如果是把對象直接映射到OSD之上會導緻對象與OSD的對應關系過于緊密和耦合,當OSD由于故障發生變更時将會對整個Ceph叢集産生影響。于是Ceph将一個對象映射到RADOS叢集的時候分兩步走:首先使用一緻性hash算法将對象名稱映射到PG ,然後将PG ID基于CRUSH算法映射到OSD即可查到對象。

    以上兩個過程都是以”實時計算“的方式完成,而沒有使用傳統的查詢資料與塊裝置的對應表的方式,這樣有效的避免了元件的”中心化“問題,也解決了查詢性能和備援問題,使得Ceph叢集擴充不再受查詢的性能限制

二、Ceph叢集部署

  1、環境準備

    系統版本:ubuntu-18.04-lts  

    記憶體: 3G

    CPU:1C

    磁盤:每台主機挂載5塊資料盤

    ip        hostname      role

    192.168.199.22  ubuntu-node02   ceph-deploy、ceph-mgr、ceph-mon、ceph-node

    192.168.199.23  ubuntu-node03   ceph-node

    192.168.199.24  ubuntu-node04   ceph-node

   2、配置國内ubuntu源

    vim /etc/apt/sources.list

# 預設注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse      

  3、配置時間同步:

    apt install ntpdate -y

    ntpdate ntp1.aliyun.com

  4、配置本地hosts檔案

    vim /etc/hosts

    192.168.199.22  ubuntu-node02
    192.168.199.23  ubuntu-node03
    192.168.199.24  ubuntu-node04
      

  5、導入ceph的校驗碼,添加國内的ceph源

    wget -q -O- "https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc" | sudo apt-key add -

    sudo echo "deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-pacific bionic main" >> /etc/apt/sources.list

  6、配置雙網卡:

    ens33:橋接

    ens38:nat

    注:另外兩台機器隻需将IP修改一下就可以了

    vim /etc/netplan/01-netcfg.yaml 

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      dhcp6: no
      addresses: [ 192.168.199.22/24 ]
      gateway4: 192.168.199.1
      nameservers:
          search: [ ubuntu-node02 ]
          addresses:
              - "192.168.199.1"
    ens38:
      dhcp4: no
      dhcp6: no
      addresses: [ 172.16.1.22/24 ]
      

  7、建立ceph使用者并配置可免密登入其他節點

    groupadd -r -g 2022 ceph && useradd -r -m -s /bin/bash -u 2022 -g 2022 ceph && echo ceph:123456 | chpasswd 

    ssh-keygen -t rsa

    ssh-copy-id [email protected]

    ssh-copy-id [email protected]

    ssh-copy-id [email protected]

    允許ceph使用者執行sudo指令:  echo "ceph ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Ceph叢集概念以及部署

    8、安裝ceph部署工具ceph-deploy:

    apt-cache madison ceph-deploy     # 列出ceph-deploy的版本資訊

    apt install ceph-deploy -y

  9、初始化mon節點:

    切換到ceph使用者的家目錄建立ceph叢集初始化目錄:

      su - ceph  

      mkdir ceph-cluster 

      各節點安裝python2并建立軟連結

        apt install python2.7 -y 

        ln -sv /usr/bin/python2.7 /usr/bin/python2

      ceph-deploy new --cluster-network 172.16.1.0/24 --public-network 192.168.199.0/24 ubuntu-node02

      注:

        --cluster-network:指定ceph叢集内部通信的網段

        --public-network:指定外部通路的網段位址

          

Ceph叢集概念以及部署

        

Ceph叢集概念以及部署

  10、初始化node節點:

    注意:確定ceph使用者的家目錄在/var/lib/ceph并且将原來/home/ceph/目錄下面的ceph-cluster目錄下面的檔案拷貝到/var/lib/ceph/ceph-cluster目錄下

    ceph-deploy install --no-adjust-repos --nogpgcheck ubuntu-node02 ubuntu-node03 ubuntu-node04     # 根據情況輸入yes和主機密碼

  11、配置mon節點并同步生成秘鑰:

     apt install ceph-mon -y

     ceph-deploy mon create-initial     # 初始化mon節點

    驗證mon節點:

    

Ceph叢集概念以及部署

    分發admin秘鑰:

      apt-get install ceph-common -y 

      ceph-deploy admin ubuntu-node02

  12、ceph節點驗證秘鑰:

Ceph叢集概念以及部署

    修改/etc/ceph/ceph.client.admin.keyring檔案的屬主:

      sudo chown -R ceph. /etc/ceph/

   13、配置manager節點:

    sudo apt install ceph-mgr -y     # 安裝ceph-mgr

    ceph-deploy mgr create ubuntu-node02    # 建立管理節點

    驗證mgr節點:

      

Ceph叢集概念以及部署

  14、使用ceph-deploy管理ceph叢集:

Ceph叢集概念以及部署

  15、驗證ceph指令:

    注意:因為重新推送了admin秘鑰,是以/etc/ceph/ceph.client.admin.keyring檔案的屬主改變了 需要重新修改屬主

  16、叢集調整:

Ceph叢集概念以及部署

   17、準備OSD節點:

    初始化環境:

      ceph-deploy install --release pacific ubuntu-node02

      ceph-deploy install --release pacific ubuntu-node03

      ceph-deploy install --release pacific ubuntu-node04

    列出指定節點的磁盤資訊:

      ceph-deploy disk list ubuntu-node02

    使用 ceph-deploy disk zap 擦除各 ceph node 的 ceph 資料磁盤:

ceph-deploy disk zap ubuntu-node02 /dev/sdb
ceph-deploy disk zap ubuntu-node02 /dev/sdc
ceph-deploy disk zap ubuntu-node02 /dev/sdd
ceph-deploy disk zap ubuntu-node02 /dev/sde
ceph-deploy disk zap ubuntu-node02 /dev/sdf
ceph-deploy disk zap ubuntu-node03 /dev/sdb
ceph-deploy disk zap ubuntu-node03 /dev/sdc
ceph-deploy disk zap ubuntu-node03 /dev/sdd
ceph-deploy disk zap ubuntu-node03 /dev/sde
ceph-deploy disk zap ubuntu-node03 /dev/sdf
ceph-deploy disk zap ubuntu-node04 /dev/sdf
ceph-deploy disk zap ubuntu-node04 /dev/sde
ceph-deploy disk zap ubuntu-node04 /dev/sdd
ceph-deploy disk zap ubuntu-node04 /dev/sdc
ceph-deploy disk zap ubuntu-node04 /dev/sdb
      

  18、添加OSD:

ceph-deploy osd create ubuntu-node02 --data /dev/sdb 
ceph-deploy osd create ubuntu-node02 --data /dev/sdc
ceph-deploy osd create ubuntu-node02 --data /dev/sde
ceph-deploy osd create ubuntu-node02 --data /dev/sdd
ceph-deploy osd create ubuntu-node02 --data /dev/sdf
ceph-deploy osd create ubuntu-node03 --data /dev/sdb
ceph-deploy osd create ubuntu-node03 --data /dev/sdc
ceph-deploy osd create ubuntu-node03 --data /dev/sdd
ceph-deploy osd create ubuntu-node03 --data /dev/sde
ceph-deploy osd create ubuntu-node03 --data /dev/sdf
ceph-deploy osd create ubuntu-node04 --data /dev/sdb
ceph-deploy osd create ubuntu-node04 --data /dev/sdc
ceph-deploy osd create ubuntu-node04 --data /dev/sdd
ceph-deploy osd create ubuntu-node04 --data /dev/sde
ceph-deploy osd create ubuntu-node04 --data /dev/sdf
      

  19、設定OSD服務自啟動:

Ceph叢集概念以及部署

     注:ubuntu-node03節點和ubuntu-node04節點以此類推

  20、驗證ceph叢集:

Ceph叢集概念以及部署

   21、從RADOS移除OSD:

    21.1 停用裝置:ceph osd out 14

    22.2 停止程序:systemctl stop ceph-osd@14

    22.3 移除裝置:ceph osd purge 14 --yes-i-really-mean-it

  22、測試上傳和下載下傳資料:

    建立pool:ceph osd pool create mypool 32 32     # 32PG和32PGP

    ceph pg ls-by-pool mypool | awk '{print $1,$2,$15}'     # 驗證PG和PGP的組合

    ceph osd pool ls 或者 rados lspool      # 列出所有的pool

    上傳檔案:

      rados put msg1 /var/log/syslog --pool=mypool     # 檔案上傳mypool并且指定對象id為msg1

    列出檔案:

      rados ls --pool=mypool

    檔案資訊:

      ceph osd map mypool msg1      # ceph osd map指令可以擷取到存儲池中資料對象的具體位置資訊

    下載下傳檔案:

      rados get msg1 --pool=mypool /opt/my.txt

    删除檔案:

      rados rm msg1 --pool=mypool 

三、叢集擴充

  1、擴充ceph-mon節點:

    apt install ceph-mon -y      # 安裝ceph-mon軟體包

    ceph-deploy mon add ubuntu-node03     # 在管理節點增加mon節點

    ceph-deploy mon add ubuntu-node04

    ceph quorum_status --format json    # 驗證狀态

Ceph叢集概念以及部署

  2、擴充mgr節點:

    apt install ceph-mgr -y 

    ceph-deploy mgr create ubuntu-node03