ceph總結(jié)

ceph簡介

Ceph是一個(gè)分布式存儲(chǔ)系統(tǒng)奥额,誕生于2004年,是最早致力于開發(fā)下一代高性能分布式文件系統(tǒng)的項(xiàng)目。隨著云計(jì)算的發(fā)展保檐,ceph乘上了OpenStack的春風(fēng),進(jìn)而成為了開源社區(qū)受關(guān)注較高的項(xiàng)目之一崔梗。

ceph基本結(jié)構(gòu)

自下向上夜只,可以將Ceph系統(tǒng)分為四個(gè)層次:

1.基礎(chǔ)存儲(chǔ)系統(tǒng)RADOS(Reliable, Autonomic, Distributed Object Store,即可靠的蒜魄、自動(dòng)化的扔亥、分布式的對象存儲(chǔ))
RADOS本身也是分布式存儲(chǔ)系統(tǒng),CEPH所有的存儲(chǔ)功能都是基于RADOS實(shí)現(xiàn),RADOS由大量的存儲(chǔ)設(shè)備節(jié)點(diǎn)組成谈为,每個(gè)節(jié)點(diǎn)擁有自己的硬件資源(CPU旅挤、內(nèi)存、硬盤峦阁、網(wǎng)絡(luò))谦铃,并運(yùn)行著操作系統(tǒng)和文件系統(tǒng)。

2.基礎(chǔ)庫librados
這一層的功能是對RADOS進(jìn)行抽象和封裝榔昔,并向上層提供API驹闰,以便直接基于RADOS(而不是整個(gè)Ceph)進(jìn)行應(yīng)用開發(fā)。

3.高層應(yīng)用接口
這一層包括了三個(gè)部分:RADOS GW(RADOS Gateway)撒会、 RBD(Reliable Block Device)和Ceph FS(Ceph File System)嘹朗,其作用是在librados庫的基礎(chǔ)上提供抽象層次更高、更便于應(yīng)用或客戶端使用的上層接口诵肛。
其中屹培,RADOS GW是一個(gè)提供與Amazon S3和Swift兼容的RESTful API的gateway默穴,以供相應(yīng)的對象存儲(chǔ)應(yīng)用開發(fā)使用。RADOS GW提供的API抽象層次更高褪秀,但功能則不如librados強(qiáng)大蓄诽。因此,開發(fā)者應(yīng)針對自己的需求選擇使用媒吗。
RBD則提供了一個(gè)標(biāo)準(zhǔn)的塊設(shè)備接口仑氛,常用于在虛擬化的場景下為虛擬機(jī)創(chuàng)建volume。目前闸英,Red Hat已經(jīng)將RBD驅(qū)動(dòng)集成在KVM/QEMU中锯岖,以提高虛擬機(jī)訪問性能。
Ceph FS是一個(gè)POSIX兼容的分布式文件系統(tǒng)甫何。由于還處在開發(fā)狀態(tài)出吹,因而Ceph官網(wǎng)并不推薦將其用于生產(chǎn)環(huán)境中

4.應(yīng)用層
這一層就是不同場景下對于Ceph各個(gè)應(yīng)用接口的各種應(yīng)用方式,例如基于librados直接開發(fā)的對象存儲(chǔ)應(yīng)用辙喂,基于RADOS GW開發(fā)的對象存儲(chǔ)應(yīng)用捶牢,基于RBD實(shí)現(xiàn)的云硬盤等等。

Ceph基本組件

  • Osd
    用于集群中所有數(shù)據(jù)與對象的存儲(chǔ)加派。處理集群數(shù)據(jù)的復(fù)制叫确、恢復(fù)、回填芍锦、再均衡竹勉。并向其他osd守護(hù)進(jìn)程發(fā)送心跳,然后向Mon提供一些監(jiān)控信息娄琉。
  • Monitor
    監(jiān)控整個(gè)集群的狀態(tài)次乓,維護(hù)集群的cluster MAP二進(jìn)制表,保證集群數(shù)據(jù)的一致性孽水。ClusterMAP描述了對象塊存儲(chǔ)的物理位置票腰,以及一個(gè)將設(shè)備聚合到物理位置的桶列表。
  • MDS(可選)
    為Ceph文件系統(tǒng)提供元數(shù)據(jù)計(jì)算女气、緩存與同步杏慰。在ceph中,元數(shù)據(jù)也是存儲(chǔ)在osd節(jié)點(diǎn)中的炼鞠,mds類似于元數(shù)據(jù)的代理緩存服務(wù)器缘滥。MDS進(jìn)程并不是必須的進(jìn)程,只有需要使用CEPHFS時(shí)谒主,才需要配置MDS節(jié)點(diǎn)朝扼。

