默认情况下,我们所有的osd都会class类型都是hdd:
# ceph osd crush class ls
[
"hdd"
]
查看当前的osd布局:
# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-8 0 root cache
-7 0 host 192.168.3.9-cache
-1 0.37994 root default
-2 0 host 192.168.3.9
-5 0.37994 host kolla-cloud
0 hdd 0.10999 osd.0 up 1.00000 1.00000
1 hdd 0.10999 osd.1 up 1.00000 1.00000
2 hdd 0.10999 osd.2 up 1.00000 1.00000
3 hdd 0.04999 osd.3 up 1.00000 1.00000
将osd.3从 hdd class中删除:
# ceph osd crush rm-device-class osd.3
done removing class of osd(s): 3
将这些osd.3添加至ssd class
# ceph osd crush set-device-class ssd osd.3
set osd(s) 3 to class 'ssd'
添加完成之后,我们再次查看osd布局:
# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-8 0 root cache
-7 0 host 192.168.3.9-cache
-1 0.37994 root default
-2 0 host 192.168.3.9
-5 0.37994 host kolla-cloud
0 hdd 0.10999 osd.0 up 1.00000 1.00000
1 hdd 0.10999 osd.1 up 1.00000 1.00000
2 hdd 0.10999 osd.2 up 1.00000 1.00000
3 ssd 0.04999 osd.3 up 1.00000 1.00000
可以看到我们osd.3的class都变为了ssd。
然后我们再次查看crush class,也多出了一个名为ssd的class:
# ceph osd crush class ls
[
"hdd",
"ssd"
]
创建一个class rule,取名为ssd_rule,使用ssd的osd:
# ceph osd crush rule create-replicated ssd_rule default host ssd
查看集群rule:
# ceph osd crush rule ls
replicated_rule
disks
ssd_rule
通过如下方式查看详细的crushmap信息:
# ceph osd getcrushmap -o crushmap
26
# crushtool -d crushmap -o crushmap.txt
# cat crushmap.txt
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54
# devices
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class ssd
# 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 192.168.3.9 {
id -2 # do not change unnecessarily
id -3 class hdd # do not change unnecessarily
id -13 class ssd # do not change unnecessarily
# weight 0.000
alg straw2
hash 0 # rjenkins1
}
host kolla-cloud {
id -5 # do not change unnecessarily
id -6 class hdd # do not change unnecessarily
id -14 class ssd # do not change unnecessarily
# weight 0.380
alg straw2
hash 0 # rjenkins1
item osd.2 weight 0.110
item osd.1 weight 0.110
item osd.0 weight 0.110
item osd.3 weight 0.050
}
root default {
id -1 # do not change unnecessarily
id -4 class hdd # do not change unnecessarily
id -15 class ssd # do not change unnecessarily
# weight 0.380
alg straw2
hash 0 # rjenkins1
item 192.168.3.9 weight 0.000
item kolla-cloud weight 0.380
}
host 192.168.3.9-cache {
id -7 # do not change unnecessarily
id -9 class hdd # do not change unnecessarily
id -11 class ssd # do not change unnecessarily
# weight 0.000
alg straw2
hash 0 # rjenkins1
}
root cache {
id -8 # do not change unnecessarily
id -10 class hdd # do not change unnecessarily
id -12 class ssd # do not change unnecessarily
# weight 0.000
alg straw2
hash 0 # rjenkins1
item 192.168.3.9-cache weight 0.000
}
# rules
rule replicated_rule {
id 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
step emit
}
rule disks {
id 1
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
step emit
}
rule ssd_rule {
id 2
type replicated
min_size 1
max_size 10
step take default class ssd
step chooseleaf firstn 0 type host
step emit
}
# end crush map
修改crushmap.txt文件中的step take default class改成 step take default class hdd
rule disks {
id 1
type replicated
min_size 1
max_size 10
step take default class hdd
step chooseleaf firstn 0 type host
step emit
}
重新编译crushmap并导入进去:
# crushtool -c crushmap.txt -o crushmap.new
# ceph osd setcrushmap -i crushmap.new
创建一个基于该ssd_rule规则的存储池:
# ceph osd pool create cache 64 64 ssd_rule
pool 'cache' created
查看cache的信息可以看到使用的crush_rule为1,也就是ssd_rule
# ceph osd pool get cache crush_rule
crush_rule: ssd_rule
查看pool使用rule情况,发现pool使用crush_rule 2
# # ceph osd dump | grep -i size
pool 1 'images' replicated size 1 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 80 lfor 0/71 flags hashpspool stripe_width 0 application rbd
pool 2 'volumes' replicated size 1 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 89 lfor 0/73 flags hashpspool stripe_width 0 application rbd
pool 3 'backups' replicated size 1 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 84 lfor 0/75 flags hashpspool stripe_width 0 application rbd
pool 4 'vms' replicated size 1 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 86 lfor 0/77 flags hashpspool stripe_width 0 application rbd
pool 5 'cache' replicated size 3 min_size 2 crush_rule 2 object_hash rjenkins pg_num 64 pgp_num 64 last_change 108 flags hashpspool stripe_width 0
缓冲池已经在一.3已经创建,pool: cache_pool,可以参考
后端存储:
# ceph osd pool create volumes2 64 64
将上面创建的cache_pool池绑定至存储池的前端,volumes即为我们的后端存储池
# ceph osd tier add volumes2 cache
pool 'cache' is now (or already was) a tier of 'volumes2'
设置缓存模式为writeback
# ceph osd tier cache-mode cache writeback
set cache-mode for pool 'cache' to writeback
将所有客户端请求从标准池引导至缓存池
# ceph osd tier set-overlay volumes2 cache
overlay for 'volumes2' is now (or already was) 'cache'
此时,我们分别查看存储池和缓存池的详情,可以看到相关的缓存配置信息:
# ceph osd dump |egrep 'volumes2|cache'
pool 5 'cache' replicated size 1 min_size 1 crush_rule 2 object_hash rjenkins pg_num 64 pgp_num 64 last_change 125 lfor 125/125 flags hashpspool,incomplete_clones tier_of 6 cache_mode writeback stripe_width 0
pool 6 'volumes2' replicated size 1 min_size 1 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 125 lfor 125/125 flags hashpspool tiers 5 read_tier 5 write_tier 5 stripe_width 0
对于生产环境的部署,目前只能使用bloom filters数据结构(看官方文档的意思,好像目前只支持这一种filter):
ceph osd pool set cache hit_set_type bloom
设置当缓存池中的数据达到多少个字节或者多少个对象时,缓存分层代理就开始从缓存池刷新对象至后端存储池并驱逐:
# 当缓存池中的数据量达到1TB时开始刷盘并驱逐
ceph osd pool set cache target_max_bytes 1099511627776
# 当缓存池中的对象个数达到100万时开始刷盘并驱逐
ceph osd pool set cache target_max_objects 10000000
定义缓存层将对象刷至存储层或者驱逐的时间:
ceph osd pool set cache cache_min_flush_age 600
ceph osd pool set cache cache_min_evict_age 600
定义当缓存池中的脏对象(被修改过的对象)占比达到多少时,缓存分层代理开始将object从缓存层刷至存储层:
# 当脏对象占比达到10%时开始刷盘
ceph osd pool set cache cache_target_dirty_ratio 0.4
# 当脏对象占比达到60%时开始高速刷盘
ceph osd pool set cache cache_target_dirty_high_ratio 0.6
当缓存池的使用量达到其总量的一定百分比时,缓存分层代理将驱逐对象以维护可用容量(达到该限制时,就认为缓存池满了),此时会将未修改的(干净的)对象刷盘:
ceph osd pool set cache cache_target_full_ratio 0.8
配置好缓存池以后,我们可以先将其驱逐对象的最小时间设置为60s:
ceph osd pool set cache cache_min_evict_age 60
ceph osd pool set cache cache_min_flush_age 60
定义当缓存池中的脏对象(被修改过的对象)占比达到千分之一,缓存分层代理开始将object从缓存层刷至存储层:
ceph osd pool set cache cache_target_dirty_ratio 0.001
然后,我们往存储池中写一个数据
rados -p volumes put test mysql-community-client-5.7.31-1.el7.x86_64.rpm
查看存储池,这时应该无法查看到该数据,查看缓存池,则可以看到数据存储在缓存池中:
rados -p volumes2 ls |grep test
rados -p cache ls |grep test
等60s之后,数据刷盘,此时即可在存储池中看到该数据,则缓存池中,该数据即被驱逐。
需要说明的是,根据缓存池类型的不同,删除缓存池的方法也不同。
由于只读缓存不具有修改的数据,因此可以直接禁用并删除它,而不会丢失任何最近对缓存中的对象的更改。
将缓存模式个性为none以禁用缓存:
ceph osd tier cache-mode cache none
删除缓存池:
# 解除绑定
ceph osd tier remove cephfs_data cache
由于回写缓存可能具有修改的数据,所以必须采取措施以确保在禁用和删除缓存前,不丢失缓存中对象的最近的任何更改。
将缓存模式更改为转发,以便新的和修改的对象刷新至后端存储池:
ceph osd tier cache-mode cache forward
查看缓存池以确保所有的对象都被刷新(这可能需要点时间):
rados -p cache ls
如果缓存池中仍然有对象,也可以手动刷新:
rados -p cache cache-flush-evict-all
删除覆盖层,以使客户端不再将流量引导至缓存:
ceph osd tier remove-overlay cephfs_data
解除存储池与缓存池的绑定:
ceph osd tier remove cephfs_data cache
ceph osd pool application enable sata-pool rbd
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO
我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe