Ceph 存儲集群第一部分:配置和部署


內容來源於官方,經過個人實踐操作整理,官方地址: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.conf (就是當前所在的工作路徑)。

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 交互的配置。

日志、調試

有時候你可能遇到一些麻煩,需要修改日志或調試選項,請參考調試和日志記錄。


免責聲明!

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



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