CEPH集羣搭建部署與常規操作實戰!理論+實戰!

前言

一:理論部分

1.1:什麼是CEPH?有什麼作用?

  • mark

  • 此LOGO的來源是章魚,是從開發者寵物的名字來的

  • CEPH是一個開源的項目,是一個可大規模擴展,高性能且無單點故障的分佈式存儲系統,它是軟件定義的,統一的存儲解決方案。

  • CEPH因爲開源,可擴展和分佈式的優點,如今稱爲各種雲的主流存儲方案

1.2:CEPH的優勢和缺點

  • ceph發展至今已過10年,隨着雲計算的發展,ceph與雲計算的關係越來越緊密,但是也存在着一些優缺點
1.2.1:優點
  • CRUSH算法
    • CRUSH算法是Ceph最初的兩大創新之一(另一個是基於動態子樹分區的元數據集羣),也是整個RADOS的基石,是Ceph最引以爲豪的地方。
    • CRUSH在一致性哈希基礎上很好的考慮了容災域的隔離,能夠實現各類負載的副本放置規則,例如跨機房、機架感知等。同時, CRUSH算法支持副本和EC兩種數據冗餘方式,還提供了四種不同類型的Bucket(Uniform, List, Tree, Straw),充分考慮了實際生產過程中硬件的迭代式部署方式,雖然實際生產中大多數情況下的都是隻用了一種Straw。
  • 統一存儲架構
    • Ceph最初設計的RADOS是爲其實現一個高性能的文件系統服務的,並沒有考慮對於塊設備、對象存儲的支持,也就沒有什麼RBD、RADOS GateWay,跟別提OpenStack和qemu之類的了。但由於 RADOS 出色的設計和獨立簡潔的訪問接口,Ceph社區果斷推出了用於支持雲計算的分佈式塊存儲RBD和分佈式對象存儲RADOS GateWay,並將開發中心全面轉向雲計算領域。
    • RADOS的設計非常的優秀。從架構上來看,RBD和RADOSGateWay實際上都只是RADOS的客戶端而已,但得益於RADOS的優秀設計,RBD和RADOSGateWay的設計和實現都很簡單,不需要考慮橫向擴展、冗餘、容災、負載平衡的等複雜的分佈式系統問題,同時能夠提供足夠多的特性和足夠優秀的性能,因此迅速得到了社區的認可。
    • 另一方面,Ceph爲OpenStack提供了良好的支持,成爲了目前最火的OpenStack底層存儲系統。
  • 豐富的特性
    • Ceph的特性不可謂不多,從分佈式系統最基本的橫向擴展、動態伸縮、冗餘容災、負載平衡等,到生產環境環境中非常實用的滾動升級、多存儲池、延遲刪除等,再到高大上的CephFS集羣、快照、糾刪碼、跨存儲池緩存等,不可謂不強大。
    • 但是就像大多數開源系統一樣,Ceph的基本特性,或者說真正在生產環境中用的上的特性還是非常靠譜的,但其他“高級”特性就只能打一個問號了。特別是在CephFS模塊,由於Ceph社區目前的開發重點主要還是與雲計算相關的部分,即RBD和RADOSGateWay,導致CephFS的開發停滯了很久,相關的特性,例如元數據集羣、快照等,目前都不滿足生產環境的要求。
1.2.2:缺點
  • 代碼質量
    • Ceph主要使用C/C++語言編寫,同時外圍的很多腳本和工具用了Python。
    • 由於歷史問題,ceph部分功能的代碼數量有的達到1萬多行,且與父級目錄沒有邏輯關係等等問題
  • 性能
    • 數據雙倍寫入
      • Ceph本地存儲接口(FileStore)爲了支持事務,引入了日誌(Journal)機制。所有的寫入操作都需要先寫入日誌(XFS模式下),然後再寫入本地文件系統。簡單來說就是一份數據需要寫兩遍,日誌+本地文件系統。
    • IO路徑過長
      • 這個問題在Ceph的客戶端和服務器端都存在。以osd爲例,一個IO需要經過message、OSD、FileJournal、FileStore多個模塊才能完成,每個模塊之間都涉及到隊列和線程切換,部分模塊在對IO進行處理時還要進行內存拷貝,導致整體性能不高。
    • 對高性能硬件的支持有待改進
      • 最開始只支持HDD,沒有充分考慮SSD

