Ceph Cluster Operating 一、状态监控 1、集群操作 2、健康状态检测 3、监控OSDs 4、定位一个Object 二、用户管理 1、认证过程 2、用户类型 3、授权示例 4、各用户所拥有的权限 5、管理用户 6、密钥文件 7、用户管理工具 ceph-authtool 8、ceph命令选项 三、添加OSD 1、介绍 2、在新加入集群的主机上添加OSD 四、删除OSD 1、将osd踢出集群 2、观察数据变化 3、注意 4、将osd进程停止 5、删除crush中对应的osd 6、删除osd认证密钥 7、删除osd 五、增加Monitor节点 六、删除monitor节点 七、Bluestore 1、介绍 2、配置对象存储方式 八、控制命令 1、Monitor命令 2、pg组命令 3、osd相关命令 4、pool snapshot相关命令 5、pool相关命令 6、存储池相关设定命令 7、mon相关命令 九、数据归置概览 (Data Placement Overview) 1、相关概念 2、创建存储池 3、设置存储池配额 4、删除存储池 5、重命名pool 6、查看pool信息 7、存储池 pool 的属性 十、纠删码 Erasure Code 1、Erasure Code介绍 2、创建存储池的纠删码 3、纠删码相关操作 4、纠删码和缓冲分层 5、纠删码插件配置 十一、分级缓存 1、介绍 2、缓存层工作的两种模式 3、配置缓存层注意事项 4、模式 5、配置缓存层基本流程 6、配置指令 7、配置缓存层参数 8、缓存层代理的主要功用 十二、Placement Groups 十三、日志和调试 1、介绍 2、设置日志输出 3、日志滚动配置 4、日志级别 5、子系统列表 十四、ceph CRUSH 1、CRUSH介绍 2、crush location 3、osd读取crush location 4、custom location hooks 5、CRUSH Map 结构 6、相关命令 7、修改CRUSH Map 1、编辑流程 2、修改CRUSH Map步骤 3、CRUSH Map文件格式及含义 4、bucket层级结构 5、bucket类型 6、CRUSH Map Rules 7、在不同的osd上放置不同的pool (CRUSH Map示例) 8、设置不同的pool使用不同的规则(不同的规则导致不同pool放置到不同的osd上) =================================================================================================================== 一、状态监控 1、集群操作 1、同时操作某个节点的所有ceph daemons或某一类型的ceph daemons systemctl start/stop/restart ceph.tartget/ceph-mds.target/ceph-mon\*.service 2、查看某个节点的所有ceph daemons的状态 systemctl status ceph\*.service ceph\*.target 2、健康状态检测 1、错误定义 Manager MGR_MODULE_DEPENDENCY # Mgr进程中的模块依赖软件包未安装,需要安装所需安装包并重新启动manager daemon MGR_MODULE_ERROR # 模块异常错误 OSDS OSD_DOWN # OSD daemon停止或者不能够检测到OSD daemon的心跳信息,出现OSD_DOWN的情况可能是 节点宕机、网络中断、进程异常终止等。可在/var/log/ceph/ceph-osd.* 查看日志信息 OSD__DOWN # 某个主机上的所有OSD daemon停止 OSD_ORPHAN # 在OSD Map中存在,但OSD已经不存在。可以使用 ceph osd crush rm osd.删除OSD OSD_OUT_OF_ORDER_FULL # OSD 存储空间利用率过高,可使用下面命令调整: ceph osd set-backfillfull-ratio # 数据迁移的目标OSD空间使用率过高 ceph osd set-nearfull-ratio # 当OSD空间使用超过指定值时,发出警告 ceph osd set-full-ratio OSD_FULL # 一个或多个OSD超出存储阈值 OSD_BACKFILLFULL # OSD_NEARFULL # 一个或多个OSD的空间使用率即将接近指定的阈值 OSDMAP_FLAGS # 手动给集群状态设置一个flags full - 标记OSD空间使用率已满 ceph osd set | ceph osd unset pauserd, pausewr - 标记OSD不能读取或者写入数据 noup - 即便OSD处于启动,也忽略它的启动 nodown -OSDs的故障报告将被忽略 noin - OSDs that were previously marked out will not be marked back in when they start noout - down OSDs will not automatically be marked out after the configured interval nobackfill, norecover, norebalance - 停止数据回填、数据恢复、数据重新平衡 noscrub, nodeep_scrub - 禁用数据清洗和数据深度清洗 notieragent - 禁用缓存分层 OSD_FLAGS # 手动给指定OSD设置一个flags ceph osd add- osd.2 | ceph osd rm- noup: 即便OSD处于启动,也忽略它的启动 nodown: 此OSD的故障报告将被忽略 noin: if this OSD was previously marked out automatically after a failure, it will not be marked in when it stats noout: if this OSD is down it will not automatically be marked out after the configured interval OLD_CRUSH_TUNABLES # OLD_CRUSH_STRAW_CALC_VERSION# 2、集群健康状态查看 1、交互模式 ceph ceph> health ceph> status ceph> quorum_status ceph> mon_status 2、手动指定密钥文件路径及配置文件路径 ceph -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring health 3、命令行 ceph -s ceph status 3、日志 ceph.audit.log # 集群审计日志 ceph.log # 集群日志 ceph-mds.node1.log # 进程日志 ceph-mgr.node1.log # 进程日志 ceph-mon.node1.log # 进程日志 ceph-osd.0.log # 进程日志 ceph -w # 动态查看集群日志信息 ceph log last 12 # 查看集群日志中的最近的12行 4、查看Ceph Cluster使用状态 ceph df ceph df detail SIZE # 总容量 AVAIL # 剩余可用容量 RAW USED # 已经使用容量 %RAW USED # 使用容量百分比 注意:如果集群的副本是2,则如果使用容量为1800T,则可推断出用户的数据实际为900T NAME # pool名称 ID # pool ID USED # 使用容量 %USED # 此pool使用的百分比 MAX AVAIL # 可以写入的最大容量值 OBJECTS # Object个数 注意:Pool部分的输出中,副本数、快照以及克隆数据不统计在内。 5、查看OSD状态 ceph osd stat ceph osd dump ceph osd tree 6、查看Monitor状态 ceph mon stat ceph mon dump 7、查看mds状态 ceph mds stat ceph mds dump 8、查看pg(placement groups)状态 ceph pg stat ceph pg dump 9、通过进程socket查看进程状态 3、监控OSDs 1、OSD状态: up/down OSD进程是否在正常运行 in/out OSD进程是否在集群内 ceph osd out osd.2 # 将osd.2移除集群 ceph osd in osd.2 # 将osd.2加入集群 2、pg监控 ceph pg dump # 查看pg状态 ceph pg stat # 查看pg状态 ceph pg dump -o {filename} --format=json # 将pg列表输出为json格式 ceph pg 4.37 query # 查看某个pg信息 ceph pg map {pg-num} # 查看指定pg在那个Acting Set或者Up Set内。存放某个pg及其副本的一组 OSD称为Acting Set,Up Set处理客户端请求,最终处理请求的一组OSD称为Up Set 3、pg状态 Creating Ceph 仍在创建归置组。 Active Ceph 可处理到归置组的请求。 Clean Ceph 把归置组内的对象复制了规定次数。 Down 包含必备数据的副本挂了,所以归置组离线。 Replay 某 OSD 崩溃后,归置组在等待客户端重放操作。 Splitting Ceph 正在把一归置组分割为多个。(实现了?) Scrubbing Ceph 正在检查归置组的一致性。 Degraded 归置组内的对象还没复制到规定次数。 Inconsistent Ceph 检测到了归置组内一或多个副本间不一致(如各对象大小不一、恢复后对象还没复制到副本那里、等等)。 Peering 归置组正在互联。 Repair Ceph 正在检查归置组、并试图修复发现的不一致(如果可能的话)。 Recovering Ceph 正在迁移/同步对象及其副本。 Backfill Ceph 正在扫描并同步整个归置组的内容,而不是根据日志推算哪些最新操作需要同步。 Backfill 是恢复的一种特殊情况。 Wait-backfill 归置组正在排队,等候回填。 Backfill-toofull 一回填操作在等待,因为目标 OSD 使用率超过了占满率。 Incomplete Ceph 探测到某一归置组可能丢失了写入信息,或者没有健康的副本。如果你看到了这个状态,试着启动一下有可能包含所需 信息的失败 OSD 、或者临时调整一下 min_size 以完成恢复。 Stale 归置组处于一种未知状态——从归置组运行图变更起就没再收到它的更新。 Remapped 归置组被临时映射到了另外一组 OSD ,它们不是 CRUSH 算法指定的。 Undersized 此归置组的副本数小于配置的存储池副本水平。 Peered 此归置组已互联,但是不能向客户端提供服务,因为其副本数没达到本存储池的配置值( min_size 参数)。在此状态下可以 进行恢复,所以此归置组最终能达到 min_size 。 4、定位一个对象 (Object) # 在客户端创建并上传一个对象 rados put test-object /etc/fstab --pool=Block # 查看对象 rados -p Block ls # 查看某个对象属于那个pg ceph osd map {pool-name} {object-name} osdmap e168 pool 'Block' (3) object 'test-object' -> pg 3.bf8f6aea (3.a) -> up ([1,0,2], p1) acting ([1,0,2], p1) # 删除某个对象 rados rm test-object-1 --pool=data =================================================================================================================== 二、用户管理 1、认证过程 与ceph server交互的用户可以是个人用户也可以是系统用户(如应用程序)。客户端与ceph server交互时必须制定用户名和包含 此用户密钥的密钥环文件(用户名默认是client.admin,如果不指定密钥环文件ceph客户端会从ceph配置文件中配置制定的位置 查找密钥)。 (参考 《Ceph架构》6、Ceph集群认证) 2、用户类型 ceph的用户可以是客户端的个人用户也可以是程序,ceph集群中有用户类型的概念,区别用户类型是通过 Type.UserName 的形式 进行区别的。例如:client.admin、client.user 中的type就是client,用户为admin、user。ceph monitors、osds、metadata 服务也都使用了cephx协议,但是他们不是客户端,他们的标识为 mon.node1、mgr.node1。 3、授权示例 ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd \ --cap mon 'profile bootstrap-osd' ceph auth get-or-create mgr.node1 mon 'allow *' osd 'allow *' mds 'allow *' 4、各用户所拥有的权限 monitor:r、w、x、allow profile {cap} OSD:r、w、x、 class-read、class-write、allow profile {cap} matedata:allow {cap} 例:mds 'allow' 5、管理用户 查看所有用户 ceph auth ls 将用户信息导出为一个文件 ceph auth ls -o /path/to/userfile 从文件中导入用户信息到ceph集群 ceph auth import -i /path/to/userfile 查看某个用户信息 ceph auth get Type.Username ceph auth export Type.Username 将某个用户信息导出到一个文件 ceph auth export Type.Username -o /root/user.file 创建/删除用户 注:ceph -c /etc/ceph/ceph.conf -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health 创建用户方式: ceph auth add # 创建一个用户、密钥、权限。返回创建成功提示 ceph auth get-or-create # 创建成功后,返回用户名及其密钥和所拥有的权限。 ceph auth get-or-create-key 删除用户: ceph auth rm|del client.xuekaixin 示例: ceph auth add client.xuekaixin mon "allow *" osd "allow r pool=Block" ceph auth get-or-create client.xuekaixin mon "allow rw" osd "allow r pool=Block" [ -o /path/to/file] 修改用户权限: ceph auth caps client.xuekaixin mon "allow *" osd "allow *" 注:相当于覆盖修改 查看某个用户的密钥: ceph auth print-key client.admin 6、密钥文件 当ceph客户端访问ceph server时,会默认从四个位置查找密钥文件: /etc/ceph/$cluster.$name.keyring /etc/ceph/$cluster.keyring /etc/ceph/keyring /etc/ceph/keyring.bin $cluster 表示ceph集群名称 $name 表示用户类型和用户名 7、用户管理工具 ceph-authtool 创建一个密钥环文件 ceph-authtool --create-keyring|-C /path/to/file.keyring 创建一个用户并授予权限(创建密钥文件) ceph-authtool -C /etc/ceph/client.xuekaixin.keyring -n client.xuekaixin --cap osd "allow *" --cap mon "allow *" --gen-key 将密钥导入ceph集群 ceph auth add client.xuekaixin -i /root/ceph.client.xuekaixin.keyring 修改一个用户的权限 ceph-authtool /root/ceph.client.xuekaixin.keyring -n client.xuekaixin --cap osd "allow *" --cap mon "allow *" 导入 ceph auth import -i /root/ceph.client.xuekaixin.keyring 8、ceph命令选项 --id|--user # 用来指定用户名,例如 --id xuekaixin --name|-n # 用于指定完整的用户类型和用户名,例如 --name client.admin --keyring # 指定密钥环文件 =================================================================================================================== 三、添加/删除OSD 1、介绍 通常情况下,每个硬盘之上运行一个OSD进程。当集群容量使用接近满的时候,需要在ceph集群运行时添加OSD。 2、在新加入集群的主机上添加OSD 1、复制/etc/ceph/目录下所有文件到新加入集群的主机上 2、创建OSD ceph osd create 8ffe197d-b8da-429a-8261-4b2efc3f3cb2 {id} 注:id可省略,此命令会自动生成 3、创建osd数据目录 mkdir /var/lib/ceph/osd/ceph-3 4、格式化设备 mkfs.xfs /dev/sdb 5、将设备挂载到osd的数据目录 mount /dev/sdb /var/lib/ceph/osd/ceph-3 6、初始化osd数据目录 ceph-osd -i 3 --mkfs --mkkey 注:--mkkey表示新生成一个密钥 7、将密钥文件中的密钥导入ceph集群 ceph auth add osd.3 osd "allow *" mon "allow rwx" -i /var/lib/ceph/osd/ceph-3/keyring 8、把 OSD 加入 CRUSH ceph osd crush add osd.3 .2 root=default 9、创建client.bootstrap-osd key文件(本节点新建第一个osd时才需要) ceph auth get-or-create client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring chmod 600 /var/lib/ceph/bootstrap-osd/ceph.keyring chown ceph:ceph /var/lib/ceph/bootstrap-osd/ceph.keyring 10、重新调整osd的权重 ceph osd reweight 1.00 =================================================================================================================== 1、将osd踢出集群 ceph osd out osd.N 2、观察数据变化 ceph -w 3、注意 有时候,(通常是只有几台主机的“小”集群,比如小型测试集群)拿出( 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 命令更适合“小”集群。 4、将osd进程停止 systemctl stop ceph-osd@3 5、删除crush中对应的osd ceph osd crush remove {osd-num} 6、删除osd认证密钥 ceph auth del osd.{osd-num} 7、删除osd ceph osd rm osd.3 =================================================================================================================== 五、增加Monitor节点 1、在新增加的节点上创建数据目录 mkdir /var/lib/ceph/mon/ceph-nodeN 2、创建临时目录,用于增加monitor节点过程中产生的文件 mkdir /tmp/tmp 3、获取monitor密钥,并保存到临时目录中 ceph auth get mon. -o /tmp/tmp/ceph.mon.keyring 4、获取monitor map ceph mon getmap -o /tmp/tmp/monmap 5、初始化monitor节点 ceph-mon -i node4 --mkfs --monmap /tmp/tmp/monmap --keyring /tmp/tmp/ceph.mon.keyring 6、启动monitor =================================================================================================================== 六、删除monitor节点 1、停止mon进程 systemctl stop ceph-mon@node4.service 2、将monitor从集群中删除 ceph mon remove node4 4、修改ceph.conf文件 遇到monitor节点出现故障时,可以将集群monmap提取出来,然后删除出现故障的monitor节点,最后将修正后的monmap注入 存活的monitor节点。 提取monmap: ceph-mon -i `hostname` --extract-monmap /tmp/monmap 删除故障monitor节点: monmaptool /tmp/monmap --rm nodeN 将修正后的monmap注入集群: ceph-mon -i nodeN --inject-monmap /tmp/monmap =================================================================================================================== 七、Bluestore Migration 1、介绍 1、默认情况下,对象存储的实现都是使用Bluestore。 2、查看某个osd使用的对象存储方式 ceph osd metadata osd.id | grep osd_objectstore 3、查看当前osd存储方式使用情况 ceph osd count-metadata osd_objectstore 2、配置对象存储方式 1、将osd踢出集群 ceph osd out osdID 2、停止osd进程 systemctl stop ceph-osd@3 3、卸载osd设备 mount | grep ceph umount /var/lib/ceph/osd/ceph-3/ 4、从逻辑卷或分区中删除所有数据和文件系统 ceph-volume lvm zap /dev/sdb 5、标记此osd已经损坏 ceph osd destroy 6 --yes-i-really-mean-it 6、使用相同的OSD ID在其位置重新配置 ceph-volume lvm create --bluestore --data $DEVICE --osd-id $ID =================================================================================================================== 八、控制命令 1、Monitor命令 查看monitor状态 ceph -f json-pretty mon_status 查看monitor投票人数 ceph -f json-pretty quorum_status 2、pg组命令 查看pg状态 ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}] 注: --format # plain (默认)或 json --threshold # 定义了多久算“卡住了”(默认 300 秒) 删除pg ceph pg {pgid} mark_unfound_lost revert|delete 3、osd相关命令 查看osd状态 ceph osd dump -f json-pretty 清洗osd ceph osd scrub {osd-num} 修复osd ceph osd repair {osd-num|*} 注:*代表匹配所有OSD osd压力测试(读写能力) rados bench -p -b -t --no-cleanup 注: pool_name # 测试所针对的存储池; seconds # 测试所持续的秒数; # 操作模式,write:写,seq:顺序读;rand:随机读; -b:block size # 即块大小,默认为 4M; -t # 读/写并行数,默认为 16; --no-cleanup # 表示测试完成后不删除测试用数据。在做读测试之前,需要使用该参数来运行一遍写测试来产生测 试数据,在全部测试结束后可以运行 rados -p cleanup 来清理所有测试数据 4、pool snapshot相关命令 查看某pool的快照 rados lssnap -p {pool—name} 创建pool snapshot ceph osd pool mksnap {pool-name} {snap-name} 删除pool snapshot ceph osd pool rmsnap {pool-name} {snap-name} 查看块设备信息 rbd info Pool_Name/Block_Name 给块设备创建快照 rbd snap create Pool_Name/Block_Name@Block_Name_Snapshot 查看块设备快照 rbd snap list Pool_Name/Block_Name 5、pool相关命令 ceph osd pool create {pool-name} pg_num [pgp_num] ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it] ceph osd pool rename {old-name} {new-name} 获取pool相关属性参数 ceph osd pool get|set {pool-name} size|pg_num|pgp_num|crush_rule 设置每个pool最大字节数/最大对象数配额 ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}] 重命名pool ceph osd pool rename {current-pool-name} {new-pool-name} 设置pool配额 6、存储池相关设定命令 设定pool属性 ceph osd pool set {pool-name} {field} {value} 注:field可以是 size: 设置存储池内数据的副本数; crash_replay_interval: 允许客户端重放确认而未提交的请求前等待的时间,秒; pg_num: 归置组数量; pgp_num: 计算归置组存放的有效数量; crush_ruleset: 用于归置映射的规则号 查看pool设置属性 ceph osd pool get {pool-name} {field} 注:field可以是 pg_num: 归置组数量; pgp_num: 计算归置组存放的有效数量; lpg_num: 本地归置组数量; lpgp_num: 用于存放本地归置组的数量 7、mon相关命令 查看mon状态 ceph quorum_status -f json-pretty ceph mon stat 查看ceph集群转储信息 ceph mon dump =================================================================================================================== 九、数据归置概览 (Data Placement Overview) 1、相关概念 pool # 对象存储的逻辑组。pool管理者pg数量、副本数量、存储池规则集。用户存储数据必须经过认证且具有相对的权限。 Placement Group # ceph集群将对象映射到pg。 CRUSH Map # 2、创建存储池 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] 选项含义: {pool-name} # 存储池名称 {pg-num} # 归置组数量,默认为8 {pgp-num} # 注: pg-num是指存储池存储对象的目录有多少个 PGP是存储池PG的OSD分布组合个数 {replicated|erasure} # 指定存储类型,默认值是 replicated。 注: replicated 副本模式,需要更多的原始空间,实现了ceph的所有功能; erasure 类似于RAID5,纠删码模式,需要更少的原始存储空间,实现较少的ceph功能。 [crush-ruleset-name] # 指定pool所用的CRUSH规则集名字,CRUSH必须实现存在,对于replicated模式来说由 osd pool default crush replicated ruleset配置项决定。 对于erasure模式来说,不同的pool使用配置不同,如果不存在则会显示创建。 [erasure-code-profile=profile] # 仅仅用于erasure模式,指定纠删码配置框架。 [expected-num-objects] # 预估指定存储池所存储的对象数。设置此值(要同时把 filestore merge threshold 设置为负数)后,在创建存储 池时就会拆分 PG 文件夹,以免运行时拆分文件夹导致延时增大。 3、设置存储池配额 ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}] 要取消配置则设置为0 4、删除存储池 ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it] 5、重命名pool ceph osd pool rename {current-pool-name} {new-pool-name} 6、查看pool信息 rados df 7、存储池 pool 的属性 ceph osd pool set {pool-name} {key} {value} key-value: compression_algorithm # 设置用于底层BlueStore的内联压缩算法,此设置将覆盖bluestore压缩算法的全局设置 有效值有:lz4, snappy, zlib, zstd compression_mode # 设置BlueStore压缩算法的策略,有效值有:none, passive, aggressive, force compression_min_blob_size # 小于此处指定大小的块不会被压缩 compression_max_blob_size # 大于此处指定的块大小的块在压缩之前会被分解为小于compression_max_blob_size的块 size # 设置pool副本数 min_size # 副本最小数量 crash_replay_interval # 允许客户端重放确认而未提交请求的秒数 pg_num # pgp_num # crush_rule # ?????? allow_ec_overwrites # ?????? hashpspool # ?????? nodelete # 给存储池设定是否可被删除的标志 1 0 nopgchange # 给存储池设定副本数是否被改变的标志 1 0 write_fadvise_dontneed # ?????? noscrub # 给存储池设定是否可清洗的标志 1 0 nodeep-scrub # 给存储池设定是否可深度清洗的标志 1 0 =================================================================================================================== 十、纠删码 Erasure Code 1、Erasure Code介绍 1、纠删码技术是在存储的数据块(n个)的基础上增加纠删码块(m个),在出现数据丢失时能够通过n+m份数据块中的任意n个数据库 恢复原始数据,最多允许丢失n-m个数据块。 2、Ceph 从 Firefly 版本开始支持纠删码。 3、ceph分布式存储中使用副本的方式保证数据的冗余会带来存储空间的浪费,而使用纠删码能够大大节省存储空间。 4、ceph中使用了不同的纠删码插件,例如Jerasure(默认使用插件),ISA-l 和 LRC。 5、Ceph 通过一个 EC 配置文件对纠删码的参数进行简单的管理。 6、纠删码最早起源于通信行业通信过程中的数据损耗问题,其基本原理就是将数据报文分段,一旦出现数据丢失,则利用纠删码 进行计算出丢失的数据段。 7、纠删码数据块n和纠删码数据块m可调整。 8、使用纠删码能够提高存储利用率,但会对计算资源和网络负载带来压力。 9、使用纠删码的pool在存储对象时,该对象被划分成k个数据块,这k个数据块的大小一致,此外又计算m个纠删码数据块,大小和 数据块大小一致, 2、创建存储池的纠删码 ceph osd pool create pool-name 12 12 erasure ceph osd pool create poolname test_pool erasure-code-directory=dir erasure-code-plugin=jerasure erasure-code-m=1 \ erasure-code-k=2 erasure-code-technique=reed_sol_van 3、纠删码相关操作 获取纠删码默认EC配置文件 ceph osd erasure-code-profile get default k=2 # 对象被分割为数据块的数量 m=1 # 创建纠删码数据块的数量。即多少个osd损坏而不会损坏数据 plugin=jerasure # 使用的纠删码插件名称 crush-failure-domain=rack # crush-failure-domain = rack将创建一个CRUSH规则,确保在同一个机架中不存储两个块。 technique=reed_sol_van directory=/usr/lib/ceph/erasure-code # 默认是此目录。设置纠删码插件目录位置 stripe_unit=stripe_unit # 每个条带的数据块中的数据量 --force # 强制覆盖现有的配置文件 注:存储池创建Erasure Code后,无法修改,只能创建新的存储池然后将Object移动到新创建的存储池中。 自定义纠删码配置文件 ceph osd erasure-code-profile set myprofile k=3 m=2 crush-faile-domain=rack 查看纠删码配置文件 ceph osd erasure-code-profile ls ceph osd erasure-code-profile get myprofile 4、纠删码和缓冲分层 使用纠删码比使用副本模式需要更多的系统资源,而且缺少一些必要的功能,例如omap。为了降低纠删码带来的性能问题,可以使用 缓存层。 默认的纠删码配置文件default的配置项的冗余级别相当于两副本模式,但磁盘空间减少了25%。 5、纠删码插件配置 文档:http://docs.ceph.com/docs/master/rados/operations/erasure-code/ jerasure是默认的纠删码插件,其封装了jerasure库。 设置使用jerasure的纠删码插件配置文件: ceph osd erasure-code-profile set {name} \ plugin=jerasure \ k={data-chunks} \ m={coding-chunks} \ technique={reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion} \ # reed_sol_van是默认的纠删码策略;cauchy_good可以提高性能;reed_sol_r6_op|cauchy_orig|cauchy_good|\ liberation|blaum_roth|liber8tion这几种策略和RAID6等价。 [crush-root={root}] \ [crush-failure-domain={bucket-type}] \ # 例如,如果故障域是主机,则不会在同一主机上存储两个块。 [crush-device-class={device-class}] \ [directory={directory}] \ [--force] =================================================================================================================== 十一、分级缓存 1、介绍 分级缓存将后端存储内的热点数据存储到高速硬盘SSHD中,减缓了数据的I/O性能。负责对象存储的BlueStore将自动处理缓存层 和后端存储的数据迁移,但管理员仍可以干预迁移规则。缓存层对于客户端来说是完全透明的。 2、缓存层工作的两种模式 (回写)Writeback模式 Ceph Clent将数据写入缓存层,缓存层返回ACK响应码,写入缓存层的数据被迁移到存储层,然后将数据从缓存层删除。当 客户端再次读数据时,将这些数据迁移到缓存层,然后返回给客户端。 Ceph Client读写都是cache层负责;当数据不在活跃时,tiering agent会将数据刷新或驱逐到后端存;这种模式使用于数 据变化频繁的场景。 (只读)Readonly模式 Ceph Client直接将数据写入后端存储,读取时,ceph把对应的数据复制到缓存层,ceph缓存层会根据已定义好的策略将脏 数据踢出缓存层。 3、配置缓存层注意事项 1、配置缓存层有可能会造成ceph集群I/O性能下降。 2、在集群中只有大多数请求集中在少量数据时适合开启缓存层。 3、少量数据需要预热,需要考虑预热成本。 4、开启缓存分层,增加系统额外的负载。 5、通常复制模式的pool开启缓存层性能要较好于开启纠删码的pool。 6、开启缓存层意味着使用集群系统中许多复杂机制和功能,因此会给系统带来更多未知的风险。 4、模式 1、要配置缓存层,需具备两个pool,一个作为后端存储池,另外一个作为缓存层池。 2、缓存层使用场景 Standard Storage:后端存储使用多个副本存储对象。 Erasure Coding:后端存储使用纠正码存储数据,在这种情况下,池使用擦除编码来更有效地存储数据,并进行小的性能折衷。 5、配置缓存层基本流程 配置缓存层的基本单位是 pool,缓存层通常意味着有存储后端和缓存前端。缓存前端的pool使用高速的ssd,存储后端使用 较慢的hhd,将存储后端和缓存前端的pool映射到不同的设备上,然后将两个pool关联。最后将访问存储后端的用户流量定向 到缓存层。 6、配置指令 将两个pool关联 ceph osd tier add {storagepool} {cachepool} 配置缓存模式 ceph osd tier cache-mode hot-storage writeback 将访问存储后端的用户流量定向到缓存层 ceph osd tier set-overlay {storagepool} {cachepool} 7、配置缓存层参数 ceph osd pool set {cachepool} {key} {value} 8、缓存层代理的主要功用 1、flushing:代理识别已修改(或脏)的对象,并将它们转发到存储池以进行长期存储。 2、Evicting:代理识别尚未修改(或清除)的对象,并从缓存中清除最近最少使用的对象。 =================================================================================================================== 十二、Placement Groups 1、系统追踪并检测数量庞大的object会对系统产生巨大的压力,因此将object存储到pg中,能够减缓系统的压力。数据的持久 和均匀分布都依赖于pg,因此且pg数量需要一个合理的值。 2、数据持久(Data Durability) 1、osd停止运行后恢复过程 1、一个OSD的停止运行,对于所有的object来说其副本数立马减少一个 2、ceph智能守护进程开始选择一个新的OSD,复制新的副本到此OSD上 =================================================================================================================== 十三、日志和调试 1、介绍 默认情况下 ceph 集群的日志记录在 /var/log/ceph/ 目录下。日志记录是资源密集型的动作,会增加系统的压力。如果集 群的特定进程遇到问题,应该为集群中的特定进程启用日志记录。例如,如果OSD运行正常,但元数据服务器没有运行,则应 首先启用特定元数据服务器实例的调试日志记录。详细的日志记录每小时大约能够产生1GB的日志记录,因此在对线上的集群 进行调试时应格外注意。 2、设置日志输出 查看某个进程的所有运行时配置 ceph daemon osd.0 config show 注入日志输出配置(通过ceph集群的monitor节点配置) ceph tell osd.0 config set debug_osd 0/5 如果monitor节点无法连接可使用以下命令配置 ceph daemon osd.0 config set debug_osd 0/5 3、日志滚动配置 /etc/logrotate.d/ceph 30 * * * * /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1 4、日志级别 每个子系统都有其输出日志的日志记录级别,以及其内存中的日志。您可以通过设置日志文件级别和调试日志记录的内存级别为 每个子系统设置不同的值。Ceph的日志记录级别的操作范围为1到20,其中1为简洁,20为详细。通常,内存中的日志不会发送到 输出日志。 调试日志记录设置可以为日志级别和内存级别采用单个值,这将它们设置为相同的值。例如,如果指定debug ms = 5,则Ceph会 将其视为日志级别和内存级别5.您也可以单独指定它们。第一个设置是日志级别,第二个设置是内存级别。您必须使用正斜杠(/) 分隔它们。例如,如果要将ms子系统的调试日志记录级别设置为1并将其内存级别设置为5,则应将其指定为debug ms = 1/5。 格式:debug {subsystem} = {log-level}/{memory-level} 5、子系统列表 {见幻灯片} =================================================================================================================== 十四、ceph CRUSH 1、CRUSH介绍 CRUSH 算法是用来如何是存储和恢复数据的。CRUSH 算法的应用使得客户端可以直接和后端存储数据的osd直接通信,避免 了中心节点或者代理服务器。通过算法确定的存储和检索数据的方法,Ceph可以避免单点故障,性能瓶颈以及对其可扩展 性的物理限制。 CRUSH算法需要集群的一个映射关系,CRUSH算法可以利用此映射关系去存储、检索、随机的分布数据。CRUSH Map包括osd的 的列表,用于将设备聚合到物理位置的buckets列表,以及告诉CRUSH如何在Ceph集群池中复制数据的规则列表。通过将这些 信息编码到cluster map中,CRUSH放置策略可以跨不同的故障域分隔对象副本,同时仍保持所需的分布。例如,为了解决并 发故障的可能性,可能需要确保数据副本在使用不同主机,机架,电源,控制器或物理位置的设备上。 在部署OSD时,系统会自动将OSD放置到主机所在CRUSH Map中。在默认的 CRUSH Map中,确保副本在主机级别分离,单个主机 故障不会造成数据丢失。会于较大的集群中,硬跨机架分离副本。 2、crush location 一个OSD的位置在CRUSH Map中称为 crush location,标记位置是用一个key/value(键值对)列表表示。例如描述一个osd的 crush location如下: root=default row=a rack=a2 chassis=a2a host=a2a1 默认情况下,osd的位置描述被标记为:root = default host = HOSTNAME 3、osd读取crush location OSD的crush location可以通常通过ceph.conf文件设置,每次OSD启动时,它都会验证osd是否位于CRUSH映射中的正确位置, 如果不是,则自动移动osd到正确到位置。要禁用此自动CRUSH映射管理,可以进行以下配置: osd crush update on start = false 4、custom location hooks 此功能为自定义crush规则文件的位置。 配置文件中添加以启用格式;crush location hook = /path/to/customized-ceph-crush-location 5、CRUSH Map 结构 CRUSH Map包括了描述集群物理结构拓扑的层次结构以及定义数据如何在这些设备上放置的一组策略规则。层次结构的叶子节 点处的osd守护进程。规则描述了如何根据层次结构放置副本。 1、devices devices是存储数据的一个单独的ceph-osd守护程序。标识devices通常格式为 osd.N 其中N为设备id。 2、types and buckets type包括: osd (or device) host chassis rack row pdu pod room datacenter region root 3、devices classes 每个设备可以设置具有与之相关联的类,默认情况下,osd会根据他们所支持的设备类型,在启功时自动将其设置为hdd、sdd、NVMe 4、weights sets 权重集是计算数据放置时使用的一组权重。与CRUSH映射中的每个设备关联的正常权重是根据设备大小设置的,并指示我们应该在哪 里存储多少数据。然而,因为CRUSH基于伪随机放置过程,所以总是存在一些与这种理想分布的差异。权重集允许群集根据群集的细 节(层次结构,池等)进行数值优化,以实现均衡分布。 6、相关命令 查看crush层次结构 ceph osd crush tree 查看osd crush规则 ceph osd crush rule ls 查看规则 ceph osd crush rule dump 设置osd类型 ceph osd crush set-device-class [...] 删除osd类型 ceph osd crush rm-device-class [...] 更改pool使用的规则 ceph osd pool set crush_rule 7、修改CRUSH Map 1、编辑流程 获取CRUSH Map ---> 反编译CRUSH Map ---> 至少编辑一个设备,存储桶和规则 ---> 重新编译CRUSH映射 2、修改CRUSH Map步骤 获取CRUSH Map ceph osd getcrushmap -o /path/to/file 反编译CRUSH Map crushtool -d crush.bin -o crush.txt 编译成CRUSH Map文件,同时设置可调参数 crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.new 注入集群 ceph osd setcrushmap -i /tmp/crush.new 3、CRUSH Map文件格式及含义 1、CRUSH Map组成段: tunables:CRUSH的可调参数。 devices:能够存储数据的ceph-osd守护进程。 types:存储桶类型定义CRUSH层次结构中使用的存储桶类型。存储桶包括存储位置的分层聚合e.g., rows, racks, chassis, hosts, etc.及其分配的权重。 buckets:定义存储桶类型后,必须在层次结构中定义每个节点,其类型以及它包含的设备或其他节点。 rules:规则定义有关如何跨层次结构中的设备分布数据的策略。 Choose_args:是与已调整以优化数据放置的层次结构相关联的替代权重。单个choose_args映射可用于整个集群,也可以为每个单独的 池创建一个映射。 2、CRUSH BUCKET CRUSH映射中的第二个列表定义了“bucket”类型。bucket中包括的节点和叶子结点之间的关系和层级结构。节点或叶子节点通常表示层 级结构中的物理位置。节点聚合于节点或叶子。叶子节点代表ceph-osd守护进程及其相应的存储介质。 4、bucket层级结构 CRUSH算法根据每个设备权重值在存储设备之间分配并存储数据对象,近似于均匀概率分布。CRUSH根据您定义的层级结构映射分发对象及其 副本。 CRUSH映射表示可用的存储设备以及包含它们的逻辑元素。 为了将 pg 映射到跨故障域的 OSD,CRUSH映射定义了桶类型的分层列表(即,在生成的CRUSH映射中的#types下)。创建存储桶层次结构的 目的是通过其故障域隔离叶节点,例如 hosts, chassis, racks, power distribution units, pods, rows, rooms, and data centers。 除了表示OSD的叶节点外,层次结构的其余部分是任意的,您可以根据自己的需要定义它。 当声明一个 bucket 实例时必须制定其类型,名称,ID以及制定一个相对于总容量或总性能的一个权重,制定 bucket 的算法(通常为 straw)和哈希算法 rjenkins1。其格式如下: [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] } 实例:(定义一个rack bucket,两个 host bucket,osd 作为 host bucket 中的叶子节点) 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 } 5、bucket类型 1、Uniform Uniform类型的bucket适合将类型完全相同的设备组合起来。 2、List List类型的bucket将所有设备聚合为一个链表结构。这种类型的bucket适合集群的扩展场景。 3、Tree Tree使用bucket使用二叉搜索树。当bucket当中包含很多设备或项目时比List类型的bucket更有效。基于RUSH R算法,树桶将放置时 间减少到O(log n),使其适合管理更大的设备集或嵌套桶。 5、Straw/straw2 straw算法里面添加节点或者减少节点,其他服务器上的osd之间会有pg的流动,straw2算法里面添加节点或者减少节点,只会pg从变化 的节点移出或者从其他点移入,其他节点间没有数据流动。它在控制数据迁移方面是最优的。 注意:每个桶类型都使用哈希算法。目前,Ceph支持rjenkins1。设置为0则代表选择rjenkins1。 6、CRUSH Map Rules 1、概念 CRUSH映射支持“CRUSH规则”的概念,这些规则决定了池的数据放置。可以对每个pool设定不同的CRUSH规则。创建池时的默认规则 的id为0的规则。CRUSH规则定义放置和复制策略或分发策略,允许您准确指定CRUSH如何放置对象副本。 2、示例配置 rule { ruleset type [ replicated | erasure ] min_size max_size step take [class ] step [choose|chooseleaf] [firstn|indep] type step emit } 3、配置键值含义 ruleset:用于识别规则的唯一整数。默认为0 type:描述pool类型是replicated还是erasure。默认replicated min_size:如果设置了pool的副本数少于次数,则CRUSH则不会将此规则应用于这个pool。默认为1 max_size:如果设置了pool的副本数多于次数,则CRUSH则不会将此规则应用于这个pool。默认为10 step take [class ]:指定bucket名称。bucket中的设备类型要和device-class指定的相匹配 step choose firstn {num} type {bucket-type}:bucket-type为该类型的桶包含的桶类型,num通常是池中副本的数量(即池大小)。 step chooseleaf firstn {num} type {bucket-type}: step emit:输出当前值并清空堆栈。通常在规则末尾使用,但也可用于从同一规则中的不同树中挑选。 5、注意:可以将给定的CRUSH规则分配给多个pool,但单个pool不可能具有多个CRUSH规则。 7、在不同的osd上放置不同的pool (CRUSH Map示例) device 0 osd.0 device 1 osd.1 device 2 osd.2 device 3 osd.3 device 4 osd.4 device 5 osd.5 device 6 osd.6 device 7 osd.7 host ceph-osd-ssd-server-1 { id -1 alg straw hash 0 item osd.0 weight 1.00 item osd.1 weight 1.00 } host ceph-osd-ssd-server-2 { id -2 alg straw hash 0 item osd.2 weight 1.00 item osd.3 weight 1.00 } host ceph-osd-platter-server-1 { id -3 alg straw hash 0 item osd.4 weight 1.00 item osd.5 weight 1.00 } host ceph-osd-platter-server-2 { id -4 alg straw hash 0 item osd.6 weight 1.00 item osd.7 weight 1.00 } root platter { id -5 alg straw hash 0 item ceph-osd-platter-server-1 weight 2.00 item ceph-osd-platter-server-2 weight 2.00 } root ssd { id -6 alg straw hash 0 item ceph-osd-ssd-server-1 weight 2.00 item ceph-osd-ssd-server-2 weight 2.00 } rule data { ruleset 0 type replicated min_size 2 max_size 2 step take platter step chooseleaf firstn 0 type host step emit } rule metadata { ruleset 1 type replicated min_size 0 max_size 10 step take platter step chooseleaf firstn 0 type host step emit } rule rbd { ruleset 2 type replicated min_size 0 max_size 10 step take platter step chooseleaf firstn 0 type host step emit } rule platter { ruleset 3 type replicated min_size 0 max_size 10 step take platter step chooseleaf firstn 0 type host step emit } rule ssd { ruleset 4 type replicated min_size 0 max_size 4 step take ssd step chooseleaf firstn 0 type host step emit } rule ssd-primary { ruleset 5 type replicated min_size 5 max_size 10 step take ssd step chooseleaf firstn 1 type host step emit step take platter step chooseleaf firstn -1 type host step emit } 8、设置不同的pool使用不同的规则(不同的规则导致不同pool放置到不同的osd上) ceph osd pool set crush_rule ssd ===================================================================================================================