ceph數(shù)據(jù)的存儲(chǔ)過程

Ceph系統(tǒng)中的尋址流程如下圖所示:

無論使用哪種存儲(chǔ)方式(對象、塊霎肯、掛載)擎颖,存儲(chǔ)的數(shù)據(jù)都會(huì)被切分成對象(Objects)榛斯。Objects size大小可以由管理員調(diào)整,通常為2M或4M搂捧。每個(gè)對象都會(huì)有一個(gè)唯一的OID驮俗,由
ino與ono生成。ino即是文件的File ID异旧,用于在全局唯一標(biāo)示每一個(gè)文件意述,而ono則是分片的編號(hào)。比如:一個(gè)文件FileID為A吮蛹,它被切成了兩個(gè)對象,一個(gè)對象編號(hào)0拌屏,另一個(gè)編號(hào)1潮针,那么這兩個(gè)文件的oid則為A0與A1。Oid的好處是可以唯一標(biāo)示每個(gè)不同的對象倚喂,并且存儲(chǔ)了對象與文件的從屬關(guān)系每篷。

但是對象并不會(huì)直接存儲(chǔ)進(jìn)OSD中,因?yàn)閷ο蟮膕ize很小端圈,在一個(gè)大規(guī)模的集群中可能有幾百到幾千萬個(gè)對象焦读。這么多對象光是遍歷尋址,速度都是很緩慢的舱权;并且如果將對象直接通過某種固定映射的哈希算法映射到osd上矗晃,當(dāng)這個(gè)osd損壞時(shí),對象無法自動(dòng)遷移至其他osd上面(因?yàn)橛成浜瘮?shù)不允許)宴倍。為了解決這些問題张症,ceph引入了歸置組的概念,即PG鸵贬。

PG是一個(gè)邏輯概念俗他,我們linux系統(tǒng)中可以直接看到對象,但是無法直接看到PG阔逼。它在數(shù)據(jù)尋址時(shí)類似于數(shù)據(jù)庫中的索引:每個(gè)對象都會(huì)固定映射進(jìn)一個(gè)PG中兆衅,所以當(dāng)我們要尋找一個(gè)對象時(shí),只需要先找到對象所屬的PG嗜浮,然后遍歷這個(gè)PG就可以了羡亩,無需遍歷所有對象。而且在數(shù)據(jù)遷移時(shí)周伦,也是以PG作為基本單位進(jìn)行遷移夕春,ceph不會(huì)直接操作對象。

對象映射進(jìn)PG的方式:使用靜態(tài)hash函數(shù)對OID做hash取出特征碼专挪,用特征碼與PG的數(shù)量去模及志,得出PGID片排。
最后PG會(huì)根據(jù)管理員設(shè)置的副本數(shù)量進(jìn)行復(fù)制,然后通過crush算法存儲(chǔ)到不同的OSD節(jié)點(diǎn)上速侈。

ceph-deploy快速安裝

說明率寡,此例中一個(gè)mon節(jié)點(diǎn),兩個(gè)osd節(jié)點(diǎn)倚搬,hostname分別為:test-ceph-1,test-ceph-2,test-ceph-3
mons節(jié)點(diǎn)必須能夠通過 SSH 無密碼地訪問各 Ceph 節(jié)點(diǎn)
配置好相應(yīng)的源冶共,國內(nèi)推薦使用有云UDS的源,創(chuàng)建/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 默認(rèn)為 Enforcing 開啟狀態(tài)捅僵。為簡化安裝,我們建議把 SELinux 設(shè)置為 Permissive 或者完全禁用眨层,也就是在加固系統(tǒng)配置前先確保集群的安裝庙楚、配置沒問題。用下列命令把 SELinux 設(shè)置為 Permissive :

