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/

  

 

   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的流程:

    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),缺點:性能、對象屬性與磁盤本地的文件系統屬性匹配存在限制

    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提供類似文件系統的能力

      以上各模塊的作用:

        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 ceph@192.168.199.22

    ssh-copy-id ceph@192.168.199.23

    ssh-copy-id ceph@192.168.199.24

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

    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:指定外部訪問的網段地址

          

        

  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節點:

      

    分發admin秘鑰:

      apt-get install ceph-common -y 

      ceph-deploy admin ubuntu-node02

  12、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節點:

      

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

    

  15、驗證ceph命令:

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

      sudo chown -R ceph. /etc/ceph/

  16、集群調整:

    

   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服務自啟動:

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

  20、驗證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    # 驗證狀態

    

  2、擴展mgr節點:

    apt install ceph-mgr -y 

    ceph-deploy mgr create ubuntu-node03 

    ceph-deploy admin ubuntu-node03     # 同步配置到ubuntu-node03節點

    驗證mgr節點狀態:

      


免責聲明!

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



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