Ceph常見問題百科全書


Ceph是目前炙手可熱的一個統一分布式存儲系統,具有優異的性能、可靠性、可擴展性。其可輕松擴展到數 PB 容量, 支持多種工作負載的高性能(每秒輸入/輸出操作[IOPS]和帶寬),具有極其高的可靠性。Ceph對比HDFS優勢在於易擴展,無單點。HDFS是專門為Hadoop這樣的雲計算而生,在離線批量處理大數據上有先天的優勢,而Ceph是一個通用的實時存儲系統,具有相當好的超大數量小文件處理能力,且現在Hadoop可以利用Ceph作為存儲后端。Ceph最近加入到 Linux 中令人印象深刻的文件系統備選行列,能夠在維護 POSIX 兼容性的同時加入了復制和容錯功能,成為現在分布式系統的掌上明珠。

而在Ceph系統的搭建過程中會出現種種意想不到問題,真的是稀奇古怪的讓人意想不到的問題,整個過程中看似每一步都正確,感覺都對,結果還是出現各種問題,更可恨的是其中遇到的很多問題在網上並不能搜索到,有的從國外論壇上能搜索到但是並沒有答案(正如硬件開發時候經常出現都對都不對,重啟一下全都對的情況)。然而對於Ceph這塊重啟並不能解決問題,還需一步一步踏踏實實的進行研究,分析解決問題,並進行總結。

筆者在此對Ceph開發過程中的血淚經驗在此與大家分享,對本人在Ceph研發過程中遇到的錯誤進行記錄並提出解決方案,一來是做個總結,二來是為此后進行Ceph開發的大家指出雷區,使大家少爬一點坑,希望能做出一點微小的貢獻。

 

從基礎環境開始在Ceph環境搭建過程中的常見問題有(在此按照問題出現的頻率進行粗略排序)采用系統為Centos7(謹以此作為示例)

1.      執行命令:#ceph-deploy install admin-node node1 node2 node3

ERROR:[ceph_deploy][ERROR ]RuntimeError: Failed to execute command: yum -y install epel-release

解決辦法:進入/etc/yum.repos.d中刪除epel.repo和epel-testing.repo

2.     執行命令:#ceph-deploy install admin-node node1 node2 node3