setenforce 0

在mon節(jié)點(diǎn)上趴樱,用 ceph-deploy 執(zhí)行如下步驟:
1.創(chuàng)建集群

ceph-deploy new test-ceph-1

2.把 Ceph 配置文件里的默認(rèn)副本數(shù)從 3 改成 2 馒闷,這樣只有兩個(gè) OSD 也可以達(dá)到 active + clean 狀態(tài)。把下面這行加入/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

完成上述操作后,當(dāng)前目錄里應(yīng)該會(huì)出現(xiàn)這些密鑰環(huán):
{cluster-name}.client.admin.keyring
{cluster-name}.bootstrap-osd.keyring
{cluster-name}.bootstrap-mds.keyring
{cluster-name}.bootstrap-rgw.keyring
5.添加兩個(gè) OSD
登錄test-ceph-2執(zhí)行:

mkdir /var/local/osd0

登錄test-ceph-3執(zhí)行:

mkdir /var/local/osd1

然后议薪,從mon節(jié)點(diǎn)執(zhí)行 ceph-deploy 來準(zhǔn)備 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節(jié)點(diǎn)和osd節(jié)點(diǎn),這樣你每次執(zhí)行 Ceph 命令行時(shí)就無需指定 monitor 地址和 ceph.client.admin.keyring 了:

ceph-deploy admin test-ceph-1 test-ceph-2 test-ceph-3

7.確保你對 ceph.client.admin.keyring 有正確的操作權(quán)限醇锚。

chmod +r /etc/ceph/ceph.client.admin.keyring

8.驗(yàn)證

ceph手動(dòng)部署

mon節(jié)點(diǎn)為test-ceph-1,osd節(jié)點(diǎn)為test-ceph-2焊唬,test-ceph-3
mons節(jié)點(diǎn)必須能夠通過 SSH 無密碼地訪問各 Ceph 節(jié)點(diǎn)
配置好相應(yīng)的ceph源
密鑰下載:
不管你是用倉庫還是手動(dòng)下載,你都需要用密鑰校驗(yàn)軟件包。如果你沒有密鑰箭窜,就會(huì)收到安全警告。有兩個(gè)密鑰:一個(gè)用于發(fā)布(常用)、一個(gè)用于開發(fā)(僅適用于程序員和 QA )

執(zhí)行下列命令安裝 release.asc 密鑰:

sudo rpm --import 'https://download.ceph.com/keys/release.asc'

執(zhí)行下列命令安裝 autobuild.asc 密鑰(僅對 QA 和開發(fā)者):

sudo rpm --import 'https://download.ceph.com/keys/autobuild.asc'

部署步驟如下:

1.mon節(jié)點(diǎn)和osd節(jié)點(diǎn)安裝 yum-plugin-priorities、ceph和依賴包:

yum install yum-plugin-priorities snappy leveldb gdisk python-argparse gperftools-libs ceph

2.mon節(jié)點(diǎn)部署

2.1登錄到監(jiān)視器節(jié)點(diǎn)变姨, 確保保存 Ceph 配置文件的目錄存在
2.2創(chuàng)建 Ceph 配置文件, Ceph 默認(rèn)使用 ceph.conf
2.3給集群分配惟一 ID (即 fsid ),并把此 ID 寫入 Ceph 配置文件

uuidgen

寫入ceph.conf

[global]
fsid = {UUID}

2.4把初始監(jiān)視器寫入 Ceph 配置文件

mon_initial_members = test-ceph-1

2.5初始監(jiān)視器的 IP 地址寫入 Ceph 配置文件

mon_host = 10.0.86.23

2.6為此集群創(chuàng)建密鑰環(huán)、并生成監(jiān)視器密鑰

ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

2.7生成管理員密鑰環(huán)窍株,生成 client.admin 用戶并加入密鑰環(huán)

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用規(guī)劃好的主機(jī)名、對應(yīng) IP 地址醋虏、和 FSID 生成一個(gè)監(jiān)視器圖艰匙,并保存為 /tmp/monmap

monmaptool --create --add test-ceph-1 10.0.86.23 --fsid {UUID} /tmp/monmap

2.10在監(jiān)視器主機(jī)上分別創(chuàng)建數(shù)據(jù)目錄限煞。

mkdir /var/lib/ceph/mon/ceph-test-ceph-1

2.11創(chuàng)建一個(gè)boot引導(dǎo)啟動(dòng)osd的key

mkdir -p /var/lib/ceph/bootstrap-osd/
ceph-authtool -C /var/lib/ceph/bootstrap-osd/ceph.keyring

2.12用監(jiān)視器圖和密鑰環(huán)組裝守護(hù)進(jìn)程所需的初始數(shù)據(jù)。

ceph-mon --mkfs -i test-ceph-1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

2.13仔細(xì)斟酌 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

把監(jiān)視器節(jié)點(diǎn)的/etc/ceph/ceph.conf 和ceph.client.admin.keyring 拷貝到test-ceph-2,test-ceph3,這一步不要忘記J鹱ぁ!健霹!

2.14建一個(gè)空文件 done 旺上,表示監(jiān)視器已創(chuàng)建、可以啟動(dòng)了

touch /var/lib/ceph/mon/ceph-test-ceph-1/done
touch /var/lib/ceph/mon/ceph-test-ceph-1/sysvinit

2.15啟動(dòng)監(jiān)視器

service ceph start mon.test-ceph-1

3.osd節(jié)點(diǎn)部署
注意:如果osd盤不是本地目錄糖埋,那么請忽略3.1-3.3抚官,直接執(zhí)行3.4即可。

3.1創(chuàng)建本地目錄當(dāng)做osd盤
在 test-ceph-2 上執(zhí)行:

mkdir /var/local/osd0

在 test-ceph-3 上執(zhí)行:

mkdir /var/local/osd1

3.2準(zhǔn)備OSD
在test-ceph-2阶捆、test-ceph-3上執(zhí)行:

ceph osd create

這條命令會(huì)輸出創(chuàng)建的osd number
3.3創(chuàng)建軟鏈接。

在 test-ceph-2 上執(zhí)行:

ln -s /var/local/osd0 /var/lib/ceph/osd/ceph-0

在 test-ceph-3 上執(zhí)行:

ln -s /var/local/osd0 /var/lib/ceph/osd/ceph-0

3.4如果osd不是本地目錄钦听,需要以下操作:

在 test-ceph-2 上執(zhí)行:
根據(jù)設(shè)備名替換下面的/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 上執(zhí)行:
根據(jù)設(shè)備名替換下面的/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 數(shù)據(jù)目錄:
在test-ceph-2洒试、test-ceph-3上執(zhí)行:

ceph-osd -i {osd-num} --mkfs --mkkey

3.6注冊此 OSD 的密鑰
在test-ceph-2、test-ceph-3上執(zhí)行:

ceph auth add osd.{osd-num} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/{cluster-name}-{osd-num}/keyring

3.7把此節(jié)點(diǎn)加入 CRUSH 圖
在 test-ceph-2 上執(zhí)行:

ceph osd crush add-bucket test-ceph-2 host

在 test-ceph-3 上執(zhí)行:

ceph osd crush add-bucket test-ceph-3 host

3.8把此 Ceph 節(jié)點(diǎn)放入 default 根下
在 test-ceph-2 上執(zhí)行:

ceph osd crush move test-ceph-2 root=default

在 test-ceph-3 上執(zhí)行:

ceph osd crush move test-ceph-3 root=default

3.9.分配權(quán)重朴上、重新編譯垒棋、注入集群

在 test-ceph-2 上執(zhí)行:
下面的1.0表示權(quán)重,需要根據(jù)磁盤大小自行調(diào)整權(quán)重

ceph osd crush add osd.0 1.0 host=test-ceph-2

在 test-ceph-3 上執(zhí)行:

ceph osd crush add osd.0 1.0 host=test-ceph-3

3.10.創(chuàng)建一個(gè)空文件:
在test-ceph-2痪宰、test-ceph-3上執(zhí)行:

