Ceph 15.2.13缓存分层

1.创建基于hdd的class rule

ceph osd crush rule create-replicated hdd_rule default host hdd

2.创建基于ssd的class rule

ceph osd crush rule create-replicated ssd_rule default host ssd

#查看现有crush rule
ceph osd crush rule ls  
#查看具体规则详细信息
ceph osd crush rule dump replicated_rule

3.重新编译crushmap,修改默认的副本crush rule(replicated_rule)

  • 实现已建数据池(pools)不再使用ssd做为存储
	#拷贝admin.keyring至mon容器
	docker cp /etc/ceph/ceph.client.admin.keyring ab80b0631d16:/etc/ceph/
	#获取crushmap
	docker exec ab80b0631d16 ceph osd getcrushmap -o /etc/ceph/crushmap.o
	#反编译crushmap
	docker exec ab80b0631d16 crushtool -d /etc/ceph/crushmap.o -o /etc/ceph/crushmap.txt
	#修改crushmap
	vi /ect/ceph/crushmap.txt
	rule replicated_rule {
        id 0
        type replicated
        min_size 1
        max_size 10
        step take default class hdd
        step chooseleaf firstn 0 type host
        step emit
}
	#重新设置crushmap
	docker exec fe597c666e5b crushtool -c /etc/ceph/crushmap.txt -o /etc/ceph/crushmap.o
	docker exec fe597c666e5b ceph osd setcrushmap -i /etc/ceph/crushmap.o

4.创建基本层数据池

ceph osd pool create cold-storage 32 32 hdd_rule

5.创建缓存层数据池

ceph osd pool create hot-storage 32 32 ssd_rule

5.1 创建后pg_num与预设不一致时,通过如下命令修改pg_num

  ceph osd pool set <pool-name> pg_num 64 
  ceph osd pool set <pool-name> pgp_num 64
  ceph osd pool set <pool-name> pg_num_min 64

6.设置缓存层

#回写模式(WRITEBACK)缓存层设置
#将 hot-storage 放置到 cold-storage 前端
ceph osd tier add cold-storage hot-storage
# 设置缓存模式为 writeback
ceph osd tier cache-mode hot-storage writeback
# 将所有客户端请求从标准池引导至缓存池
ceph osd tier set-overlay cold-storage hot-storage

7.设置缓存层的基本配置

ceph osd pool set kubernetes-hot hit_set_type bloom
ceph osd pool set kubernetes-hot hit_set_count 12
ceph osd pool set kubernetes-hot hit_set_period 14400
ceph osd pool set kubernetes-hot min_read_recency_for_promote 2
ceph osd pool set kubernetes-hot min_write_recency_for_promote 2
#以 1 TB 刷新或驱逐(100M:104857600)
ceph osd pool set kubernetes-hot target_max_bytes 104857600
#要刷新或驱逐 1M 个对象
ceph osd pool set kubernetes-hot target_max_objects 1000000
#达到缓存池容量的 40% 时开始刷新已修改(脏)对象 
ceph osd pool set kubernetes-hot cache_target_dirty_ratio 0.2
#达到缓存池容量的 60% 时开始积极刷新脏对象 
ceph osd pool set kubernetes-hot cache_target_dirty_high_ratio 0.4
#达到缓存池容量的 80% 时开始刷新未修改(干净)的对象 
ceph osd pool set kubernetes-hot cache_target_full_ratio 0.6
#在10分钟后刷新已修改(或脏)的对象到后备存储池 
ceph osd pool set kubernetes-hot cache_min_flush_age 600
#30分钟后将指定对象从缓存层中驱逐
ceph osd pool set kubernetes-hot cache_min_evict_age 1800 

8.将池关联到应用

ceph osd pool application enable cold-storage rgw

9.删除写回缓存层

#将缓存模式更改为readproxy以便新的和修改过的对象将刷新到后备存储池
[root@ceph-node1 ~]# ceph osd tier cache-mode hot-storage readproxy
set cache-mode for pool 'hot-storage' to readproxy
#确保缓存池已被刷新
[root@ceph-node1 ~]# rados -p hot-storage ls
#手动刷新缓存层对象
[root@ceph-node1 ~]# rados -p hot-storage  cache-flush-evict-all
#移除覆盖层,以便客户端不会将流量定向到缓存
[root@ceph-node1 ~]# ceph osd tier remove-overlay cold-storage
there is now (or already was) no overlay for 'cold-storage'
#从后备存储池中删除缓存层池
[root@ceph-node1 ~]# ceph osd tier remove cold-storage hot-storage
pool 'hot-storage' is now (or already was) not a tier of 'cold-storage'
#删除hot-storage
[root@ceph-node1 ~]#  ceph osd pool rm hot-storage hot-storage --yes-i-really-really-mean-it
#删除cold-storage
[root@ceph-node1 ~]#  ceph osd pool rm hot-storage cold-storage --yes-i-really-really-mean-it
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 `cephfs.MountInfo` 也可以实现上面的问题。下面是使用 `cephfs.MountInfo` 的代码: ```go package main import ( "fmt" "io/ioutil" "github.com/ceph/go-ceph/cephfs" ) func main() { // 获取一个 Ceph 连接 mountInfo, err := cephfs.NewMountInfo("", "", "/etc/ceph/ceph.conf") if err != nil { panic(err) } defer mountInfo.Destroy() // 挂载 Ceph 文件系统 err = mountInfo.Mount() if err != nil { panic(err) } defer mountInfo.Unmount() // 创建一个文件并写入数据 fs, err := cephfs.New(mountInfo.Context()) if err != nil { panic(err) } defer fs.Shutdown() file, err := fs.OpenFile("/test.txt", cephfs.O_CREATE|cephfs.O_WRONLY, 0644) if err != nil { panic(err) } defer file.Close() _, err = file.Write([]byte("Hello world!")) if err != nil { panic(err) } // 读取文件内容 data, err := ioutil.ReadFile("/mnt/myceph/test.txt") if err != nil { panic(err) } fmt.Println(string(data)) } ``` 在代码中,我们使用 `cephfs.NewMountInfo()` 方法获取一个 `cephfs.MountInfo` 对象,并使用 `/etc/ceph/ceph.conf` 配置文件来连接 Ceph 集群。然后,我们使用 `mountInfo.Mount()` 方法挂载 Ceph 文件系统,使用 `cephfs.New()` 方法创建一个 `Ceph` 对象,通过 `fs.OpenFile()` 方法创建 `/test.txt` 文件并向文件中写入数据。 需要注意的是,使用 `cephfs.MountInfo` 挂载文件系统时,需要手动调用 `mountInfo.Unmount()` 方法来卸载文件系统,而不是使用 `Ceph` 对象的 `fs.Shutdown()` 方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值