每天5分鐘復習OpenStack(十一)Ceph部署

    在之前的章節中,我們介紹了Ceph集群的組件,一個最小的Ceph集群包括Mon、Mgr和Osd三個部分。為了更好地理解Ceph,我建議在進行部署時采取手動方式,這樣方便我們深入了解Ceph的底層。今天我們將進行較長的章節講解,希望您能耐心閱讀完(個人建議可以動手實踐一次,效果更佳)。因為Ceph官方文檔中對該過程進行了過于簡單的描述,許多細節都被隱藏了,然而這些細節對于理解Ceph概念至關重要。

    1、網絡規劃

    在部署之前我們先介紹下Ceph的網絡,Ceph集群是劃分了兩種網絡(集群網絡)Cluster Network、(公共網絡)Public Network 。

    • Cluster Network: 就是Ceph 集群組件內部通信時使用的網絡,也稱為存儲內網。如mon之間相互通信,osd向mon上報其狀態信息,主osd向從osd 復制數據等內部操作。

    • Public Network: Ceph集群中用于客戶端訪問和管理的網絡。它是集群與外部世界(客戶端、管理員等)通信的主要通道。也稱為存儲外網。說簡單點就是集群外部客戶端訪問集群內部時的網絡。

    總結:集群內部訪問走Cluster Network ,集群外訪問集群內時走Public Network,集群內外怎么區分了? 集群內部組件有 Mon Mgr OSD Mds 等這些內部組件自身通信就是走Cluster Network ,客戶或者運維人員使用ceph命令與集群通信,此時走的就是Public Network 。

    思考1OpenStackCeph作為后端存儲時,對Ceph的訪問是走哪個網絡了? 當我們上傳鏡像到Ceph存儲池時走的是哪個網絡了?

    做過OpenStack運維的小伙伴們,一定少不了鏡像制作和上傳,如果后端存儲是Ceph時,該網絡的流量是怎么走了的呢?

    #OpenStack 鏡像上傳命令如下:
    openstack image create --container-format bare --disk-format qcow2 \
    --public --file /path/to/centos-image.qcow2 centos-image
    
    ### 參數說明
    --container-format bare 表示容器格式是裸(bare)。
    --disk-format qcow2 表示磁盤格式是qcow2。
    --public 表示將鏡像設置為公共鏡像。
    --file /path/to/centos-image.qcow2 指定CentOS鏡像文件的路徑。
    centos-image 是你給鏡像起的名稱。
    

    此時的流量是先是走了OpenStack的管理網,訪問了Glance鏡像服務,然后Glance作為客戶端走Public 網絡訪問Ceph集群,將數據存儲在后端Ceph集群中。(管理網一般是千兆網絡,而Ceph 無論是Public 還是 Cluster 網絡一般都是萬兆及以上高速網絡。)

    window鏡像動輒10GB的大小,上傳一個鏡像少則幾分鐘,多則1個小時,那鏡像上傳的過程可以發現,瓶頸是在OpenStack管理網上,如果我們傳文件時不走OpenStack管理網,就能解決該問題。

    1. openstack image create 命令創建一個空鏡像并記錄其uuid .
    2. 通過rbd命令直接將鏡像文件傳到Ceph后端,然后給其做快照,并打上快照保護的標記.
    3. 設置glance鏡像location url 為rbd的路徑。

    此過程只是在第一步,創建空鏡像時使用了OpenStack管理網,后面所有的操作都是走Public 網絡。其效率提高了至少10倍。

    思考2: Ceph兩個網段是必須的嗎?

    測試環境中是可以將兩個網絡合并為一個網絡,但是生產環境中是強烈不建議這樣使用的。

    1. 從隔離角度來說會造成Public 網絡流量過高時,影響集群的穩定性,
    2. 從安全的角度,Public網絡是非安全網絡,而Cluster網絡是安全的網絡。

    此時我們是一個測試環境就簡單規劃為一個網絡 192.168.200.0/24

    2、 Mon 部署

    一個Ceph集群至少需要一個Mon和少量OSD,部署一個Mon 需要提前先了解下如下幾個概念

    • Unique Identifier: 集群唯一標識符,在集群中顯示為fsid, (由于最初的ceph集群主要支持文件系統,所以最初fsid代表文件系統ID,現在ceph集群也支持了塊存儲和對象存儲,但是這個名字確保留下來。文件存儲是最先被規劃的,相對對象存儲和塊存儲,卻是最后生產可用的。)

    • Cluster Name 集群名字,如果不指定默認為ceph,注意如果是多個ceph集群的環境需要指定。
      當一個節點做為客戶端要訪問兩個Ceph集群 cluster1 和 cluster2 時,需要在ceph 命令指定參數

    ceph --cluster CLUSTER  cluster name
    
    • Monitor Name: Mon名字,默認mon使用主機名為自Mon節點的名字,因此需要做好域名解析。

    • Monitor Map:啟動初始monitor需要生成monitor map。monitor映射需要fsid,集群的名字以及一個主機名或IP地址。( 在生活中我們去一個陌生地方會先查地圖(map),同理mon第一次初始化和查找同伴時也需要Mon Map)

    • Keyring :Ceph 認證密鑰環,用于集群身份認證。Cephx認證的不僅有客戶端用戶(比如某客戶端要想執行命令來操作集群,就要有登錄Ceph的密鑰),也有Ceph集群的服務器,這是一種特殊的用戶類型MON/OSD/MDS。也就是說,Monitor、OSD、MDS都需要賬號和密碼來登錄Ceph系統。因此這里的Keyring既有集群內組件的,也有用于管理的Keyring 。(這一點和K8s集群的認證很類似,都是采用雙向認證)

    了解上述這些是為了能看懂Ceph的配置文件,但是我們在部署時可以不寫配置文件,但是在生產環境中強烈建議是手動編寫配置文件

    2.1 MON 部署前置任務

    環境說明:
    部署環境 vmware 虛擬機 
    虛擬機系統 CentOS Linux release 7.9.2009 (Core) 
    部署ceph版本: 14.2.22 nautilus (stable)
    
    ip 主機名 角色 磁盤
    192.168.200.11 mon01 mon mgr osd sdb,sdc,sde,sdf
    1 修改主機名,添加hosts 文件解析
    hostnamectl set-hostname mon01
    echo "192.168.200.11 mon01" >> /etc/hosts 
    
    2 關閉防火墻和seliux 
    systemctl stop firewalld 
    setenforce 0
    getenforce  
    #Disabled
    
    
    3 配置ceph 的yum 源,這里使用國內的aliyun的鏡像站點
    
    cat > /etc/yum.repos.d/ceph.repo <<EOF
    [ceph]
    name=ceph
    baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
    gpgcheck=0
    EOF
    
    4 檢查repo 
    yum repolist 
    
    5 自身免密
    ssh-keygen -t rsa
    
    #自己的管理IP
    ssh-copy-id mon01:
    
    
    6 安裝ceph 包和其依賴包
    yum install -y snappy leveldb gdisk python-argparse gperftools-libs ceph
    

    檢查安裝包

    檢查ceph客戶端的版本

    [root@mon01 ~]# ceph -v 
    ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
    
    

    【注意】安裝了ceph 的基礎組件包之后,系統默認在/var/lib/ceph目錄下生成了一系列的目錄如下

    而且其屬主和屬組都是ceph用戶。為什么強調這個,在很多利舊的環境中,在清理集群時清理目錄要清理這些目錄下的文件。如果不清理,或者清理不干凈,在ceph多次部署時會產生各種問題,本人在生產環境中就遇見過多次。文件清理不徹底,文件權限不正確的問題。

    這里提供一個生產環境中清理ceph集群的命令

    #停止服務
    systemctl stop ceph-osd.target
    systemctl stop ceph-mon.target
    systemctl stop ceph-mgr.target
    
    #刪除文件
    rm -f /var/lib/ceph/bootstrap-mds/ceph.keyring
    rm -f /var/lib/ceph/bootstrap-mgr/ceph.keyring
    rm -f /var/lib/ceph/bootstrap-osd/ceph.keyring
    rm-f /var/lib/ceph/bootstrap-rbd/ceph.keyring
    rm -f /var/lib/ceph/bootstrap-rbd-mirror/ceph.keyring
    rm -f /var/lib/ceph/bootstrap-rgw/ceph.keyring
    rm -rf /etc/ceph/*
    rm -fr /var/lib/ceph/mon/*
    rm -fr /var/lib/ceph/mgr/*
    
    rm -rf /etc/systemd/system/multi-user.target.wants/ceph-volume*
    rm -rf /etc/systemd/system/ceph-osd.target.wants/ceph-osd*
    
    取消osd掛載
    umount /var/lib/ceph/osd/*
    rm -rf /var/lib/ceph/osd/*
    rm -f /var/log/ceph/*
    
    #刪除lv vg pv 分區信息
    for i in `ls /dev/ | grep ceph-`; do j=/dev/$i/osd*; lvremove  --force --force $j; done
    for i in $(vgdisplay |grep "VG Name"|awk -F' ' '{print $3}'); do     vgremove -y $i; done
    for j in $(pvdisplay|grep 'PV Name'|awk '{print $3}'); do pvremove --force --force  $j; done
    
    
    vgscan --cache
    pvscan --cache
    lvscan --cache
    

    2.2 Mon 部署

    1 生成uuid 即集群的fsid,即集群的唯一標識符
    [root@mon01 ~]# uuidgen 
    51be96b7-fb6b-4d68-8798-665278119188
    
    2 安裝完ceph組件包之后,已經生成了/etc/ceph目錄 
    接下來我們補充下ceph.conf 的配置文件
    
    cat > /etc/ceph/ceph.conf <<EOF 
    fsid = 51be96b7-fb6b-4d68-8798-665278119188
    mon_initial_members = mon01
    mon_host = 192.168.200.11
    public_network = 192.168.200.0/24 
    #cluster_network = 192.168.200.0/24 
    EOF
    
    • fsid 對應集群id
    • mon_initial_member 對應初始化的mon主機名,
    • mon_host 對應其IP地址
    • public_network 和cluster_network 則對應了之前介紹的公共網絡和集群網絡。

    3、生成mon的私鑰文件,進行身份驗證

    上文中提到集群內的組件訪問也是需要認證的,Ceph 默認是使用Cephx 協議進行認證,此時分別給monbootstrap-osdclient.admin 來生成私鑰文件

    • mon mon 私鑰文件,用于mon進行身份認證
    • bootstrap-osd 是當你添加一個新的 OSD 到 Ceph 集群時,需要向集群引導這個 OSD。這個引導過程涉及到向 OSD 分配一個獨特的標識符,并為其生成一個密鑰以便在集群內進行身份驗證。
    • client.admin 用于集群管理員進行管理使用的身份認證。
    # mon key
    ceph-authtool --create-keyring /tmp/ceph.mon.keyring \
    --gen-key -n mon. --cap mon 'allow *'
    
    #bootstarp-osd key
    ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \
    --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' \
    --cap mgr 'allow r'
    
    #client.admin key
    ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \
    --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *'\
    --cap mds 'allow *' --cap mgr 'allow *'
    

    cat /etc/ceph/ceph.client.admin.keyring
    查看其結構也很容易理解,key 表示其私鑰文件,caps mds = allow * ,表示對mds 擁有了所有的權限,其他同理。

    [client.admin]
    	key = AQCni2NlDuN7ERAAYr/aL5A5R0OJFeBkwmrBjQ==
    	caps mds = "allow *"
    	caps mgr = "allow *"
    	caps mon = "allow *"
    	caps osd = "allow *"
    

    4、導入key到mon.keyring 文件中

    將client.admin 和bootstrap-osd key,導入到mon的 keyring 文件中。并將keyring 文件復制到/etc/ceph/目錄下

    ceph-authtool /tmp/ceph.mon.keyring --import-keyring \
    /etc/ceph/ceph.client.admin.keyring
    
    #將bootstap-osd的key 文件導入并復制到了 /var/lib/ceph/bootstrap-osd/ceph.keyring 
    ceph-authtool /tmp/ceph.mon.keyring --import-keyring \
    /var/lib/ceph/bootstrap-osd/ceph.keyring
    importing contents of /var/lib/ceph/bootstrap-osd/ceph.keyring into /tmp/ceph.mon.keyring
    
    

    查看mon此時的keyring 文件,驗證client.admin和client.bootstrap-osd keyring 已經導入

    [root@mon01 ceph]# cat /tmp/ceph.mon.keyring 
    [mon.]
    	key = AQD8h2NlYzQWLRAA306ur5iOEjoHwarGx77FFg==
    	caps mon = "allow *"
    [client.admin]
    	key = AQCni2NlDuN7ERAAYr/aL5A5R0OJFeBkwmrBjQ==
    	caps mds = "allow *"
    	caps mgr = "allow *"
    	caps mon = "allow *"
    	caps osd = "allow *"
    [client.bootstrap-osd]
    	key = AQCKi2NlASwkDxAAPPXUeSwX8nQJJcJao+bgCw==
    	caps mgr = "allow r"
    	caps mon = "profile bootstrap-osd"
    
    

    5 修改權限為ceph

    chown ceph:ceph /tmp/ceph.mon.keyring
    

    6、創建monmap

    #單節點mon環境
    monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
    monmaptool --create --add mon01 192.168.200.11 \
    --fsid 51be96b7-fb6b-4d68-8798-665278119188  /tmp/monmap 
    
    #多節點mon環境
    monmaptool --create --add mon01 192.168.200.11 \
    --add node2 192.168.200.12 --add node3 192.168.200.13 \
    --fsid 51be96b7-fb6b-4d68-8798-665278119188  /tmp/monmap 
    
    

    6.1、什么是monmap? monmap是做什么用的?

    • Monitor Map: Ceph 集群中的 Monitors 負責維護集群的狀態信息、監控數據等。monmap 包含了 Monitors 的信息,包括它們的主機名、IP地址以及集群的唯一標識(FSID)等。

    • 啟動 Monitors: 在 Ceph 集群的啟動過程中,Monitors 首先需要從 monmap 中獲取集群的初始信息。monmaptool 的這個命令就是為了生成一個初始化的 monmap 文件,以供 Monitors 使用。這個文件會在 Monitors 啟動時被加載。

    • 維護集群狀態: 一旦 Monitors 啟動,它們會使用 monmap 文件來維護集群的狀態。Monitors 之間會相互通信,共享集群的狀態信息。monmap 中包含的信息幫助 Monitors 確定其他 Monitor 節點的位置,從而進行集群管理和數據的一致性。

    • Monitor 選舉: 當一個 Monitor 節點發生故障或新的 Monitor 節點加入集群時,集群需要進行 Monitor 的選舉。monmap 包含的信息有助于集群中的 OSD(Object Storage Daemon)和客戶端找到 Monitor 節點,并確保選舉過程正確進行。

    6.2 、怎么驗證和查看當前集群的monmap ?

    [root@mon01 tmp]# monmaptool --print /tmp/monmap
    monmaptool: monmap file monmap
    epoch 0
    fsid 51be96b7-fb6b-4d68-8798-665278119188  #集群id 
    last_changed 2023-11-27 03:23:10.956578
    created 2023-11-27 03:23:10.956578
    min_mon_release 0 (unknown)
    0: v1:192.168.200.11:6789/0 mon.mon01  #mon節點信息
    

    6.3 、寫錯了怎么覆蓋寫?

    # --clobber 參數 將會覆蓋寫
    monmaptool --create --add mon01 192.168.200.12 --fsid \
    91e36b46-8e6b-4ac6-8292-0a8ac8352907 /tmp/monmap   --clobber
    

    7 修改ceph 權限

    chown -R ceph:ceph /tmp/{monmap,ceph.mon.keyring}
    

    8 創建mon01 工作目錄

    #mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
    sudo -u ceph mkdir /var/lib/ceph/mon/ceph-mon01     #默認cluster-name 就是ceph
    

    9 用monitor map和keyring填充monitor守護程序,生mon01的數據庫文件

    #sudo -u ceph ceph-mon [--cluster {cluster-name}] \
    #--mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    
    sudo -u ceph ceph-mon --cluster ceph  --mkfs -i mon01 \
    --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    

    驗證

    [root@mon01 ceph-mon01]# cat keyring 
    [mon.]
    	key = AQD8h2NlYzQWLRAA306ur5iOEjoHwarGx77FFg==
    	caps mon = "allow *"
    [root@mon01 ceph-mon01]# ls
    keyring  kv_backend  store.db
    [root@mon01 ceph-mon01]# pwd
    /var/lib/ceph/mon/ceph-mon01
    

    【提示】mon 完成之后,即使key誤刪了,但admin keyring還在,可以使用ceph auth list 查看集群所有的keyring

    完成第9步之后,在以systemd的方式拉起mon01的守護進場就算完成了mon的安裝,但是在拉其服務之前,我們先介紹下兩個概念,副本和糾刪碼

    3、副本 or 糾刪碼

    Ceph存儲池在配置有兩種分別是 副本池(Replicated Pool)糾刪碼池(Erasure-coded Pool),這兩種類型也很好理解,如果是副本池,其存放是以副本的方式存放的,每份副本其數據是完全一致的,相當于1份數據存多份來冗余。

    糾刪碼池一般Ceph是采用前向糾錯碼(Forward Error Correction,FEC)
    FEC代碼將K個chunk(以下稱為塊)數據進行冗余校驗處理,得到了N個塊數據。這N個塊數據既包含原數據,也包括校驗數據。這樣就能保證K個塊中如果有數據丟失,可以通過N個塊中包含的校驗數據進行恢復。

    具體地說,在N=K+M中,變量K是數據塊即原始數量;變量M代表防止故障的冗余塊的數量;變量N是在糾刪碼之后創建的塊的總數。這種方法保證了Ceph可以訪問所有原始數據,可以抵抗任意N–K個故障。例如,在K=10、N=16的配置中,Ceph會將6個冗余塊添加到10個基本塊K中。在M=N–K(即16–10=6)的配置中,Ceph會將16個塊分布在16個OSD中,這樣即使6個OSD掉線,也可以從10個塊中重建原始文件,以確保不會丟失數據,提高容錯能力。

    簡單來說就是 K個數據塊 + M 個冗余塊 = N個總塊

    【思考3】生產環境中我們是選副本還是糾刪碼呢?

    性能優先選副本池,容量優先選糾刪碼。(本質上糾刪碼就是犧牲部分計算性能換存儲容量)

    4 故障域也稱為冗余級別

    在實際的生產環境中我們的數據都是存儲在磁盤中的,磁盤對應OSD ,磁盤是服務器上的一個組件,服務器對應Host 而服務器是在機架中存放的,一個機柜RACK中有N個機架,而機柜是屬于一個房間的ROOM,一個大型的數據中心(Data Center)可能有N個房間,而每個房間可能在同一個地區,也可以在不同地區。

    對應其關系為 1Data Center = NRoom = NRACK = NHost = NOSD

    總結:Ceph集群中有很多硬件設備,從上到下可能涉及某些邏輯單元,類似數據中心→設備所在機房→機架→行→服務器→OSD盤等的關系。那么,如何描述這些邏輯單元的關系、

    Bucket 專門用于描述以上提到的這些邏輯單元屬性,以便將來對這些屬性按樹狀結構進行組織。(Bucket邏輯視圖)(選取規則RuleSet) (磁盤設備Device) 組成了ceph的Crush Map.(混個臉熟即可,將來會重點介紹)

    在ceph中使用 ceph osd tree 就可用查看該視圖

    上述視圖中有3個機架 rack1 rack2 rack3 ,每個rack下分別由一個mon主機和兩個osd 設備。
    

    無論是副本池還是糾刪碼池,數據都是存儲在osd中的,如果是副本池,默認3副本,那這3個osd,怎么選取了?

    我們先不討論Crush算法選取OSD的問題,我們就考慮一個問題,數據冗余問題。如果我們3個OSD 都在同一個節點,該節點down了,則我們數據都訪問不了了,則我們稱我們數據的冗余級別是OSD的級別的(Host下一級)。
    如果我們的選取的3個OSD都在不同節點上(Host),但是這三個節點都在同一個機柜中(Rack),如果機柜斷電了,則我們的數據無法訪問了,我們稱我們的冗余級別是節點級別(Host),同理3個OSD 在不同的機柜中,但在同一個ROOM中,我們稱我們數據的冗余級別是RACK級別。

    那我們怎么定義數據冗余級別了,osd_crush_chooseleaf_type 參數則可以定義,其值是一個數字 代表了類型。

    ceph osd crush dump #可以查看到其type 
    
    # types
    type 0 osd
    type 1 host
    type 2 chassis  #一般不使用,服務器機框。
    type 3 rack
    type 4 row
    type 5 pdu
    type 6 pod
    type 7 room
    type 8 datacenter
    

    數字0 代表了其故障域是osd級別,雖然這種說法不嚴謹但是方便理解。后面我們在學習了Crush算法第二步之后就知道其OSD 是如何通過Bucket 和RuleSet 來選取OSD的,這里我們簡單理解就是將3副本分散到3個osd就能滿足要求。如果是數字1 表示其冗余級別是host 級別。要在不同的節點上,其他同理。

    此實驗環境中我們osd都在同一個節點上因此我們將其參數值設置為0
    最后ceph.conf 文件修該為如下

    最后我們啟動mon服務

    systemctl daemon-reload 
    systemctl start ceph-mon@mon01
    systemctl enable ceph-mon@mon01
    
    查看集群狀態
    [root@mon01 ceph-mon01]# ceph -s 
      cluster:
        id:     51be96b7-fb6b-4d68-8798-665278119188
        health: HEALTH_WARN
                mon is allowing insecure global_id reclaim
                1 monitors have not enabled msgr2
     
      services:
        mon: 1 daemons, quorum mon01 (age 6s)
        mgr: no daemons active
        osd: 0 osds: 0 up, 0 in
     
      data:
        pools:   0 pools, 0 pgs
        objects: 0 objects, 0 B
        usage:   0 B used, 0 B / 0 B avail
        pgs:     
    
    

    如果ceph狀態顯示如上圖,恭喜你,表示第一個mon已經成功部署了.

    mon組件可以說是Ceph最重要的組件了,因此本章節對其每一步操作都做了詳細說明,剩下的mgr osd的部署則會簡單很多,由于篇幅所限,我們將在下一章節繼續。

    posted @ 2023-11-27 23:07  ALEX_li88  閱讀(227)  評論(0編輯  收藏  舉報
    正能量网站你懂我意思下载,欧美亚洲综合视频,97国产超碰,久在线中文欧美