ERROR[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: rpm -Uvh --replacepkgs http://ceph.com/rpm-giant/el6/noarch/ceph-release-1-0.el6.noarch.rpm

解決辦法:進入/etc/yum.repos.d/ceph.repo文件將所有的源改為網易163源,或者阿里源(經測試網易163源更好用點)編輯ceph源的配置文件, vim  /etc/yum.repo.d/ceph.repo,更改為如下內容:

 [Ceph]

name=Ceph packages for $basearch

baseurl=http:// mirrors.163.com/ceph /rpm-jewel/el7/$basearch

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https:// mirrors.163.com/ceph /keys/release.asc

priority=1

[Ceph-noarch]

name=Ceph noarch packages

baseurl=http:// mirrors.163.com/ceph /rpm-jewel/el7/noarch

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https:// mirrors.163.com/ceph /keys/release.asc

priority=1

[ceph-source]

name=Ceph source packages

baseurl=http:// mirrors.163.com/ceph /rpm-jewel/el7/SRPMS

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https:// mirrors.163.com/ceph /keys/release.asc

priority=1

編輯完成之后保存退出並運行yum clean all && yum makecache

Ceph官網提供的download.ceph.com在一些情況下非常不好用。在此建議使用網易yum

 

3.     執行命令:#ceph-deploy install admin-node node1 node2 node3

ERROR:[ceph_deploy][ERROR ] RuntimeError: NoSectionError: No section: ‘   ceph’

解決辦法:安裝包沖突,直接移除已經安裝的 rpm(把各個節點的這個包都移除)

    yum remove ceph-release -y

4.     執行命令:#ceph-deploy install admin-node node1 node2 node3

ERROR: [ceph1][INFO  ] Running command: yum -y install ceph ceph-radosgw

[ceph1][WARNIN] No data was received after 300 seconds, disconnecting

[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version

解決辦法:同樣是因為一些不明狀況的網絡問題,(官方網址總是坑人),建議更換網易163源在重新試試

5.     執行命令:# ceph-deploy mon create-initial

ERROR:[ceph1][ERROR ] “ceph auth get-or-create for keytype admin returned 1

解決辦法:ceph.conf 中 public network 配置錯誤,和 mon_host 不在同一個網段。

配置正確的應該是: mon_host = 192.168.122.18  

public network = 192.168.122.18/24

6.     執行命令:#ceph-deploy  osd  prepare node1:/var/local/osd0 …

ERROR: error creating empty object store in /var/local/osd0: (13) Permission denied

[admin-node][ERROR ] RuntimeError: command returned non-zero exitstatus: 1

[ceph_deploy][ERROR ] RuntimeError: Failedto execute command: /usr/sbin/ceph-disk -v activate --mark-init systemd --mount/var/local/osd0

解決辦法:權限不夠 進入到各節點上運行

chmod 777  /var/local/osd0        或者    chmod  –R  777  /var/local/osd1/

chmod 777  /var/local/osd1

7.     執行命令:#ceph-deploy  osd  prepare node1:/var/local/osd0 … 

#ceph-deploy  osd  activate node1:/var/local/osd0 …

ERROR要是在原有的osd基礎之上重新prepare或者activate osd的話,經常會出現already exist    或者[admin-node][ERROR ] RuntimeError: command returned non-zero exitstatus: 1之類這樣的錯誤。

解決辦法:產生此類錯誤的原因均為再重新安裝Ceph的過程中並未將原有的osd進行重新設置,其中還保存有原有的conf信息,並且在集群conf中依舊保存的是原有信息。采用重寫conf命令即可解決,建議在重裝ceph時均采用--overwrite-conf命令

#ceph-deploy --overwrite-conf osd  prepare node1:/var/local/osd0

#ceph-deploy --overwrite-conf osd  activate node1:/var/local/osd0

#ceph-deploy --overwrite-conf mon create-initial 

 

8.     ERROR[admin-node][WARNIN] Anotherapp is currently holding the yum lock; waiting for it to exit... [admin-node][WARNIN] Anotherapp is currently holding the yum lock; waiting for it to exit...

解決辦法:引發此問題的原因為上一次執行yum操作時由於網絡問題或者源頭問題以及防火牆問題等引起上一次yum操作進程並未執行結束,系統仍在執行該進程,解決辦法為關閉此進程。網上博客介紹采用rm -f /var/run/yum.pid命令,但只有部分情況適用。終極必殺技reboot,直接進行reboot,然后進來重新進行操作,包治百病,屢試不爽。

rm -f /var/run/yum.pid    或者 reboot

9.     ERROR:由於多次安裝Ceph導致環境不知道哪里出了問題(新舊錯誤都重疊在一塊了)總之怎么樣都不能正確進行安裝,已經心灰意冷,准備重新安裝。

解決方案再重新安裝之前請留步相信我環境混亂的情況下安裝出現問題最多的地方是ceph-deploy install admin-node node1 node2 node3 總之能不重新安裝就別重新安裝,這中間會引發很多問題。

比較好一點的解決方案,清理Ceph環境,本文在此引用小胖的大話Ceph 的環境清理!

 

如果之前部署失敗了,不必刪除ceph客戶端,或者重新搭建虛擬機,只需要在每個節點上執行如下指令即可將環境清理至剛安裝完ceph客戶端時的狀態!強烈建議在舊集群上搭建之前清理干凈環境,否則會發生各種異常情況。

ps aux|grep ceph |awk '{print $2}'|xargs kill -9

ps -ef|grep ceph

#確保此時所有ceph進程都已經關閉!!!如果沒有關閉,多執行幾次。

umount /var/lib/ceph/osd/*

rm -rf /var/lib/ceph/osd/*

rm -rf /var/lib/ceph/mon/*

rm -rf /var/lib/ceph/mds/*

rm -rf /var/lib/ceph/bootstrap-mds/*

rm -rf /var/lib/ceph/bootstrap-osd/*

rm -rf /var/lib/ceph/bootstrap-rgw/*

rm -rf /var/lib/ceph/tmp/*

rm -rf /etc/ceph/*

rm -rf /var/run/ceph/*

10.  執行命令:#ceph-deploy  osd  prepare node1:/var/local/osd0 … 

#ceph-deploy  osd  activate node1:/var/local/osd0 …

ERRORcan not find /etc/ceph/osd   或者can not find /etc/ceph/mon等錯誤,運行完環境清理之后在進行Ceph安裝部署時仍然會出現很多問題,如在准備以及激活OSD時候會出現如上錯誤,原因是清理環境時候將/ect/ceph/文件夾里邊的所有東西都已經清理啊干凈,系統並不能找到合適的位置進行部署。

解決方案:自己手動在/etc/ceph/文件夾下創建osd mds mon等文件夾

Sudo mkdir /etc/ceph/osd  其他兩個如此。

11.  執行命令:ceph osd tree  ceph -s   ceph health   ceph -w

ERROR:系統卡住什么也不顯示,只能手動切斷該過程,所有ceph有關命令全部失效。那么就會報錯:ERROR: missing keyring。也就是說,用戶client.admin登陸 Ceph 系統失敗! Error connecting to cluster: ObjectNotFound

 

解決辦法:錯誤原因位系統不能找到Client :/etc/ceph/ceph.client.admin.keyring。通常我們執行ceph -s 時,就相當於開啟了一個客戶端,連接到 Ceph 集群,而這個客戶端默認是使用 client.admin 的賬戶密碼登陸連接集群的,所以平時執行的ceph -s 相當於執行了 ceph -s --name client.admin --keyring /etc/ceph/ceph.client.admin.keyring。需要注意的是,每次我們在命令行執行 Ceph 的指令,都相當於開啟一個客戶端,和集群交互,再關閉客戶端。

采用

12.   執行命令:sudo yum update && sudo yum install ceph-deploy

ERROR: 在安裝ceph-deploy工具時常見的錯誤有search for fastest mirror 。。。  302 time out ,或者是404not found等因為網絡的原因無法下載。

解決辦法:如problem  2所示更換網易163源

或者直接構建本地源來進行安裝(在此采用阿里源)

mkdir -p /var/www/html/ceph/10.2.2

cd /var/www/html/ceph/10.2.2

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-base-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-common-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-devel-compat-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-fuse-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-libs-compat-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-mds-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-mon-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-osd-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-radosgw-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-selinux-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/ceph-test-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/cephfs-java-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/libcephfs1-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/libcephfs1-devel-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/libcephfs_jni1-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/libcephfs_jni1-devel-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/librados2-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/librados2-devel-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/libradosstriper1-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/libradosstriper1-devel-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/librbd1-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/librbd1-devel-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/librgw2-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/librgw2-devel-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/python-ceph-compat-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/python-cephfs-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/python-rados-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/python-rbd-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/rbd-fuse-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/rbd-mirror-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/rbd-nbd-10.2.2-0.el7.x86_64.rpm

wget http://mirrors.aliyun.com/ceph/rpm-hammer/el7/noarch/ceph-deploy-1.5.36-0.noarch.rpm

此過程不采用deploy工具

13.  ERROR:mds 狀態一直為creating狀態

ceph mds stat

e6: 1/1/1 up {0=node0=up:creating }, 1 up:standby

解決辦法:產生此原因的問題為在ceph集群狀態還沒有達到HEALTH_OK的狀態下就執行ceph-deploy mds create node 的操作,解決途徑為等ceph狀態為HEALTH_OK時在進行。

14.  ERROR HEALTH_ERR

health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck unclean; no osds monmap e1: 1 mons at {essperf13=209.243.160.45:6789/0}, election epoch 1, quorum 0 essperf13 osdmap e205: 0 osds: 0 up, 0 in pgmap v928: 192 pgs, 3 pools, 0 bytes data, 0 objects 0 kB used, 0 kB / 0 kB avail 192 creating

解決辦法:將各個節點上時間進行同步要不然會出現時間漂移錯誤,使得mon檢測的心跳信息出現問題,解決辦法參考NTP服務器時間同步

15.  啟動關閉ceph或者查看ceph狀態采用(啟動start 關閉 stop 重啟 restart 查看狀態 status)

ceph重啟mon命令以node4的mon為例

systemctl restart ceph-mon@node4.service 

ceph重啟mon命令以node4的mon為例

systemctl restart ceph-osd@osd.0

 ceph重啟命令

systemctl restart ceph.target

16.  重啟ceph時應該先啟動MON在啟動OSD

17.  Ceph pool 中的pg數只能從小到大,不能從大到小

18.  Pg數應該合適,不宜過大或者過小 pg數計算公式為

Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

 

 

 


免責聲明!

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



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