ceph 杂项

cp的参数
-a:归档,相当于-dR --preserv=all,可以用来备份,所有的属性及文件都会保留下来

ceph卡在active+remapped状态:
执行:ceph osd crush reweight XX即可ok

解码object map:

1、getfattr -n user.ceph._ -d 0.25_head/rbd\udata.85dd2ae8944a.00000000000009f5__head_87E781E5__0 --only-values > 1.chunk
2、getfattr -n user.ceph._@1 -d 0.25_head/rbd\udata.85dd2ae8944a.00000000000009f5__head_87E781E5__0 --only-values > 1.chunk
3、ceph-dencoder import 1.chunk type object_info_t decode dump_json

ceph -s -f json-pretty #json输出
解码osd元数据:
ceph-dencoder import osd\usuperblock__0_23C2FCDE__none type OSDSuperblock dump_json

ceph osd pool ls detail
ceph osd pool stats
ceph osd df
ceph df
ceph daemon /var/run/ceph/ceph-osd.1.asok ops //当前osd ops

查看map了test.img的节点:

rados -p images listwatchers test.img

ceph pg 1.619 query #查看pg状态

ceph pg set_nearfull_ratio 0.9 #待验证

ceph osd out osd.0
ceph osd down osd.0
ceph osd rm osd.0
ceph osd crush rm osd.0
ceph auth del osd.0

ceph的log没有具体的文件行号,我自己加的代码

define dout_subsys ceph_subsys_rgw

define INFO dout(1) <<FILE<<":"<<func<<":"<<LINE<<":"<<

这样log中就有具体的函数和文件行号了

ceph提供有自动调节reweight的工具:ceph osd reweight-by-utilization
ceph osd crush tunables optimal //最优化crush,暂不知道优化了之后的修改地方在哪

osd目录以及名字解析:
数据目录/PG名称/子目录/object文件名
举例说明:
/data09/ceph/osd2/current/0.0_head/DIR_0/DIR_8/DIR_9/10000007af4.00000000__head_3AF0B980__0
其中,子目录是根据object文件名中hash字段的字符反向排列生成。当一个目录中的文件个数大于配置值(merge_threshold * 16 * split_multiplier)时,会建子目录,对文件进行归档。

pgp_num决定了多少pg会拿来存放数据,也就是说并不是所有创建出来的pg都会存放数据;
调整pg的数目会触发相关pg的分裂操作(但不会数据迁移,因为分裂后的pg会map到其父pg对应的osd集合),调整pgp_num会导致集群内发生数据迁移;

降低fillback的最大数和recovery的最大数

ceph --admin-daemon /var/run/ceph/ceph-mon.SJ-6-Cloud101.asok help
ceph --admin-daemon /var/run/ceph/ceph-osd.22.asok help
/usr/bin/radosgw -d --debug-rgw 20 --debug-ms 1 start
ceph tell osd.* injectargs "--rbd_cache true" # * 批量修改
ceph tell osd.* injectargs "--debug-osd 20"

osd.X reported failed by osd.XX

ceph daemon /var/run/ceph/ceph-mon.ceph.asok config set osd_heartbeat_grace 60

如何限制 ceph rbd 的qos和读写速度呢
可以在client配置objecter inflight *,参数

--image-format format-id
选择用哪个对象布局,默认为 1 。
format 1 - 新建 rbd 映像时使用最初的格式。此格式兼容所有版本的 librbd 和内核模块,但是不支持较新的功能,像克隆。
format 2 - 使用第二版 rbd 格式, librbd 和 3.11
版以上内核模块才支持(除非是分拆的模块)。此格式增加了克隆支持,使得扩展更容易,还允许以后增加新功能。

为使用rbd 块新特性,使用格式2,在map 时发生以上报错:
查找官网相关资料,找到信息如下:
笔者安装的是jewel 版本,新建rbd块指定格式2,默认格式2的rbd 块支持如下特性,默认全部开启;
layering: 支持分层
striping: 支持条带化 v2
exclusive-lock: 支持独占锁
object-map: 支持对象映射(依赖 exclusive-lock )
fast-diff: 快速计算差异(依赖 object-map )
deep-flatten: 支持快照扁平化操作
journaling: 支持记录 IO 操作(依赖独占锁)

