「網紅架構師」解決你的Ceph 運維難題

歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~javascript

本文由Tstack發表於雲+社區專欄前端

本文爲長篇連續劇,將分多個篇幅發表,主要介紹了從動手部署環境到後期運營故障處理過程當中常見的問題,內容由淺入深,是居家旅行運維Ceph的必備良藥。java

Q1. 環境預準備

絕大多數MON建立的失敗都是因爲防火牆沒有關致使的,亦或是SeLinux沒關閉致使的。必定必定必定要關閉每一個每一個每一個節點的防火牆(執行一次就好,沒安裝報錯就忽視):node

CentOSpython

sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld 
systemctl disable firewalld
# iptables -F
service iptables stop
複製代碼

Q2. 清理環境

MON部署不上的第二大問題就是在舊的節點部署MON,或者在這個節點部署MON失敗了,而後從新newmon create-initial,請查看要部署MON的節點上的/var/lib/ceph/mon/目錄下是否爲空,若是不爲空,說明已經在這個目錄部署過MON,再次部署會檢測子目錄下的done文件,因爲有了這個文件,就不會再創建新的MON數據庫,而且不會覆蓋之,致使了部署時的各類異常,這裏就不贅述了,直接給出萬能清理大法:linux

對於任何須要新部署MON的節點,請到這個節點下執行以下指令,確保環境已經清理乾淨:數據庫