touch /var/lib/ceph/osd/{cluster-name}-{osd-num}/sysvinit

3.11.用 sysvinit 啟動(dòng)
在test-ceph-2叼架、test-ceph-3上執(zhí)行:

service ceph start osd.{osd-num}

puppet-ceph部署

目前部署方式可以有Puppet和Ceph-deploy, 目前生產(chǎn)環(huán)境中主要使用Puppet來進(jìn)行部署。Ceph-deploy的部署方式主要是為了滿足快速驗(yàn)證的需求衣撬。一般推薦在生產(chǎn)環(huán)境中使用Puppet來部署乖订,這樣方便后續(xù)環(huán)境的維護(hù)。

在puppet master module目錄下下載puppet-ceph

openstack/puppet-ceph 使用ceph版本為hammer

部署節(jié)點(diǎn)同上具练,mon節(jié)點(diǎn)為test-ceph-1乍构,osd節(jié)點(diǎn)為test-ceph-2,test-ceph-3

各節(jié)點(diǎn)加載的類:

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會(huì)執(zhí)行 ceph-disk prepare /dev/sdc 扛点,如果journal為空哥遮,它會(huì)把自動(dòng)把這塊盤分成兩個(gè)分區(qū),一個(gè)為ceph data ,一個(gè)為ceph journal岂丘。journal分區(qū)大小默認(rèn)為5G,剩下的
都分給ceph data.

Journal的作用類似于mysql innodb引擎中的事物日志系統(tǒng)眠饮。當(dāng)有突發(fā)的大量寫入操作時(shí)奥帘,ceph可以先把一些零散的,隨機(jī)的IO請求保存到緩存中進(jìn)行合并仪召,然后再統(tǒng)一向內(nèi)核發(fā)起IO請求寨蹋。journal的io是非常密集的,很大程度上也損耗了硬件的io性能,所以通常在生產(chǎn)環(huán)境中返咱,推薦使用ssd來單獨(dú)存儲(chǔ)journal文件以提高ceph讀寫性能钥庇。

journal也可以使用單獨(dú)的數(shù)據(jù)盤,只需要在hieradata中傳遞相應(yīng)的設(shè)備名即可咖摹。

openstack/puppet-ceph 傳osds參數(shù)不支持wwn的方式,因?yàn)閏eph-disk當(dāng)前不支持使用wwn來作為磁盤標(biāo)識(shí)的輸入?yún)?shù)评姨。

如果重啟了mon節(jié)點(diǎn),需要執(zhí)行:

如果重啟了mon節(jié)點(diǎn)萤晴,需要執(zhí)行:

service ceph start mon.test-ceph-1

如果重啟了osd節(jié)點(diǎn)吐句,需要執(zhí)行:

ceph-disk activate-all

activate-all 靠 /dev/disk/by-parttype-uuid/$typeuuid.$uuid 發(fā)現(xiàn)所有分區(qū)

parttype-uuid 是在執(zhí)行activate-prepare 時(shí)生成的。通過parttypeuuid店读,在本機(jī)插拔盤完全不會(huì)導(dǎo)致故障嗦枢。

puppet執(zhí)行過程分析

創(chuàng)建mon的大致過程如下:

1.安裝包

package { $::ceph::params::packages :
    ensure => $ensure,
    tag    => 'ceph'
  }

2.是否開啟認(rèn)證

# [*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服務(wù),創(chuàng)建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.啟動(dòng)mon服務(wù):

service ceph start mon.test-ceph-xue-1

創(chuàng)建osd的大致過程如下:

1.安裝包

package { $::ceph::params::packages :
    ensure => $ensure,
    tag    => 'ceph'
  }

2.是否開啟認(rèn)證

# [*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.創(chuàng)建keyring file

if ! defined(File[$keyring_path]) {
    file { $keyring_path:
      ensure  => file,
      owner   => $user,
      group   => $group,
      mode    => $mode,
      require => Package['ceph'],
    }
  }

4.生成管理員密鑰環(huán)屯断,生成 client.admin 用戶并加入密鑰環(huán)

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,否則文虏,可能會(huì)導(dǎo)致ceph-disk activate失敗