1.3:什麼是集中式存儲架構?

  • 所謂集中式存儲,整個存儲是集中在一個系統中的。但集中式存儲並不是一個單獨的設備,是集中在一套系統當中的多個設備。
  • 在集中式存儲中通常包含一個機頭,這個是存儲系統中最爲核心的部件。通常在機頭中有包含兩個控制器,這兩個控制器實現互備的作用,避免硬件故障導致整個存儲系統的不可用。在該機頭中通常包含前端端口和後端端口,前端端口用戶爲服務器提供存儲服務,而後端端口用於擴充存儲系統的容量。通過後端端口機頭可以連接更多的存儲設備,從而形成一個非常大的存儲資源池。
  • 分佈式存儲是一個大的概念,其包含的種類繁多,除了傳統意義上的分佈式文件系統、分佈式塊存儲和分佈式對象存儲外,還包括分佈式數據庫和分佈式緩存等

1.4:中間控制節點架構(HDFS)

1.5:完全無中心架構—一致性哈希(Swift)

  • 與Ceph的通過計算方式獲得數據位置的方式不同,另外一種方式是通過一致性哈希方式獲得數據位置。一致性哈希的方式就是將設備做成一個哈希環,然後根據數據名稱計算出的哈希值映射到哈希環的某個位置,從而實現數據定位。
  • 哈希環對服務器設備做映射
  • mark

1.6:完全無中心架構—計算模式(Ceph)

  • 下圖是Ceph存儲系統的架構,在該架構中與HDFS不同的地方在於該架構中沒有中心節點。客戶端是通過一個設備映射關係計算出來其寫入數據的位置,這樣客戶端可以直接與存儲節點通信,從而避免中心節點的性能瓶頸。

  • mark

  • ceph 是一種開源存儲軟件。底層實現了對象存儲,並以此爲基礎對外提供對象存儲接口、塊存儲接口、文件級存儲接口。

  • 官方架構圖

    mark

  • 通俗轉化版

    mark

  • 名詞解釋

    • RADOS:Reliable Autonomic Distributed Object Store(可靠的,自主的,分佈式的對象存儲)。在 ceph 中這個名詞經常出現,有時會以 R 表示 RADOS。實際上這個詞僅僅是對 ceph 的一個修飾詞,並不代表 ceph 的組件什麼的。粗暴的認爲, RADOS = ceph 對象存儲集羣 即可。
    • RGW、RBD、CEPH FS: 這三個就是 ceph clients。
    • RGW:對象存儲網關,也就是對象存儲接口。
    • RBD:塊設備,也就是塊存儲接口。
    • CEPH FS:ceph 文件系統,也就是文件級存儲接口。
  • CEPH基本架構

    • CEPH組件主要分分爲兩部分:

      Ceph Node:構成Ceph集羣的基礎組件

      Ceph Client:對外提供多種方式使用Ceph存儲的組件

  • CEPH基礎組件

  • 此部分介紹構成Ceph集羣的基礎組件,其中包含OSD、Manager、MSD、Monitor

    • OSD(ceph-osd):object storage daemon,對象存儲進程。ceph 管理物理硬盤時,引入了OSD概念,每一塊盤都會針對的運行一個OSD進程。換句話說,ceph 集羣通過管理 OSD 來管理物理硬盤。OSD 一般功能爲:存儲數據、維護數據副本、數據恢復、數據再平衡以及對ceph monitor組件提供相關監控信息.
    • Manager(ceph-mgr):用於收集ceph集羣狀態、運行指標,比如存儲利用率、當前性能指標和系統負載。對外提供 ceph dashboard(ceph ui)和 resetful api。Manager組件開啓高可用時,至少2個。
    • MDS(ceph-mds):Metadata server,元數據服務。爲ceph 文件系統提供元數據服務(ceph 對象存儲和塊存儲不需要MDS)。爲 posix 文件系統用戶提供性能良好的基礎命令(ls,find等)。
    • Monitor(ceph-mon):維護集羣的狀態,包含monitor組件信息,manger 組件信息,osd組件信息,mds組件信息,crush 算法信息。還負責ceph集羣的身份驗證功能,client在連接ceph集羣時通過此組件進行驗證。Monitor組件開啓高可用時,至少3個。
  • Ceph Clients

    • 此部分介紹 ceph 對外提供各種功能的組件。其中包含:Block Device、Object Storage、Filesystem。
    • Block Device:塊存儲設備,RBD。
    • Object Storage: 對象存儲,RGW。對外可提供 swift 、s3 接口類型restful api
    • Filesystem:文件系統,CephFS。提供一個兼容POSIX的文件系統。
  • Ceph存儲過程

    • 在對象存儲中,一切都是扁平化的,並且存儲的最小單元爲對象(OBJ)。

    • mark

    • ceph 在對象存儲的基礎上提供了更加高級的思想。當對象數量達到了百萬級以上,原生的對象存儲在索引對象時消耗的性能非常大。ceph因此引入了 placement group (pg)的概念。一個PG就是一組對象的集合。

    • mark

    • obj和pg之間的映射由ceph client計算得出。

    • 討論 pg 時,不得不提的另外一個名詞:pgp。pgp決定了pg和osd 之間的映射關係。一般將 pgp_num 設置成和 pg_num 一樣大小。這裏還有一個名詞需要提一下,在ceph中會經常見到crush算法。簡單來說,crush 算法就是指 ceph 中數據如何存儲、讀取的過程。由於ceph集羣面對許多的獨立項目,因此ceph還引入了ceph pool的概念用於劃分不同的項目。

      ceph pool 是對 ceph 對象的邏輯劃分,並不是物理劃分。

    • pg和ceph pool的區別:

      pg對於用戶來說是透明的,只是底層的一種優化方案。

      ceph pool對於用戶來說,就像mysql中的database。

