DAS
NAS
SAN
概述
特征
分布性
对等性
并发性
缺乏全局时钟
故障总是会发生
处理单点故障
出现的意义
解决的问题
GPL
GPLV2
GPLV3
LGPL
介绍
特性
优点
缺点
应用场景
介绍
特性
优点
缺点
应用场景
介绍
特性
组成
元数据服务器(master)
元数据日志服务器(metalogger)
数据存储服务器(chunkserver)
优点
缺点
应用场景
介绍
特性
优点
缺点
应用场景
ceph官方文档
ceph中文开源社区
块存储RBD(Rados Block Device)
文件系统存储Ceph FS
(Ceph Filesystem)
对象存储RADOSGW(Reliable、Autonomic、Distributed、Object Storage Gateway)
统一存储
高扩展性
可靠性强
性能高
placement group归置组, 是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略
相同PG内的对象都会放到相同的硬盘上。PG是 ceph的核心概念, 服务端数据均衡和恢复的最小粒度就是PG
无论使用对象、块或挂载存储,数据都会被切分成Objects。Objects size大小可以由管理员调整,通常为2M或4M
OID
每个对象都会固定映射进一个PG中,当要找一个对象时,先找到对象所属的PG,再遍历这个PG即可
在数据迁移时,也是以PG作为基本单位进行迁移,ceph不会直接操作对象
映射
关系图
一个Pool里有很多PG
一个PG里包含一堆对象;一个对象只能属于一个PG
PG有主从之分,一个PG分布在不同的OSD上
monitor
osd&mds
什么是块设备
Linux中的块设备
rbd
文件系统
Ceph块设备接口使用
在Ceph集群中创建块设备
在用户机上挂载该Ceph块设备
rbdmap myrbd
将Ceph块设备格式化成文件系统并挂载
通过/mnt/ceph_rbd读写数据,都是在读写Ceph集群中该块设备对应的存储区域
介绍
比较
共享性
块设备接口
文件系统接口
Ceph的文件系统接口使用
将Ceph的文件系统挂载到用户机目录
在/mnt/ceph_fuse下读写数据,都是读写远程Ceph集群
总结
对象存储接口
比较
存储空间(Bucket)
存储空间命名规范
Ceph的对象存储接口使用
总结
系统
配置
服务器
时间同步
互相解析
配置yum源
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=0
type=rpm-md
priority=1
[Ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md
priority=1
[Ceph-aarch64]
name=Ceph aarch64 packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/aarch64/
enabled=1
gpgcheck=0
type=rpm-md
安装ceph-deploy
准备OSD
修改OSD属主属组
激活OSD
查看状态
1.1.1.25 client
安装ceph
拷贝配置文件和密钥环
修改密钥文件的权限
创建存储池
语法
ceph osd pool create {pool-name} {pg-num}
pool-name
pg-num
存储池拥有的归置组总数
OSD<5
5<=OSD<10
10<=OSD<50
OSD>=50
[root@client ceph]# ceph osd pool create mypool 128
创建块设备映像(任意节点均可)
{pool-name}/{image-name}
映射块设备(必须在client)
{pool-name}/{image-name}
使用块设备
[root@client ceph]# mkfs.xfs /dev/rbd0
[root@client ceph]# mkfs.xfs /dev/rbd/mypool/myimage
挂载
在线扩容
块设备
文件系统
删除块设备
部署MDS服务
[root@mon1 ceph]# ceph-deploy mds create osd{1…3}
查看状态
查看集群状态
创建ceph文件系统
介绍
官方文档: http://docs.ceph.org.cn/cephfs/
一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据
存储池配置考虑
创建存储池
查看存储池
创建文件系统
挂载文件系统
两种挂载方式
方式A
安装ceph
创建挂载点
创建密钥文件
挂载
方式B
安装ceph-fuse
拷贝密钥环
挂载
注
卸载
介绍
官方文档: http://docs.ceph.org.cn/rados/operations/pools/
存储池功能
自恢复力
归置组
CRUSH 规则
快照
设置所有者
列出存储池
创建存储池
设置存储池配额
存储池配额可设置最大字节数或每存储池最大对象数
语法
例:将data存储池设置只能存储10000个对象
[guo@node1 ceph-cluster]$ ceph osd pool set-quota data max_objects 10000
set-quota max_objects = 10000 for pool data
要取消配额,设置为0
相关命令
查看对象 rados ls -p poolname
存储对象 rados put -p poolname
获取对象 rados get -p poolname
删除对象 rados rm -p poolname
复制对象 rados cp [target-obj] -p poolname
截断对象 rados truncate length -p poolname 把对象内容保留多少长度
例
在任意节点创建存储池cephobj
[root@client2 ceph]# ceph osd pool create cephobj 128
在其中一个客户端存入一个对象到cephobj
[root@client2 ceph]# echo “this file upload by client2” > /tmp/a.txt
[root@client2 ceph]# rados put test-file /tmp/a.txt -p cephobj # 存储对象
在另外的客户端获取对象
[root@client ~]# rados ls -p cephobj
test-file
[root@client ~]# rados get test-file /opt/a.txt -p cephobj # 取出对象
[root@client ~]# cat /opt/a.txt
this file upload by client2
准备工作
在所有节点上修改解析记录,加入osd4
在osd4节点上
在管理节点mon1上
配置集群加入OSD
[root@mon1 ~]# cd /etc/ceph/
[root@mon1 ceph-cluster]# ceph-deploy osd prepare osd4:/mnt/osd #准备osd
[root@mon1 ceph-cluster]# ceph-deploy osd activate osd4:/mnt/osd #激活osd
- 一旦新加了OSD,Ceph集群就开始重均衡,把归置组迁移到新 OSD,用ceph -w查看过程
删除OSD
把OSD踢出集群
观察数据迁移
停止OSD进程
删除 OSD
有时候,(通常是只有几台主机的“小”集群,比如小型测试集群)拿出( out )某个 OSD 可能会使 CRUSH 进入临界状态,这时某些 PG 一直卡在 active+remapped 状态.如果遇到了这种情况,你应该把此 OSD 标记为 in :
ceph osd in {osd-num}
等回到最初的状态后,把它的权重设置为 0 ,而不是标记为 out ,用此命令:
ceph osd crush reweight osd.{osd-num} 0
执行后,你可以观察数据迁移过程,应该可以正常结束。把某一 OSD 标记为 out 和权重改为 0 的区别在于,前者,包含此 OSD 的桶、其权重没变;而后一种情况下,桶的权重变了(降低了此 OSD 的权重)。某些情况下, reweight 命令更适合“小”集群
介绍
修改配置文件
新增monitor成员
或 ceph-deploy mon create {host-name [host-name]…}
查看
删除monitor
1:检查集群健康状况
启动集群后、读写数据前,先检查下集群的健康状态。你可以用下面的命令检查:
ceph health 或者 ceph health detail (输出信息更详细)
要观察集群内正发生的事件,打开一个新终端,然后输入:ceph -w
2:检查集群的使用情况
ceph df 检查集群的数据用量及其在存储池内的分布情况,可以用 df 选项,它和 Linux 上的 df 相似。如下:
输出的 GLOBAL 段展示了数据所占用集群存储空间的概要。
• SIZE: 集群的总容量;
• AVAIL: 集群的可用空间总量;
• RAW USED: 已用存储空间总量;
• % RAW USED: 已用存储空间比率。用此值参照 full ratio 和 near full ratio 来确保不会用尽集群空间
输出的 POOLS 段展示了存储池列表及各存储池的大致使用率。本段没有展示副本、克隆品和快照占用情况。
例如,如果你把 1MB 的数据存储为对象,理论使用率将是 1MB ,但考虑到副本数、克隆数、和快照数,实际使用率可能是 2MB 或更多。
• NAME: 存储池名字;
• ID: 存储池唯一标识符;
• USED: 大概数据量,单位为 KB 、 MB 或 GB ;
• %USED: 各存储池的大概使用率;
• OBJECTS: 各存储池内的大概对象数。
注: POOLS 段内的数字是理论值,它们不包含副本、快照或克隆。
因此,它与 USED 和 %USED 数量之和不会达到 GLOBAL 段中的 RAW USED 和 %RAW USED 数量。
ceph osd df 命令,可以详细列出集群每块磁盘的使用情况,包括大小、权重、使用多少空间、使用率等等
3:检查集群状态
要检查集群的状态,执行下面的命令:
ceph status
输出信息里包含:
• 集群唯一标识符
• 集群健康状况
• 监视器图元版本和监视器法定人数状态
• OSD 版本和 OSD 状态摘要
• 其内存储的数据和对象数量的粗略统计,以及数据总量等。
4:检查MONITOR状态
查看监视器图,执行下面的命令::
ceph mon stat
ceph mon dump
要检查监视器的法定人数状态,执行下面的命令:
ceph quorum_status
5:检查 MDS 状态:
元数据服务器为 Ceph 文件系统提供元数据服务,元数据服务器有两种状态: up | \ down 和 active | inactive ,执行下面的命令查看元数据服务器状态为 up 且 active :
ceph mds stat
要展示元数据集群的详细状态,执行下面的命令:
ceph mds dump
6:集群命令详解
mon 相关
ceph mon stat 查看mon的状态信息
ceph quorum_status 查看mon的选举状态
ceph mon dump 查看mon的映射信息
ceph mon remove cs1 删除一个mon节点
ceph mon getmap -o a.txt 获得一个正在运行的mon map,并保存在a.txt文件中
monmaptool --print a.txt 读取上面获得的map
ceph-mon -i nc3 --inject-monmap a.txt 把上面的mon map注入新加入的节点
ceph-conf --name mon.nc3 --show-config-value admin_socket 查看mon的amin socket
ceph-conf --name mon.nc1 --show-config-value log_file 查看ceph mon log日志所在的目录
ceph --admin-daemon /var/run/ceph/ceph-mon.nc3.asok config show | less 查看一个集群ceph-mon.nc3参数的配置
mds 相关
ceph mds stat 查看msd状态
ceph mds rm 0 mds.nc1 删除一个mds节点
ceph mds rmfailed
ceph mds add_data_pool 新建pool
mds cluster_down 关闭mds集群
mds cluster_up 启动mds集群
ceph mds set max_file_size 1024000000000 设置cephfs文件系统存储方式最大单个文件尺寸
清除 cephfs 文件系统步骤
ceph mds fail 0 强制mds状态为featrue
ceph fs rm leadorfs --yes-i-really-mean-it 删除mds文件系统
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it 删除fs数据文件夹
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it 删除元数据文件夹
然后再删除 mds key ,残留文件等
ceph mds rm 0 mds.node242 拆除文件系统前推荐先删除节点,待验证
ceph auth 相关
详见 ceph用户管理
ceph auth list 查看ceph集群中的认证用户及相关的key
为ceph创建一个admin用户并为admin用户创建一个密钥,把密钥保存到/etc/ceph目录下:
ceph auth get-or-create client.admin mds ‘allow’ osd ‘allow *’ mon ‘allow *’ > /etc/ceph/ceph.client.admin.keyring
或
ceph auth get-or-create client.admin mds ‘allow’ osd ‘allow *’ mon ‘allow *’ -o /etc/ceph/ceph.client.admin.keyring
为osd.0创建一个用户并创建一个key
ceph auth get-or-create osd.0 mon ‘allow rwx’ osd ‘allow *’ -o /var/lib/ceph/osd/ceph-0/keyring
为mds.nc3创建一个用户并创建一个key
ceph auth get-or-create mds.nc3 mon ‘allow rwx’ osd ‘allow *’ mds ‘allow *’ -o /var/lib/ceph/mds/ceph-cs1/keyring
导入key信息
ceph auth import /var/lib/ceph/mds/ceph-cs1/keyring
删除集群中的一个认证用户
ceph auth del osd.0
osd 相关
ceph osd tree 查看osd列表
ceph osd perf 查看数据延迟
ceph osd df 详细列出集群每块磁盘的使用情况,包括大小、权重、使用多少空间、使用率等等
ceph osd down 0 down掉osd.0节点
ceph osd rm 0 在集群中删除一个osd硬盘
ceph osd crush rm osd.0 在集群中删除一个osd 硬盘 crush map
ceph osd crush rm cs1 在集群中删除一个osd的host节点
ceph osd getmaxosd 查看最大osd的个数
ceph osd setmaxosd 2048 设置最大的osd的个数(当扩大osd节点的时候必须扩大这个值)
ceph osd crush set {id} {weight} [{loc1} [{loc2} …]] 设置osd crush的权重为1.0
例如:
ceph osd crush set osd.1 0.5 host=node241
ceph osd reweight 3 0.5 设置osd的权重
reweighted osd.3 to 0.5 (8327682)
或者用下面的方式
ceph osd crush reweight osd.1 1.0
ceph osd out osd.3: 把一个osd节点逐出集群
3 1 osd.3 up 0 # osd.3的reweight变为0了就不再分配数据,但是设备还是存活的
ceph osd in osd.3 把逐出的osd加入集群
ceph osd pause 暂停osd (暂停后整个集群不再接收数据)
ceph osd unpause 再次开启osd (开启后再次接收数据)
查看一个集群osd.0参数的配置、输出信息特别详细,集群所有配置生效可以在此参数下确认
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | less
设置标志 flags ,不允许关闭osd、解决网络不稳定,osd 状态不断切换的问题
ceph osd set nodown
取消设置
ceph osd unset nodown
pool 相关
查看ceph集群中的pool数量
ceph osd lspools 或者 ceph osd pool ls
在ceph集群中创建一个pool
ceph osd pool create rbdtest 100 #这里的100指的是PG组:
查看集群中所有pool的副本尺寸
ceph osd dump | grep ‘replicated size’
查看pool 最大副本数量
ceph osd pool get rbdpool size
size: 3
查看pool 最小副本数量
[root@node241 ~]# ceph osd pool get rbdpool min_size
min_size: 2
设置一个pool的pg数量
ceph osd pool set rbdtest pg_num 100
设置一个pool的pgp数量
ceph osd pool set rbdtest pgp_num 100
修改ceph,数据最小副本数、和副本数
ceph osd pool set $pool_name min_size 1
ceph osd pool set $pool_name size 2
示例:
ceph osd pool set rbdpool min_size 1
ceph osd pool set rbdpool size 2
验证:
ceph osd dump
pool 3 ‘rbdpool’ replicated size 2 min_size 1
设置rbdtest池的最大存储空间为100T(默认是1T)
ceph osd pool set rbdtest target_max_bytes 100000000000000
为一个ceph pool配置配额、达到配额前集群会告警,达到上限后无法再写入数据
ceph osd pool set-quota rbdtest max_objects 10000
在集群中删除一个pool,注意删除poolpool 映射的image 会直接被删除,线上操作要谨慎。
ceph osd pool delete rbdtest rbdtest --yes-i-really-really-mean-it #集群名字需要重复两次
给一个pool创建一个快照
ceph osd pool mksnap rbdtest rbdtest-snap20150924
查看快照信息
rados lssnap -p rbdtest
1 rbdtest-snap20150924 2015.09.24 19:58:55
2 rbdtest-snap2015092401 2015.09.24 20:31:21
2 snaps
删除pool的快照
ceph osd pool rmsnap rbdtest rbdtest-snap20150924
验证,剩余一个snap
rados lssnap -p rbdtest
2 rbdtest-snap2015092401 2015.09.24 20:31:21
1 snaps
rados命令相关
rados 是和Ceph的对象存储集群(RADOS),Ceph的分布式文件系统的一部分进行交互是一种实用工具。
查看ceph集群中有多少个pool (只是查看pool)
rados lspools 同 ceph osd pool ls 输出结果一致
显示整个系统和被池毁掉的使用率统计,包括磁盘使用(字节)和对象计数
rados df
创建一个pool
rados mkpool test
创建一个对象object
rados create test-object -p test
查看对象文件
rados -p test ls
test-object
删除一个对象
rados rm test-object-1 -p test
删除foo池 (和它所有的数据)
rados rmpool test test –yes-i-really-really-mean-it
查看ceph pool中的ceph object (这里的object是以块形式存储的)
rados ls -p test | more
为test pool创建快照
rados -p test mksnap testsnap
created pool test snap testsnap
列出给定池的快照
rados -p test lssnap
1 testsnap 2015.09.24 21:14:34
删除快照
rados -p test rmsnap testsnap
removed pool test snap testsnap
上传一个对象到test pool
rados -p test put myobject blah.txt
使用rados 进行性能测试
测试用例如下:
rados bench 600 write rand -t 100 -b 4K -p datapool
选项解释:
测试时间 :600
支持测试类型:write/read ,加rand就是随机,不加就是顺序
并发数( -t选项):100
pool的名字是:datapool
PG 相关
PG =“放置组”。当集群中的数据,对象映射到编程器,被映射到这些PGS的OSD。
查看pg组的映射信息
ceph pg dump 或者 ceph pg ls
查看一个PG的map
ceph pg map 0.3f
osdmap e88 pg 0.3f (0.3f) -> up [0,2] acting [0,2] #其中的[0,2]代表存储在osd.0、osd.2节点,osd.0代表主副本的存储位置
查看PG状态
ceph pg stat
查询一个pg的详细信息
ceph pg 0.26 query
要洗刷一个pg组,执行命令:
ceph pg scrub {pg-id}
查看pg中stuck的状态
要获取所有卡在某状态的归置组统计信息,执行命令:
ceph pg dump_stuck inactive|unclean|stale --format
ceph pg dump_stuck unclean
ceph pg dump_stuck inactive
ceph pg dump_stuck stale
Inactive (不活跃)归置组不能处理读写,因为它们在等待一个有最新数据的 OSD 复活且进入集群。
Unclean (不干净)归置组含有复制数未达到期望数量的对象,它们应该在恢复中。
Stale (不新鲜)归置组处于未知状态:存储它们的 OSD 有段时间没向监视器报告了(由 mon_osd_report_timeout 配置)。
可用格式有 plain (默认)和 json 。阀值定义的是,归置组被认为卡住前等待的最小时间(默认 300 秒)
显示一个集群中的所有的pg统计
ceph pg dump --format plain
恢复一个丢失的pg
如果集群丢了一个或多个对象,而且必须放弃搜索这些数据,你就要把未找到的对象标记为丢失( lost )。
如果所有可能的位置都查询过了,而仍找不到这些对象,你也许得放弃它们了。这可能是罕见的失败组合导致的,集群在写入完成前,未能得知写入是否已执行。
当前只支持 revert 选项,它使得回滚到对象的前一个版本(如果它是新对象)或完全忽略它。要把 unfound 对象标记为 lost ,执行命令:
ceph pg {pg-id} mark_unfound_lost revert|delete
查看某个PG内分布的数据状态,具体状态可以使用选项过滤输出
ceph pg ls {} {active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait|undersized [active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|undersized…]} : list pg with specific pool, osd, state
实例如下:
pg号 过滤输出的状态
ceph pg ls 1 clean
查询osd 包含pg 的信息,过滤输出pg的状态信息
pg ls-by-osd
{} {active|clean|down|replay|splitting|scrubbing|scrubq|degraded|
inconsistent|peering|repair|recovering| backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|backfill_toofull|recovery_wait|undersized[active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent| peering|repair|recovering|backfill_ wait|incomplete|stale|remapped|deep_scrub|backfill|backfill_toofull|recovery_wait|undersized…]}
实例如下:
ceph pg ls-by-osd osd.5
查询pool包含pg 的信息,过滤输出pg的状态信息
ceph pg ls-by-pool poolname 选项
ceph pg ls-by-pool {active|clean| down|replay|splitting|scrubbing|scrubq| degraded|inconsistent|peering|repair| recovering|backfill_wait|incomplete| stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait| undersized [active|clean|down|replay| splitting|scrubbing|scrubq|degraded| inconsistent|peering|repair|recovering| backfill_wait|incomplete|stale| remapped|deep_scrub|backfill|backfill_
实例如下:
ceph pg ls-by-pool test
查询某个osd状态为 primary pg ,可以根据需要过滤状态
pg ls-by-primary
backfill_toofull|recovery_wait|undersized [active|clean|down|replay|splitting|scrubbing|scrubq|degraded|inconsistent|peering|repair|recovering|backfill_wait|incomplete|stale|remapped|deep_scrub|backfill|
backfill_toofull|recovery_wait|undersized…]} : list pg with primary = [osd]
实例如下:
osd号 过滤输出的状态
ceph pg ls-by-primary osd.3 clean
rbd命令相关
在test池中创建一个命名为kjh的10000M的镜像
rbd create -p test --size 10000 kjh
查看ceph中一个pool里的所有镜像
rbd ls test
kjh
查看新建的镜像的信息
rbd -p test info kjh
查看ceph pool中一个镜像的信息
rbd info -p test --image kjh
rbd image ‘kjh’:
size 1000 MB in 250 objects
order 22 (4096 kB objects)
block_name_prefix: rb.0.92bd.74b0dc51
format: 1
删除一个镜像
rbd rm -p test kjh
调整一个镜像的尺寸
rbd resize -p test --size 20000 kjh
rbd -p test info kjh #调整后的镜像大小
rbd image ‘kjh’:
size 2000 MB in 500 objects
order 22 (4096 kB objects)
block_name_prefix: rb.0.92c1.74b0dc51
format: 1
rbd pool 快照功能测试
新建个pool叫’ptmindpool’同时在下面创建一个’kjhimage’
ceph osd pool create ptmindpool 256 256
pool ‘ptmindpool’ created
创建镜像
rbd create kjhimage --size 1024 --pool ptmindpool
查看镜像
rbd --pool ptmindpool ls
kjhimage
创建snap,快照名字叫’snapkjhimage’
rbd snap create ptmindpool/kjhimage@snapkjhimage
查看kjhimage的snap
rbd snap ls ptmindpool/kjhimage
SNAPID NAME SIZE
2 snapkjhimage 1024 MB
回滚快照,
rbd snap rollback ptmindpool/kjhimage@snapkjhimage
删除snap 删除snap报(rbd: snapshot ‘snapshot-xxxx’ is protected from removal.)写保护 ,使用 rbd snap unprotect volumes/snapshot-xxx’ 解锁,然后再删除
rbd snap rm ptmindpool/kjhimage@snapkjhimage
删除kjhimage的全部snapshot
rbd snap purge ptmindpool/kjhimage
把ceph pool中的一个镜像导出
导出镜像
rbd export -p ptmindpool --image kjhimage /tmp/kjhimage.img
Exporting image: 100% complete…done.
验证查看导出文件
l /tmp/kjhimage.img
-rw-r–r-- 1 root root 1073741824 Sep 24 23:15 /tmp/kjhimage.img
把一个镜像导入ceph中
rbd import /tmp/kjhimage.img -p ptmindpool --image importmyimage1
Importing image: 100% complete…done
验证查看导入镜像文件
rbd -pptmindpool ls
importmyimage1
修改ceph.conf文件
将修改push到集群中其他节点
重启ceph-mon服务
再次查看
卸载所有ceph程序
删除ceph相关的安装包
删除ceph相关的配置
删除key
卸载ceph-deploy管理
rm -rf /etc/ceph/*
rm -rf /var/lib/ceph/*
rm -rf /mnt/osdN/*