mv -f ${udev_rules_file} ${udev_rules_file}.disabled && udevadm control --reload

7.使用ceph-disk prepare 做預(yù)處理
預(yù)處理用作 Ceph OSD 的目錄、磁盤殖演。它會(huì)創(chuàng)建 GPT 分區(qū)氧秘、給分區(qū)打上 Ceph 風(fēng)格的 uuid 標(biāo)記、創(chuàng)建文件系統(tǒng)趴久、把此文件系統(tǒng)標(biāo)記為已就緒丸相、使用日志磁盤的整個(gè)分區(qū)并新增一分區(qū)”斯鳎可單獨(dú)使用灭忠,也可由 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 座硕。先把此卷掛載到一臨時(shí)位置弛作,分配 OSD 惟一標(biāo)識(shí)符(若有必要),重掛載到正確位置

ceph-disk activate ${data}

ceph常見命令

查看ceph集群的運(yùn)行狀態(tài)信息:

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.查看認(rèn)證狀態(tài)

[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.添加指定實(shí)例的認(rèn)證信息

# 使用方法: ceph auth get-or-create 實(shí)例名稱 對象1 權(quán)限1 對象2 權(quán)限2
[root@test-ceph-1 ~]# ceph auth get-or-create client.admin mds 'allow *' osd 'allow *' mon 'allow *'

3.刪除指定實(shí)例及其認(rèn)證信息

# 使用方法: ceph auth del 實(shí)例名稱
ceph auth del client.bootstrap-mds

pool命令

1.打印pool列表

ceph osd lspools

2.創(chuàng)建pool

通常在創(chuàng)建pool之前华匾,需要覆蓋默認(rèn)的pg_num缆蝉,官方推薦:

若少于5個(gè)OSD, 設(shè)置pg_num為128。
5~10個(gè)OSD刊头,設(shè)置pg_num為512黍瞧。
10~50個(gè)OSD,設(shè)置pg_num為4096原杂。
超過50個(gè)OSD印颤,可以參考pgcalc計(jì)算。

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]

創(chuàng)建一個(gè)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

刪除一個(gè)pool會(huì)同時(shí)清空pool的所有數(shù)據(jù)年局,因此非常危險(xiǎn)。(和rm -rf /類似)咸产。因此刪除pool時(shí)ceph要求必須輸入兩次pool名稱矢否,同時(shí)加上--yes-i-really-really-mean-it選項(xiàng)。

ceph osd pool delete test-pool test-pool  --yes-i-really-really-mean-it

5.顯示所有pool詳細(xì)信息

rados df

6.元數(shù)據(jù)信息

通過以下語法設(shè)置pool的元數(shù)據(jù):

ceph osd pool set {pool-name} {key} {value}

比如設(shè)置pool的冗余副本數(shù)量為3:

ceph osd pool set test-pool size 3

通過get操作能夠獲取pool的配置值,比如獲取當(dāng)前pg_num:

ceph osd pool get test-pool pg_num

獲取當(dāng)前副本數(shù):

ceph osd pool get test-pool size

mon命令

1.顯示mon的狀態(tài)信息