二:實驗部分

2.1:環境介紹

  • 主機名 操作系統 IP地址 主要軟件
    ceph01 centos7.7 NAT:192.168.233.128,VM1:192.168.11.128
    ceph02 centos7.7 NAT:192.168.233.129,VM1:192.168.11.129
    ceph03 centos7.7 NAT:192.168.233.130,VM1:192.168.11.130

    mark

2.2:實驗拓撲圖

  • mark

2.3:實驗過程

2.3.1:開局優化
  • 修改IP地址,三臺都做,僅展示ceph01的操作

    [root@localhost ~]# cd /etc/sysconfig/network-scripts/
    [root@localhost network-scripts]# ip addr	'//發現需要添加一個ens36的網卡配置'
    [root@localhost network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
    [root@localhost network-scripts]# vi ifcfg-ens33
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=static	'//改成static靜態'
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=ens33
    UUID=c8c5bb8e-55a1-4a47-9f25-12dd3fa47b64
    DEVICE=ens33
    ONBOOT=yes	'//開啓網卡'
    IPADDR=192.168.233.128	'//設置網卡IP地址'
    NETMASK=255.255.255.0
    GATEWAY=192.168.233.2
    DNS1=8.8.8.8	'//設置dns'
    DNS2=114.114.114.114
    [root@localhost network-scripts]# vi ifcfg-ens36
    ...省略內容,跟ens33的配置相同
    NAME=ens36	'//一下兩個修改成ens36,刪除UUID'
    DEVICE=ens36
    ONBOOT=yes
    IPADDR=192.168.11.128
    NETMASK=255.255.255.0	'//修改IP地址,刪除網關和dns'
    [root@localhost network-scripts]# systemctl restart network	'//重啓網卡'
    [root@localhost network-scripts]# ip addr	'//查看是否生效'
    [root@localhost network-scripts]# ping www.baidu.com	'//發現是可以ping通的'
    
    
  • 修改主機名並配置hosts文件,三臺都做,僅展示ceph01的操作

    [root@localhost network-scripts]# hostnamectl set-hostname ceph01
    [root@localhost network-scripts]# su
    [root@ceph01 network-scripts]# 
    [root@ceph01 network-scripts]# vi /etc/hosts
    '//添加一下內容'
    192.168.11.128 ceph01
    192.168.11.129 ceph02
    192.168.11.130 ceph03
    [root@ceph01 network-scripts]# ping ceph01	'//測試是否能ping通'
    [root@ceph01 network-scripts]# ping ceph02
    [root@ceph01 network-scripts]# ping ceph03
    
    
  • 關閉防火牆與核心防護,三臺都做,僅展示ceph01的操作

    [root@ceph01 network-scripts]# systemctl stop firewalld
    [root@ceph01 network-scripts]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@ceph01 network-scripts]# setenforce 0
    [root@ceph01 network-scripts]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
    
    
  • 創建免密交互,三臺都做,僅展示ceph01的操作

    [root@ceph01 network-scripts]# ssh-keygen	'//生成密鑰對'
    '//下面的四個交互都直接回車即可'
    [root@ceph01 network-scripts]# ssh-copy-id root@ceph01	'//上傳密鑰對'
    '//交互信息輸入yes和對方主機密碼'
    [root@ceph01 network-scripts]# ssh-copy-id root@ceph02
    [root@ceph01 network-scripts]# ssh-copy-id root@ceph03
    '//測試免祕鑰登陸'
    [root@ceph01 network-scripts]# ssh ceph01
    Last login: Mon Mar 30 21:22:24 2020
    [root@ceph01 ~]# exit
    登出
    Connection to ceph01 closed.
    [root@ceph01 network-scripts]# ssh ceph02
    Last login: Mon Mar 30 21:22:51 2020
    [root@ceph02 ~]# exit
    登出
    Connection to ceph02 closed.
    [root@ceph01 network-scripts]# ssh ceph03
    Last login: Mon Mar 30 21:36:46 2020 from ceph03
    [root@ceph03 ~]# exit
    登出
    Connection to ceph03 closed.
    [root@ceph01 network-scripts]# 
    
    
  • 修改yum源,三臺都做,僅展示ceph01的操作

    [root@ceph01 network-scripts]# cd /etc/yum.repos.d
    [root@ceph01 yum.repos.d]# yum -y install wget curl net-tools bash-completion vim 	'//安裝一些環境包'
    [root@ceph01 yum.repos.d]# mkdir bak
    [root@ceph01 yum.repos.d]# mv * bak
    mv: 無法將目錄"bak" 移動至自身的子目錄"bak/bak" 下
    [root@ceph01 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo	'//下載基礎源'
    [root@ceph01 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo	'//下載epel源'
    [root@ceph01 yum.repos.d]# vi local.repo	'//配置本地源'
    [ceph]
    name=Ceph packages for
    baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch
    enabled=1
    gpgcheck=1
    type=rpm-md
    gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
    priority=1
    
    [ceph-noarch]
    name=Ceph noarch packages 
    baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/
    enabled=1
    gpgcheck=1
    type=rpm-md
    gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
    priority=1
    
    [ceph-source]
    name=Ceph source packages 
    baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS/
    enabled=1
    gpgcheck=1
    type=rpm-md
    gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
    priority=1
    [root@ceph01 yum.repos.d]# yum update -y	'//進行升級操作'
    	
    
  • 配置NTP服務,CEPH01配置NTP服務即可,其他服務器想CEPH01節點同步

    '//ceph01操作'
    [root@ceph01 yum.repos.d]# yum -y install ntpdate ntp	'//三臺主機都裝'
    [root@ceph01 yum.repos.d]# ntpdate ntp1.aliyun.com	'//ceph01向阿里雲同步時間'
    30 Mar 21:52:57 ntpdate[66372]: adjust time server 120.25.115.20 offset -0.007958 sec
    [root@ceph01 yum.repos.d]# clock -w	'//將當前系統時間寫入到CMOS中'
    [root@ceph01 yum.repos.d]# vi /etc/ntp.conf 	'//修改ntp服務配置文件'
    restrict default nomodify   '//第8行改'
    restrict 192.168.11.0 mask 255.255.255.0 nomodify notrap  '//第17行改'
    '//將21行到24行刪除'
         21 server 0.centos.pool.ntp.org iburst
         22 server 1.centos.pool.ntp.org iburst
         23 server 2.centos.pool.ntp.org iburst
         24 server 3.centos.pool.ntp.org iburst
    '//刪除的插入下面內容'
    fudeg 127.127.1.0 stratum 10    
    server 127.127.1.0
    [root@ceph01 yum.repos.d]# systemctl restart ntpd	'//重啓ntpd服務'
    [root@ceph01 yum.repos.d]# systemctl enable ntpd	'//設置開機自啓動'
    Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
    '//ceph02和ceph03操作'
    [root@ceph02 yum.repos.d]# ntpdate ceph01	'//同步ceph01的時間'
    30 Mar 22:01:11 ntpdate[74462]: adjust time server 192.168.11.128 offset -0.007308 sec
    [root@ceph02 yum.repos.d]# crontab -e	'//設置計劃任務'
    */2 * * * * /usr/bin/ntpdate ceph01 >> /var/log/ntpdate.log
    [root@ceph01 yum.repos.d]# systemctl restart crond	'//重啓計劃任務'
    [root@ceph02 yum.repos.d]# crontab -l	'//查看計劃任務'
    */2 * * * * /usr/bin/ntpdate ceph01 >> /var/log/ntpdate.log
    
    
2.3.2:搭建集羣
  • 管理節點安裝部署工具

    [root@ceph01 yum.repos.d]# yum -y install python-setuptools ceph-deploy
    
    
  • 三個節點創建目錄,用於保存ceph-deploy 生成的配置文件和密鑰對。三個節點安裝ceph

    [root@ceph01 yum.repos.d]# mkdir /etc/ceph
    [root@ceph01 yum.repos.d]# yum -y install ceph
    
    
  • 管理節點創建mon並初始化,收集祕鑰

    [root@ceph01 yum.repos.d]# cd /etc/ceph
    [root@ceph01 ceph]# ceph-deploy new ceph01 ceph02 	'//創建mon'
    [root@ceph01 ceph]# ceph-deploy mon create-initial	'//初始化,收集祕鑰'
    
    
  • 查看集羣狀態

    [root@ceph01 ceph]# ceph -s
    
    
  • 創建osd

    [root@ceph01 ceph]# ceph-deploy osd create --data /dev/sdb ceph01
    [root@ceph01 ceph]# ceph-deploy osd create --data /dev/sdb ceph02
    [root@ceph01 ceph]# ceph -s	'//查看集羣狀態會發現有兩個osd加入進來了'
    [root@ceph01 ceph]# ceph osd tree	'//查看osd目錄樹'
    ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
    -1       1.99799 root default                            
    -3       0.99899     host ceph01                         
     0   hdd 0.99899         osd.0       up  1.00000 1.00000 
    -5       0.99899     host ceph02                         
     1   hdd 0.99899         osd.1       up  1.00000 1.00000 
    [root@ceph01 ceph]# ceph osd stat	'//查看osd狀態'
    2 osds: 2 up, 2 in; epoch: e9
    
    
  • 將配置文件和admin祕鑰下發到節點並給祕鑰增加權限

    [root@ceph01 ceph]# ceph-deploy admin ceph01 ceph02
    [root@ceph01 ceph]# chmod +r ceph.client.admin.keyring 
    [root@ceph02 ceph]# chmod +r ceph.client.admin.keyring 
    
2.3.3:擴容操作
  • 擴容ceph03節點的osd和mon

    [root@ceph01 ceph]# ceph-deploy osd create --data /dev/sdb ceph03
    [root@ceph01 ceph]# ceph -s	'//已經有三個osd了'
    [root@ceph01 ceph]# vi ceph.conf 
    [global]
    fsid = b175fb1a-fdd6-4c57-a41f-b2d964dff248
    mon_initial_members = ceph01, ceph02, ceph03	'//添加ceph03'
    mon_host = 192.168.11.128,192.168.11.129,192.168.11.130	'//添加ceph03IP地址'
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
    public network = 192.168.11.0/24	'//添加內部通信網段'
    [root@ceph01 ceph]# ceph-deploy mon add ceph03	'//添加mon'
    
  • 重新下發祕鑰和配置文件

    [root@ceph01 ceph]# ceph-deploy --overwrite-conf config push ceph01 ceph02 ceph03
    [root@ceph01 ceph]# systemctl list-unit-files |grep mon	'//查看已啓動的含mon列表'
    [email protected]                             enabled        
    lvm2-monitor.service                          enabled        
    ceph-mon.target                               enabled   
    
    
  • 三臺主機重啓mon服務

    [root@ceph01 ceph]# systemctl restart ceph-mon.target
    [root@ceph01 ceph]# ceph -s
    
    
2.3.4:常用命令操作集錦
  • ceph中osd的刪除pool操作

    [root@ceph00 ceph]# ceph osd pool rm cinder cinder --yes-i-really-really-mean-it	'//刪除pool'
    Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool
    [root@ceph00 ceph]# vi /etc/ceph/ceph.conf 	'//配置文件添加允許'
    mon_allow_pool_delete = true
    [root@ceph00 ceph]# systemctl restart ceph-mon.target	'//重啓mon服務'
    [root@ceph00 ceph]# ceph osd pool rm cinder cinder --yes-i-really-really-mean-it	'//刪除成功'
    pool 'cinder' removed
    [root@ceph00 ceph]# ceph osd pool ls
    nova
    glance
    [root@ceph00 ceph]# ceph osd pool rename nova nova999	'//重命名pool'
    pool 'nova' renamed to 'nova999'
    
  • 更多操作請查看之前博客:https://blog.csdn.net/CN_TangZheng/article/details/104758061

2.3.5:實驗結束,謝謝查看!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章