ps aux|grep ceph |awk '{print $2}'|xargs kill -9
ps -ef|grep ceph
#確保此時全部ceph進程都已經關閉!!!若是沒有關閉,多執行幾回。
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/bootstrap-mds/*
rm -rf /var/lib/ceph/bootstrap-osd/*
rm -rf /var/lib/ceph/bootstrap-rgw/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*
複製代碼

請直接複製粘貼,遇到過好些個本身打錯打漏刪了目錄的。bootstrap

Q3. 部署前最後的確認

這裏介紹的都是個案,不過仍是須要提一下:後端

  • 確保每一個節點的hostname都設置正確,而且添加至/etc/hosts文件中,而後同步到全部節點下。克隆出來的虛擬機或者批量建的虛擬機有可能發生此情形。
  • 確保如下目錄在各個節點都存在:
  • /var/lib/ceph/
  • /var/lib/ceph/mon/
  • /var/lib/ceph/osd/
  • /etc/ceph/
  • /var/run/ceph/
  • 上面的目錄,若是Ceph版本大於等於jewel,請確認權限均爲ceph:ceph,若是是root:root,請自行chown

Q4. 安裝Ceph

官網指導方法是使用ceph-deploy install nodeX,可是由於是國外的源,速度慢得使人髮指,因此咱們換到阿里的源,而且使用yum install的方式安裝,沒差啦其實,這樣反而還快點,畢竟多個節點一塊兒裝。安全

不少安裝失敗的都是由於沒有添加epel源請在每一個存儲節點都執行如下指令,來安裝Ceph:

yum clean all
rm -rf /etc/yum.repos.d/*.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo sed -i 's/$releasever/7.2.1511/g' /etc/yum.repos.d/CentOS-Base.repo echo " [ceph] name=ceph baseurl=http://mirrors.aliyun.com/ceph/rpm-hammer/el7/x86_64/ gpgcheck=0 [ceph-noarch] name=cephnoarch baseurl=http://mirrors.aliyun.com/ceph/rpm-hammer/el7/noarch/ gpgcheck=0 " > /etc/yum.repos.d/ceph.repo yum install ceph ceph-radosgw -y 複製代碼

這裏是安裝的hammer版本的Ceph,若是須要安裝jewel版本的,請執行:

sed -i 's/hammer/jewel/' /etc/yum.repos.d/ceph.repo
yum install ceph ceph-radosgw -y
複製代碼

若是安裝了jewel版本的Ceph,想要換回hammer版本的Ceph,能夠執行下面的指令:

卸載Ceph客戶端

rpm -qa |grep `ceph -v |awk '{print $3}'` |xargs rpm -e --nodeps
複製代碼

更改ceph.repo裏面的Ceph版本

sed -i 's/jewel/hammer/' /etc/yum.repos.d/ceph.repo
yum install ceph ceph-radosgw -y
複製代碼

Q5. ceph-deploy

這裏我要開啓話嘮模式:

① Ceph-deploy 是什麼?

Ceph-deploy是Ceph官方給出的用於部署Ceph的一個工具,這個工具幾乎所有是Python寫的腳本,其代碼位於/usr/lib/python2.7/site-packages/ceph_deploy目錄下(1.5.36版本)。最主要的功能就是用幾個簡單的指令部署好一個集羣,而不是手動部署操碎了心,敲錯一個地方就可能失敗。因此對於新人來講,或者說以個人經驗,接觸Ceph少於一個月的,又或者說,集羣規模不上PB的,都沒有必要手動部署,Ceph-deploy徹底足夠了。

② Ceph-deploy怎麼裝?

這個包在ceph的源裏面:

yum install ceph-deploy -y
複製代碼

③Ceph-deploy裝在哪?

既然Ceph-deploy只是個部署Ceph的腳本工具而已,那麼這個工具隨便裝在哪一個節點均可以,並不須要單獨爲了裝這個工具再搞個節點,我通常習慣放在第一個節點,之後好找部署目錄。

④Ceph-deploy怎麼用?

詳細的指令暫時不介紹,下面會有,在安裝好後,須要在這個節點新建一個目錄,用做部署目錄,這裏是強烈建議建一個單獨的目錄的,好比我習慣在集羣的第一個節點下建一個/root/cluster目錄,爲了之後好找。Ceph-deploy的全部的指令都須要在這個目錄下執行。包括new,mon,osd等等一切ceph-deploy的指令都須要在這個部署目錄下執行!最後一遍,全部的ceph-deploy的指令都要在部署目錄下執行!不然就會報下面的錯:

[ceph_deploy][ERROR ] ConfigError: Cannot load config: [Errno 2] No such file or directory: 'ceph.conf'; has ceph-deploy new been run in this directory?
複製代碼

⑤ Ceph-deploy怎麼部署集羣?

咱們暫且把部署目錄所在的節點叫作部署節點。Ceph-deploy經過SSH到各個節點,而後再在各個節點執行本機的Ceph指令來建立MON或者OSD等。因此在部署以前,你須要從部署節點ssh-copy-id到各個集羣節點,使其能夠免祕鑰登錄。

⑥Ceph-deploy部署的日誌在哪裏?

就在部署目錄下面的ceph-deploy-ceph.log文件,部署過程當中產生的全部的日誌都會保存在裏面,好比你大半年前敲的建立OSD的指令。在哪一個目錄下執行ceph-deploy指令,就會在這個目錄下生成log,若是你跑到別的目錄下執行,就會在執行目錄裏生成log再記下第四點的錯。固然,這個LOG最有用的地方仍是裏面記錄的部署指令,你能夠經過cat ceph-deploy-ceph.log |grep "Running command"查看到建立一個集羣所需的全部指令,這對你手動創建集羣或者建立祕鑰等等等等有着很大的幫助!!!

⑦ Ceph-deploy版本

寫這段時的最新的版本號爲1.5.36,下載連接爲ceph-deploy-1.5.36-0.noarch.rpm, 以前的1.5.35裏面有點bug在這個版本被修復了,若是使用1.5.25部署遇到了問題,能夠更新至這個版本,會繞過一些坑。更新到1.5.36以後,腰也不酸了,退了不疼了,Ceph也能部署上了。

Q6. ceph-deploy new 作了什麼

進入部署目錄,執行ceph-deploy new node1 node2 node3,會生成兩個文件(第三個是ceph-deploy-ceph.log,忽視之):

[root@blog cluster]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring
複製代碼

new後面跟的是你即將部署MON的節點的hostname,推薦三個就夠了,須要是奇數個MON節點。不要由於只有兩個節點就搞兩個MON,兩個節點請用一個MON,由於兩個MON掛掉一個,集羣也就掛了,和一個MON掛掉一個效果是同樣的。生成的ceph.conf默認狀況下長成這樣:

[root@blog cluster]# cat ceph.conf 
[global]
fsid = 13b5d863-75aa-479d-84ba-9e5edd881ec9
mon_initial_members = blog
mon_host = 1.2.3.4
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
複製代碼

會調用uuidgen生成一個fsid,用做集羣的惟一ID,再將new後面的主機加入到mon_initial_membersmon_host裏面,剩下的三行你們都是同樣的,默認開啓CephX認證。下面有一節會專門介紹這個,須要注意的是,部署的時候,千萬不要動這三行 下面會有一節介紹之。還有一個文件ceph.mon.keyring

[root@blog cluster]# cat ceph.mon.keyring 
[mon.]
key = AQB1yWRYAAAAABAAhMoAcadfCdy9VtAaY79+Sw==
caps mon = allow *
複製代碼

除了key的內容不同,剩下的都會是同樣的。由於是開啓了CephX認證了,因此MON直接的通信是須要一個祕鑰的,key的內容就是祕鑰。是否是對Ceph裏面的明文認證感到吃驚,有總比沒有強。若是,你再次執行new,會生成新的ceph.conf和新的ceph.mon.keyring,並將以前的這兩個文件給覆蓋掉,新舊文件惟一不一樣的就是fsidkey的內容,可是對Ceph來講,這就是兩個集羣了。這裏說一下我我的很是很是很是反感的一個問題,有的朋友喜歡在/etc/ceph/目錄下面執行ceph-deploy的命令,這麼作和在部署目錄下面作通常是沒有差異的,由於這兩個目錄下面都有ceph.confceph.client.admin.keyring,可是我仍是強烈推薦建立獨立的部署目錄,由於/etc/ceph目錄是Ceph節點的運行目錄,爲了體現各自的功能性,也爲了安全性,請不要在**/etc/ceph**目錄下部署集羣!!!