使用系统为centos7.2 ,内核版本 3.10.0-327.18.2.el7.x86_64,根据报错内容提示可知,服务器系统内核版本,不支持有些格式2
的新特性导致。可以使用
--image-feature 选项指定使用特性,不用全部开启。我们的需求仅需要使用快照等特性,开启layering即可,配置方式如下:
rbd create rbd/test1 --size 10G --image-format 2 --image-feature layering
rbd ls
rbd map rbd/test1 #可以正常映射;

经测试,内核版本 3.10,仅支持此特性(layering),其它特性需要使用更高版本内核,或者从新编译内核加载特性模块才行。

ceph daemon osd.0 config show |less -----------查看ceph集群参数设置;

ec Pool:
osd_pool_erasure_code_stripe_width = 4194304
ceph tier测试
新建2个pools:
ceph osd pool create cachepool 128 128
ceph osd pool create datapool 1024 1024
关联两个pool:
ceph osd tier add datapool cachepool
设置cache模式:
ceph osd tier cache-mode cachepool writeback
设置over-lay:【所谓overlay,即所有发送到后端存储层的请求会被转发到cache层】
ceph osd tier set-overlay datapool cachepool
配置cache tier:
ceph osd pool set cachepool hit_set_type bloom
ceph osd pool set cachepool hit_set_count 1
ceph osd pool set cachepool hit_set_period 3600
ceph osd pool set cachepool target_max_bytes 1000000000000
ceph osd pool set cachepool min_read_recency_for_promote 1

    ceph osd pool set tierpool target_max_bytes   XX
    ceph osd pool set tierpool target_max_objects XX

max_objects和max_bytes
ceph osd pool set tierpool max_objects XX *******
ceph osd pool set tierpool max_bytes xx *******
ceph osd pool set tierpool hit_set_type bloom
ceph osd pool set tierpool cache_target_dirty_ratio 0.4
ceph osd pool set tierpool cache_target_full_ratio 0.8
ceph osd pool set tierpool cache_min_evict_age 1800

Flushing And Evicting
Flushing: Cache Tier Agent识别出dirty的object,然后更新到后端存储。
Evicting: 识别出clean的对象,即没有被修改过的,从cache层删除最旧的数据。

ceph osd reweight (reweight 为0-1之间)
reweight只会影响同一故障域内的OSD之间容量配比
它是做了配比,把部分pg迁移出故障域,好处是reweight对数据改动较少

weight 权重和磁盘的容量相关,一般1T,值为1.000, 500G为0.500
其和磁盘的容量有关系,不因磁盘的可用空间减少而变化;

osd经常down 状态:
1、在crush中删除对应的osd信息
ceph osd crush remove osd.A
2、启动osd服务, 将osd添加回crushmap中;
ceph osd crush add A 1.0 host=XX.xx.xx.xx

ceph tell流程如下:
ceph tell osd.0 -> messenger ->dispath() -> handle_command() -> command_wq.queue() -> do_command()
-> _conf->injectargs() -> applychange() -> obs->handle_conf_change()
从conf_opts.h文件来看,配置项主要有两类:一类是SUBSYSTEM的,一类是OPTION。
SUBSYSTEM主要定义了日志子系统写日志的级别。OPTION则主要定义了特定配置项的类型和初始的值。当injectargs的时候可以通过–debug
$
{system}=int/int 来改变子系统日志的级别。

ceph源码分析:
1、OS模块(ObjectStore)————— src目录下os文件夹:
OSD使用OS模块访问本地存储,os向osd层提供了一个支持事务(transaction)的访问接口,该接口定义
在os/ObjectStore.h中,目前os中有多种实现方式,包括基于filesystem+journal的FileStore,基于KV
的KeyValueStore,基于内存的MemStore等
2、

故障发生后,如果一定时间后重新上线故障 OSD,那么 PG 会进行以下流程:
1. 故障 OSD 上线,通知 Monitor 并注册,该 OSD 在上线前会读取存在持久设备的 PGLog,
2. Monitor 得知该 OSD 的旧有 id,因此会继续使用以前的 PG 分配,之前该 OSD 下线造成的 Degraded PG 会被通知该 OSD 已重新加入
3. 这时候分为两种情况,注意这个情况下 PG 会标志自己为 Peering 状态并暂时停止处理请求:
3.1 第一种情况是故障 OSD 所拥有的 Primary PG
3.1.1 它作为这部分数据"权责"主体,需要发送查询 PG 元数据请求给所有属于该 PG 的 Replicate 角色节点。
3.1.2 该 PG 的 Replicate 角色节点实际上在故障 OSD 下线时期间成为了 Primary 角色并维护了“权威”的 PGLog,该 PG 在得到故障 OSD 的 Primary PG 的查询请求后会发送回应
3.1.3 Primary PG 通过对比 Replicate PG 发送的元数据和 PG 版本信息后发现处于落后状态,因此它会合并得到的 PGLog并建立“权威” PGLog,同时会建立 missing 列表来标记过时数据
3.1.4 Primary PG 在完成“权威” PGLog 的建立后就可以标志自己处于 Active 状态

    3.2 第二种情况是故障 OSD 所拥有的 Replicate PG
    3.2.1 这时上线后故障 OSD 的 Replicate PG 会得到 Primary PG 的查询请求,发送自己这份“过时”的元数据和 PGLog
    3.2.2 Primary PG 对比数据后发现该 PG 落后并且过时,比通过 PGLog 建立了 missing 列表
    3.2.3 Primary PG 标记自己处于 Active 状态
4. PG 开始接受 IO 请求,但是 PG 所属的故障节点仍存在过时数据,故障节点的 Primary PG 会发起 Pull 请求从 Replicate 节点获得最新数据,Replicate PG 会得到其他 OSD 节点上的 Primary PG 的 Push 请求来恢复数据
5. 恢复完成后标记自己 Clean

第三步是 PG 唯一不处理请求的阶段,它通常会在 1s 内完成来减少不可用时间。但是这里仍然有其他问题,比如在恢复期间故障 OSD 会维护 missing
列表,如果 IO 正好是处于 missing 列表的数据,那么 PG 会进行恢复数据的“插队”操作,主动将该 IO 涉及的数据从 Replicate PG
拉过来,提前恢复该部分数据。这个情况造成的延迟大概在几十毫米,通常来说是可接受的。

永久性故障
上面的流程的前提故障 OSD 在 PGLog 保存的最大条目数以内加入集群都会利用 PGLog 恢复,那么如果在 N 天之后
或者发生了永久故障需要新盘加入集群时,PGLog 就无法起到恢复数据的作用,这时候就需要 backfill(全量拷贝) 流程介入。
backfill 会将所有数据复制到新上线的 PG,这里的流程跟上述过程基本一致,唯一的差异就是在第三步 Primary PG
发现 PGLog 已经不足以恢复数据时,这时候同样分为两种情况:
故障 OSD 拥有 Primary PG,该 PG 在对比 PGLog 后发现需要全量拷贝数据,那么毫无疑问 Primary PG 在复制
期间已经无法处理请求,它会发送一个特殊请求给 Monitor 告知自己需要全量复制,需要将 Replicate PG 临时性提升为
Primary,等到自己完成了复制过程才会重新接管 Primary 角色
故障 OSD 拥有 Replicate PG,该 PG 的 Primary 角色会发起 backfill 流程向该 PG 复制数据,由于故障 OSD 是 Replicate 角色,
因此不影响正常 IO 的处理

永久性恢复时,需要修改以下参数:
osd-max-backfills:1
osd-recovery-threads:1
osd-recovery-op-priority:1
osd-client-op-priority:63
osd-recovery-max-active:1
osd_recovery_max_single_start:1

术语:
Storage Performance Development Kit,存储性能开发工具包, 简称SPDK

ceph之watch/notify机制(粒度是object),基于librbd exclusive lock来实现:
查看磁盘实际使用量:
rbd diff rbd/zp |awk '{ SUM += $2}' END { print SUM/1024/1024 " mb"}'
gdb输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:
set args

BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。

Ext4引入了现代文件系统中流行的 extents 概念,而传统上ext3等之前的文件系统使用的间接块(inefficient indirect block)来标记文件内容。

从上面的流程分析可以知晓,一个I/O在bluestore里经历了多个线程和队列才最终完成,对于非WAL的写,比如对齐写、写到新的blob里等,I/O先写到块设备上,然后元数据提交到rocksdb并sync了,才返回客户端写完成(在STATE_KV_QUEUED状态的处理);对于WAL(即覆盖写),没有先把数据写块设备,而是将数据和元数据作为wal一起提交到rocksdb并sync后,这样就可以返回客户端写成功了,然后在后面的动作就是将wal里的数据再写到块设备的过程,对这个object的读请求要等到把数据写到块设备完成整个wal写I/O的流程后才行,代码里对应的是_do_read里先o->flush()的操作,所以bluestore里的wal就类似filestore里的journal的作用。
http://www.tuicool.com/articles/ZV3m6bU

ceph osd map images rbd_data.3b2f23752117.0000000000000f47tunables

./configure --prefix=/usr --sbindir=/sbin --sysconfdir=/etc
./do_cmake.sh -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SBINDIR=/sbin -DCMAKE_INSTALL_SYSCONFDIR=/etc

Jewel版本之后版本手动安装:
chown -R ceph:ceph /var/lib/ceph/mon/
chown -R ceph:ceph /var/run/ceph
chown -R ceph:ceph /var/lib/ceph/osd/ceph-{id}

ceph.conf 参数:
[global]
osd tracing = true
osd objectstore tracing = true
rados tracing = true
rbd tracing = true

Ceph RBD QoS
Qemu与KVM均提供对网络资源的限制支持,使用libvirt封装的接口可以更方便的实现对rbd设备的资源限制。 libvirt提供如下选项:

total_bytes_sec: 混合模式下的带宽限制
read_bytes_sec: 顺序读带宽
write_bytes_sec: 顺序写带宽
total_iops_sec: 混合模式下的IOPS限制
read_iops_sec: 随机读IOPS
write_iops_sec: 随机写IOPS
使用方法:


...

...


<read_iops_sec>20</read_iops_sec>
<write_iops_sec>10</write_iops_sec>

...

在XML文件中添加标签,并设置相应的限制值即可

./configure --prefix=/usr --sbindir=/sbin --sysconfdir=/etc
./do_cmake.sh -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_INSTALL_SBINDIR=/sbin -DCMAKE_INSTALL_SYSCONFDIR=/etc

Jewel版本之后版本手动安装:
chown -R ceph:ceph /var/lib/ceph/mon/
chown -R ceph:ceph /var/run/ceph
chown -R ceph:ceph /var/lib/ceph/osd/ceph-{id}

monitor处理消息流程:
Monitor.dispatch_op #(由flag进行分类处理)
-> #以pgstat为例
PGMonitor->dispath(op),
-> PaxosService::dispatch #PGMonitor继承了PaxosService
-> PGMonitor::preprocess_query(op)
-> PGMonitor::preprocess_pg_stats(op)
-> 更新osdmap信息,pgmap信息

使用这个目录恢复osd
在源osd.0的节点执行:
ceph osd creat
ceph auth add osd.0 osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-0/keyring
ceph osd crush add 0 1.0 host=controller-01
然后重新启动osd.0
service ceph start osd.0
此时osd.0被恢复了

systemtap调试ceph
yum install systemtap systemtap-runtime

RGW业务处理流程:

http reqest --> apache 转 FastCgi module:

FastCgi module --> radosgw 通过socket请求实现(未确定是否有其它方式)

radosgw --> ceph集群 通过socket实现,调用rados接口

radosgw常用命令:
创建容器
s3cmd mb s3://BUCKET
删除容器
s3cmd rb s3://BUCKET
查看容器内的文件
s3cmd ls [s3://BUCKET/path/
查看所有容器内的所有文件,我测试过只能显示一层目录
s3cmd la
把文件从本地上传至oos的命令
s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
从oos下载文件到本地
s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
删除容器内的特定文件
s3cmd del s3://BUCKET/OBJECT
如果要删除容器类的整个目录,可以加参数 -r -f
s3cmd del -r -f s3://容器/目录/
把本地目录同步到oos或者从oos同步到本地
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
查看容器所占空间
s3cmd du [s3://BUCKET[/PREFIX]]
查看容器或者文件的属性
s3cmd info s3://BUCKET[/OBJECT]
天翼oos中的文件复制命令
s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
移动文件
s3cmd mv s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]

其中sync同步命令很实用,可以加参数实现不少功能:
同步本地至oos,并在云端删除已经从本地删除的文件
s3cmd sync --delete-removed /path/ s3://bucket/path/
如果怕错删除,可以再加参数 --dry-run,它只列出--delet-removed将要删除的文件,但并不会真正的删除
s3cmd sync --dry-run --delete-removed /path/ s3://bucket/path/
sync命令默认是要校检本地文件和oos中文件的md5值的,如果不想校检只同步新文件,可以加 --skip-existing
s3cmd sync --skip-existing /path/ s3://bucket/path/
还有 --exclude(不包含) 和 --include(包含)参数
s3cmd sync --exclude '.txt' --include 'dir2/' . s3://bucket/path/

对于我,天翼oos是用来存储网站上的静态内容的:.css、.js、.jpg一类。这类文件加入Cache-Control header 可以减少请求数量和流量,参数是 --add-header,命令如下:

s3cmd put --add-header='Cache-Control:max-age=31536000' -M -r jpg_folder s3://assets.onepx.com/

如果想进一步降低流量消耗,可以考虑gzip压缩css和js文件,毕竟流量在云存储里是算钱的,但貌似天翼oos服务器端并不支持gzip压缩,所以我们要预先压缩文件。我的做法是先 "gzip -9" 压缩css文件得到 *.css.gz ,再批量重命名 *.css.gz 为 *.css,最后上传 *.css 文件。这时需要给已经压缩过的文件加 Content-encoding header,否则浏览器读不出来,命令如下:

s3cmd put --add-header='Cache-Control:max-age=31536000' --add-header='Content-encoding:gzip' -M *.css s3://assets.onepx.com/css/

目前网站还在国外,这些静态内容放天翼oos后,网页加载速度真心快不少。

关于REST,这也是比较火的一种Web服务架构。简单来说,资源是由URI指定,对资源的操作包括GET、PUT、POST、DELETE和HEAD,返回结果常常是XML或者其他形式。

s3cmd 远端同步到本地:
/usr/local/bin/s3cmd sync s3://cdnsong/ /data/

s3可执行文件:/root/cp/ceph0.94/src/libs3/build/bin

./s3 -h -f -u -s -r 1 list

./s3 -h -f -u -s -r 1 getacl test filename=aa.txt

./s3 -h -f -u -s -r 1 setacl test filename=aa.txt

./s3 -h -f -u -s -r 1 test aaaaaa

./s3 -h -f -u -s -r 1 create aaaaa1

./s3 -h -f -u -s -r 1 create aaaaa2 cannedAcl=public-read-write location=EU

./s3 -h -f -u -s -r 1 delete aaaaa1

./s3 -h -f -u -s -r 1 put test/release filename=/root/release.asc

./s3 -h -f -u -s -r 1 copy test/release aaaaaa/release

./s3 -h -f -u -s -r 1 get test/release filename=./release

ceph osd crush remove osd.139

E:\Work\linux\ceph
rgw典型案例:
http://cephnotes.ksperis.com/blog/2015/05/12/radosgw-big-index

rgw获取用户已使用bucket的容量大小:
radosgw-admin bucket stats --uid=cp

radosgw-admin user stats --uid=cp --sync-stats

ceph支持rdma:
编译,启用 --enable-xio build Ceph Accelio transport
Accelio是一套支持rdma协议的通讯框架,并且允许扩展包含client和server,同时支持用户态和内核态。
mellanox.com: https://community.mellanox.com/docs/DOC-2141

ceph磁盘容量回收问题:
需要在虚拟机里执行fstrim触发空间回收,并且要求磁盘bus是scsi或者ide,默认的virtio是不可以的

问题:块数据操作,是怎么切分为iops操作的,比如用librbd向集群写一个文件,最后文件怎么划分为io操作的?
答:
osdc/Objecter.cc ---- void Objecter::_send_op(Op *op, MOSDOp *m)
该函数的用途是发送object operation(对象操作)
把数据封装成operation发送给ceph集群,而非仅仅是数据;
比如执行object的read/write等操作,op的来源是msg;
4M是一个对象,object operate封装了对该4M操作的请求;然后再建立session
与mon通信,获取主osd;

问题:怎么把4M对象的写操作,封装在OP(object operate)里面?
4M对象数据存放在bufflist中,op通过偏移来操作他们;
此时,数据并不放在op里面;操作时候,op通过偏移,依次发送该4M数据;
(simplemsg的pipe部分)

osdc/Objecter.cc ------ _op_submit中
2095   bool const check_for_latest_map = _calc_target(&op->target, &op->last_force_resend) == RECALC_OP_TARGET_POOL_DNE;
2096   
2097   // Try to get a session, including a retry if we need to take write lock
2098   int r = _get_session(op->target.osd, &s, lc);
通过op->target获取目标数据,_get_session来获取session;

可以随意找一个obj 处理的函数来分析,例如:
osdc/Objecter.h -----ceph_tid_t write_trunc()

2315 ceph_tid_t write_trunc(const object_t& oid, const object_locator_t& oloc,
2316 uint64_t off, uint64_t len, const SnapContext& snapc, const bufferlist &bl,
2317 utime_t mtime, int flags,
2318 uint64_t trunc_size, __u32 trunc_seq,
2319 Context *onack, Context *oncommit,
2320 version_t *objver = NULL, ObjectOperation *extra_ops = NULL) {
2321 vector ops;
2322 int i = init_ops(ops, 1, extra_ops);
2323 ops[i].op.op = CEPH_OSD_OP_WRITE;
2324 ops[i].op.extent.offset = off;
2325 ops[i].op.extent.length = len;
2326 ops[i].op.extent.truncate_size = trunc_size;
2327 ops[i].op.extent.truncate_seq = trunc_seq;
2328 ops[i].indata = bl;
2329 Op *o = new Op(oid, oloc, ops, flags | global_op_flags.read() | CEPH_OSD_FLAG_WRITE, onack, oncommit, objver);
2330 o->mtime = mtime;
2331 o->snapc = snapc;
2332 return op_submit(o);
2333 }

rbd命名规则
18 /* New-style rbd image 'foo' consists of objects
19 * rbd_id.foo - id of image
20 * rbd_header. - image metadata
21 * rbd_object_map. - optional image object map
22 * rbd_data..00000000
23 * rbd_data..00000001
24 * ... - data
25 */
26
27 #define RBD_HEADER_PREFIX "rbd_header."
28 #define RBD_OBJECT_MAP_PREFIX "rbd_object_map."
29 #define RBD_DATA_PREFIX "rbd_data."
30 #define RBD_ID_PREFIX "rbd_id."

 
CriticalSection临界区
Event 事件
Mutex 互斥量
Semaphore 信号量

linux虚拟文件系统四大对象:
1、超级块(super block) ----每个超级块保存了对于文件系统(非vfs)的类型、大小、状态信息等等)
2、索引节点(inode)----index node-----数据的元数据(文件大小、设备标识符、用户描述符、文件模式、扩展信息,
指向存储该内容的磁盘区块的指针、文件分类等等;
3、目录项(dentry) ---- 存在内存中的关于文件的目录树
4、文件对象 ---- 对于正打开文件的描述的实例
分布式存储CAP理论:
Cosistency 数据一致性
Availability 高可用性
Tolerance to network Partitions 分区容忍性

ceph编译优化:
笨方法就是,去掉-g,configure后,打开makefile文件看看,还有那些优化选项。
./configure --prefix=/usr CXXFLAGS=-g\ -O0 CFLAGS=-g\ -O0 CCASFLAGS=-g\ O0

查看ceph monmap,先关闭mon
ceph-kvstore-tool /var/lib/ceph/mon/ceph-ceph90301/store.db/ list
ceph-kvstore-tool /var/lib/ceph/mon/ceph-ceph90301/store.db/ get paxos last_pn(paxos, last_pn)
ceph-kvstore-tool /var/lib/ceph/mon/ceph-ceph90301/store.db/ get paxos key(paxos, last_pn)

ceph mon getmap -o monmap.file
monmaptool --print monmap.file
导入monmap:
/usr/bin/ceph-mon -i ceph-node3 --inject-monmap ./monmap.file

monmaptool --create --add ceph-1 x.x.x.x:6789 --add ceph-2 .... --fsid ceph-fsid --clobber monmap
删除mon:
monmaptool monmap --rm ceph-node3

radosgw-admin --name client.admin gc list --include-all

ceph osd pool get ecpool12with2 size 14
ceph osd erasure-code-profile get txmec122

  1. nginx配置

编辑/etc/nginx/conf.d/default.conf,内容如下

   server {
       listen       80;
       server_name  s3.ceph.work;
   	client_max_body_size 0;


       location / {
       fastcgi_pass_header Authorization;
       fastcgi_pass_request_headers on;
       fastcgi_param QUERY_STRING  $query_string;
       fastcgi_param REQUEST_METHOD $request_method;
       fastcgi_param CONTENT_LENGTH $content_length;
       fastcgi_param CONTENT_TYPE $content_type;
       fastcgi_param HTTP_CONTENT_LENGTH $content_length;

       if ($request_method = PUT) {
           rewrite ^ /PUT$request_uri;
       }

       include fastcgi_params;
       fastcgi_pass unix:/var/run/ceph/ceph-client.radosgw.gateway.sock;
       }
       location /PUT/ {
       internal;
       fastcgi_pass_header Authorization;
       fastcgi_pass_request_headers on;

       include fastcgi_params;
       fastcgi_param QUERY_STRING  $query_string;
       fastcgi_param REQUEST_METHOD $request_method;
       fastcgi_param CONTENT_LENGTH $content_length;
       fastcgi_param CONTENT_TYPE $content_type;
       fastcgi_param HTTP_CONTENT_LENGTH $content_length;
       fastcgi_pass unix:/var/run/ceph/ceph-client.radosgw.gateway.sock;
       }
}

注:如果需要配置SSL,可以参考网上的nginx SSl配置文档资料。

  1. 服务启动与检查

    启动radosgw服务

    /etc/init.d/radosgw start
    

    检查radosgw服务进程

    root@gateway-node# ps aux|grep radosgw
    root      6336  0.1  1.5 2165224 15936 ?       Ssl  13:15   0:00 /usr/bin/radosgw -n client.rgw.demo
    

    重新加载nginx配置

    /etc/init.d/nginx reload
    

    使用curl命令测试服务状态,正常会看到下面的内容

    curl http://gateway-node
    <?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>
    
    

创建用户:
radosgw-admin user create --uid="chengpeng" --display-name="keke"

创建子用户:
radosgw-admin subuser create --uid=chengpeng --subuser=chengpeng:swift --access=full

生成子用户秘钥:
radosgw-admin key create --subuser=chengpeng:swift --key-type=swift --gen-se
ceph osd crush rule dump
ceph osd crush rule ls

ulimit -c unlimited

echo 1 > /proc/sys/kernel/core_uses_pid

echo "~/ceph/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

通过上述方法设置了core dump的限制和规则后,就可以生成linux程序的core dump了

rgw使用admin的api:
--access=full --caps="metadata=;users=;buckets=*"
你创建用户的时候加个这个

然后用这个用户去做admin的api调用

ceph优化(待验证)
ssd做journal加速,只能加速写,无法加速读;
解决方法:
1、把xattr放在omap上:
filestore_max_inline_xattrs_size_xfs = 0
filestore_max_inline_xattrs_xfs = 0
2、把omap和commit_op_seq都放在ssd上:
a、利用软连接
b、修改代码使得他们的路径可配置
3、读取xattr时,由ssd提供服务;

降低目录深度:
影响目录深度的参数:
filestore_merge_threshold (default: 10)
filestore_split_multiple (default: 2)
目录分裂(深度增加):
在 文件数 > filestore_merge_threshold * 16 * filestore_split_multiple)

