文章目錄
前言
一:理論部分
1.1:什麼是CEPH?有什麼作用?
-
此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的通過計算方式獲得數據位置的方式不同,另外一種方式是通過一致性哈希方式獲得數據位置。一致性哈希的方式就是將設備做成一個哈希環,然後根據數據名稱計算出的哈希值映射到哈希環的某個位置,從而實現數據定位。
- 哈希環對服務器設備做映射
1.6:完全無中心架構—計算模式(Ceph)
-
下圖是Ceph存儲系統的架構,在該架構中與HDFS不同的地方在於該架構中沒有中心節點。客戶端是通過一個設備映射關係計算出來其寫入數據的位置,這樣客戶端可以直接與存儲節點通信,從而避免中心節點的性能瓶頸。
-
ceph 是一種開源存儲軟件。底層實現了對象存儲,並以此爲基礎對外提供對象存儲接口、塊存儲接口、文件級存儲接口。
-
官方架構圖
-
通俗轉化版
-
名詞解釋
- 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)。
-
ceph 在對象存儲的基礎上提供了更加高級的思想。當對象數量達到了百萬級以上,原生的對象存儲在索引對象時消耗的性能非常大。ceph因此引入了 placement group (pg)的概念。一個PG就是一組對象的集合。
-
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
2.2:實驗拓撲圖
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