ceph簡介
Ceph是一個分布式存儲系統,誕生于2004年,是最早致力于開發下一代高性能分布式文件系統的項目。隨著云計算的發展,ceph乘上了OpenStack的春風,進而成為了開源社區受關注較高的項目之一。
ceph基本結構
自下向上,可以將Ceph系統分為四個層次:
1.基礎存儲系統RADOS(Reliable, Autonomic, Distributed Object Store,即可靠的、自動化的、分布式的對象存儲)
RADOS本身也是分布式存儲系統,CEPH所有的存儲功能都是基于RADOS實現,RADOS由大量的存儲設備節點組成,每個節點擁有自己的硬件資源(CPU、內存、硬盤、網絡),并運行著操作系統和文件系統。
2.基礎庫librados
這一層的功能是對RADOS進行抽象和封裝,并向上層提供API,以便直接基于RADOS(而不是整個Ceph)進行應用開發。
3.高層應用接口
這一層包括了三個部分:RADOS GW(RADOS Gateway)、 RBD(Reliable Block Device)和Ceph FS(Ceph File System),其作用是在librados庫的基礎上提供抽象層次更高、更便于應用或客戶端使用的上層接口。
其中,RADOS GW是一個提供與Amazon S3和Swift兼容的RESTful API的gateway,以供相應的對象存儲應用開發使用。RADOS GW提供的API抽象層次更高,但功能則不如librados強大。因此,開發者應針對自己的需求選擇使用。
RBD則提供了一個標準的塊設備接口,常用于在虛擬化的場景下為虛擬機創建volume。目前,Red Hat已經將RBD驅動集成在KVM/QEMU中,以提高虛擬機訪問性能。
Ceph FS是一個POSIX兼容的分布式文件系統。由于還處在開發狀態,因而Ceph官網并不推薦將其用于生產環境中
4.應用層
這一層就是不同場景下對于Ceph各個應用接口的各種應用方式,例如基于librados直接開發的對象存儲應用,基于RADOS GW開發的對象存儲應用,基于RBD實現的云硬盤等等。
Ceph基本組件
- Osd
用于集群中所有數據與對象的存儲。處理集群數據的復制、恢復、回填、再均衡。并向其他osd守護進程發送心跳,然后向Mon提供一些監控信息。 - Monitor
監控整個集群的狀態,維護集群的cluster MAP二進制表,保證集群數據的一致性。ClusterMAP描述了對象塊存儲的物理位置,以及一個將設備聚合到物理位置的桶列表。 - MDS(可選)
為Ceph文件系統提供元數據計算、緩存與同步。在ceph中,元數據也是存儲在osd節點中的,mds類似于元數據的代理緩存服務器。MDS進程并不是必須的進程,只有需要使用CEPHFS時,才需要配置MDS節點。
ceph數據的存儲過程
Ceph系統中的尋址流程如下圖所示:
無論使用哪種存儲方式(對象、塊、掛載),存儲的數據都會被切分成對象(Objects)。Objects size大小可以由管理員調整,通常為2M或4M。每個對象都會有一個唯一的OID,由
ino與ono生成。ino即是文件的File ID,用于在全局唯一標示每一個文件,而ono則是分片的編號。比如:一個文件FileID為A,它被切成了兩個對象,一個對象編號0,另一個編號1,那么這兩個文件的oid則為A0與A1。Oid的好處是可以唯一標示每個不同的對象,并且存儲了對象與文件的從屬關系。
但是對象并不會直接存儲進OSD中,因為對象的size很小,在一個大規模的集群中可能有幾百到幾千萬個對象。這么多對象光是遍歷尋址,速度都是很緩慢的;并且如果將對象直接通過某種固定映射的哈希算法映射到osd上,當這個osd損壞時,對象無法自動遷移至其他osd上面(因為映射函數不允許)。為了解決這些問題,ceph引入了歸置組的概念,即PG。
PG是一個邏輯概念,我們linux系統中可以直接看到對象,但是無法直接看到PG。它在數據尋址時類似于數據庫中的索引:每個對象都會固定映射進一個PG中,所以當我們要尋找一個對象時,只需要先找到對象所屬的PG,然后遍歷這個PG就可以了,無需遍歷所有對象。而且在數據遷移時,也是以PG作為基本單位進行遷移,ceph不會直接操作對象。
對象映射進PG的方式:使用靜態hash函數對OID做hash取出特征碼,用特征碼與PG的數量去模,得出PGID。
最后PG會根據管理員設置的副本數量進行復制,然后通過crush算法存儲到不同的OSD節點上。
ceph-deploy快速安裝
說明,此例中一個mon節點,兩個osd節點,hostname分別為:test-ceph-1,test-ceph-2,test-ceph-3
mons節點必須能夠通過 SSH 無密碼地訪問各 Ceph 節點
配置好相應的源,國內推薦使用有云UDS的源,創建/etc/yum.repos.d/ceph.repo如下:
[ceph]
name=UDS Packages for CentOS 7
baseurl=http://uds.ustack.com/repo/Azeroth/el7/
enabled=1
gpgcheck=0
priority=1
[ceph-noarch]
name=UDS Packages for CentOS 7
baseurl=http://uds.ustack.com/repo/Azeroth/el7/
enabled=1
gpgcheck=0
priority=1
[ceph-source]
name=UDS Packages for CentOS 7
baseurl=http://uds.ustack.com/repo/Azeroth/el7/
enabled=1
gpgcheck=0
priority=1
安裝 ceph-deploy:
yum install ceph-deploy
如果安裝了firewalld,那么需要:
firewall-cmd --zone=public --add-port=6789/tcp --permanent
若使用 iptables,要開放 Ceph Monitors 使用的 6789 端口和 OSD 使用的 6800:7300 端口范圍:
iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
/sbin/service iptables save
在 CentOS 和 RHEL 上, SELinux 默認為 Enforcing 開啟狀態。為簡化安裝,我們建議把 SELinux 設置為 Permissive 或者完全禁用,也就是在加固系統配置前先確保集群的安裝、配置沒問題。用下列命令把 SELinux 設置為 Permissive :
setenforce 0
在mon節點上,用 ceph-deploy 執行如下步驟:
1.創建集群
ceph-deploy new test-ceph-1
2.把 Ceph 配置文件里的默認副本數從 3 改成 2 ,這樣只有兩個 OSD 也可以達到 active + clean 狀態。把下面這行加入/etc/ceph/ceph.conf的[global]段:
osd_pool_default_size = 2
3.安裝 Ceph
ceph-deploy install test-ceph-1 test-ceph-2 test-ceph-3
4.配置初始 monitor(s)、并收集所有密鑰:
ceph-deploy mon create-initial
完成上述操作后,當前目錄里應該會出現這些密鑰環:
{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring
5.添加兩個 OSD
登錄test-ceph-2執行:
mkdir /var/local/osd0
登錄test-ceph-3執行:
mkdir /var/local/osd1
然后,從mon節點執行 ceph-deploy 來準備 OSD:
ceph-deploy osd prepare test-ceph-2:/var/local/osd0 test-ceph-3:/var/local/osd1
激活 OSD :
ceph-deploy osd activate test-ceph-2:/var/local/osd0 test-ceph-3:/var/local/osd1
6.用 ceph-deploy 把配置文件和 admin 密鑰拷貝到mon節點和osd節點,這樣你每次執行 Ceph 命令行時就無需指定 monitor 地址和 ceph.client.admin.keyring 了:
ceph-deploy admin test-ceph-1 test-ceph-2 test-ceph-3
7.確保你對 ceph.client.admin.keyring 有正確的操作權限。
chmod +r /etc/ceph/ceph.client.admin.keyring
8.驗證
ceph手動部署
mon節點為test-ceph-1,osd節點為test-ceph-2,test-ceph-3
mons節點必須能夠通過 SSH 無密碼地訪問各 Ceph 節點
配置好相應的ceph源
密鑰下載:
不管你是用倉庫還是手動下載,你都需要用密鑰校驗軟件包。如果你沒有密鑰,就會收到安全警告。有兩個密鑰:一個用于發布(常用)、一個用于開發(僅適用于程序員和 QA )
執行下列命令安裝 release.asc 密鑰:
sudo rpm --import 'https://download.ceph.com/keys/release.asc'
執行下列命令安裝 autobuild.asc 密鑰(僅對 QA 和開發者):
sudo rpm --import 'https://download.ceph.com/keys/autobuild.asc'
部署步驟如下:
1.mon節點和osd節點安裝 yum-plugin-priorities、ceph和依賴包:
yum install yum-plugin-priorities snappy leveldb gdisk python-argparse gperftools-libs ceph
2.mon節點部署
2.1登錄到監視器節點, 確保保存 Ceph 配置文件的目錄存在
2.2創建 Ceph 配置文件, Ceph 默認使用 ceph.conf
2.3給集群分配惟一 ID (即 fsid ),并把此 ID 寫入 Ceph 配置文件
uuidgen
寫入ceph.conf
[global]
fsid = {UUID}
2.4把初始監視器寫入 Ceph 配置文件
mon_initial_members = test-ceph-1
2.5初始監視器的 IP 地址寫入 Ceph 配置文件
mon_host = 10.0.86.23
2.6為此集群創建密鑰環、并生成監視器密鑰
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
2.7生成管理員密鑰環,生成 client.admin 用戶并加入密鑰環
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
2.8把 client.admin 密鑰加入 ceph.mon.keyring
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
2.9用規劃好的主機名、對應 IP 地址、和 FSID 生成一個監視器圖,并保存為 /tmp/monmap
monmaptool --create --add test-ceph-1 10.0.86.23 --fsid {UUID} /tmp/monmap
2.10在監視器主機上分別創建數據目錄。
mkdir /var/lib/ceph/mon/ceph-test-ceph-1
2.11創建一個boot引導啟動osd的key
mkdir -p /var/lib/ceph/bootstrap-osd/
ceph-authtool -C /var/lib/ceph/bootstrap-osd/ceph.keyring
2.12用監視器圖和密鑰環組裝守護進程所需的初始數據。
ceph-mon --mkfs -i test-ceph-1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
2.13仔細斟酌 Ceph 配置文件,公共的全局配置包括這些:
[global]
fsid = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
mon_initial_members = test-ceph-1
mon_host = 10.0.86.23
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
auth_supported = cephx
osd_pool_default_size = 2
把監視器節點的/etc/ceph/ceph.conf 和ceph.client.admin.keyring 拷貝到test-ceph-2,test-ceph3,這一步不要忘記!!!
2.14建一個空文件 done ,表示監視器已創建、可以啟動了
touch /var/lib/ceph/mon/ceph-test-ceph-1/done
touch /var/lib/ceph/mon/ceph-test-ceph-1/sysvinit
2.15啟動監視器
service ceph start mon.test-ceph-1
3.osd節點部署
注意:如果osd盤不是本地目錄,那么請忽略3.1-3.3,直接執行3.4即可。
3.1創建本地目錄當做osd盤
在 test-ceph-2 上執行:
mkdir /var/local/osd0
在 test-ceph-3 上執行:
mkdir /var/local/osd1
3.2準備OSD
在test-ceph-2、test-ceph-3上執行:
ceph osd create
這條命令會輸出創建的osd number
3.3創建軟鏈接。
在 test-ceph-2 上執行:
ln -s /var/local/osd0 /var/lib/ceph/osd/ceph-0
在 test-ceph-3 上執行:
ln -s /var/local/osd0 /var/lib/ceph/osd/ceph-0
3.4如果osd不是本地目錄,需要以下操作:
在 test-ceph-2 上執行:
根據設備名替換下面的/dev/vdb
mkfs.xfs -f /dev/vdb
mkdir -p /var/lib/ceph/osd/ceph-0
mount /dev/vdb /var/lib/ceph/osd/ceph-0
mount -o remount,user_xattr /var/lib/ceph/osd/ceph-0
vi /etc/fstab
>>
/dev/vdb /var/lib/ceph/osd/ceph-0 xfs defaults 0 0
/dev/vdb /var/lib/ceph/osd/ceph-0 xfs remount,user_xattr 0 0
<<
在 test-ceph-3 上執行:
根據設備名替換下面的/dev/vdc
mkfs.xfs -f /dev/vdc
mkdir -p /var/lib/ceph/osd/ceph-1
mount /dev/vdc /var/lib/ceph/osd/ceph-1
mount -o remount,user_xattr /var/lib/ceph/osd/ceph-0
vi /etc/fstab
>>
/dev/vdc /var/lib/ceph/osd/ceph-0 xfs defaults 0 0
/dev/vdc /var/lib/ceph/osd/ceph-0 xfs remount,user_xattr 0 0
<<
3.5初始化 OSD 數據目錄:
在test-ceph-2、test-ceph-3上執行:
ceph-osd -i {osd-num} --mkfs --mkkey
3.6注冊此 OSD 的密鑰
在test-ceph-2、test-ceph-3上執行:
ceph auth add osd.{osd-num} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/{cluster-name}-{osd-num}/keyring
3.7把此節點加入 CRUSH 圖
在 test-ceph-2 上執行:
ceph osd crush add-bucket test-ceph-2 host
在 test-ceph-3 上執行:
ceph osd crush add-bucket test-ceph-3 host
3.8把此 Ceph 節點放入 default 根下
在 test-ceph-2 上執行:
ceph osd crush move test-ceph-2 root=default
在 test-ceph-3 上執行:
ceph osd crush move test-ceph-3 root=default
3.9.分配權重、重新編譯、注入集群
在 test-ceph-2 上執行:
下面的1.0表示權重,需要根據磁盤大小自行調整權重
ceph osd crush add osd.0 1.0 host=test-ceph-2
在 test-ceph-3 上執行:
ceph osd crush add osd.0 1.0 host=test-ceph-3
3.10.創建一個空文件:
在test-ceph-2、test-ceph-3上執行:
touch /var/lib/ceph/osd/{cluster-name}-{osd-num}/sysvinit
3.11.用 sysvinit 啟動
在test-ceph-2、test-ceph-3上執行:
service ceph start osd.{osd-num}
puppet-ceph部署
目前部署方式可以有Puppet和Ceph-deploy, 目前生產環境中主要使用Puppet來進行部署。Ceph-deploy的部署方式主要是為了滿足快速驗證的需求。一般推薦在生產環境中使用Puppet來部署,這樣方便后續環境的維護。
在puppet master module目錄下下載puppet-ceph
openstack/puppet-ceph 使用ceph版本為hammer
部署節點同上,mon節點為test-ceph-1,osd節點為test-ceph-2,test-ceph-3
各節點加載的類:
node /^test-ceph-1$/ {
$ceph_pools = ['test']
ceph::pool { $ceph_pools: }
class { '::ceph::profile::mon': }
}
node /^test-ceph-[2-3]$/ {
class { '::ceph::profile::osd': }
}
傳的hieradata:
common/ceph.yaml:
---
######## Ceph
ceph::profile::params::release: 'hammer'
######## Ceph.conf
ceph::profile::params::fsid: '4b5c8c0a-ff60-454b-a1b4-9747aa737d19'
ceph::profile::params::authentication_type: 'cephx'
ceph::profile::params::mon_initial_members: 'test-ceph-1'
ceph::profile::params::mon_host: '10.0.86.23:6789'
ceph::profile::params::osd_pool_default_size: '2'
######## Keys
ceph::profile::params::mon_key: 'AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg=='
ceph::profile::params::client_keys:
'client.admin':
secret: 'AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg=='
mode: '0600'
cap_mon: 'allow *'
cap_osd: 'allow *'
cap_mds: 'allow *'
'client.bootstrap-osd':
secret: 'AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg=='
keyring_path: '/var/lib/ceph/bootstrap-osd/ceph.keyring'
cap_mon: 'allow profile bootstrap-osd'
test-ceph-2.yaml:
ceph::profile::params::osds:
'/dev/sdb':
journal: ''
test-ceph-3.yaml:
ceph::profile::params::osds:
'/dev/sdc':
journal: ''
puppet會執行 ceph-disk prepare /dev/sdc ,如果journal為空,它會把自動把這塊盤分成兩個分區,一個為ceph data ,一個為ceph journal。journal分區大小默認為5G,剩下的
都分給ceph data.
Journal的作用類似于mysql innodb引擎中的事物日志系統。當有突發的大量寫入操作時,ceph可以先把一些零散的,隨機的IO請求保存到緩存中進行合并,然后再統一向內核發起IO請求。journal的io是非常密集的,很大程度上也損耗了硬件的io性能,所以通常在生產環境中,推薦使用ssd來單獨存儲journal文件以提高ceph讀寫性能。
journal也可以使用單獨的數據盤,只需要在hieradata中傳遞相應的設備名即可。
openstack/puppet-ceph 傳osds參數不支持wwn的方式,因為ceph-disk當前不支持使用wwn來作為磁盤標識的輸入參數。
如果重啟了mon節點,需要執行:
如果重啟了mon節點,需要執行:
service ceph start mon.test-ceph-1
如果重啟了osd節點,需要執行:
ceph-disk activate-all
activate-all 靠 /dev/disk/by-parttype-uuid/$typeuuid.$uuid 發現所有分區
parttype-uuid 是在執行activate-prepare 時生成的。通過parttypeuuid,在本機插拔盤完全不會導致故障。
puppet執行過程分析
創建mon的大致過程如下:
1.安裝包
package { $::ceph::params::packages :
ensure => $ensure,
tag => 'ceph'
}
2.是否開啟認證
# [*authentication_type*] Activate or deactivate authentication
# Optional. Default to cephx.
# Authentication is activated if the value is 'cephx' and deactivated
# if the value is 'none'. If the value is 'cephx', at least one of
# key or keyring must be provided.
if $authentication_type == 'cephx' {
ceph_config {
'global/auth_cluster_required': value => 'cephx';
'global/auth_service_required': value => 'cephx';
'global/auth_client_required': value => 'cephx';
'global/auth_supported': value => 'cephx';
}
3.生成mon密鑰
cat > ${keyring_path} << EOF
[mon.]
key = ${key}
caps mon = \"allow *\"
EOF
chmod 0444 ${keyring_path}
4.生成/etc/ceph/ceph.client.admin.keyring文件
touch /etc/ceph/${cluster_name}.client.admin.keyring
5.初始化monitor服務,創建done,sysvinit空文件
mon_data=\$(ceph-mon ${cluster_option} --id ${id} --show-config-value mon_data)
if [ ! -d \$mon_data ] ; then
mkdir -p \$mon_data
if ceph-mon ${cluster_option} \
--mkfs \
--id ${id} \
--keyring ${keyring_path} ; then
touch \$mon_data/done \$mon_data/${init} \$mon_data/keyring
else
rm -fr \$mon_data
fi
fi
6.啟動mon服務:
service ceph start mon.test-ceph-xue-1
創建osd的大致過程如下:
1.安裝包
package { $::ceph::params::packages :
ensure => $ensure,
tag => 'ceph'
}
2.是否開啟認證
# [*authentication_type*] Activate or deactivate authentication
# Optional. Default to cephx.
# Authentication is activated if the value is 'cephx' and deactivated
# if the value is 'none'. If the value is 'cephx', at least one of
# key or keyring must be provided.
if $authentication_type == 'cephx' {
ceph_config {
'global/auth_cluster_required': value => 'cephx';
'global/auth_service_required': value => 'cephx';
'global/auth_client_required': value => 'cephx';
'global/auth_supported': value => 'cephx';
}
3.創建keyring file
if ! defined(File[$keyring_path]) {
file { $keyring_path:
ensure => file,
owner => $user,
group => $group,
mode => $mode,
require => Package['ceph'],
}
}
4.生成管理員密鑰環,生成 client.admin 用戶并加入密鑰環
ceph-authtool \$NEW_KEYRING --name '${name}' --add-key '${secret}' ${caps}
5.把 client.admin 密鑰加入 ceph.mon.keyring
ceph ${cluster_option} ${inject_id_option} ${inject_keyring_option} auth import -i ${keyring_path}"
6.ceph 0.94版本下禁用udev rules,否則,可能會導致ceph-disk activate失敗
mv -f ${udev_rules_file} ${udev_rules_file}.disabled && udevadm control --reload
7.使用ceph-disk prepare 做預處理
預處理用作 Ceph OSD 的目錄、磁盤。它會創建 GPT 分區、給分區打上 Ceph 風格的 uuid 標記、創建文件系統、把此文件系統標記為已就緒、使用日志磁盤的整個分區并新增一分區。可單獨使用,也可由 ceph-deploy 用。
if ! test -b ${data} ; then
mkdir -p ${data}
fi
ceph-disk prepare ${cluster_option} ${data} ${journal}
udevadm settle
8.激活 Ceph OSD
激活 Ceph OSD 。先把此卷掛載到一臨時位置,分配 OSD 惟一標識符(若有必要),重掛載到正確位置
ceph-disk activate ${data}
ceph常見命令
查看ceph集群的運行狀態信息:
root@test-ceph-1 ~]# ceph -s
cluster b60db21f-6735-4909-a0bb-c550b4659bfc
health HEALTH_OK
monmap e1: 1 mons at {test-ceph-xue-1=30.20.10.9:6789/0}
election epoch 2, quorum 0 test-ceph-xue-1
osdmap e10: 1 osds: 1 up, 1 in
pgmap v642: 256 pgs, 4 pools, 0 bytes data, 0 objects
6865 MB used, 13603 MB / 20469 MB avail
256 active+clean
auth命令
1.查看認證狀態
[root@test-ceph-1 ~]# ceph auth list
installed auth entries:
osd.0
key: AQDRPn9YgQESIhAA/n4KnNPlS3OXwX5W5c2s9w==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg==
caps: [mds] allow *
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
key: AQATGHJTUCBqIBAA7M2yafV1xctn1pgr3GcKPg==
caps: [mon] allow profile bootstrap-osd
2.添加指定實例的認證信息
# 使用方法: ceph auth get-or-create 實例名稱 對象1 權限1 對象2 權限2
[root@test-ceph-1 ~]# ceph auth get-or-create client.admin mds 'allow *' osd 'allow *' mon 'allow *'
3.刪除指定實例及其認證信息
# 使用方法: ceph auth del 實例名稱
ceph auth del client.bootstrap-mds
pool命令
1.打印pool列表
ceph osd lspools
2.創建pool
通常在創建pool之前,需要覆蓋默認的pg_num,官方推薦:
若少于5個OSD, 設置pg_num為128。
5~10個OSD,設置pg_num為512。
10~50個OSD,設置pg_num為4096。
超過50個OSD,可以參考pgcalc計算。
ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
[crush-ruleset-name] [expected-num-objects]
ceph osd pool create {pool-name} {pg-num} {pgp-num} erasure \
[erasure-code-profile] [crush-ruleset-name] [expected_num_objects]
創建一個test-pool,pg_num為128:
ceph osd pool create test-pool 128
3.重命名pool
ceph osd pool rename test-pool test-pool-new
4.刪除pool
刪除一個pool會同時清空pool的所有數據,因此非常危險。(和rm -rf /類似)。因此刪除pool時ceph要求必須輸入兩次pool名稱,同時加上--yes-i-really-really-mean-it選項。
ceph osd pool delete test-pool test-pool --yes-i-really-really-mean-it
5.顯示所有pool詳細信息
rados df
6.元數據信息
通過以下語法設置pool的元數據:
ceph osd pool set {pool-name} {key} {value}
比如設置pool的冗余副本數量為3:
ceph osd pool set test-pool size 3
通過get操作能夠獲取pool的配置值,比如獲取當前pg_num:
ceph osd pool get test-pool pg_num
獲取當前副本數:
ceph osd pool get test-pool size
mon命令
1.顯示mon的狀態信息
[root@test-ceph-1 ~]# ceph mon stat
e1: 1 mons at {test-ceph-1=30.20.10.9:6789/0}, election epoch 2, quorum 0 test-ceph-1
2.格式化輸出mon map信息
[root@test-ceph-1 ~]# ceph mon dump
dumped monmap epoch 1
epoch 1
fsid b60db21f-6735-4909-a0bb-c550b4659bfc
last_changed 0.000000
created 0.000000
0: 30.20.10.9:6789/0 mon.test-ceph-1
3.刪除當前集群中指定的mon
ceph mon remove test-ceph-1
osd命令
1.顯示OSD map的匯總信息
[root@test-ceph-1 ~]# ceph osd stat
osdmap e10: 1 osds: 1 up, 1 in
2.顯示OSD tree
[root@test-ceph-1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.01999 root default
-2 0.01999 host test-ceph-1
0 0.01999 osd.0 up 1.00000 1.00000
3.顯示OSD的延遲匯總信息
ceph osd perf
4.查看OSD的使用率
ceph osd df
5.將指定OSD置為down狀態
ceph osd down {osd-num}
6.將指定OSD置為out狀態
ceph osd out {osd-number}
CRUSH 圖
CRUSH算法通過計算數據存儲位置來確定如何存儲和檢索。 CRUSH 授權 Ceph 客戶端直接連接 OSD ,而非通過一個中央服務器或經紀人。數據存儲、檢索算法的使用,使 Ceph 避免了單點故障、性能瓶頸、和伸縮的物理限制。
CRUSH圖包含 OSD 列表、把設備匯聚為物理位置的“桶”列表和指示 CRUSH 如何復制存儲池里的數據的規則列表。
CRUSH圖主要有 4 個主要段落:
1.設備
設備的格式:
#devices
device {num} {osd.name}
2.桶類型: 定義了 CRUSH 分級結構里要用的桶類型( types )
如:
# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root
3.桶例程: 定義了桶類型后,還必須聲明主機的桶類型、以及規劃的其它故障域。
格式:
[bucket-type] [bucket-name] {
id [a unique negative numeric ID]
weight [the relative capacity/capability of the item(s)]
alg [the bucket type: uniform | list | tree | straw ]
hash [the hash type: 0 by default]
item [item-name] weight [weight]
}
Ceph 支持四種桶,每種都是性能和組織簡易間的折衷。如果你不確定用哪種桶,我們建議 straw 。關于桶類型的詳細討論: 桶類型
各個桶都用了一種哈希算法,當前 Ceph 僅支持 rjenkins1 ,輸入 0 表示哈希算法設置為 rjenkins1 。
如下面這個例子:
定義的桶例程為:
host node1 {
id -1
alg straw
hash 0
item osd.0 weight 1.00
item osd.1 weight 1.00
}
host node2 {
id -2
alg straw
hash 0
item osd.2 weight 1.00
item osd.3 weight 1.00
}
rack rack1 {
id -3
alg straw
hash 0
item node1 weight 2.00
item node2 weight 2.00
}
此例中,機柜桶不包含任何 OSD ,它只包含低一級的主機桶、以及其內條目的權重之和
4.規則: 由選擇桶的方法組成。
規則格式如下:
rule <rulename> {
ruleset <ruleset>
type [ replicated | erasure ]
min_size <min-size>
max_size <max-size>
step take <bucket-type>
step [choose|chooseleaf] [firstn|indep] <N> <bucket-type>
step emit
}
各字段含義如下
4.1ruleset
描述: 區分一條規則屬于某個規則集的手段。給存儲池設置規則集后激活。
??目的: 規則掩碼的一個組件。
??類型: Integer
??是否必需: Yes
??默認值: 0
4.2type
描述: 為硬盤(復制的)或 RAID 寫一條規則。
??目的: 規則掩碼的一個組件。
??類型: String
??是否必需: Yes
??默認值: replicated
??合法取值: 當前僅支持 replicated 和 erasure
4.3min_size
描述: 如果一個歸置組副本數小于此數, CRUSH 將不應用此規則。
??類型: Integer
??目的: 規則掩碼的一個組件。
??是否必需: Yes
??默認值: 1
4.4max_size
??描述: 如果一個歸置組副本數大于此數, CRUSH 將不應用此規則。
??類型: Integer
??目的: 規則掩碼的一個組件。
??是否必需: Yes
??默認值: 10
4.5step take <bucket-name>
描述: 選取桶名并迭代到樹底。
??目的: 規則掩碼的一個組件。
??是否必需: Yes
??實例: step take default
4.6step chooseleaf firstn {num} type {bucket-type}
描述: 選擇 {bucket-type} 類型的一堆桶,并從各桶的子樹里選擇一個葉子節點。集合內桶的數量通常是存儲池的副本數(即 pool size )。
????如果 {num} == 0 選擇 pool-num-replicas 個桶(所有可用的);
????如果 {num} > 0 && < pool-num-replicas 就選擇那么多的桶;
????如果 {num} < 0 它意為 pool-num-replicas - {num} 。
??目的: 規則掩碼的一個組件。 它的使用避免了通過兩步來選擇一設備。
??先決條件: Follows step take or step choose.
??實例: step chooseleaf firstn 0 type row
4.7step emit
描述: 輸出當前值并清空堆棧。通常用于規則末尾,也適用于相同規則應用到不同樹的情況。
??目的: 規則掩碼的一個組件。
??先決條件: Follows step choose.
??實例: step emit
新版本的 CRUSH (從 0.48 起)為了解決一些遺留值導致幾個不當行為,在最前面加入了一些參數值。
CRUSH 圖內容:
# begin crush map
tunable choose_local_tries 0 #本地重試次數。以前是 2 ,最優值是 0 。
tunable choose_local_fallback_tries 0 #以前 5 ,現在是 0
tunable choose_total_tries 50 #選擇一個條目的最大嘗試次數。以前 19 ,后來的測試表明,對典型的集群來說 50 更合適。最相當大的集群來說,更大的值也許必要。
tunable chooseleaf_descend_once 1 #是否重遞歸葉子選擇,或只試一次、并允許最初歸置組重試。以前默認 0 ,最優為 1 。
tunable straw_calc_version 1
# devices
device 0 osd.0
device 1 osd.1
device 2 osd.2
# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root
# buckets
host server-250 {
id -2 # do not change unnecessarily
# weight 2.160
alg straw
hash 0 # rjenkins1
item osd.0 weight 0.720
item osd.1 weight 0.720
item osd.2 weight 0.720
}
root default {
id -1 # do not change unnecessarily
# weight 2.160
alg straw
hash 0 # rjenkins1
item server-250 weight 2.160
}
# rules
rule replicated_ruleset {
ruleset 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type osd
step emit
}
# end crush map
部署ceph all-in-one遇到的問題
在測試環境中,我用openstack/puppet-ceph 部署的ceph all-in-one遇到了問題:
我使用了三塊ssd作為osd的三塊盤,副本數為3,但是部署完有很多pg未處于active+clean 的狀態
后來發現問題出在這里:
因為只有一個主機,bucket (桶)類型只有一個host,我設置的副本數是3,副本策略默認是type: host。
解決方法:
1.獲取當前CRUSH map文件
ceph osd getcrushmap -o crushmap
2.反編譯成可編輯文件
crushtool -d crushmap -o crushmap.txt
3.編輯文件,將type類型改為osd
vim crushmap.txt
4.重新編譯
crushtool -c crushmap.txt -o newcrushmap
5.往集群中注入CRUSH map
ceph osd setcrushmap -i newcrushmap
6.重啟mon和osd服務