目录过深的影响:
	VFS查找路径过长;
	filestore试探次数增多

调优:
	filestore_merge_threshold = 400
	filestore_split_multiple  = 2 
	单层目录存放 400 * 2 * 16 = 12800 个文件

目录预分裂:
filestore_merge_threshold为负值时,目录预分裂
但, conf文件解析不支持负值(见md_config_t::set_val_raw -->strict_si_cast())

解决:
	加一个配置项filestroe_pre_split: true 或false
	修改代码:不检查filestore_merge_threshold, 而检查filestore_pre_split
	创建pool时指定expected_num_objects. 如需要每个pg有N个叶子目录:
		expected_num_objects = pg_num * N * objects-num-in-one-PG
		objects-num-in-one-pg = abs(filestore_merge_threshold) * filestore_split_multiple * 16 

ceph 安装方式:mkcephfs

mon_clock_drift_allowed = .15
mon_clock_drift_warn_backoff = 30

想检查 ceph-osd 存储的一对象的一个属性,可以这样:

$ cd /mnt/osd.12/current/2.b_head
$ attr -l foo_bar_head_EFE6384B
Attribute "ceph.snapset" has a 31 byte value for foo_bar_head_EFE6384B
Attribute "ceph." has a 195 byte value for foo_bar_head_EFE6384B
$ attr foo_bar_head_EFE6384B -g ceph.
-q > /tmp/a
$ ceph-dencoder type object_info_t import /tmp/a decode dump_json

设置osd亲和性:
osd primary-affinity <osdname (id|osd.id)> <float[0.0-1.0]>
设置pool副本数目:
osd pool set size

posted on 2018-01-24 18:59  阳台  阅读(518)  评论(0编辑  收藏  举报

导航