內容來源於官方,經過個人實踐操作整理,官方地址:http://docs.ceph.org.cn/rados/
所有 Ceph 部署都始於 Ceph 存儲集群。
基於 RADOS 的 Ceph 對象存儲集群包括兩類守護進程:term:對象存儲守護進程( OSD )把存儲節點上的數據存儲為對象; term:Ceph 監視器( MON )維護集群運行圖的主拷貝。
一個 Ceph 集群可以包含數千個存儲節點,最簡系統至少需要一個監視器和兩個 OSD 才能做到數據復制。
Ceph 文件系統、 Ceph 對象存儲、和 Ceph 塊設備從 Ceph 存儲集群讀出和寫入數據。
Ceph 存儲集群的某些配置選項是必要的,但大多數都有默認值。典型部署是通過部署工具定義集群、並啟動監視器的,關於 ceph-deploy 的詳情見部署(http://docs.ceph.org.cn/rados/deployment/)。
配置
Ceph 作為集群時可以包含數千個對象存儲設備(OSD)。最簡系統至少需要二個 OSD 做數據復制。要配置 OSD 集群,你得把配置寫入配置文件。 Ceph 對很多選項提供了默認值,你可以在配置文件里覆蓋它們;另外,你可以使用命令行工具修改運行時配置。
Ceph 啟動時要激活三類守護進程:
- ceph-mon (必備)
- ceph-osd (必備)
- ceph-mds (cephfs必備)
各進程、守護進程或工具都會讀取配置文件。一個進程可能需要不止一個守護進程例程的信息(即多個上下文);一個守護進程或工具只有關於單個守護進程例程的信息(單上下文)。
硬盤和文件系統
1.准備硬盤
Ceph 注重數據安全,就是說, Ceph 客戶端收到數據已寫入存儲器的通知時,數據確實已寫入硬盤。使用較老的內核(版本小於 2.6.33 )時,如果日志在原始硬盤上,就要禁用寫緩存;較新的內核沒問題。
用 hdparm 禁用硬盤的寫緩沖功能。
sudo hdparm -W 0 /dev/hda 0
在生產環境,我們建議操作系統和 Ceph OSD 守護進程數據分別放到不同的硬盤。如果必須把數據和系統放在同一硬盤里,最好給數據分配一個單獨的分區。
2.文件系統
Ceph 的 OSD 依賴於底層文件系統的穩定性和性能。
當前,我們推薦部署生產系統時使用 xfs 文件系統;推薦用 btrfs 做測試、開發和其他不太要緊的部署。我們相信,長遠來看 btrfs 適合 Ceph 的功能需求和發展方向,但是 xfs 和 ext4 能提供當前部署所必需的穩定性。
OSD 守護進程有賴於底層文件系統的擴展屬性( XATTR )存儲各種內部對象狀態和元數據。底層文件系統必須能為 XATTR 提供足夠容量, btrfs 沒有限制隨文件的 xattr 元數據總量; xfs 的限制相對大( 64KB ),多數部署都不會有瓶頸; ext4 的則太小而不可用。
使用 ext4 文件系統時,一定要把下面的配置放於 ceph.conf 配置文件的 [osd] 段下;用 btrfs 和 xfs 時可以選填。
filestore xattr use omap = true
配置 Ceph
啟動 Ceph 服務時,初始化進程會把一系列守護進程放到后台運行。 Ceph 存儲集群運行兩種守護進程:
- Ceph 監視器 ( ceph-mon )
- Ceph OSD 守護進程 ( ceph-osd )
要支持 Ceph 文件系統功能,它還需要運行至少一個 Ceph 元數據服務器( ceph-mds );支持 Ceph 對象存儲功能的集群還要運行網關守護進程( radosgw )。為方便起見,各類守護進程都有一系列默認值(很多由 ceph/src/common/config_opts.h 配置),你可以用 Ceph 配置文件覆蓋這些默認值。
1.配置文件
啟動 Ceph 存儲集群時,各守護進程都從同一個配置文件(即默認的 ceph.conf )里查找它自己的配置。手動部署時,你需要創建此配置文件;用部署工具(如 ceph-deploy 、 chef 等)創建配置文件時可以參考下面的信息。配置文件定義了:
- 集群身份
- 認證配置
- 集群成員
- 主機名
- 主機 IP 地址
- 密鑰環路徑
- 日志路徑
- 數據路徑
- 其它運行時選項
默認的 Ceph 配置文件位置相繼排列如下:
$CEPH_CONF
(就是 $CEPH_CONF 環境變量所指示的路徑);-c path/path
(就是 -c 命令行參數);/etc/ceph/ceph.conf
~/.ceph/config
./ceph.con
f (就是當前所在的工作路徑)。
Ceph 配置文件使用 ini 風格的語法,以分號 (😉 和井號 (#) 開始的行是注釋,如下:
# <--A number (#) sign precedes a comment.
; A comment may be anything.
# Comments always follow a semi-colon (;) or a pound (#) on each line.
# The end of the line terminates a comment.
# We recommend that you provide comments in your configuration file(s).
2.配置段落
Ceph 配置文件可用於配置存儲集群內的所有守護進程、或者某一類型的所有守護進程。要配置一系列守護進程,這些配置必須位於能收到配置的段落之下,比如:
[global]
描述: [global] 下的配置影響 Ceph 集群里的所有守護進程。
實例: auth supported = cephx
[osd]
描述: [osd] 下的配置影響存儲集群里的所有 ceph-osd 進程,並且會覆蓋 [global] 下的同一選項。
實例: osd journal size = 1000
[mon]
描述: [mon] 下的配置影響集群里的所有 ceph-mon 進程,並且會覆蓋 [global] 下的同一選項。
實例: mon addr = 10.0.0.101:6789
[mds]
描述: [mds] 下的配置影響集群里的所有 ceph-mds 進程,並且會覆蓋 [global] 下的同一選項。
實例: host = myserver01
[client]
描述: [client] 下的配置影響所有客戶端(如掛載的 Ceph 文件系統、掛載的塊設備等等)。
實例: log file = /var/log/ceph/radosgw.log
全局設置影響集群內所有守護進程的例程,所以 [global]
可用於設置適用所有守護進程的選項。但可以用這些覆蓋 [global]
設置:
- 在 [osd] 、 [mon] 、 [mds] 下更改某一類進程的配置。
- 更改特定進程的設置,如 [osd.1] 。
覆蓋全局設置會影響所有子進程,明確剔除的例外。
典型的全局設置包括激活認證,例如:
[global]
#Enable authentication between hosts within the cluster.
#v 0.54 and earlier
auth supported = cephx
#v 0.55 and after
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
可以統一配置一類守護進程。配置寫到 [osd] 、 [mon] 、 [mds] 下時,無須再指定某個特定例程,即可分別影響所有 OSD 、監視器、元數據進程。
典型的類范疇配置包括日志尺寸、 filestore 選項等,如:
[osd]
osd journal size = 1000
也可以配置某個特定例程。一個例程由類型和及其例程 ID 確定, OSD 的例程 ID 只能是數字,但監視器和元數據服務器的 ID 可包含字母和數字。
[osd.1]
# settings affect osd.1 only.
[mon.a]
# settings affect mon.a only.
[mds.b]
# settings affect mds.b only.
如果你想配置某個 Ceph 網關客戶端,可以用點( . )
分隔的守護進程和例程來指定,例如:
[client.radosgw.instance-name]
# settings affect client.radosgw.instance-name only.
3.元變量
元變量大大簡化了集群配置。 Ceph 會把配置的元變量展開為具體值;元變量功能很強大,可以用在配置文件的 [global] 、 [osd] 、 [mon] 、 [mds] 段里,類似於 Bash 的 shell 擴展。
Ceph 支持下列元變量:
$cluster
描述: 展開為存儲集群名字,在同一套硬件上運行多個集群時有用。
實例: /etc/ceph/$cluster.keyring
默認值: ceph
$type
描述: 可展開為 mds 、 osd 、 mon 中的一個,有賴於當前守護進程的類型。
實例: /var/lib/ceph/$type
$id
描述: 展開為守護進程標識符; osd.0 應為 0 , mds.a 是 a 。
實例: /var/lib/ceph/$type/$cluster-$id
$host
描述: 展開為當前守護進程的主機名。
$name
描述: 展開為 $type.$id 。
實例: /var/run/ceph/$cluster-$name.asok
4.共有選項
硬件推薦段提供了一些配置 Ceph 存儲集群的硬件指導。
一個 Ceph 節點可以運行多個進程,例如一個節點有多個硬盤,可以為每個硬盤配置一個 ceph-osd 守護進程。
理想情況下一台主機應該只運行一類進程,例如:一台主機運行着 ceph-osd 進程,另一台主機運行着 ceph-mds 進程, ceph-mon 進程又在另外一台主機上。
各節點都用 host 選項指定主機名字,監視器還需要用 addr 選項指定網絡地址和端口(即域名或 IP 地址)。基本配置文件可以只指定最小配置。例如:
[global]
mon_initial_members = ceph1
mon_host = 10.0.0.1
host 選項是此節點的短名字,不是全資域名( FQDN ),也不是 IP 地址;執行
hostname -s
即可得到短名字。不要給初始監視器之外的例程設置 host ,除非你想手動部署;一定不能用於 chef 或 ceph-deploy ,這些工具會自動獲取正確結果。
網絡配置參考
網絡配置對構建高性能 Ceph 存儲集群來說相當重要。 Ceph 存儲集群不會代表 Ceph 客戶端執行請求路由或調度,相反, Ceph 客戶端(如塊設備、 CephFS 、 REST 網關)直接向 OSD 請求,然后OSD為客戶端執行數據復制,也就是說復制和其它因素會額外增加集群網的負載。
我們的快速入門配置提供了一個簡陋的 Ceph 配置文件,其中只設置了監視器 IP 地址和守護進程所在的主機名。如果沒有配置集群網,那么 Ceph 假設你只有一個“公共網”。只用一個網可以運行 Ceph ,但是在大型集群里用單獨的“集群”網可顯著地提升性能。
我們建議用兩個網絡運營 Ceph 存儲集群:一個公共網(前端)和一個集群網(后端)。為此,各節點得配備多個網卡.
運營兩個獨立網絡的考量主要有:
- 性能: OSD 為客戶端處理數據復制,復制多份時 OSD 間的網絡負載勢必會影響到客戶端和 Ceph 集群的通訊,包括延時增加、產生性能問題;恢復和重均衡也會顯著增加公共網延時。
- 安全: 大多數人都是良民,很少的一撮人喜歡折騰拒絕服務攻擊( DoS )。當 OSD 間的流量失控時,歸置組再也不能達到 active + clean 狀態,這樣用戶就不能讀寫數據了。挫敗此類攻擊的一種好方法是維護一個完全獨立的集群網,使之不能直連互聯網
1.防火牆
守護進程默認會綁定到 6800:7300 間的端口,你可以更改此范圍。
1.1 監視器防火牆
監視器默認監聽 6789 端口,而且監視器總是運行在公共網。按下例增加規則時,要把 {iface}
替換為公共網接口(如 eth0 、 eth1 等等)、 {ip-address}
替換為公共網 IP 、{netmask}
替換為公共網掩碼。
sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
1.2 MDS 防火牆
元數據服務器會監聽公共網 6800 以上的第一個可用端口。需要注意的是,這種行為是不確定的,所以如果你在同一主機上運行多個 OSD 或 MDS 、或者在很短的時間內重啟了多個守護進程,它們會綁定更高的端口號;所以說你應該預先打開整個 6800-7300 端口區間。按下例增加規則時,要把 {iface}
替換為公共網接口(如 eth0 、 eth1 等等)、 {ip-address}
替換為公共網 IP 、 {netmask}
替換為公共網掩碼。
sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
1.3 OSD 防火牆
OSD 守護進程默認綁定 從 6800 起的第一個可用端口,需要注意的是,這種行為是不確定的,所以如果你在同一主機上運行多個 OSD 或 MDS 、或者在很短的時間內重啟了多個守護進程,它們會綁定更高的端口號。一主機上的各個 OSD 最多會用到 4 個端口:
1 一個用於和客戶端、監視器通訊;
2 一個用於發送數據到其他 OSD ;
3 兩個用於各個網卡上的心跳;
當某個守護進程失敗並重啟時沒釋放端口,重啟后的進程就會監聽新端口。你應該打開整個 6800-7300 端口區間,以應對這種可能性。
如果你分開了公共網和集群網,必須分別為之設置防火牆,因為客戶端會通過公共網連接、而其他 OSD 會通過集群網連接。按下例增加規則時,要把 {iface}
替換為網口(如 eth0 、 eth1 等等)、 {ip-address}
替換為公共網或集群網 IP 、 {netmask}
替換為公共網或集群網掩碼。例如:
sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
如果你的元數據服務器和 OSD 在同一節點上,可以合並公共網配置。
2.Ceph 網絡
Ceph 的網絡配置要放到 [global] 段下。前述的 5 分鍾快速入門提供了一個簡陋的 Ceph 配置文件,它假設服務器和客戶端都位於同一網段, Ceph 可以很好地適應這種情形。然而 Ceph 允許配置更精細的公共網,包括多 IP 和多掩碼;也能用單獨的集群網處理 OSD 心跳、對象復制、和恢復流量。不要混淆你配置的 IP 地址和客戶端用來訪問存儲服務的公共網地址。典型的內網常常是 192.168.0.0 或 10.0.0.0 。
如果你給公共網或集群網配置了多個 IP 地址及子網掩碼,這些子網必須能互通。另外要確保在防火牆上為各 IP 和子網開放了必要的端口。
Ceph 用 CIDR 法表示子網,如 10.0.0.0/24 。
配置完幾個網絡后,可以重啟集群或挨個重啟守護進程。 Ceph 守護進程動態地綁定端口,所以更改網絡配置后無需重啟整個集群。
公共網
要配置一個公共網,把下列選項加到配置文件的 [global] 段下。
[global]
...
public network = {public-network/netmask}
集群網
如果你聲明了集群網, OSD 將把心跳、對象復制和恢復流量路由到集群網,與單個網絡相比這會提升性能。要配置集群網,把下列選項加進配置文件的 [global] 段。
[global]
...
cluster network = {cluster-network/netmask}
為安全起見,從公共網或互聯網到集群網應該是不可達的。
3.Ceph 守護進程
有一個網絡配置是所有守護進程都要配的:各個守護進程都必須指定 host , Ceph 也要求指定監視器 IP 地址及端口。
host 選項是主機的短名,不是全資域名 FQDN ,也不是 IP 地址。在命令行下輸入 hostname -s 獲取主機名。
[mon.a]
host = {hostname}
mon addr = {ip-address}:6789
[osd.0]
host = {hostname}
並非一定要給守護進程設置 IP 地址。如果你有一個靜態配置,且分離了公共網和集群網, Ceph 允許你在配置文件里指定主機的 IP 地址。要給守護進程設置靜態 IP ,可把下列選項加到 ceph.conf 。
[osd.0]
public addr = {host-public-ip-address}
cluster addr = {host-cluster-ip-address}
單網卡OSD、雙網絡集群
一般來說,我們不建議用單網卡 OSD 主機部署兩個網絡。然而這事可以實現,把 public addr 選項配在 [osd.n] 段下即可強制 OSD 主機運行在公共網,其中 n 是其 OSD 號。另外,公共網和集群網必須互通,考慮到安全因素我們不建議這樣做。
4.網絡配置選項
網絡配置選項不是必需的, Ceph 假設所有主機都運行於公共網,除非你特意配置了一個集群網。
公共網
公共網配置用於明確地為公共網定義 IP 地址和子網。你可以分配靜態 IP 或用 public addr 覆蓋 public network 選項。
public network
描述: 公共網(前端)的 IP 地址和掩碼(如 192.168.0.0/24 ),置於 [global] 下。多個子網用逗號分隔。
類型: {ip-address}/{netmask} [, {ip-address}/{netmask}]
是否必需: No
默認值: N/A
public addr
描述: 用於公共網(前端)的 IP 地址。適用於各守護進程。
類型: IP 地址
是否必需: No
默認值: N/A
集群網
集群網配置用來聲明一個集群網,並明確地定義其 IP 地址和子網。你可以配置靜態 IP 或為某 OSD 守護進程配置 cluster addr 以覆蓋 cluster network 選項。
cluster network
描述: 集群網(后端)的 IP 地址及掩碼(如 10.0.0.0/24 ),置於 [global] 下。多個子網用逗號分隔。
類型: {ip-address}/{netmask} [, {ip-address}/{netmask}]
是否必需: No
默認值: N/A
cluster addr
描述: 集群網(后端) IP 地址。置於各守護進程下。
類型: Address
是否必需: No
默認值: N/A
綁定
綁定選項用於設置 OSD 和 MDS 默認使用的端口范圍,默認范圍是 6800:7300 。確保防火牆開放了對應端口范圍。
你也可以讓 Ceph 守護進程綁定到 IPv6 地址。
ms bind port min
描述: OSD 或 MDS 可綁定的最小端口號。
類型: 32-bit Integer
默認值: 6800
是否必需: No
ms bind port max
描述: OSD 或 MDS 可綁定的最大端口號。
類型: 32-bit Integer
默認值: 7300
是否必需: No.
ms bind ipv6
描述: 允許 Ceph 守護進程綁定 IPv6 地址。
類型: Boolean
默認值: false
是否必需: No
主機
Ceph 配置文件里至少要寫一個監視器、且每個監視器下都要配置 mon addr 選項;每個監視器、元數據服務器和 OSD 下都要配 host 選項。
mon addr
描述: {hostname}:{port} 條目列表,用以讓客戶端連接 Ceph 監視器。如果未設置, Ceph 查找 [mon.*] 段。
類型: String
是否必需: No
默認值: N/A
host
描述: 主機名。此選項用於特定守護進程,如 [osd.0] 。
類型: String
是否必需: Yes, for daemon instances.
默認值: localhost
不要用 localhost 。在命令行下執行 hostname -s 獲取主機名(到第一個點,不是全資域名),並用於配置文件。
用第三方部署工具時不要指定 host 選項,它會自行獲取。
TCP
Ceph 默認禁用 TCP 緩沖。
ms tcp nodelay
描述: Ceph 用 ms tcp nodelay 使系統盡快(不緩沖)發送每個請求。禁用 Nagle 算法可增加吞吐量,但會引進延時。如果你遇到大量小包,可以禁用 ms tcp nodelay 試試。
類型: Boolean
是否必需: No
默認值: true
ms tcp rcvbuf
描述: 網絡套接字接收緩沖尺寸,默認禁用。
類型: 32-bit Integer
是否必需: No
默認值: 0
ms tcp read timeout
描述: 如果一客戶端或守護進程發送請求到另一個 Ceph 守護進程,且沒有斷開不再使用的連接,在 ms tcp read timeout 指定的秒數之后它將被標記為空閑。
類型: Unsigned 64-bit Integer
是否必需: No
默認值: 900 15 minutes.
監視器
典型的 Ceph 生產集群至少部署 3 個監視器來確保高可靠性,它允許一個監視器例程崩潰。奇數個監視器( 3 個)確保 PAXOS 算法能確定一批監視器里哪個版本的集群運行圖是最新的。
一個 Ceph 集群可以只有一個監視器,但是如果它失敗了,因沒有監視器數據服務就會中斷。
Ceph 監視器默認監聽 6789 端口,例如:
[mon.a]
host = hostName
mon addr = 150.140.130.120:6789
默認情況下, Ceph 會在下面的路徑存儲監視器數據:
/var/lib/ceph/mon/$cluster-$id
你必須手動或通過部署工具(如 ceph-deploy )創建對應目錄。前述元變量必須先全部展開,名為 “ceph” 的集群將展開為:
/var/lib/ceph/mon/ceph-a
認證
對於 v0.56 及后來版本,要在配置文件的 [global] 中明確啟用或禁用認證。
[global]
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
另外,你應該啟用消息簽名,詳情見 Cephx 配置參考和 Cephx 認證。
建議,升級時先明確地關閉認證,再進行升級。等升級完成后再重新啟用認證。
OSDs
通常, Ceph 生產集群在一個節點上只運行一個 Ceph OSD 守護進程,此守護進程在一個存儲驅動器上只運行一個 filestore ;典型部署需指定日志尺寸。例如:
[osd]
osd journal size = 10000
[osd.0]
host = {hostname} #manual deployments only.
默認情況下, Ceph 認為你把 OSD 數據存儲到了以下路徑:
/var/lib/ceph/osd/$cluster-$id
你必須手動或通過部署工具(如 ceph-deploy )創建對應目錄,名為 “ceph” 的集群其元變量完全展開后,前述的目錄將是:
/var/lib/ceph/osd/ceph-0
你可以用 osd data 選項更改默認值,但我們不建議修改。用下面的命令在新 OSD 主機上創建默認目錄:
ssh {osd-host}
sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
osd data 路徑應該指向一個獨立硬盤的掛載點,這個硬盤應該獨立於操作系統和守護進程所在硬盤。按下列步驟准備好並掛載:
ssh {new-osd-host}
sudo mkfs -t {fstype} /dev/{disk}
sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
我們推薦用 xfs 或 btrfs 文件系統,命令是 :command:mkfs 。
配置詳細步驟見 OSD 配置參考。
心跳
在運行時, OSD 守護進程會相互檢查鄰居 OSD 、並把結果報告給 Ceph 監視器,一般不需要更改默認配置。但如果你的網絡延時比較大,也許需要更改某些選項。
其它細節部分見監視器與 OSD 交互的配置。
日志、調試
有時候你可能遇到一些麻煩,需要修改日志或調試選項,請參考調試和日志記錄。