Q7. 爲ceph-deploy添加參數

Ceph-deploy的log仍是頗有看頭的,查看ceph-deploy new blog(blog是個人一臺主機)的log:

[root@blog cluster]# ceph-deploy new blog
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.36): /usr/bin/ceph-deploy new blog
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  func                          : <function new at 0x288e2a8>
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x28eccf8>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
[ceph_deploy.cli][INFO  ]  mon                           : ['blog']
[ceph_deploy.cli][INFO  ]  public_network                : None
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  cluster_network               : None
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.cli][INFO  ]   fsid                          : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
複製代碼

能夠看到有不少的參數被列出來了,好比:mon : ['blog'],也有不少參數是False或者None, 這些參數可否被設置呢? 由於這裏咱們能夠看到有fsid : None 這個參數,難道集羣的fsid能夠被指定嗎?抱着這些疑惑,我就去看完了ceph-deploy的全部代碼,答案是:能夠設置。全部上面的參數均可以使用參數的形式進行設置,只須要在前面加上兩個--,好比對於fsid能夠執行:

ceph-deploy  new blog --fsid xx-xx-xx-xxxx
複製代碼

若是想要查看每一個執行可指定的參數,能夠-h

[root@blog cluster]# ceph-deploy new -h
usage: ceph-deploy new [-h] [--no-ssh-copykey] [--fsid FSID]
                      [--cluster-network CLUSTER_NETWORK]
                      [--public-network PUBLIC_NETWORK]
                      MON [MON ...]
...
optional arguments:
  -h, --help            show this help message and exit
  --no-ssh-copykey      do not attempt to copy SSH keys
  --fsid FSID           provide an alternate FSID for ceph.conf generation
  --cluster-network CLUSTER_NETWORK
                        specify the (internal) cluster network
  --public-network PUBLIC_NETWORK
                        specify the public network for a cluster
複製代碼

這裏就能夠看到能夠指定--cluster-network--public-network,等等,若是optional arguments裏面沒有介紹這個參數,能夠直接使用--xxarg的方式指定,好比--overwrite-conf--verbose等等,能不能設置這些參數,本身動手試一下就知道了。須要注意的是,參數的位置根據指令而異,好比--overwrite-conf參數是跟在ceph-deploy後面的,而--public-network是跟在new後面的:

ceph-deploy --overwrite-conf --verbose new blog --fsid a-a-a-a
[root@blog cluster]# cat ceph.conf |grep fsid
fsid = a-a-a-a
複製代碼

Q8. Public VS Cluster

若是非要在剛剛生成的ceph.conf裏面添加什麼的話,那麼可能就要加public_network或者cluster_network了。那麼這兩個配置項有什麼用呢?這裏簡單得介紹下Ceph的Public(外網或者叫公網或者前端網)和Cluster(內網或者叫集羣網或者叫後端網)這兩個網絡,在Ceph中,存在如下三種主要的網絡通信關係:

  • client-> mon =>public : 也就是客戶端獲取集羣狀態,或者叫客戶端與MON通信走的網絡,是走的外網。
  • client-> osd => public : 也就是客戶端向OSD直接寫入數據走的也是外網。
  • osd<-> osd => cluster :也就是OSD之間的數據克隆,恢復走的是內網,客戶端寫第一份數據時經過外網寫,對於三副本剩下的兩個副本OSD之間經過內網完成數據複製。當OSD掛掉以後產生的recover,走的也是內網。

一般,咱們會將外網配置爲千兆網,而內網配置成萬兆網,這是有必定緣由的:

  • 客戶端可能由成百上千的計算節點組成,外網配成萬兆成本過高。
  • 存儲節點通常只有幾個到幾十個節點,配置了萬兆內網能夠大大加快故障恢復速度,並且剩餘的兩副本寫速度會大大加快,萬兆網的性價比極高。舉個例子,集羣壞掉一個OSD千兆須要一小時,那麼萬兆網只須要五六分鐘,必定程度上增長了集羣的安全性。