[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.刪除當(dāng)前集群中指定的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狀態(tài)

ceph osd down {osd-num}

6.將指定OSD置為out狀態(tài)

ceph osd out {osd-number}

CRUSH 圖

CRUSH算法通過計(jì)算數(shù)據(jù)存儲(chǔ)位置來確定如何存儲(chǔ)和檢索脑溢。 CRUSH 授權(quán) Ceph 客戶端直接連接 OSD 僵朗,而非通過一個(gè)中央服務(wù)器或經(jīng)紀(jì)人。數(shù)據(jù)存儲(chǔ)屑彻、檢索算法的使用验庙,使 Ceph 避免了單點(diǎn)故障、性能瓶頸社牲、和伸縮的物理限制粪薛。

CRUSH圖包含 OSD 列表、把設(shè)備匯聚為物理位置的“桶”列表和指示 CRUSH 如何復(fù)制存儲(chǔ)池里的數(shù)據(jù)的規(guī)則列表搏恤。

CRUSH圖主要有 4 個(gè)主要段落:
1.設(shè)備
設(shè)備的格式:

#devices
device {num} {osd.name}

2.桶類型: 定義了 CRUSH 分級(jí)結(jié)構(gòu)里要用的桶類型( 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.桶例程: 定義了桶類型后违寿,還必須聲明主機(jī)的桶類型、以及規(guī)劃的其它故障域熟空。
格式:

[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 。關(guān)于桶類型的詳細(xì)討論: 桶類型

各個(gè)桶都用了一種哈希算法腮敌,當(dāng)前 Ceph 僅支持 rjenkins1 阱当,輸入 0 表示哈希算法設(shè)置為 rjenkins1 。

如下面這個(gè)例子:

定義的桶例程為:

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
}

此例中糜工,機(jī)柜桶不包含任何 OSD 弊添,它只包含低一級(jí)的主機(jī)桶、以及其內(nèi)條目的權(quán)重之和

4.規(guī)則: 由選擇桶的方法組成捌木。

規(guī)則格式如下:

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

描述: 區(qū)分一條規(guī)則屬于某個(gè)規(guī)則集的手段油坝。給存儲(chǔ)池設(shè)置規(guī)則集后激活。
??目的: 規(guī)則掩碼的一個(gè)組件。
??類型: Integer
??是否必需: Yes
??默認(rèn)值: 0

4.2type

描述: 為硬盤(復(fù)制的)或 RAID 寫一條規(guī)則澈圈。
??目的: 規(guī)則掩碼的一個(gè)組件彬檀。
??類型: String
??是否必需: Yes
??默認(rèn)值: replicated
??合法取值: 當(dāng)前僅支持 replicated 和 erasure

4.3min_size

描述: 如果一個(gè)歸置組副本數(shù)小于此數(shù), CRUSH 將不應(yīng)用此規(guī)則瞬女。
??類型: Integer
??目的: 規(guī)則掩碼的一個(gè)組件窍帝。
??是否必需: Yes
??默認(rèn)值: 1

4.4max_size
??描述: 如果一個(gè)歸置組副本數(shù)大于此數(shù), CRUSH 將不應(yīng)用此規(guī)則诽偷。
??類型: Integer
??目的: 規(guī)則掩碼的一個(gè)組件坤学。
??是否必需: Yes
??默認(rèn)值: 10

4.5step take <bucket-name>

描述: 選取桶名并迭代到樹底。
??目的: 規(guī)則掩碼的一個(gè)組件报慕。
??是否必需: Yes
??實(shí)例: step take default

4.6step chooseleaf firstn {num} type {bucket-type}

描述: 選擇 {bucket-type} 類型的一堆桶深浮,并從各桶的子樹里選擇一個(gè)葉子節(jié)點(diǎn)。集合內(nèi)桶的數(shù)量通常是存儲(chǔ)池的副本數(shù)(即 pool size )眠冈。
????如果 {num} == 0 選擇 pool-num-replicas 個(gè)桶(所有可用的)飞苇;
????如果 {num} > 0 && < pool-num-replicas 就選擇那么多的桶;
????如果 {num} < 0 它意為 pool-num-replicas - {num} 洋闽。
??目的: 規(guī)則掩碼的一個(gè)組件玄柠。 它的使用避免了通過兩步來選擇一設(shè)備。
??先決條件: Follows step take or step choose.
??實(shí)例: step chooseleaf firstn 0 type row

4.7step emit

描述: 輸出當(dāng)前值并清空堆棧诫舅。通常用于規(guī)則末尾羽利,也適用于相同規(guī)則應(yīng)用到不同樹的情況。
??目的: 規(guī)則掩碼的一個(gè)組件刊懈。
??先決條件: Follows step choose.
??實(shí)例: step emit

新版本的 CRUSH (從 0.48 起)為了解決一些遺留值導(dǎo)致幾個(gè)不當(dāng)行為这弧,在最前面加入了一些參數(shù)值。

CRUSH 圖內(nèi)容:

# begin crush map
tunable choose_local_tries 0 #本地重試次數(shù)虚汛。以前是 2 匾浪,最優(yōu)值是 0 。
tunable choose_local_fallback_tries 0 #以前 5 卷哩,現(xiàn)在是 0
tunable choose_total_tries 50 #選擇一個(gè)條目的最大嘗試次數(shù)蛋辈。以前 19 ,后來的測試表明将谊,對典型的集群來說 50 更合適冷溶。最相當(dāng)大的集群來說,更大的值也許必要尊浓。
tunable chooseleaf_descend_once 1 #是否重遞歸葉子選擇逞频,或只試一次、并允許最初歸置組重試栋齿。以前默認(rèn) 0 苗胀,最優(yōu)為 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遇到的問題

在測試環(huán)境中,我用openstack/puppet-ceph 部署的ceph all-in-one遇到了問題:

我使用了三塊ssd作為osd的三塊盤基协,副本數(shù)為3歌亲,但是部署完有很多pg未處于active+clean 的狀態(tài)

后來發(fā)現(xiàn)問題出在這里:

因?yàn)橹挥幸粋€(gè)主機(jī),bucket (桶)類型只有一個(gè)host,我設(shè)置的副本數(shù)是3堡掏,副本策略默認(rèn)是type: host应结。

解決方法:

1.獲取當(dāng)前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服務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泉唁,一起剝皮案震驚了整個(gè)濱河市鹅龄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亭畜,老刑警劉巖扮休,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拴鸵,居然都是意外死亡玷坠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門劲藐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來八堡,“玉大人,你說我怎么就攤上這事聘芜⌒置欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵汰现,是天一觀的道長挂谍。 經(jīng)常有香客問我,道長瞎饲,這世上最難降的妖魔是什么口叙? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嗅战,結(jié)果婚禮上妄田,老公的妹妹穿的比我還像新娘。我一直安慰自己驮捍,他們只是感情好疟呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厌漂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斟珊。 梳的紋絲不亂的頭發(fā)上苇倡,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天富纸,我揣著相機(jī)與錄音,去河邊找鬼旨椒。 笑死晓褪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的综慎。 我是一名探鬼主播涣仿,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼示惊!你這毒婦竟也來了好港?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤米罚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橡娄,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡立美,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘竭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塘秦。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖动看,靈堂內(nèi)的尸體忽然破棺而出尊剔,到底是詐尸還是另有隱情,我是刑警寧澤弧圆,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布赋兵,位于F島的核電站,受9級(jí)特大地震影響搔预,放射性物質(zhì)發(fā)生泄漏霹期。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一拯田、第九天 我趴在偏房一處隱蔽的房頂上張望历造。 院中可真熱鬧,春花似錦船庇、人聲如沸吭产。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臣淤。三九已至,卻和暖如春窃爷,著一層夾襖步出監(jiān)牢的瞬間邑蒋,已是汗流浹背姓蜂。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留医吊,地道東北人钱慢。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像卿堂,于是被迫代替她去往敵國和親束莫。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 系統(tǒng)環(huán)境: centos73.10.0-514.26.2.el7.x86_64 機(jī)器數(shù)量:五臺(tái) 硬盤:四塊一塊為系...
    think_lonely閱讀 4,630評(píng)論 0 5
  • 集群管理 每次用命令啟動(dòng)草描、重啟览绿、停止Ceph守護(hù)進(jìn)程(或整個(gè)集群)時(shí),必須指定至少一個(gè)選項(xiàng)和一個(gè)命令,還可能要指定...
    Arteezy_Xie閱讀 18,533評(píng)論 0 19
  • 一、概述 Ceph是一個(gè)分布式存儲(chǔ)系統(tǒng)陶珠,誕生于2004年挟裂,最早致力于開發(fā)下一代高性能分布式文件系統(tǒng)的項(xiàng)目。隨著云計(jì)...
    魏鎮(zhèn)坪閱讀 49,403評(píng)論 3 54
  • CRUSH(Controlled Replication Under Scalable Hashing...
    Cindy_lina閱讀 1,771評(píng)論 0 6
  • 朱 榮澤| 2013.09.09 https://www.ustack.com/blog/ceph_infra/ ...
    守望者_(dá)1065閱讀 2,509評(píng)論 0 1