借用官網的這張圖來講明集羣的網絡走勢:再假設你的節點有兩個網段172.23.0.1和3.3.4.1,還記得咱們上一節ceph-deploy new的時候是能夠指定public_networkcluster_network的嗎!若是不指定這兩個參數,那麼ceph-deploy怎麼知道用哪一個IP做爲這個節點的mon_host的IP呢,其實他是隨便選的,若是它選了172網段可是你想使用3.3網段做爲這個節點的mon_host的IP,那麼只須要指定--public-network 172.23.0.0/24 就能夠了,其中的/24就至關於一個掩碼,表示前面的IP的前24位,也就是172.23.0.XXX,只要你的主機上有一個處於這個範圍內的IP,那麼就會選擇這個IP做爲公網IP。相似的,/16表示範圍:172.23.XXX.XXX。 若是想指定內網IP,那麼只要指定--cluster-network 3.3.4.1/24就能夠了。

**通常狀況下,會在new生成的ceph.conf文件里加入public_network配置項以指定公網IP。固然你的MON主機上須要有至少一個IP在公網範圍內。**除了在生成的ceph.conf文件中加入公網IP的方式,咱們還可使用參數的方式來指定公網IP:

[root@ceph-1 cluster]# ceph-deploy new ceph-1 --public-network 172.23.0.0/24
[ceph_deploy.cli][INFO  ] Invoked (1.5.36): /usr/bin/ceph-deploy new ceph-1 --public-network 172.23.0.0/24
[ceph_deploy.cli][INFO  ] ceph-deploy options:
...
[ceph_deploy.cli][INFO  ]  public_network                : 172.23.0.0/24
...
[ceph-1][DEBUG ] IP addresses found: [u'172.23.0.101', u'10.0.2.15']
[ceph_deploy.new][DEBUG ] Resolving host ceph-1
[ceph_deploy.new][DEBUG ] Monitor ceph-1 at 172.23.0.101
[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-1']
[ceph_deploy.new][DEBUG ] Monitor addrs are [u'172.23.0.101']
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
[root@ceph-1 cluster]# cat ceph.conf 
[global]
fsid = d2a2bccc-b215-4f3e-922b-cf6019068e76
public_network = 172.23.0.0/24
mon_initial_members = ceph-1
mon_host = 172.23.0.101
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
複製代碼

查看部署log能夠發現參數配置已經生效,而這個節點有兩個IP,public_nwtwork這個參數限定了公網IP的搜索範圍,生成的ceph.conf文件內也包含了public_network這個參數。

Q9. 參數是下劃線仍是空格分隔

這裏只是簡單的提一下這個小困惑,對於如下的兩個參數書寫方式,哪一種會有問題呢:

public_network = 172.23.0.1/24
public network = 172.23.0.1/24
osd_journal_size = 128
osd journal size = 128
複製代碼

這兩種參數的書寫方式其實都是正確的,說究竟是由於底層調用的是Python的argparse模塊。這兩種方式都是等效的,因此不須要擔憂。

Q10. ceph-deploy mon create-initial如何一次性經過

這一步坑哭了多少迫切加入Ceph世界的新人,看到的最多的就是5s,10s,10s, 15s,20s。。。而後報了錯。再執行,再報錯。因此這裏給出如下的預檢清單,若是被報錯失敗所煩惱,請認真執行各個子項,尤爲是失敗後要執行清理環境:

  1. 請確保全部節點都安裝了Ceph。
  2. 請確保全部節點的防火牆等都關閉了。參考環境預準備一節
  3. 請前往各個MON節點清理乾淨,不論你是否相信這個節點是乾淨的。參考清理環境一節。
  4. 請確保各個MON節點下存在如下目錄,而且對於Jewel版本及以後的請確保目錄權限爲ceph:ceph。參考部署前最後的確認一節。
  5. 請在ceph-deploy new生成的ceph.conf內添加public_network配置項,參考Public VS Cluster一節。

這些總結來之不易,我幫過上百我的解決過部署問題和集羣故障。我相信在認真確認過以後是確定能夠經過的(反正前三點若是有問題通常是不會建好MON的,爲何不認真確認下呢),我遇到過絕大多數都是由於防火牆沒關,或者手動刪除了一些目錄,或者沒有修改權限致使的問題。

相對來講,新環境只要關了防火牆就能夠一次性經過,舊環境或者失敗的環境只要清理環境就能夠經過了。

Q11. mon create-initial 作了什麼

簡單介紹下流程:

  • ceph-deploy讀取配置文件中的

    mon_initial_members
    複製代碼

    的各個主機,而後依次SSH前往各個主機:

    1. 部署目錄下的ceph.conf推送到新節點的/etc/ceph/目錄下。
    2. 建立/var/lib/ceph/mon/$cluster-$hostname/目錄。
    3. 檢查MON目錄下是否有done文件,若是有則直接跳到第6步。
    4. ceph.mon.keyring拷貝到新節點,並利用該祕鑰在MON目錄下創建MON數據庫。
    5. 在MON目錄下創建done文件,防止從新創建MON。
    6. 啓動MON進程。
    7. 查看/var/run/ceph/$cluster-mon.$hostname.asokSOCKET文件,這個是由MON進程啓動後生成的,輸出MON狀態。
  • 在全部的MON都創建好後,再次前往各個主機,查看全部主機是否運行而且到達法定人羣(quorum)。若是有沒到到的,直接結束報錯。若是都到達了,執行下一步。

  • 調用

    auth get-or-create
    複製代碼

    方法建立(若是不存在)或者拉取(已經存在)MON節點上的如下幾個keyring到

    部署目錄

    中:

    • ceph.bootstrap-mds.keyring
    • ceph.bootstrap-osd.keyring
    • ceph.bootstrap-rgw.keyring
    • ceph.client.admin.keyring
  • 指令結束。

Q12. mon create-initial 爲何會失敗

我不喜歡講怎麼作,我願意花很大的篇幅介紹爲何會形成各類各樣的問題,若是知道了緣由,你天然知道該怎麼作,因此纔會理解Ceph,而不是機械的去敲指令。

綜合上面的全部小節,我來總結下這一步失敗的基本上全部可能的緣由:

  • 所謂MON的quorum,至關於多個MON造成的一個羣體,它們之間須要經過網絡發送數據包來通信達成某種協議,若是打開了防火牆,會阻斷數據交流。因此不能構成羣體,一直等待(5s->10s->10s->15s->20s)其餘MON的數據包,既然被阻斷了這樣的等待是沒有意義的,等了30s尚未正常,就能夠直接ctrl+z去檢查了。
  • 我在配置文件裏面添加了pubilc_network,可是有個主機的全部IP都不在公網IP段內,那麼這個MON是建很差的,由於沒有IP用做MON使用,public_network至關於一個過濾器
  • 搭好了一臺虛擬機後,直接克隆了兩臺,沒有修改主機名,致使socket文件路徑名識別錯誤,報了異常,不過這不多發生。
  • 若是在舊的MON節點上再次部署新的MON,再又沒有清理環境,以前的MON數據庫會保留着done文件,MON數據庫裏面仍是記錄着以前fsid,keyring等等,和新集羣是兩套徹底不一樣的,因此這個節點的MON天然到達不了MON羣體。
  • 即便你單單刪除了/var/lib/ceph/mon下的東西,而沒有清理那些keyring,也有可能會由於收集了舊集羣的祕鑰而發生稀奇古怪的問題。
  • 對於Jewel,你一不當心刪除了/var/lib/ceph/mon目錄,或者其餘的OSD目錄或者/var/run/ceph目錄,而後又重建了目錄,依然部署不上,是由於Jewel的全部Ceph指定都是運行在ceph:ceph用戶下的,天然不能在root權限目錄下創建任何文件,修改權限便可。
  • Ceph生成MON數據庫是依照主機的hostname來命名至目錄/var/lib/ceph/mon/${cluster}-${hostname}的,而檢測SOCKET文件則是用ceph.conf裏面的mon_initial_members裏面的名字來檢測的 ,若是mon_initial_members裏面的名字和真是的主機名不一致,就會報錯。

​ 一旦你運行了ceph-deploy mon create-initial指令,而且失敗了,有極大的可能性已經在某些節點創建好了MON的數據庫,再次執行可能會由於舊的環境致使再次失敗,因此若是失敗了,執行一下第二節中的清理環境便可。清理完畢後,再執行ceph-deploy mon create-initial

相關閱讀

RMAN 配置、監控與管理

Hadoop學習11--Ha集羣配置啓動

rsync 服務部署詳解

【每日課程推薦】機器學習實戰!快速入門在線廣告業務及CTR相應知識

此文已由做者受權騰訊雲+社區發佈,更多原文請點擊

搜索關注公衆號「雲加社區」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!

海量技術實踐經驗,盡在雲加社區

相關文章
相關標籤/搜索