分类目录归档:storage

ceph – Ceph 管理工具

ceph – Ceph 管理工具

提纲

ceph auth [ add | caps | del | export | get | get-key | get-or-create | get-or-create-key | import | list | print-key | print_key ] ...
ceph compact
ceph config-key [ del | exists | get | list | put ] ...
ceph daemon <name> | <path> <command> ...
ceph daemonperf <name> | <path> [ interval [ count ] ]
ceph df {detail}
ceph fs [ ls | new | reset | rm ] ...
ceph fsid
ceph health {detail}
ceph heap [ dump | start_profiler | stop_profiler | release | stats ] ...
ceph injectargs <injectedargs> [ <injectedargs>... ]
ceph log <logtext> [ <logtext>... ]
ceph mds [ add_data_pool | cluster_down | cluster_up | compat | deactivate | dump | fail | getmap | newfs | remove_data_pool | rm | rmfailed | set | set_max_mds | set_state | setmap | stat | stop | tell ] ...
ceph mon [ add | dump | getmap | remove | stat ] ...
ceph mon_status
ceph osd [ blacklist | blocked-by | create | deep-scrub | df | down | dump | erasure-code-profile | find | getcrushmap | getmap | getmaxosd | in | lspools | map | metadata | out | pause | perf | pg-temp | primary-affinity | primary-temp | repair | reweight | reweight-by-pg | rm | scrub | set | setcrushmap | setmaxosd | stat | thrash | tree | unpause | unset ] ...
ceph osd crush [ add | add-bucket | create-or-move | dump | get-tunable | link | move | remove | rename-bucket | reweight | reweight-all | reweight-subtree | rm | rule | set | set-tunable | show-tunables | tunables | unlink ] ...
ceph osd pool [ create | delete | get | get-quota | ls | mksnap | rename | rmsnap | set | set-quota | stats ] ...
ceph osd tier [ add | add-cache | cache-mode | remove | remove-overlay | set-overlay ] ...
ceph pg [ debug | deep-scrub | dump | dump_json | dump_pools_json | dump_stuck | force_create_pg | getmap | ls | ls-by-osd | ls-by-pool | ls-by-primary | map | repair | scrub | set_full_ratio | set_nearfull_ratio | stat ] ...
ceph quorum [ enter | exit ]
ceph quorum_status
ceph report { <tags> [ <tags>... ] }
ceph scrub
ceph status
ceph sync force {–yes-i-really-mean-it} {–i-know-what-i-am-doing}
ceph tell <name (type.id)> <args> [<args>...]
ceph version

描述

ceph 是个控制工具,可用于手动部署和维护 Ceph 集群。它提供的多种工具可用于部署监视器、 OSD 、归置组、 MDS 和维护、管理整个集群。

命令

auth

管理认证密钥。用于给某个具体实体(如监视器或 OSD )增加、删除、导出或更新认证密钥。还需额外加子命令。

子命令 add 用于为特定实体增加认证信息,这些信息可从文件读入,若未在命令行指定密钥(和、或此密钥的能力)将生成随机密钥。

用法:

ceph auth add <entity> {<caps> [<caps>...]}

子命令 capsname 的能力更新为命令行中指定的。

用法:

ceph auth caps <entity> <caps> [<caps>...]

子命令 del 删除 name 的所有能力。

用法:

ceph auth del <entity>

子命令 export 把指定实体写入密钥环,若未指定则写入主密钥环。

用法:

ceph auth export {<entity>}

子命令 get 把请求到的密钥写入密钥环文件。

用法:

ceph auth get <entity>

子命令 get-key 显示所请求的密钥。

用法:

ceph auth get-key <entity>

子命令 get-or-create 用于为特定实体增加认证信息,这些信息可从文件读入,若未在命令行指定密钥(和、或此密钥的能力)将生成随机密钥。

用法:

ceph auth get-or-create <entity> {<caps> [<caps>...]}

子命令 get-or-create-key 根据命令行指定的系统、能力对,为 name 获取或创建密钥。若密钥已存在,任何指定的能力必须与当前已有能力一致。

用法:

ceph auth get-or-create-key <entity> {<caps> [<caps>...]}

子命令 import 从输入文件读入密钥环。

用法:

ceph auth import

子命令 list 罗列认证状态。

用法:

ceph auth list

子命令 print-key 显示请求的密钥。

用法:

ceph auth print-key <entity>

子命令 print_key 显示请求的密钥。

用法:

ceph auth print_key <entity>

compact

让监视器压缩其 leveldb 存储。

用法:

ceph compact

config-key

管理配置密钥。需额外指定子命令。

子命令 del 用于删除配置密钥。

用法:

ceph config-key del <key>

子命令 exists 用于检查配置密钥是否存在。

用法:

ceph config-key exists <key>

子命令 get 用于获取配置密钥。

用法:

ceph config-key get <key>

子命令 list 罗列配置密钥。

用法:

ceph config-key list

子命令 put 上传配置密钥及其内容。

用法:

ceph config-key put <key> {<val>}

df

显示集群空闲空间状态。

用法:

ceph df {detail}

fs

用于管理 cephfs 文件系统,需额外加子命令。

子命令 ls 用于罗列文件系统。

用法:

ceph fs ls

子命令 new 用指定的存储池 <metadata> 和 <data> 创建新文件系统。

用法:

ceph fs new <fs_name> <metadata> <data>

子命令 reset 仅适用于灾难恢复:重置成单 MDS 运行图。

用法:

ceph fs reset <fs_name> {--yes-i-really-mean-it}

子命令 rm 用于禁用指定文件系统。

用法:

ceph fs rm <fs_name> {--yes-i-really-mean-it}

fsid

显示集群的 FSID/UUID 。

用法:

ceph fsid

health

显示集群健康状况。

用法:

ceph health {detail}

heap

显示堆栈使用信息(编译时启用了 tcmalloc 支持才可用)

用法:

ceph heap dump|start_profiler|stop_profiler|release|stats

injectargs

向监视器注入配置参数。

用法:

ceph injectargs <injected_args> [<injected_args>...]

log

把指定文本记录到监视器日志中。

用法:

ceph log <logtext> [<logtext>...]

mds

用于元数据服务器的配置和管理,需额外指定子命令。

子命令 add_data_pool 用于增加数据存储池。

用法:

ceph mds add_data_pool <pool>

子命令 cluster_down 关闭 mds 集群。

用法:

ceph mds cluster_down

子命令 cluster_up 启动 mds 集群。

用法:

ceph mds cluster_up

子命令 compat 管理兼容功能,需额外指定子命令。

子命令 rm_compat 可删除兼容功能。

用法:

ceph mds compat rm_compat <int[0-]>

子命令 rm_incompat 可删除不兼容的功能。

用法:

ceph mds compat rm_incompat <int[0-]>

子命令 show 可查看 mds 的兼容性选项。

用法:

ceph mds compat show

子命令 deactivate 可停止 mds 。

用法:

ceph mds deactivate <who>

子命令 dump 用于转储信息, epoch 号为可选。

用法:

ceph mds dump {<int[0-]>}

子命令 fail 强制把 mds 状态设置为失效。

用法:

ceph mds fail <who>

子命令 getmap 获取 MDS 图, epoch 号可选。

用法:

ceph mds getmap {<int[0-]>}

子命令 newfs 可用 <metadata> 和 <data> 存储池新建文件系统。

用法:

ceph mds newfs <int[0-]> <int[0-]> {--yes-i-really-mean-it}

子命令 remove_data_pool 用于删除数据存储池。

用法:

ceph mds remove_data_pool <pool>

子命令 rm 用于删除不活跃的 mds 。

用法:

ceph mds rm <int[0-]> <name> (type.id)>

子命令 rmfailed 用于删除失效的 mds 。

用法:

ceph mds rmfailed <int[0-]>

子命令 set 用于设置参数,把 <var> 的值设置为 <val> 。

用法:

ceph mds set max_mds|max_file_size|allow_new_snaps|inline_data <va> {<confirm>}

子命令 set_max_mds 用于设置 MDS 的最大索引号。

用法:

ceph mds set_max_mds <int[0-]>

子命令 set_state 把 mds 状态从 <gid> 改为 <numeric-state> 。

用法:

ceph mds set_state <int[0-]> <int[0-20]>

子命令 setmap 设置 mds 图,必须提供正确的 epoch 号。

用法:

ceph mds setmap <int[0-]>

子命令 stat 显示 MDS 状态。

用法:

ceph mds stat

子命令 stop 停止指定 mds 。

用法:

ceph mds stop <who>

子命令 tell 用于向某个 mds 发送命令。

用法:

ceph mds tell <who> <args> [<args>...]

mon

用于监视器的配置和管理,需额外指定子命令。

子命令 add 新增名为 <name> 的监视器,地址为 <addr> 。

用法:

ceph mon add <name> <IPaddr[:port]>

子命令 dump 转储格式化的 monmap , epoch 号可选。

用法:

ceph mon dump {<int[0-]>}

子命令 getmap 用于获取 monmap 。

用法:

ceph mon getmap {<int[0-]>}

子命令 remove 用于删除名为 <name> 的监视器。

用法:

ceph mon remove <name>

子命令 stat 汇总监视器状态。

用法:

ceph mon stat

mon_status

报告监视器状态。

用法:

ceph mon_status

osd

用于配置和管理 OSD ,需额外指定子命令。

子命令 blacklist 用于管理客户端黑名单,需额外加子命令。

子命令 add 用于把 <addr> 加入黑名单(可指定时间,从现在起 <expire> 秒)。

用法:

ceph osd blacklist add <EntityAddr> {<float[0.0-]>}

子命令 ls 列出进黑名单的客户端。

用法:

ceph osd blacklist ls

子命令 rm 从黑名单里删除 <addr> 。

用法:

ceph osd blacklist rm <EntityAddr>

子命令 blocked-by 用于罗列哪些 OSD 在阻塞互联。

用法:

ceph osd blocked-by

子命令 create 用于新建 OSD , UUID 和 ID 是可选的。

用法:

ceph osd create {<uuid>} {<id>}

子命令 crush 用于 CRUSH 管理,需额外指定子命令。

子命令 add 可用于新增或更新 <name> 的 crushmap 位置及权重,权重改为 <weight> 、位置为 <args> 。

用法:

ceph osd crush add <osdname (id|osd.id)> <float[0.0-]> <args> [<args>...]

子命令 add-bucket 可新增没有父级(可能是 root )、类型为 <type> 、名为 <name> 的 crush 桶。

用法:

ceph osd crush add-bucket <name> <type>

子命令 create-or-move 用于创建名为 <name> 、权重为 <weight> 的条目并放置到 <args> ,若已存在则移动到指定位置 <args> 。

用法:

ceph osd crush create-or-move <osdname (id|osd.id)> <float[0.0-]>
<args> [<args>...]

子命令 dump 用于转储 crush 图。

用法:

ceph osd crush dump

子命令 get-tunable 用于获取 CRUSH 可调值 straw_calc_version 。

用法:

ceph osd crush get-tunable straw_calc_version

子命令 link 用于把已存在条目 <name> 链接到 <args> 位置下。

用法:

ceph osd crush link <name> <args> [<args>...]

子命令 move 可把已有条目 <name> 移动到 <args> 位置。

用法:

ceph osd crush move <name> <args> [<args>...]

子命令 remove 把 crush 图中(任意位置,或 <ancestor> 之下的)的 <name> 删掉。

用法:

ceph osd crush remove <name> {<ancestor>}

子命令 rename-bucket 可把桶 <srcname> 重命名为 <dstname> 。

用法:

ceph osd crush rename-bucket <srcname> <dstname>

子命令 reweight 把 crush 图中 <name> 的权重改为 <weight> 。

用法:

ceph osd crush reweight <name> <float[0.0-]>

子命令 reweight-all 重新计算树的权重,以确保权重之和没算错。

用法:

ceph osd crush reweight-all

子命令 reweight-subtree 用于把 CRUSH 图内 <name> 之下的所有叶子条目的权重改为 <weight> 。

用法:

ceph osd crush reweight-subtree <name> <weight>

子命令 rm 把 crush 图中(任意位置,或 <ancestor> 之下的)的 <name> 删掉。

用法:

ceph osd crush rm <name> {<ancestor>}

子命令 rule 用于创建 crush 规则,需额外加子命令。

子命令 create-erasure 可为纠删码存储池(用 <profile> 创建的))创建名为 <name> 的 crush 规则,默认为 default 。

用法:

ceph osd crush rule create-erasure <name> {<profile>}

子命令 create-simple 创建从 <root> 开始、名为 <name> 的 crush 规则,副本将跨 <type> 类型进行散布,选择模式为 <firstn|indep> (默认 firstn ,indep 更适合纠删码存储池)。

用法:

ceph osd crush rule create-simple <name> <root> <type> {firstn|indep}

子命令 dump 转储名为 <name> 的 crush 规则,默认全部转储。

用法:

ceph osd crush rule dump {<name>}

子命令 list 罗列 crush 规则。

用法:

ceph osd crush rule list

子命令 ls 罗列 crush 规则。

用法:

ceph osd crush rule ls

子命令 rm 删除 crush 规则 <name> 。

用法:

ceph osd crush rule rm <name>

子命令 set 单独使用,把输入文件设置为 crush 图。

用法:

ceph osd crush set

子命令 set 为 osdname 或 osd.id 更新 crush 图的位置和权重信息,把名为 <name> 的 OSD 权重设置为 <weight> 、位置设置为 <args> 。

用法:

ceph osd crush set <osdname (id|osd.id)> <float[0.0-]> <args> [<args>...]

子命令 set-tunable 把可调值 <tunable> 设置为 <value> 。唯一能设置的可调值是 straw_calc_version 。

用法:

ceph osd crush set-tunable straw_calc_version <value>

子命令 show-tunables 显示当前的 crush 可调值。

用法:

ceph osd crush show-tunables

子命令 tree 用树状视图显示各 crush 桶、及各条目。

用法:

ceph osd crush tree

子命令 tunables 设置 <profile> 中的 crush 可调值。

用法:

ceph osd crush tunables legacy|argonaut|bobtail|firefly|hammer|optimal|default

子命令 unlink 从 crush 图中解链接出 <name> (任意位置,或 <ancestor> 之下的)。

用法:

ceph osd crush unlink <name> {<ancestor>}

子命令 df 用于显示 OSD 利用率。

用法:

ceph osd df {plain|tree}

子命令 deep-scrub 可启动指定 OSD 的深度洗刷。

用法:

ceph osd deep-scrub <who>

子命令 down 把 osd(s) <id> [<id>...] 状态设置为 down 。

用法:

ceph osd down <ids> [<ids>...]

子命令 dump 打印 OSD 图汇总。

用法:

ceph osd dump {<int[0-]>}

子命令 erasure-code-profile 用于管理纠删码配置,需额外加子命令。

子命令 get 读取纠删码配置 <name> 。

用法:

ceph osd erasure-code-profile get <name>

子命令 ls 罗列所有纠删码配置。

用法:

ceph osd erasure-code-profile ls

子命令 rm 删除纠删码配置 <name> 。

用法:

ceph osd erasure-code-profile rm <name>

子命令 set 用给定的参数 [<key[=value]> ...] 创建纠删码配置 <name> 。末尾加 –force 可覆盖已有配置(慎用)。

用法:

ceph osd erasure-code-profile set <name> {<profile> [<profile>...]}

子命令 find 从 CRUSH 图中找到 osd <id> 并显示其位置。

用法:

ceph osd find <int[0-]>

子命令 getcrushmap 获取 CRUSH 图。

用法:

ceph osd getcrushmap {<int[0-]>}

子命令 getmap 获取 OSD 图。

用法:

ceph osd getmap {<int[0-]>}

子命令 getmaxosd 显示最大 OSD 惟一标识符。

用法:

ceph osd getmaxosd

子命令 in 把给出的 OSD <id> [<id>...] 标识为 in 状态。

用法:

ceph osd in <ids> [<ids>...]

子命令 lost 把 OSD 标识为永久丢失。如果没有多个副本,此命令会导致数据丢失,慎用。

用法:

ceph osd lost <int[0-]> {--yes-i-really-mean-it}

子命令 ls 显示所有 OSD 的惟一标识符。

用法:

ceph osd ls {<int[0-]>}

子命令 lspools 罗列存储池。

用法:

ceph osd lspools {<int>}

子命令 map 在 <pool> 存储池中找 <object> 对象所在的归置组号码。

用法:

ceph osd map <poolname> <objectname>

子命令 metadata 为 osd <id> 取出元数据。

用法:

ceph osd metadata {int[0-]} (default all)

子命令 out 把指定 OSD <id> [<id>...] 的状态设置为 out 。

用法:

ceph osd out <ids> [<ids>...]

子命令 pause 暂停 osd 。

用法:

ceph osd pause

子命令 perf 打印 OSD 的性能统计摘要。

用法:

ceph osd perf

子命令 pg-temp 设置 pg_temp 映射 pgid:[<id> [<id>...]] ,适用于开发者。

用法:

ceph osd pg-temp <pgid> {<id> [<id>...]}

子命令 pool 用于管理数据存储池,需额外加子命令。

子命令 create 创建存储池。

用法:

ceph osd pool create <poolname> <int[0-]> {<int[0-]>} {replicated|erasure}
{<erasure_code_profile>} {<ruleset>} {<int>}

子命令 delete 删除存储池。

用法:

ceph osd pool delete <poolname> {<poolname>} {--yes-i-really-really-mean-it}

子命令 get 获取存储池参数 <var> 。

用法:

ceph osd pool get <poolname> size|min_size|crash_replay_interval|pg_num|
pgp_num|crush_ruleset|auid|write_fadvise_dontneed

以下命令只适用于分层存储池:

ceph osd pool get <poolname> hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|
target_max_objects|target_max_bytes|cache_target_dirty_ratio|cache_target_dirty_high_ratio|
cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|
min_read_recency_for_promote|hit_set_grade_decay_rate|hit_set_search_last_n

以下命令只适用于纠删码存储池:

ceph osd pool get <poolname> erasure_code_profile

子命令 get-quota 获取存储池的对象或字节数限额。

用法:

ceph osd pool get-quota <poolname>

子命令 ls 用于罗列存储池。

用法:

ceph osd pool ls {detail}

子命令 mksnap 拍下存储池 <pool> 的快照 <snap> 。

用法:

ceph osd pool mksnap <poolname> <snap>

子命令 rename 把存储池 <srcpool> 重命名为 <destpool> 。

用法:

ceph osd pool rename <poolname> <poolname>

子命令 rmsnap 删除存储池 <pool> 的快照 <snap> 。

用法:

ceph osd pool rmsnap <poolname> <snap>

子命令 set 把存储池参数 <var> 的值设置为 <val> 。

用法:

ceph osd pool set <poolname> size|min_size|crash_replay_interval|pg_num|
pgp_num|crush_ruleset|hashpspool|nodelete|nopgchange|nosizechange|
hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|debug_fake_ec_pool|
target_max_bytes|target_max_objects|cache_target_dirty_ratio|
cache_target_dirty_high_ratio|
cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|auid|
min_read_recency_for_promote|write_fadvise_dontneed|hit_set_grade_decay_rate|
hit_set_search_last_n
<val> {--yes-i-really-mean-it}

子命令 set-quota 设置存储池的对象或字节数限额。

用法:

ceph osd pool set-quota <poolname> max_objects|max_bytes <val>

子命令 stats 获取所有或指定存储池的统计信息。

用法:

ceph osd pool stats {<name>}

子命令 primary-affinity 设置主 OSD 亲和性,有效值范围 0.0 <= <weight> <= 1.0

用法:

ceph osd primary-affinity <osdname (id|osd.id)> <float[0.0-1.0]>

子命令 primary-temp 设置 primary_temp 映射 pgid:<id>|-1 ,适用于开发者。

用法:

ceph osd primary-temp <pgid> <id>

子命令 repair 让指定 OSD 开始修复。

用法:

ceph osd repair <who>

子命令 reweight 把 OSD 权重改为 0.0 < <weight> < 1.0 之间的值。

用法:

osd reweight <int[0-]> <float[0.0-1.0]>

子命令 reweight-by-pg 按归置组分布情况调整 OSD 的权重(考虑的过载百分比,默认 120 )。

用法:

ceph osd reweight-by-pg {<int[100-]>} {<poolname> [<poolname...]}

子命令 reweight-by-utilization 按利用率调整 OSD 的权重,还需考虑负载比率,默认 120 。

用法:

ceph osd reweight-by-utilization {<int[100-]>}

子命令 rm 删除集群中的 OSD ,其编号为 <id> [<id>...] 。

用法:

ceph osd rm <ids> [<ids>...]

子命令 scrub 让指定 OSD 开始洗刷。

用法:

ceph osd scrub <who>

子命令 set 设置关键字 <key> 。

用法:

ceph osd set full|pause|noup|nodown|noout|noin|nobackfill|
norebalance|norecover|noscrub|nodeep-scrub|notieragent

子命令 setcrushmap 把输入文件设置为 CRUSH 图。

用法:

ceph osd setcrushmap

子命令 setmaxosd 设置最大 OSD 数值。

用法:

ceph osd setmaxosd <int[0-]>

子命令 stat 打印 OSD 图摘要。

用法:

ceph osd stat

子命令 thrash 把 OSD 元版本回滚到 <num_epochs> 。

用法:

ceph osd thrash <int[0-]>

子命令 tier 用于管理(存储池)分级,需额外加子命令。

子命令 add 把 <tierpool> (第二个)加到基础存储池 <pool> (第一个)之前。

用法:

ceph osd tier add <poolname> <poolname> {--force-nonempty}

子命令 add-cache 把尺寸为 <size> 的缓存存储池 <tierpool> (第二个)加到现有存储池 <pool> (第一个)之前。

用法:

ceph osd tier add-cache <poolname> <poolname> <int[0-]>

子命令 cache-mode 设置缓存存储池 <pool> 的缓存模式。

用法:

ceph osd tier cache-mode <poolname> none|writeback|forward|readonly|
readforward|readproxy

子命令 remove 删掉基础存储池 <pool> (第一个)的马甲存储池 <tierpool> (第二个)。

用法:

ceph osd tier remove <poolname> <poolname>

子命令 remove-overlay 删除基础存储池 <pool> 的马甲存储池。

用法:

ceph osd tier remove-overlay <poolname>

子命令 set-overlay 把 <overlaypool> 设置为基础存储池 <pool> 的马甲存储池。

用法:

ceph osd tier set-overlay <poolname> <poolname>

子命令 tree 打印 OSD 树。

用法:

ceph osd tree {<int[0-]>}

子命令 unpause 取消 osd 暂停。

用法:

ceph osd unpause

子命令 unset 取消设置的关键字 <key> 。

用法:

ceph osd unset full|pause|noup|nodown|noout|noin|nobackfill|
norebalance|norecover|noscrub|nodeep-scrub|notieragent

pg

用于管理 OSD 内的归置组,需额外加子命令。

子命令 debug 可显示归置组的调试信息。

用法:

ceph pg debug unfound_objects_exist|degraded_pgs_exist

子命令 deep-scrub 开始深度洗刷归置组 <pgid> 。

用法:

ceph pg deep-scrub <pgid>

子命令 dump 可显示归置组图的人类可读版本(显示为纯文本时只有 ‘all’ 合法)。

用法:

ceph pg dump {all|summary|sum|delta|pools|osds|pgs|pgs_brief} [{all|summary|sum|delta|pools|osds|pgs|pgs_brief...]}

子命令 dump_json 只以 json 格式显示归置组图的人类可读版本。

用法:

ceph pg dump_json {all|summary|sum|delta|pools|osds|pgs|pgs_brief} [{all|summary|sum|delta|pools|osds|pgs|pgs_brief...]}

子命令 dump_pools_json 只以 json 格式显示归置组存储池信息[译者:存疑]。

用法:

ceph pg dump_pools_json

子命令 dump_stuck 显示卡顿归置组的信息。

用法:

ceph pg dump_stuck {inactive|unclean|stale|undersized|degraded [inactive|unclean|stale|undersized|degraded...]}
{<int>}

子命令 force_create_pg 强制创建归置组 <pgid> 。

用法:

ceph pg force_create_pg <pgid>

子命令 getmap 获取二进制归置组图,保存到 -o/stdout 。

用法:

ceph pg getmap

子命令 ls 可根据指定存储池、 OSD 、状态罗列对应的归置组。

用法:

ceph pg ls {<int>} {active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale| remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized [active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale|remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized...]}

子命令 ls-by-osd 用于罗列指定 OSD 上的归置组。

用法:

ceph pg ls-by-osd <osdname (id|osd.id)> {<int>}
{active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale| remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized [active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale|remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized...]}

子命令 ls-by-pool 用于罗列存储池 [poolname | poolid] 内的归置组。

用法:

ceph pg ls-by-pool <poolstr> {<int>} {active|
clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale| remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized [active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale|remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized...]}

子命令 ls-by-primary 可罗列主 OSD 为 [osd] 的归置组。

用法:

ceph pg ls-by-primary <osdname (id|osd.id)> {<int>}
{active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale| remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized [active|clean|down|replay|splitting|
scrubbing|scrubq|degraded|inconsistent|peering|repair|
recovery|backfill_wait|incomplete|stale|remapped|
deep_scrub|backfill|backfill_toofull|recovery_wait|
undersized...]}

子命令 map 显示归置组到 OSD 的映射关系。

用法:

ceph pg map <pgid>

子命令 repair 开始修复归置组 <pgid> 。

用法:

ceph pg repair <pgid>

子命令 scrub 开始洗刷归置组 <pgid> 。

用法:

ceph pg scrub <pgid>

子命令 set_full_ratio 设置认为归置组占满的比率。

用法:

ceph pg set_full_ratio <float[0.0-1.0]>

子命令 set_nearfull_ratio 设置认为归置组将要占满的比率。

用法:

ceph pg set_nearfull_ratio <float[0.0-1.0]>

子命令 stat 显示归置组状态。

用法:

ceph pg stat

quorum

进入或退出法定人数。

用法:

ceph quorum enter|exit

quorum_status

报告监视器法定人数状态。

用法:

ceph quorum_status

report

报告集群的全部状态,标签字符串可选。 Reports full status of cluster, optional title tag strings.

用法:

ceph report {<tags> [<tags>...]}

scrub

洗刷监视器的存储。

用法:

ceph scrub

status

显示集群状态。

用法:

ceph status

sync force

强制监视器进行同步、并清除存储。

用法:

ceph sync force {--yes-i-really-mean-it} {--i-know-what-i-am-doing}

tell

发命令给指定守护进程。

用法:

ceph tell <name (type.id)> <args> [<args>...]

version

显示监视器守护进程的版本。

用法:

ceph version

选项

-i infile
指定一个输入文件,它将作为载荷与命令一起传递给监视器集群。仅用于某些特定的监视器命令。
-o outfile
把响应中监视器集群返回的载荷写入 outfile 文件。只有某些特定的监视器命令(如 psd getmap )会返回载荷。
-c ceph.conf, --conf=ceph.conf
用 ceph.conf 配置文件而非默认的 /etc/ceph/ceph.conf 来确定启动时所用的监视器地址。
--id CLIENT_ID, --user CLIENT_ID
用于认证的客户端 ID 。
--name CLIENT_NAME, -n CLIENT_NAME
用于认证的客户端名字。
--cluster CLUSTER
Ceph 集群名字。
--admin-socket ADMIN_SOCKET, --admin-socket DAEMON_NAME
提交管理套接字命令。
--admin-socket ADMIN_SOCKET_NOPE
你也许想要的是 –admin-daemon 。
-s, --status
显示集群状态。
-w, --watch
盯着集群的实时状态变更。
--watch-debug
盯着调试事件。
--watch-info
盯着一般信息事件。
--watch-sec
盯着安全事件。
--watch-warn
盯着告警事件。
--watch-error
盯着错误事件。
--version, -v
显示版本号。
--verbose
使输出更详细。
--concise
使输出简洁些。
-f {json,json-pretty,xml,xml-pretty,plain}, --format
输出格式。
--connect-timeout CLUSTER_TIMEOUT
设置连接集群的超时值。

使用范围

ceph 是 Ceph 的一部分,这是个伸缩力强、开源、分布式的存储系统

 

文章来源:

http://docs.ceph.org.cn/man/8/ceph/

 

..

Hadoop 备忘录

计算引擎层

Hadoop生态和其他生态最大的不同之一就是“单一平台多种应用”的理念了。传的数据库底层只有一个引擎,只处理关系型应用,所以是“单一平台单一应用”;而NoSQL市场有上百个NoSQL软件,每一个都针对不同的应用场景且完全独立,因此是“多平台多应用”的模式。而Hadoop在底层共用一份HDFS存储,上层有很多个组件分别服务多种应用场景,如:

  • 确定性数据分析:主要是简单的数据统计任务,例如OLAP,关注快速响应,实现组件有Impala等;
  • 探索性数据分析:主要是信息关联性发现任务,例如搜索,关注非结构化全量信息收集,实现组件有Search等;
  • 预测性数据分析:主要是机器学习类任务,例如逻辑回归等,关注计算模型的先进性和计算能力,实现组件有Spark、MapReduce等;
  • 数据处理及转化:主要是ETL类任务,例如数据管道等,关注IO吞吐率和可靠性,实现组件有MapReduce等

服务层

服务层是包装底层引擎的编程API细节,对业务人员提供更高抽象的访问模型,如Pig、Hive等。

而其中最炙手可热的就是OLAP的SQL市场了。现在,Spark有70%的访问量来自于SparkSQL!

SQL on Hadoop到底哪家强?Hive、Facebook的Pheonix、Presto、SparkSQL、Cloudera推的Impala、MapR推的Drill、IBM的BigSQL、还是Pivital开源的HAWQ?

 

 

 

 

 

ceph 常用命令

1、ceph pool配置
1 创建pool
ceph osd pool create {pool-name} {pg-num} [{pgp-num}]

2 查看pool
ceph osd lspools

3 设置pool的指标pool池中最大存储对象数或最大存储字节数 有其一即可
ceph osd pool set-quota {pool-name} [max_objects{obj-count}] [max_bytes {bytes}]

4 重命名pool
ceph osd pool rename {current-pool-name} {new-pool-name}

5 查看pool的状态
rsdosdf

6 给pool制作快照
ceph osd pool mksnap {pool-name} {snap-name}

7 删除pool的快照
ceph osd pool rmsnap {pool-name} {snap-name}

8 删除一个pool
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]

2、ceph pg配置
1 设置pool 中 pgs 的大小
ceph osd poolset {pool-name} pg_num

2 获得 pool 中 pgs 的大小
ceph osd pool get {pool-name} pg_num

3 设置 pool 中 pgs 组的大小
ceph osd poolset {pool-name} pgp_num

4 获得 pool 中 pgs 组的大小
ceph osd poolget {pool-name} pgp_num

5 查看集群中 pgs 的状态
ceph pg dump

6 查看指定pg 的 map
ceph pg map{pg-id}

7 查看指定pg 的状态
ceph pg {pg-id}query

8 清除一个 pg
ceph pg scrub{pg-id}

3、ceph镜像配置
1 查看更新Linux内核版本,

需相应Linux内核支持modproberbd 查看:uname –r

若不支持:
执行下述操作:

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel

改为新内核:
sudo grub2-set-default 'CentOS Linux (4.4.0-1.el7.elrepo.x86_64) 7 (Core)'
grub2-editenv list 查看修改

最终更新设置内核:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

2 创建一个设备的镜像,size以M为单位
rbd create{image-name} --size {megabytes} –pool {pool-name}

如:
rbd createtestImage --size 512 --pool testPool

3 列出一个 pool 里面的块设备,即创建的镜像
rbd list{pool-name}

4 读出一个镜像里面的信息
rbd --image{image-name} -p {pool-name} info

5 重新修改镜像的大小
rbd resize--image {image-name} –p {pool-name} --size 1024

6 将块设备映射到本地
1 sudomodprobe rbd
2 sudo rbd map{image-name} --pool {pool-name}

7 显示映射的模块
rbd showmapped

8 从一个具体的 pool 中删除一个块设备
rbd rm {image-name} -p{pool-name}

9 取消块设备的映射
sudo rbdunmap /dev/rbd/{poolname}/{imagename}

4、ceph快照配置
1 创建快照

1 给镜像创建一个快照
rbd snap create {pool-name}/{image-name}@{snap-name}

2 列出一个镜像的所有快照
rbd snap ls {pool-name}/{image-name}

3 快照回滚
rbd snap rollback {pool-name}/{image-name}@{snap-name}

4 删除快照
rbd snap rm {pool-name}/{image-name}@{snap-name}

5 删除一个镜像的全部快照
rbd snap purge{pool-name}/{image-name}

2 分层快照

1 首先创建一个特殊格式的的镜像,格式要求:format 2
rbd create --image-format 2 {image-name}--size { megabytes } --pool {pool-name}

2 创建快照
rbd snap create {pool-name}/{image-name}@{snap-name}

3 克隆品访问父快照。父快照,所有克隆品都会损坏。为防止数据丢失,必须先保护、然后再克隆快照。

rbd snap protect {pool-name}/{image-name}@{snapshot-name}
$ rbd clone rbd/testImage2@test2Snap rbd/testImage3

4 克隆快照,将一个存储池中的镜像的快照克隆到另一存储池中,成为一个镜像
rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}

5 删除快照

1] 删除方式一:
删除所有快照 取消快照保护 删除快照

2] 删除方式二:
首先将克隆品压缩 解除保护 删除快照

6 取消快照保护
rbd snapunprotect {pool-name}/{image-name}@{snapshot-name}

7 列出一块镜像的子孙
rbd children {pool-name}/{image-name}@{snapshot-name}

8 克隆镜像压缩,进而消除父快照的引用
rbd flatten {pool-name}/{imag

5、ceph qemu配置
1 使用 qemu 创建镜像
qemu-img create-f raw rbd:{pool-name}/{image-name} {size}
例如: qemu-img create -f raw rbd:testPool/testImage0 1G

2 调整 qemu 镜像的大小
qemu-img resizerbd:{pool-name}/{image-name} {size}

3 查看一个 qemu 镜像属性信息
qemu-img inforbd:{pool-name}/{image-name}

4 转换 qemu 其他格式的镜像为块设备镜像
qemu-img convert-p -f 源镜像-O 目标镜像格式文件
rbd:poolname/imagename转换后的文件

5 运行镜像中的虚拟机
qemu -m 内存大小 -driveformat=raw,file=rbd:poolname/imagename

6 qemu 的带缓存控制

1 qemu -m1024 -drive format=rbd,file=rbd:poolname/imagename,cache=writeback
2 qemu –m 1024 \
-driveformat=raw,file=rbd:poolname/imagename:rbd_cache=true,cache=writeback

注:如若设置了rbd_cache=ture那么必须设置cache=writeback或者risk data loss 否则的话,qemu将不会发送请求给librbd如果qemu没有在配置文件中指定清楚,那么基于rbd的上层文件系统可能能被损坏

7 qemu 缓冲操作

回写:
rbd_cache = true
直写:
rbd_cache = ture
rbd_cache_max_dirty = 0
无:
rbd_cache = false

Ceph的安装

Ceph的安装

官网链接:http://docs.ceph.com/docs/master/install/install-storage-cluster/

2.1 相关依赖的安装

我这里操作系统都是Centos7.2的操作系统。

#yum install yum-plugin-priorities -y

# cat /etc/yum/pluginconf.d/priorities.conf   #确保priority.conf启用插件。

[main]
enabled = 1

# vim /etc/yum.repos.d/ceph.repo  #做ceph源文件

[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-jewel/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-jewel/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

OR

[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0

#yum install snappy leveldb gdisk python-argparse gperftools-libs -y

2.2 ceph安装

rpm -Uvh http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/ceph-release-1-1.el7.noarch.rpm
yum -y install epel-release
yum -y install ceph-deploy
yum -y install ntp ntpdate ntp-doc
yum -y install openssh-server openssh-client
yum -y install yum-plugin-priorities -y
yum -y install redhat-lsb
yum -y install ceph ceph-release ceph-common ceph-radosgw

 


性能优化:

 Ceph Configurations

[global]

参数名 描述 默认值 建议值
public network 客户端访问网络 192.168.100.0/24
cluster network 集群网络 192.168.1.0/24
max open files 如果设置了该选项,Ceph会设置系统的max open fds 0 131072

  • 查看系统最大文件打开数可以使用命令
1
cat /proc/sys/fs/file-max

[osd] - filestore

参数名 描述 默认值 建议值
filestore xattr use omap 为XATTRS使用object map,EXT4文件系统时使用,XFS或者btrfs也可以使用 false true
filestore max sync interval 从日志到数据盘最大同步间隔(seconds) 5 15
filestore min sync interval 从日志到数据盘最小同步间隔(seconds) 0.1 10
filestore queue max ops 数据盘最大接受的操作数 500 25000
filestore queue max bytes 数据盘一次操作最大字节数(bytes) 100 << 20 10485760
filestore queue committing max ops 数据盘能够commit的操作数 500 5000
filestore queue committing max bytes 数据盘能够commit的最大字节数(bytes) 100 << 20 10485760000
filestore op threads 并发文件系统操作数 2 32

  • 调整omap的原因主要是EXT4文件系统默认仅有4K
  • filestore queue相关的参数对于性能影响很小,参数调整不会对性能优化有本质上提升

[osd] - journal

参数名 描述 默认值 建议值
osd journal size OSD日志大小(MB) 5120 20000
journal max write bytes journal一次性写入的最大字节数(bytes) 10 << 20 1073714824
journal max write entries journal一次性写入的最大记录数 100 10000
journal queue max ops journal一次性最大在队列中的操作数 500 50000
journal queue max bytes journal一次性最大在队列中的字节数(bytes) 10 << 20 10485760000

  • Ceph OSD Daemon stops writes and synchronizes the journal with the filesystem, allowing Ceph OSD Daemons to trim operations from the journal and reuse the space.
  • 上面这段话的意思就是,Ceph OSD进程在往数据盘上刷数据的过程中,是停止写操作的。

[osd] - osd config tuning

参数名 描述 默认值 建议值
osd max write size OSD一次可写入的最大值(MB) 90 512
osd client message size cap 客户端允许在内存中的最大数据(bytes) 524288000 2147483648
osd deep scrub stride 在Deep Scrub时候允许读取的字节数(bytes) 524288 131072
osd op threads OSD进程操作的线程数 2 8
osd disk threads OSD密集型操作例如恢复和Scrubbing时的线程 1 4
osd map cache size 保留OSD Map的缓存(MB) 500 1024
osd map cache bl size OSD进程在内存中的OSD Map缓存(MB) 50 128
osd mount options xfs Ceph OSD xfs Mount选项 rw,noatime,inode64 rw,noexec,nodev,noatime,nodiratime,nobarrier

  • 增加osd op threads和disk threads会带来额外的CPU开销

[osd] - recovery tuning

参数名 描述 默认值 建议值
osd recovery op priority 恢复操作优先级,取值1-63,值越高占用资源越高 10 4
osd recovery max active 同一时间内活跃的恢复请求数 15 10
osd max backfills 一个OSD允许的最大backfills数 10 4

[osd] - client tuning

参数名 描述 默认值 建议值
rbd cache RBD缓存 true true
rbd cache size RBD缓存大小(bytes) 33554432 268435456
rbd cache max dirty 缓存为write-back时允许的最大dirty字节数(bytes),如果为0,使用write-through 25165824 134217728
rbd cache max dirty age 在被刷新到存储盘前dirty数据存在缓存的时间(seconds) 1 5

关闭Debug

3. PG Number

PG和PGP数量一定要根据OSD的数量进行调整,计算公式如下,但是最后算出的结果一定要接近或者等于一个2的指数。

Total PGs = (Total_number_of_OSD * 100) / max_replication_count

例如15个OSD,副本数为3的情况下,根据公式计算的结果应该为500,最接近512,所以需要设定该pool(volumes)的pg_num和pgp_num都为512.

1
2
ceph osd pool set volumes pg_num 512
ceph osd pool set volumes pgp_num 512

4. CRUSH Map

CRUSH是一个非常灵活的方式,CRUSH MAP的调整取决于部署的具体环境,这个可能需要根据具体情况进行分析,这里面就不再赘述了。

 


Mon删除

从健康的集群中删除

1、  systemctl stop ceph-mon@{mon-id}

2、  ceph mon remove {mon-id}

3、  从ceph.conf中删除

从不健康的集群中删除

1、  ceph mon dump

2、  service ceph stop mon

3、  ceph-mon –i {mon-id} --extract-monmap {mappath}

4、  monmaptool {mappath}  -rm {mon-id}

5、  ceph-mon –I {mon-id} –inject-monmap {monpath}


参考:

删除Ceph OSD节点

Ceph性能优化

 

 

..

CEPH pg/pgs

PG全称是placement groups,它是ceph的逻辑存储单元。在数据存储到cesh时,先打散成一系列对象,再结合基于对象名的哈希操作、复制级别、PG数量,产生目标PG号。根据复制级别的不同,每个PG在不同的OSD上进行复制和分发。可以把PG想象成存储了多个对象的逻辑容器,这个容器映射到多个具体的OSD。PG存在的意义是提高ceph存储系统的性能和扩展性。

如果没有PG,就难以管理和跟踪数以亿计的对象,它们分布在数百个OSD上。对ceph来说,管理PG比直接管理每个对象要简单得多。每个PG需要消耗一定的系统资源包括CPU、内存等。集群的PG数量应该被精确计算得出。通常来说,增加PG的数量可以减少OSD的负载,但是这个增加应该有计划进行。一个推荐配置是每OSD对应50-100个PG。如果数据规模增大,在集群扩容的同时PG数量也需要调整。CRUSH会管理PG的重新分配。

每个pool应该分配多少个PG,与OSD的数量、复制份数、pool数量有关,有个计算公式在:

http://ceph.com/pgcalc/

《learning ceph》这本书里的计算公式也差不多:

Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count

结算的结果往上取靠近2的N次方的值。比如总共OSD数量是160,复制份数3,pool数量也是3,那么按上述公式计算出的结果是1777.7。取跟它接近的2的N次方是2048,那么每个pool分配的PG数量就是2048。

在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。下面介绍如何修改pg_num和pgp_num。

(1)检查rbd这个pool里已存在的PG和PGP数量:

$ ceph osd pool get rbd pg_num
pg_num: 128
$ ceph osd pool get rbd pgp_num
pgp_num: 128

(2)检查pool的复制size,执行如下命令:

$ ceph osd dump |grep size|grep rbd
pool 2 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash 
rjenkins pg_num 128 pgp_num 128 last_change 45 flags hashpspool stripe_width 0

(3)使用上述公式,根据OSD数量、复制size、pool的数量,计算出新的PG数量,假设是256.

(4)变更rbd的pg_num和pgp_num为256:

$ ceph osd pool set rbd pg_num 256
$ ceph osd pool set rbd pgp_num 256

(5)如果有其他pool,同步调整它们的pg_num和pgp_num,以使负载更加均衡。

##############################################################

Ceph常用命令总结

1. 创建自定义pool

ceph osd pool create pg_num pgp_num

其中pgp_num为pg_num的有效归置组个数,是一个可选参数。pg_num应该足够大,不要拘泥于官方文档的计算方法,根据实际情况选择256、512、1024、2048、4096。

2. 设置pool的副本数、最小副本数、最大副本数

ceph osd pool set <poolname> size 2
ceph osd pool set <poolname> min_size 1
ceph osd pool set <poolname> max_size 10

资源所限,如果不希望保存3副本,可以用该命令对特定的pool更改副本存放数。

利用get可以获得特定pool的副本数。

ceph osd pool get <poolname> size

3. 增加osd

可以利用ceph-deploy增加osd:

ceph-deploy osd prepare monosd1:/mnt/ceph osd2:/mnt/ceph
ceph-deploy osd activate monosd1:/mnt/ceph osd2:/mnt/ceph

#相当于:
ceph-deploy osd create monosd1:/mnt/ceph osd2:/mnt/ceph

#还有一种方法,在安装osd时同时指定对应的journal的安装路径
ceph-deploy osd create osd1:/cephmp1:/dev/sdf1 /cephmp2:/dev/sdf2

也可以手动增加:

## Prepare disk first, create partition and format it
<insert parted oneliner>
mkfs.xfs -f /dev/sdd
mkdir /cephmp1
mount /dev/sdd /cephmp1
cd /cephmp1

ceph-osd -i 12 --mkfs --mkkey
ceph auth add osd.12 osd 'allow *' mon 'allow rwx' -i /cephmp1/keyring

#change the crushmap
ceph osd getcrushmap -o map
crushtool -d map -o map.txt
vim map.txt
crushtool -c map.txt -o map
ceph osd setcrushmap -i map

## Start it
/etc/init.d/ceph start osd.12

4. 删除osd

先将此osd停止工作:

## Mark it out
ceph osd out 5

## Wait for data migration to complete (ceph -w), then stop it
service ceph -a stop osd.5

## Now it is marked out and down

再对其进行删除操作:

## If deleting from active stack, be sure to follow the above to mark it out and down
ceph osd crush remove osd.5

## Remove auth for disk
ceph auth del osd.5

## Remove disk
ceph osd rm 5

## Remove from ceph.conf and copy new conf to all hosts

5. 查看osd总体情况、osd的详细信息、crush的详细信息

ceph osd tree
ceph osd dump --format=json-pretty
ceph osd crush dump --format=json-pretty

6. 获得并修改CRUSH maps

## save current crushmap in binary
ceph osd getcrushmap -o crushmap.bin

## Convert to txt
crushtool -d crushmap.bin -o crushmap.txt

## Edit it and re-convert to binary
crushtool -c crushmap.txt -o crushmap.bin.new

## Inject into running system
ceph osd setcrushmap -i crushmap.bin.new

## If you've added a new ruleset and want to use that for a pool, do something like:
ceph osd pool default crush rule = 4

#也可以这样设置一个pool的rule
cpeh osd pool set testpool crush_ruleset <ruleset_id>

-o=output; -d=decompile; -c=compile; -i=input

记住这些缩写,上面的命令就很容易理解了。

7. 增加/删除journal

为了提高性能,通常将ceph的journal置于单独的磁盘或分区中:

先利用以下命令设置ceph集群为nodown:

  • ceph osd set nodown
# Relevant ceph.conf options
 -- existing setup --
[osd]
    osd data = /srv/ceph/osd$id
    osd journal = /srv/ceph/osd$id/journal
    osd journal size = 512

# stop the OSD:
/etc/init.d/ceph osd.0 stop
/etc/init.d/ceph osd.1 stop
/etc/init.d/ceph osd.2 stop

# Flush the journal:
ceph-osd -i 0 --flush-journal
ceph-osd -i 1 --flush-journal
ceph-osd -i 2 --flush-journal

# Now update ceph.conf - this is very important or you'll just recreate 
journal on the same disk again
 -- change to [filebased journal] --
[osd]
    osd data = /srv/ceph/osd$id
    osd journal = /srv/ceph/journal/osd$id/journal
    osd journal size = 10000

 -- change to [partitionbased journal (journal
 in this case would be on /dev/sda2)] --
[osd]
    osd data = /srv/ceph/osd$id
    osd journal = /dev/sda2
    osd journal size = 0

# Create new journal on each disk
ceph-osd -i 0 --mkjournal
ceph-osd -i 1 --mkjournal
ceph-osd -i 2 --mkjournal

# Done, now start all OSD again
/etc/init.d/ceph osd.0 start
/etc/init.d/ceph osd.1 start
/etc/init.d/ceph osd.2 start

记得将nodown设置回来:

  • ceph osd unset nodown

8. ceph cache pool

经初步测试,ceph的cache pool性能并不好,有时甚至低于无cache pool时的性能。可以利用flashcache等替代方案来优化ceph的cache。

ceph osd tier add satapool ssdpool
ceph osd tier cache-mode ssdpool writeback
ceph osd pool set ssdpool hit_set_type bloom
ceph osd pool set ssdpool hit_set_count 1

## In this example 80-85% of the cache pool is equal to 280GB
ceph osd pool set ssdpool target_max_bytes $((280*1024*1024*1024))
ceph osd tier set-overlay satapool ssdpool
ceph osd pool set ssdpool hit_set_period 300
ceph osd pool set ssdpool cache_min_flush_age 300   # 10 minutes
ceph osd pool set ssdpool cache_min_evict_age 1800   # 30 minutes
ceph osd pool set ssdpool cache_target_dirty_ratio .4
ceph osd pool set ssdpool cache_target_full_ratio .8

9. 查看运行时配置

ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show

10. 查看监控集群状态

ceph health
cehp health detail
ceph status
ceph -s

#可以加上--fortmat=json-pretty
ceph osd stat
ceph osd dump
ceph osd tree

ceph mon stat
ceph quorum_status
ceph mon dump

ceph mds stat
ceph mds dump

11. 查看所有的pool

ceph osd lspools
rados lspools

12. 查看kvm和qemu是否支持rbd

qemu-system-x86_64 -drive format=?
qemu-img -h | grep rbd

13, 查看特定的pool及其中的文件

rbd ls testpool
rbd create testpool/test.img -s 1024 --image-format=2
rbd info testpool/test.img
rbd rm testpool/test.img

#统计块数
rados -p testpool ls | grep ^rb.0.11a1 | wc -l
#导入并查看文件
rados makepool testpool
rados put -p testpool logo.png logo.png
ceph osd map testpool logo.png

rbd import logo.png testpool/logo.png
rbd info testpool/logo.png

14. 挂载/卸载创建的块设备

ceph osd pool create testpool 256 256
rbd create testpool/test.img -s 1024 --image-format=2
rbd map testpool/test.img
rbd showmapped
mkfs.xfs /dev/rbd0
rbd unmap /dev/rbd0

15. 创建快照

#创建
rbd snap create testpool/test.img@test.img-snap1
#查看
rbd snap ls testpool/test.img
#回滚
rbd snap rollback testpool/test.img@test.img-snap1
#删除
rbd snap rm testpool/test.img@test.img-snap1
#清除所有快照
rbd snap purge testpool/test.img

16. 计算合理的pg数

官方建议每OSD50-100个pg。total pgs=osds*100/副本数,例如6osd、2副本的环境,pgs为6*100/2=300

pg数只能增加,无法减少;增加pg_num后必须同时增减pgp_num

17. 对pool的操作

ceph osd pool create testpool 256 256
ceph osd pool delete testpool testpool --yes-i-really-really-mean-it
ceph osd pool rename testpool anothertestpool
ceph osd pool mksnap testpool testpool-snap

18. 重新安装前的格式化

ceph-deploy purge osd0 osd1
ceph-deploy purgedata osd0 osd1
ceph-deploy forgetkeys

ceph-deploy disk zap --fs-type xfs osd0:/dev/sdb1

19. 修改osd journal的存储路径

#noout参数会阻止osd被标记为out,使其权重为0
ceph osd set noout
service ceph stop osd.1
ceph-osd -i 1 --flush-journal
mount /dev/sdc /journal
ceph-osd -i 1 --mkjournal /journal
service ceph start osd.1
ceph osd unset noout

20. xfs挂载参数

mkfs.xfs -n size=64k /dev/sdb1

#/etc/fstab挂载参数
rw,noexec,nodev,noatime,nodiratime,nobarrier

21. 认证配置

[global]
auth cluser required = none
auth service required = none
auth client required = none

#0.56之前
auth supported = none

22. pg_num不够用,进行迁移和重命名

ceph osd pool create new-pool pg_num
rados cppool old-pool new-pool
ceph osd pool delete old-pool
ceph osd pool rename new-pool old-pool

#或者直接增加pool的pg_num

23. 推送config文件

ceph-deploy --overwrite-conf config push mon1 mon2 mon3

24. 在线修改config参数

ceph tell osd.* injectargs '--mon_clock_drift_allowde 1'

使用此命令需要区分配置的参数属于mon、mds还是osd。


Ceph三节点(3 mon+9 osd)集群部署

2017-7-14

一、基础环境准备
3台机器,每台机器标配:1G内存、2块网卡、3块20G的SATA裸盘
"$"符号表示三个节点都进行同样配置
$ cat /etc/hosts
ceph-node1 10.20.0.101
ceph-node2 10.20.0.102
ceph-node3 10.20.0.103
$ yum install epel-release

二、安装ceph-deploy
[root@ceph-node1 ~]# ssh-keygen //在node1节点配置免SSH密钥登录到其他节点
[root@ceph-node1 ~]# ssh-copy-id ceph-node2
[root@ceph-node1 ~]# ssh-copy-id ceph-node3
[root@ceph-node1 ~]# yum install ceph-deploy -y

三个节点安装: yum install ceph

[root@ceph01 yum.repos.d]# cat ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
[root@ceph01 yum.repos.d]#

[root@ceph-node1 ~]# ceph-deploy new ceph-node1 ceph-node2 ceph-node3 //new命令会生成一个ceph-node1集群,并且会在当前目录生成配置文件和密钥文件

+++++++++++++++++++++++++++++++++++++++
[root@ceph-node1 ~]# ceph -v
ceph version 0.94.10 (b1e0532418e4631af01acbc0cedd426f1905f4af)
[root@ceph-node1 ~]# ceph-deploy mon create-initial //创建第一个monitor
[root@ceph-node1 ~]# ceph status //此时集群处于error状态是正常的
cluster ea54af9f-f286-40b2-933d-9e98e7595f1a
health HEALTH_ERR
[root@ceph-node1 ~]# systemctl start ceph
[root@ceph-node1 ~]# systemctl enable ceph

 

三、创建对象存储设备OSD,并加入到ceph集群
[root@ceph-node1 ~]# ceph-deploy disk list ceph-node1 //列出ceph-node1已有的磁盘,很奇怪没有列出sdb、sdc、sdd,但是确实存在的
//下面的zap命令慎用,会销毁磁盘中已经存在的分区表和数据。ceph-node1是主机名,同样可以是ceph-node2
[root@ceph-node1 ~]# ceph-deploy disk zap ceph-node1:sdb ceph-node1:sdc ceph-node1:sdd
[root@ceph-node1 ~]# ceph-deploy osd create ceph-node1:sdb ceph-node1:sdc ceph-node1:sdd //擦除磁盘原有数据,并创建新的文件系统,默认是XFS,然后将磁盘的第一个分区作为数据分区,第二个分区作为日志分区。加入到OSD中。
[root@ceph-node1 ~]# ceph status //可以看到集群依旧没有处于健康状态。我们需要再添加一些节点到ceph集群中,以便它能够形成分布式的、冗余的对象存储,这样集群状态才为健康。
cluster ea54af9f-f286-40b2-933d-9e98e7595f1a
health HEALTH_WARN
64 pgs stuck inactive
64 pgs stuck unclean
monmap e1: 1 mons at {ceph-node1=10.20.0.101:6789/0}
election epoch 2, quorum 0 ceph-node1
osdmap e6: 3 osds: 0 up, 0 in
pgmap v7: 64 pgs, 1 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail
64 creating

 

四、纵向扩展多节点Ceph集群,添加Monitor和OSD
注意:Ceph存储集群最少需要一个Monitor处于运行状态,要提供可用性的话,则需要奇数个monitor,比如3个或5个,以形成仲裁(quorum)。
(1)在Ceph-node2和Ceph-node3部署monitor,但是是在ceph-node1执行命令!
[root@ceph-node1 ~]# ceph-deploy mon add ceph-node2
[root@ceph-node1 ~]# ceph-deploy mon add ceph-node3
++++++++++++++++++++++++++
报错:[root@ceph-node1 ~]# ceph-deploy mon create ceph-node2
[ceph-node3][WARNIN] Executing /sbin/chkconfig ceph on
[ceph-node3][ERROR ] admin_socket: exception getting command descriptions: [Errno 2] No such file or directory
[ceph-node3][WARNIN] monitor: mon.ceph-node3, might not be running yet
[ceph-node3][INFO ] Running command: ceph --cluster=ceph --admin-daemon /var/run/ceph/ceph-mon.ceph-node3.asok mon_status
[ceph-node2][WARNIN] neither `public_addr` nor `public_network` keys are defined for monitors
解决:①通过在CentOS 7上chkconfig,怀疑节点1并没有远程启动节点2的ceph服务,如果我在node2手动启动的话,应该就可以了
[root@ceph-node2 ~]# systemctl status ceph
● ceph.service - LSB: Start Ceph distributed file system daemons at boot time
Loaded: loaded (/etc/rc.d/init.d/ceph)
Active: inactive (dead)
结果enable后还是失败了
②沃日,原来是书上写错了,在已经添加了监控节点后,后续添加监控节点应该是mon add,真的是醉了!

++++++++++++++++++++++++++++++++
[root@ceph-node1 ~]# ceph status
monmap e3: 3 mons at {ceph-node1=10.20.0.101:6789/0,ceph-node2=10.20.0.102:6789/0,ceph-node3=10.20.0.103:6789/0}
election epoch 8, quorum 0,1,2 ceph-node1,ceph-node2,ceph-node3

(2)添加更多的OSD节点,依然在ceph-node1执行命令即可。
[root@ceph-node1 ~]# ceph-deploy disk list ceph-node2 ceph-node3
//确保磁盘号不要出错,否则的话,容易把系统盘都给格式化了!
[root@ceph-node1 ~]# ceph-deploy disk zap ceph-node2:sdb ceph-node2:sdc ceph-node2:sdd
[root@ceph-node1 ~]# ceph-deploy disk zap ceph-node3:sdb ceph-node3:sdc ceph-node3:sdd
//经过实践,下面的这条命令,osd create最好分两步,prepare和activate,终于为什么不清楚。
[root@ceph-node1 ~]# ceph-deploy osd create ceph-node2:sdb ceph-node2:sdc ceph-node2:sdd
[root@ceph-node1 ~]# ceph-deploy osd create ceph-node3:sdb ceph-node3:sdc ceph-node3:sdd

++++++++++++++++++++++++++++++++++++++++++++
报错:
[ceph-node3][WARNIN] ceph-disk: Error: Command '['/usr/sbin/sgdisk', '--new=2:0:5120M', '--change-name=2:ceph journal', '--partition-guid=2:fa28bc46-55de-464a-8151-9c2b51f9c00d', '--typecode=2:45b0969e-9b03-4f30-b4c6-b4b80ceff106', '--mbrtogpt', '--', '/dev/sdd']' returned non-zero exit status 4
[ceph-node3][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy.osd][ERROR ] Failed to execute command: ceph-disk -v prepare --fs-type xfs --cluster ceph -- /dev/sdd
[ceph_deploy][ERROR ] GenericError: Failed to create 3 OSDs
未解决:原来敲入osd create命令不小心把node2写成node3了,哎我尼玛,后面越来越难办了
+++++++++++++++++++++++++++++

[root@ceph-node1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.08995 root default
-2 0.02998 host ceph-node1
0 0.00999 osd.0 up 1.00000 1.00000
1 0.00999 osd.1 up 1.00000 1.00000
2 0.00999 osd.2 up 1.00000 1.00000
-3 0.02998 host ceph-node2
3 0.00999 osd.3 down 0 1.00000
4 0.00999 osd.4 down 0 1.00000
8 0.00999 osd.8 down 0 1.00000
-4 0.02998 host ceph-node3
5 0.00999 osd.5 down 0 1.00000
6 0.00999 osd.6 down 0 1.00000
7 0.00999 osd.7 down 0 1.00000

有6个OSD都处于down状态,ceph-deploy osd activate 依然失败,根据之前的报告,osd create的时候就是失败的。
未解决:由于刚部署ceph集群,还没有数据,可以把OSD给清空。
参考文档:http://www.cnblogs.com/zhangzhengyan/p/5839897.html
[root@ceph-node1 ~]# ceph-deploy disk zap ceph-node2:sdb ceph-node2:sdc ceph-node2:sdd
[root@ceph-node1 ~]# ceph-deploy disk zap ceph-node3:sdb ceph-node3:sdc ceph-node3:sdd

(1)从ceph osd tree移走crush map的osd.4,还有其他osd号
[root@ceph-node1 ~]# ceph osd crush remove osd.3
[root@ceph-node1 ~]# ceph osd crush remove osd.4
[root@ceph-node1 ~]# ceph osd crush remove osd.8
[root@ceph-node1 ~]# ceph osd crush remove osd.5
[root@ceph-node1 ~]# ceph osd crush remove osd.6
[root@ceph-node1 ~]# ceph osd crush remove osd.7

(2)[root@ceph-node1 ~]# ceph osd rm 3
[root@ceph-node1 ~]# ceph osd rm 4
[root@ceph-node1 ~]# ceph osd rm 5
[root@ceph-node1 ~]# ceph osd rm 6
[root@ceph-node1 ~]# ceph osd rm 7
[root@ceph-node1 ~]# ceph osd rm 8

[root@ceph-node1 ~]# ceph osd tree //终于清理干净了
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.02998 root default
-2 0.02998 host ceph-node1
0 0.00999 osd.0 up 1.00000 1.00000
1 0.00999 osd.1 up 1.00000 1.00000
2 0.00999 osd.2 up 1.00000 1.00000
-3 0 host ceph-node2
-4 0 host ceph-node3
可以登录到node2和node3,sdb/sdc/sdd都被干掉了,除了还剩GPT格式,现在重新ceph-deploy osd create
我尼玛还是报错呀,[ceph_deploy.osd][ERROR ] Failed to execute command: ceph-disk -v prepare --fs-type xfs --cluster ceph -- /dev/sdd

++++++++++++++++++++++++++++++++++
报错:(1)node1远程激活node2的osd出错。prepare和activate能够取代osd create的步骤
[root@ceph-node1 ~]# ceph-deploy osd prepare ceph-node2:sdb ceph-node2:sdc ceph-node2:sdd
[root@ceph-node1 ~]# ceph-deploy osd activate ceph-node2:sdb ceph-node2:sdc ceph-node2:sdd

[ceph-node2][WARNIN] ceph-disk: Cannot discover filesystem type: device /dev/sdb: Line is truncated:
[ceph-node2][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph-disk -v activate --mark-init sysvinit --mount /dev/sdb
解决:格式分区权限问题,在报错的节点执行ceph-disk activate-all即可。

(2)明明是node2的sdb盘,但是ceph osd tree却发现执行的是node3的sdb盘,当然会报错了
Starting Ceph osd.4 on ceph-node2...
Running as unit ceph-osd.4.1500013086.674713414.service.
Error EINVAL: entity osd.3 exists but key does not match
[root@ceph-node1 ~]# ceph osd tree
3 0 osd.3 down 0 1.00000

解决:[root@ceph-node1 ~]# ceph auth del osd.3
[root@ceph-node1 ~]# ceph osd rm 3
在node2上lsblk发现sdb不正常,没有挂载osd,那么于是
[root@ceph-node1 ~]# ceph-deploy disk zap ceph-node2:sdb
[root@ceph-node1 ~]# ceph-deploy osd prepare ceph-node2:sdb
[root@ceph-node1 ~]# ceph osd tree //至少osd跑到node2上面,而不是node3,还好还好。
-3 0.02998 host ceph-node2
3 0.00999 osd.3 down 0 1.00000
[root@ceph-node1 ~]# ceph-deploy osd activate ceph-node2:sdb //肯定失败,按照上面的经验,必须在Node2上单独激活
[root@ceph-node2 ~]# ceph-disk activate-all

[root@ceph-node1 ~]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.08995 root default
-2 0.02998 host ceph-node1
0 0.00999 osd.0 up 1.00000 1.00000
1 0.00999 osd.1 up 1.00000 1.00000
2 0.00999 osd.2 up 1.00000 1.00000
-3 0.02998 host ceph-node2
4 0.00999 osd.4 up 1.00000 1.00000
5 0.00999 osd.5 up 1.00000 1.00000
3 0.00999 osd.3 up 1.00000 1.00000
-4 0.02998 host ceph-node3
6 0.00999 osd.6 up 1.00000 1.00000
7 0.00999 osd.7 up 1.00000 1.00000
8 0.00999 osd.8 up 1.00000 1.00000
哎,卧槽,终于解决了,之前只是一个小小的盘符写错了,就害得我搞这么久啊,细心点!

=========================================
拓展:
[root@ceph-node1 ~]# lsblk // OSD up的分区都挂载到/var/lib/ceph/osd目录下
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 39.5G 0 part
├─centos-root 253:0 0 38.5G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 15G 0 part /var/lib/ceph/osd/ceph-0
└─sdb2 8:18 0 5G 0 part
sdc 8:32 0 20G 0 disk
├─sdc1 8:33 0 15G 0 part /var/lib/ceph/osd/ceph-1
└─sdc2 8:34 0 5G 0 part
sdd 8:48 0 20G 0 disk
├─sdd1 8:49 0 15G 0 part /var/lib/ceph/osd/ceph-2
└─sdd2 8:50 0 5G 0 part
sr0 11:0 1 1024M 0 rom

 

 

 

 

 

 

ceph radosgw-admin

生成一新用户:

$ radosgw-admin user create --display-name="johnny rotten" --uid=johnny
{ "user_id": "johnny",
  "rados_uid": 0,
  "display_name": "johnny rotten",
  "email": "",
  "suspended": 0,
  "subusers": [],
  "keys": [
        { "user": "johnny",
          "access_key": "TCICW53D9BQ2VGC46I44",
          "secret_key": "tfm9aHMI8X76L3UdgE+ZQaJag1vJQmE6HDb5Lbrz"}],
  "swift_keys": []}

删除一用户:

$ radosgw-admin user rm --uid=johnny

删除一个用户和与他相关的桶及内容:

$ radosgw-admin user rm --uid=johnny --purge-data

删除一个桶:

$ radosgw-admin bucket unlink --bucket=foo

显示一个桶从 2012 年 4 月 1 日起的日志:

$ radosgw-admin log show --bucket=foo --date=2012-04-01

显示某用户 2012 年 3 月 1 日(不含)到 4 月 1 日期间的使用情况:

$ radosgw-admin usage show --uid=johnny
--start-date=2012-03-01 --end-date=2012-04-01

只显示所有用户的使用情况汇总:

$ radosgw-admin usage show --show-log-entries=false

裁剪掉某用户 2012 年 4 月 1 日之前的使用信息:

$ radosgw-admin usage trim --uid=johnny --end-date=2012-04-01

命令

radosgw-admin 工具有很多命令,可完成各种管理任务:

user create
创建一个新用户。
user modify
修改一个用户。
user info
显示用户信息,以及可能存在的子用户和密钥。
user rm
删除一个用户。
user suspend
暂停某用户。
user enable
重新允许暂停的用户。
user check
检查用户信息。
user stats
显示配额子系统统计的用户状态。
caps add
给用户分配能力。
caps rm
删除用户能力。
subuser create
新建一个子用户(适合使用 Swift API 的客户端)。
subuser modify
修改子用户。
subuser rm
删除子用户
key create
新建访问密钥。
key rm
删除访问密钥。
bucket list
罗列所有桶。
bucket link
把桶关联到指定用户。
bucket unlink
取消指定用户和桶的关联。
bucket stats
返回桶的统计信息。
bucket rm
删除一个桶。
bucket check
检查桶的索引信息。
object rm
删除一个对象。
object unlink
从桶索引里去掉对象。
quota set
设置配额参数。
quota enable
启用配额。
quota disable
禁用配额。
region get
显示 region 信息。
regions list
列出本集群配置的所有 region 。
region set
设置 region 信息(需要输入文件)。
region default
设置默认 region 。
region-map get
显示 region-map 。
region-map set
设置 region-map (需要输入文件)。
zone get
显示区域集群参数。
zone set
设置区域集群参数(需要输入文件)。
zone list
列出本集群内配置的所有区域。
pool add
增加一个已有存储池用于数据归置。
pool rm
从数据归置集删除一个已有存储池。
pools list
罗列归置活跃集。
policy
显示桶或对象相关的策略。
log list
罗列日志对象。
log show
显示指定对象内(或指定桶、日期、桶标识符)的日志。
log rm
删除日志对象。
usage show
查看使用率信息(可选选项有用户和数据范围)。
usage trim
修剪使用率信息(可选选项有用户和数据范围)。
temp remove
删除指定日期(时间可选)之前创建的临时对象。
gc list
显示过期的垃圾回收对象(加 –include-all 选项罗列所有条目,包括未过期的)。
gc process
手动处理垃圾。
metadata get
读取元数据信息。
metadata put
设置元数据信息。
metadata rm
删除元数据信息。
metadata list
罗列元数据信息。
mdlog list
罗列元数据日志。
mdlog trim
裁截元数据日志。
bilog list
罗列桶索引日志。
bilog trim
裁截桶索引日志(需要起始标记、结束标记)。
datalog list
罗列数据日志。
datalog trim
裁截数据日志。
opstate list
罗列含状态操作(需要 client_id 、 op_id 、对象)。
opstate set
设置条目状态(需指定 client_id 、 op_id 、对象、状态)。
opstate renew
更新某一条目的状态(需指定 client_id 、 op_id 、对象)。
opstate rm
删除条目(需指定 client_id 、 op_id 、对象)。
replicalog get
读取复制元数据日志条目。
replicalog delete
删除复制元数据日志条目。

选项

-c ceph.conf--conf=ceph.conf
用指定的 ceph.conf 配置文件而非默认的 /etc/ceph/ceph.conf 来确定启动时所需的监视器地址。
-m monaddress[:port]
连接到指定监视器,而非通过 ceph.conf 查询。
--uid=uid
radosgw 用户的 ID 。
--subuser=<name>
子用户名字。
--email=email
用户的电子邮件地址。
--display-name=name
配置用户的显示名称(昵称)
--access-key=<key>
S3 访问密钥。
--gen-access-key
生成随机访问密钥(给 S3 )。
--secret=secret
指定密钥的密文。
--gen-secret
生成随机密钥。
--key-type=<type>
密钥类型,可用的有: swift 、 S3 。
--temp-url-key[-2]=<key>
临时 URL 密钥。
--system
给用户设置系统标识。
--bucket=bucket
指定桶名
--object=object
指定对象名
--date=yyyy-mm-dd
某些命令所需的日期
--start-date=yyyy-mm-dd
某些命令所需的起始日期
--end-date=yyyy-mm-dd
某些命令所需的终结日期
--shard-id=<shard-id>
执行 mdlog list 时为可选项。对 mdlog trim 、 replica mdlog get/delete 、 replica datalog get/delete 来说是必须的。
--auth-uid=auid
librados 认证所需的 auid 。
--purge-data
删除用户前先删除用户数据。
--purge-keys
若加了此选项,删除子用户时将一起删除其所有密钥。
--purge-objects
删除桶前先删除其内所有对象。
--metadata-key=<key>
用 metadata get 检索元数据时用的密钥。
--rgw-region=<region>
radosgw 所在的 region 。
--rgw-zone=<zone>
radosgw 所在的区域。
--fix
除了检查桶索引,还修复它。
--check-objects
检查桶:根据对象的实际状态重建桶索引。
--format=<format>
为某些操作指定输出格式: xml 、 json 。
--sync-stats
user stats 的选项,收集用户的桶索引状态、并同步到用户状态。
--show-log-entries=<flag>
执行 log show 时,显示或不显示日志条目。
--show-log-sum=<flag>
执行 log show 时,显示或不显示日志汇总。
--skip-zero-entries
让 log show 只显示数字字段非零的日志。
--infile
设置时指定要读取的文件。
--state=<state string>
给 opstate set 命令指定状态。
--replica-log-type
复制日志类型( metadata 、 data 、 bucket ),操作复制日志时需要。
--categories=<list>
逗号分隔的一系列类目,显示使用情况时需要。
--caps=<caps>
能力列表,如 “usage=read, write; user=read” 。
--yes-i-really-mean-it
某些特定操作需要。

配额选项

--bucket
为配额命令指定桶。
--max-objects
指定最大对象数(负数为禁用)。
--max-size
指定最大尺寸(单位为字节,负数为禁用)。
--quota-scope
配额有效范围(桶、用户)。

 

操作管理实例:

用户管理

新建一个用户

执行下面的命令新建一个用户 (S3 接口):

radosgw-admin user create --uid={username} 
--display-name="{display-name}" [--email={email}]

实例如下:

radosgw-admin user create --uid=johndoe
 --display-name="John Doe" --email=john@example.com

新建一个子用户

为了给用户新建一个子用户 (Swift 接口) ,你必须为该子用户指定用户的 ID(--uid={username}),子用户的 ID 以及访问级别:

radosgw-admin subuser create --uid={uid}
 --subuser={uid} --access=[ read | write | readwrite | full ]

实例如下:

radosgw-admin subuser create --uid=johndoe --subuser=johndoe:swift --access=full

Note:full 并不表示 readwrite, 因为它还包括访问权限策略.

获取用户信息

要获取一个用户的信息,你必须使用 user info 子命令并且制定一个用户 ID(--uid={username}) .

radosgw-admin user info --uid=johndoe

修改用户信息

要修改一个用户的信息,你必须指定用户的 ID (--uid={username}),还有 你想要修改的属性值。典型的修改项主要是 access 和secret 密钥,邮件地址,显 示名称和访问级别。举例如下:

radosgw-admin user modify --uid=johndoe --display-name="John E. Doe"

要修改子用户的信息, 使用 subuser modify 子命令并且执行子用户的 ID. 举例如下:

radosgw-admin subuser modify --uid=johndoe:swift --access=full

用户 启用/停用

当你创建了一个用户,用户默认情况下是处于启用状态的。然而,你可以暂停用户权 限并在以后随时重新启用它们。暂停一个用户,使用 user suspend 子命令 然后哦指定用户的 ID:

radosgw-admin user suspend --uid=johndoe

要重新启用已经被停用的用户,使用 user enable 子命令并指明用户的 ID.

radosgw-admin user enable --uid=johndoe

Note:停用一个用户后,它的子用户也会一起被停用.

删除用户

删除用户时,这个用户以及他的子用户都会被删除。当然,如果你愿意,可以只删除子用户。要删除用户(及其子用户),可使用 user rm 子命令并指明用户 ID :

radosgw-admin user rm --uid=johndoe

只想删除子用户时,可使用 subuser rm 子命令并指明子用户 ID 。

radosgw-admin subuser rm --subuser=johndoe:swift

其它可选操作:

  • Purge Data: 加 --purge-data 选项可清除与此 UID 相关的所有数据。
  • Purge Keys: 加 --purge-keys 选项可清除与此 UID 相关的所有密钥。

删除子用户

在你删除子用户的同时,也失去了 Swift 接口的访问方式,但是这个用户在系统 中还存在。要删除子用户,可使用 subuser rm 子命令并指明子用户 ID :

radosgw-admin subuser rm --subuser=johndoe:swift

其它可选操作:

  • Purge Keys: 加 --purge-keys 选项可清除与此 UID 相关的所有密钥。

新建一个密钥

要为用户新建一个密钥,你需要使用 key create 子命令。对于用户来说,需要指明用户的 ID 以及新建的密钥类型为 s3 。要为子用户新建一个密钥,则需要指明子用户的 ID以及密钥类型为 swift 。实例如下:

radosgw-admin key create --subuser=johndoe:swift --key-type=swift --gen-secret

新建/删除 ACCESS 密钥

用户和子用户要能使用 S3 和Swift 接口,必须有 access 密钥。在你新 建用户或者子用户的时候,如果没有指明 access 和 secret 密钥,这两 个密钥会自动生成。你可能需要新建 access 和/或 secret 密钥,不管是 手动指定还是自动生成的方式。你也可能需要删除一个 access 和 secret 。可用的选项有:

  • --secret=<key> 指明一个 secret 密钥 (e.即手动生成).
  • --gen-access-key 生成一个随机的 access 密钥 (新建 S3 用户的默认选项).
  • --gen-secret 生成一个随机的 secret 密钥.
  • --key-type=<type> 指定密钥类型. 这个选项的值可以是: swift, s3

要新建密钥,需要指明用户 ID.

radosgw-admin key create --uid=johndoe --key-type=s3 --gen-access-key --gen-secret

你也可以使用指定 access 和 secret 密钥的方式.

要删除一个 access 密钥, 也需要指定用户 ID.

radosgw-admin key rm --uid=johndoe

添加/删除 管理权限

Ceph 存储集群提供了一个管理API,它允许用户通过 REST API 执行管理功能。默认情况下,用户没有访问 这个 API 的权限。要启用用户的管理功能,需要为用 户提供管理权限。

执行下面的命令为一个用户添加管理权限:

radosgw-admin caps add --uid={uid} --caps={caps}

你可以给一个用户添加对用户、bucket、元数据和用量(存储使用信息)等数据的 读、写或者所有权限。举例如下:

--caps="[users|buckets|metadata|usage|zone]=[*|read|write|read, write]"

实例如下:

radosgw-admin caps add --uid=johndoe --caps="users=*"

要删除某用户的管理权限,可用下面的命令:

radosgw-admin caps rm --uid=johndoe --caps={caps}

配额管理

设置用户配额

在你启用用户的配额前 ,你需要先设置配额参数。 例如:

radosgw-admin quota set --quota-scope=user
 --uid=<uid> [--max-objects=<num objects>] [--max-size=<max size>]

实例如下:

radosgw-admin quota set --quota-scope=user
 --uid=johndoe --max-objects=1024 --max-size=1024

最大对象数和最大存储用量的值是负数则表示不启用指定的 配额参数。

启用/禁用用户配额

在你设置了用户配额之后,你可以启用这个配额。实例如下:

radosgw-admin quota enable --quota-scope=user --uid=<uid>

你也可以禁用已经启用了配额的用户的配额。 举例如下:

radosgw-admin quota-disable --quota-scope=user --uid=<uid>

设置 BUCKET 配额

Bucket 配额作用于用户的某一个 bucket,通过 uid 指定用户。这些配额设置是独立于用户之外的。:

radosgw-admin quota set --uid=<uid>
 --quota-scope=bucket [--max-objects=<num objects>] [--max-size=<max size>]

最大对象数和最大存储用量的值是负数则表示不启用指定的 配额参数。

启用/禁用 BUCKET 配额

在你设置了 bucket 配额之后,你可以启用这个配额。实例如下:

radosgw-admin quota enable --quota-scope=bucket --uid=<uid>

你也可以禁用已经启用了配额的 bucket 的配额。 举例如下:

radosgw-admin quota-disable --quota-scope=bucket --uid=<uid>

获取配额信息

你可以通过用户信息 API 来获取每一个用户的配额 设置。通过 CLI 接口读取用户的配额设置信息,请执行下面的命令:

radosgw-admin user info --uid=<uid>

更新配额统计信息

配额的统计数据的同步是异步的。你也可以通过手动获 取最新的配额统计数据为所有用户和所有 bucket 更新配额统计数据:

radosgw-admin user stats --uid=<uid> --sync-stats

获取用户用量统计信息

执行下面的命令获取当前用户已经消耗了配额的多少:

radosgw-admin user stats --uid=<uid>

Note:你应该在执行 radosgw-admin user stats 的时候带上 --sync-stats 参数来获取最新的数据.

读取/设置全局配额

你可以在 region map中读取和设置配额。执行下面的命 令来获取 region map:

radosgw-admin regionmap get > regionmap.json

要为整个 region 设置配额,只需要简单的修改 region map 中的配额设置。然后使用 region set 来更新 region map即可:

radosgw-admin region set < regionmap.json

Note:在更新 region map 后,你必须重启网关.

用量管理

Ceph 对象网关会为每一个用户记录用量数据。你也可以通过指定日期范围来跟踪用户的用量数据。

可用选项如下:

  • Start Date: 选项 --start-date 允许你指定一个起始日期来过滤用量数据 (format: yyyy-mm-dd[HH:MM:SS]).
  • End Date: 选项 --end-date 允许你指定一个截止日期来过滤用量数据 (format: yyyy-mm-dd[HH:MM:SS]).
  • Log Entries: 选项 --show-log-entries 允许你 指明显示用量数据的时候是否要包含日志条目。 (选项值: true | false).

Note:你可以指定时间为分钟和秒,但是数据存储是以一个小时的间隔存储的.

展示用量信息

显示用量统计数据,使用 usage show 子命令。显示某一个特定 用户的用量数据,你必须指定该用户的 ID。你也可以指定开始日期、结 束日期以及是否显示日志条目。:

radosgw-admin usage show --uid=johndoe --start-date=2012-03-01 --end-date=2012-04-01

通过去掉用户的 ID,你也可以获取所有用户的汇总的用量信息

radosgw-admin usage show --show-log-entries=false

删除用量信息

对于大量使用的集群而言,用量日志可能会占用大量存储空间。你可以为所有用户或者一个特定的用户删除部分用量日志。你也可以为删除操作指定日期范围。:

radosgw-admin usage trim --start-date=2010-01-01 --end-date=2010-12-31
radosgw-admin usage trim --uid=johndoe
radosgw-admin usage trim --uid=johndoe --end-date=2013-12-31

 

参考:

https://www.cnblogs.com/kuku0223/p/8257813.html

 

 

磁盘IOPS的计算

计算磁盘IOPS的三个因素:
1、RAID类型的读写比

不同RAID类型的IOPS计算公式:

RAID类型

公式

RAID5、RAID3 Drive IOPS=Read IOPS + 4*Write IOPS
RAID6 Drive IOPS=Read IOPS +  6*Write IOPS
RAID1、RAID10 Drive IOPS=Read IOPS + 2*Write IOPS
2、硬盘类型的IOPS值

不同磁盘类型的IOPS:

硬盘类型

IOPS

FC 15K RPM 180
FC 10K RPM 140
SAS 15K RPM 180
SAS 10K RPM 150
SATA 10K RPM 290
SATA 7.2K RPM 80
SATA 5.4K RPM 40
Flash drive 2500
3、具体业务系统的读写比

二、案例

1) 业务需求: 10TB 的FC 15K RPM存储空间,满足6000 IOPS,计算RAID5,RAID10分别需要多少块硬盘?

首先需要知道I/O中读操作与写操作所占的百分比。 假定6000 IOPS中读/写比是2:1

    不同的RAID类型Drive 硬盘实际IOPS负载分别如下:

RAID10:(2/3)*6000+2*(1/3)*6000= 8000 IOPS

RAID5:(2/3)*6000+4*(1/3)*6000=12000 IOPS

参照不同硬盘类型的IOPS值,换算出需要多少块盘:

RAID10:8000 /180 = 45块

RAID5:12000/180 =67块

2)    一个RAID5,是由5块500G 10K RPM的FC盘组成,换算出该RAID支持的最大IOPS以及能够给前端应用提供的IOPS?

首先10K RPM的FC盘,单块盘的IOPS为140,5块盘最大IOPS值为700。

假设读写比为2:1,能够提供给前端应用的IOPS为:

(2/3)*X+4*(1/3)*X = 700

         2*X = 700
         X=350
         能够提供给前端应用的IOPS为350。

三. IOPS 说明

3.1 IOPS (Input/OutputPer Second)

IOPS 即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(OnlineTransaction Processing),IOPS是关键衡量指标。

另一个重要指标是数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。

传统磁盘本质上一种机械装置,如FC, SAS, SATA磁盘,转速通常为5400/7200/10K/15K rpm不等。影响磁盘的关键因素是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间、旋转延迟和数据传输时间三部分构成。

(1)寻道时间

Tseek是指将读写磁头移动至正确的磁道上所需要的时间。寻道时间越短,I/O操作越快,目前磁盘的平均寻道时间一般在3-15ms。

(2)旋转延迟

Trotation是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间。旋转延迟取决于磁盘转速,通常使用磁盘旋转一周所需时间的1/2表示。比如,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,而转速为15000 rpm的磁盘其平均旋转延迟约为2ms。

(3)数据传输时间

Ttransfer是指完成传输所请求的数据所需要的时间,它取决于数据传输率,其值等于数据大小除以数据传输率。目前IDE/ATA能达到133MB/s(MBPS),SATA II可达到300MB/s的接口数据传输率,数据传输时间通常远小于前两部分时间。

IOPS(每秒IO次数) = 1s/(寻道时间+旋转延迟+数据传输时间)

因此,理论上可以计算出磁盘的最大IOPS,即IOPS = 1000ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms, 磁盘转速为7200,10K,15Krpm,则磁盘IOPS理论最大值分别为:

IOPS = 1000 / (3 + 60000/7200/2)  = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200

3.2 固态硬盘的IOPS

固态硬盘SSD是一种电子装置, 避免了传统磁盘在寻道和旋转上的时间花费,存储单元寻址开销大大降低,因此IOPS可以非常高,能够达到数万甚至数十万。实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。因此对比测量磁盘IOPS时,必须在同样的测试基准下进行,即便如何也会产生一定的随机不确定性。

通常情况下,IOPS可细分为如下几个指标:

Toatal IOPS:混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。

Random Read IOPS:100%随机读负载情况下的IOPS。

Random WriteIOPS:100%随机写负载情况下的IOPS。

Sequential ReadIOPS:100%顺序负载读情况下的IOPS。

Sequential WriteIOPS:100%顺序写负载情况下的IOPS。

文章来源: https://www.cnblogs.com/renyb/p/3698664.html
CentOS/Redhat IO view:
yum install iotop -y
sudo iotop

Ceph

打造高性能高可靠块存储系统

UnitedStack块存储系统

分布式存储有出色的性能,可以扛很多故障,能够轻松扩展,所以我们UnitedStack使用Ceph构建了高性能、高可靠的块存储系统,并使用它支撑UnitedStack公有云和托管云的云主机、云硬盘服务。

由于使用分布式块存储系统,避免了复制镜像的过程,所以云主机的创建时间可以缩短到10秒以内,而且云主机还能快速热迁移,方便了运维人员对物理服务器上硬件和软件的维护。

用户对于块存储系统最直观的感受来源于云硬盘服务,现在我们的云硬盘的特点是:

  • 每个云硬盘最大支持 6000 IOPS和170 MB/s的吞吐率,95%的4K随机写操作的延迟小于2ms 。
  • 所有数据都是三副本,强一致性,持久性高达10个9。
  • 创建、删除、挂载、卸载都是秒级操作。
  • 实时快照。
  • 提供两种云硬盘类型,性能型和容量型。

软硬件配置

经过多轮的选型和测试,并踩过无数的坑之后,我们选择了合适我们的软件和硬件。

软件

点击查看原图

硬件

  • 从SATA磁盘到SSD,为了提高IOPS和降低Latency。
  • 从消费级SSD到企业级SSD,为了提高可靠性。
  • 从RAID卡到HBA卡,为了提高IOPS和降低Latency。

 

最小部署架构

随着软硬件的升级,需求的调整, 我们的部署架构也不断在演进,力求在成本、性能、可靠性上达到最佳平衡点。

点击查看原图

最小规模部署中有12个节点,每个节点上有3块SSD。节点上有2个万兆口和1个千兆口,虚拟机网络和存储网络使用万兆口,管理网络使用千兆口。每个集群中都有3个Ceph Monitor节点。

轻松扩展

云计算的好处是极强的扩展性,作为云计算的底层架构,也需要有快速的Scale-out能力。在块存储系统的部署架构中,可以以12台节点为单位进行扩展。

点击查看原图

 

改造OpenStack

原生的OpenStack并不支持统一存储,云主机服务Nova、镜像服务Glance、云硬盘服务Cinder的后端存储各不相同,造成了严重的内耗。我们把这三大服务的后端统一起来,进行高效管理,解决了虚拟机创建时间长和镜像风暴等问题,还能让虚拟机随便漂移。

原生的OpenStack

点击查看原图

改造后的OpenStack

点击查看原图

使用原生的OpenStack创建虚拟机需要1~3分钟,而使用改造后的OpenStack仅需要不到10秒钟时间。这是因为nova-compute不再需要通过HTTP下载整个镜像,虚拟机可以通过直接读取Ceph中的镜像数据进行启动。

我们还增加两个OpenStack没有的功能: QoS 和 共享云硬盘。云计算的另外一个好处是租户资源隔离,所以必备QoS。共享云硬盘可以挂载给多台云主机,适用于数据处理的场景。

我们还使用了OpenStack的multi-backend功能,支持多种云硬盘类型,现在我们的云硬盘类型有性能型、容量型,可以满足数据库和大文件应用。

 

高性能

高可靠性

自动化运维

 未来

RAID 简述

 

一.RAID定义

RAID(Redundant
Array of Independent Disk
独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损

失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价磁盘构成的冗余阵列,在操作系统下是作为一个独立的大型存储设备出现。RAID可以充分发

挥出多块硬盘的优势,可以提升硬盘速度,增大容量,提供容错功能够确保数据安全性,易于管理的优点,在任何一块硬盘出现问题的情况下都可以继续工作,不会
受到损坏硬盘的影响。

二、 RAID的几种工作模式(仅讨论 RAID0,RAID1,RAID5,RAID10这四种,这四种比较典型)

1、RAID0 (又称为Stripe或Striping--分条)

即Data Stripping数据分条技术。RAID 0可以把多块硬盘连成一个容量更大的硬盘群,可以提高磁 盘的性能和吞吐量。RAID 0没有冗余或错误修复能力,成本低,要求至少两个磁盘,一般只是在那些对数 据安全性要求不高的情况下才被使用。

特点:

容错性: 没有 冗余类型: 没有
热备盘选项: 没有 读性能:
随机写性能: 连续写性能:
需要的磁盘数: 只需2个或2*N个(这里应该是多于两个硬盘都可以) 可用容量: 总的磁盘的容量
典型应用: 无故障的迅速读写,要求安全性不高,如图形工作站等。

RAID 0的工作方式:

点击查看原图

图1

如图1所示:系统向 三个磁盘组成的逻辑硬盘(RADI 0 磁盘组)发出的I/O数据请求被转化为3项操作,其中的每一项操作都对应于一块物理硬盘。我们从图中可以清楚的看到通过建立RAID 0,原先顺序的数据请求被分散到所有的三块硬盘中同时执行。

从理论上讲,三块硬盘的并行操作使同一时间内磁盘读写速度提升了3倍。 但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是,大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。

RAID 0的缺点是不提供数据冗余,因此一旦用户数据损坏,损坏的数据将无法得到恢复。

RAID 0具有的特点,使其特别适用于对性能要求较高,而对数据安全不太在乎的领域,如图形工作站等。对于个人用户,RAID 0也是提高硬盘存储性能的绝佳选择。


算机技术发展迅速,但硬盘传输率也成了性能的瓶颈。怎么办?IDE RAID技术的成熟让我们轻松打造自己的超高速硬盘。在实际应用中,RAID
0硬盘阵列能比普通IDE 7200转ATA
133硬盘快得多,时至今日,在大多数的高端或者玩家主板上我们都能找到一颗PROMISE或者HighPoint的RAID芯片,同时发现它们提供的额
外几个IDE接口。没错,RAID已经近在眼前,难道你甘心放弃RAID为我们带来的性能提升吗?答案当然是否定的!

实用 的IDE RAID

RAID
可以通过软件或硬件实现。像Windows
2000就能够提供软件的RAID功能,但是这样需要消耗不小的CPU资源,降低整机性能。而硬件实现则是一般由RAID卡实现的,高档的SCSI
RAID卡有着自己专用的缓存和I/O处理器,但是对于家庭用户来说这样的开销显然是承受不了的,毕竟为了实现RAID买两个或者更多的HDD已经相当不
容易了。我们还有一种折中的办法——IDE RAID。或许这才是普通人最容易接受的方法。虽然IDE
RAID在功能和性能上都有所折中,但相对于低廉的价格,普通用户看来并不在意。

为什么要用RAID 0

RAID
0至少需要两块硬盘才能够实现,它的容量为组成这个系统的各个硬盘容量之和,这几块硬盘的容量要相同,在家用IDE
RAID中一般级联两块硬盘,一定要用同型号同容量的硬盘。RAID
0模式向硬盘写入数据的时候把数据一分为二,分别写入两块硬盘,读取数据的时候则反之,这样的话,每块硬盘只要负担一半的数据传输任务,得到的结果也就是
速度的增加。

实现方 式:

(1)、RAID 0最简单方式(我觉得这个方式不是它本意所提倡的)


是把x块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起,形成一个独立的逻辑驱动器,容量是单独硬盘的
x倍,在电脑数据写时被依次写入到各磁盘 中,当一块磁盘的空间用尽时,数据就会被自动写入到下一块磁盘中,它的好处是可以增加磁盘的容量。

速度与其中任何一块磁盘的速度相同,如果其中的任何一块磁盘出现故障,整个系统将会受到破坏,可靠

性是单独使用一块硬盘的1/n。

(2)、RAID 0的另一方式(常指的RAID 0就是指的这个)

是用n块硬盘选择合理的带区大小创建带区集,最好是为每一块硬盘都配备一个专门的磁盘控制器,在 电脑数据读写时同时向n块磁盘读写数据,速度提升n倍。提高系统的性能。

2、RAID 1 (又称为Mirror或Mirroring--镜像)

RAID

1称为磁盘镜像:把一个磁盘的数据镜像到另一个磁盘上,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,具有很高的数据冗余能力,但磁盘利用
率为50%,故成本最高,多用在保存关键性的重要数据的场合。RAID 1的操作方式是把用户写入硬盘的数据百分之百地自动复制到另外一个硬盘上。

RAID 1有以下特点

(1)、RAID 1的每一个磁盘都具有一个对应的镜像盘,任何时候数据都同步镜像,系统可以从一组 镜像盘中的任何一个磁盘读取数据。

(2)、磁盘所能使用的空间只有磁盘容量总和的一半,系统成本高。

(3)、只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行。

(4)、出现硬盘故障的RAID系统不再可靠,应当及时的更换损坏的硬盘,否则剩余的镜像盘也出现问题,那么整个系统就会崩溃。

(5)、更换新盘后原有数据会需要很长时间同步镜像,外界对数据的访问不会受到影响,只是这时整个系统的性能有所下降。

(6)、RAID 1磁盘控制器的负载相当大,用多个磁盘控制器可以提高数据的安全性和可用性。

RAID 1的工作方式:

点击查看原图

图2


图2所
示:当读取数据时,系统先从RAID1的源盘读取数据,如果读取数据成功,则系统不去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份盘

上的数据,不会造成用户工作任务的中断。当然,我们应当及时地更换损坏的硬盘并利用备份数据重新建立Mirror,避免备份盘在发生损坏时,造成不可挽回
的数据损失。

raid 1的优缺点


于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID
1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而Mirror(镜像)的磁盘空间利用率低,存储成本高。
Mirror虽不能提高存储性能,但由于其具有的高数据安全性,使其尤其适用于存放重要数据,如服务器和数据库存储等领域。

3、 RAID 5 (可以理解为是RAID 0和RAID 1的折衷方案,但没有完全使用RAID 1镜像理念,而是使用了“奇偶校验信息”来作为数据恢复的方式,与下面的RAID10不同。)

容错性: 冗余类型: 奇偶校验
热备盘选项: 读性能:
随机写性能: 连续写性能:
需要的磁盘数: 三个或更多
可用容量: (n-1)/n的总磁盘容量(n为磁盘数)
典型应用: 随机数据传输要求安全性高,如金融、数据库、存储等。

点击查看原图

图3

RAID
5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。 以四个硬盘组成的RAID
5为例,其数据存储方式如图4所示:图中,Ap为A1,A2和A3的奇偶校验信息,其它以此类推。由图中可以看出,RAID
5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘
上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

RAID
5可以理解为是RAID 0和RAID 1的折衷方案。RAID
5可以为系统提供数据安全保障,但保障程度要比Mirror低而磁盘空间利用率要比Mirror高。RAID 5具有和RAID
0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID
5的磁盘空间利用率要比RAID 1高,存储成本相对较低。

4、 RAID 5 (可以理解为是RAID 0和RAID 1的折衷方案,但没有完全使用RAID 1镜像理念,而是使用了“奇偶校验信息”来作为数据恢复的方式)

点击查看原图

图4

RAID10
也被称为镜象阵列条带。象RAID0一样,数据跨磁盘抽取;象RAID1一样,每个磁盘都有一个镜象磁盘, 所以RAID 10的另一种会说法是
RAID
0+1。RAID10提供100%的数据冗余,支持更大的卷尺寸,但价格也相对较高。对大多数只要求具有冗余度而不必考虑价格的应用来说,RAID10提

供最好的性能。使用RAID10,可以获得更好的可靠性,因为即使两个物理驱动器发生故障(每个阵列中一个),数据仍然可以得到保护。RAID10需要4
+ 2*N 个磁盘驱动器(N >=0), 而且只能使用其中一半(或更小, 如果磁盘大小不一)的磁盘用量, 例如 4 个 250G
的硬盘使用RAID10 阵列, 实际容量是 500G。

RAID总结:

类型 读写性能 安全性 磁盘利用率 成本 应用方面
RAID0 最好(因并行性而提高) 最差(完全无安全保障) 最高(100%) 最低

个人用户

RAID1 读和单个磁盘无分别,写则要写两边 最高(提供数据的百分之百备份) 差(50%) 最高 适用于存放重要数据,如服务器和数据库存储等领域。
RAID5 读:RAID 5=RAID 0(相近似的数据读取速度)

 

写:RAID 5<对单个磁盘进行写入操作(多了一个奇偶校验信息写入)

RAID 5 RAID 5
>
RAID 1
RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。
RAID10 读:RAID10=RAID0

 

写:RAID10=RAID1

RAID10=RAID1 RAID10

RAID1(50%)
RAID10

RAID1
集合了RAID0,RAID1的优点,但是空间上由于使用镜像,而不是类似RAID5的“奇偶校验信息”,磁盘利用率一样是50%

 

 

...

 

MooseFS-管理优化

一、高级功能

1、副本

       副本,在MFS中也被称为目标(Goal),它是指文件被复制的份数,设定目标值后可以通过mfsgetgoal命令来证实,也可以通过mfssetgoal命令来改变设定。

[root@mfs-client ~]# cd /mfsdata/
[root@mfs-client mfsdata]# dd if=/dev/zero of=/mfsdata/test.file bs=1M count=200 
200+0 records in 
200+0 records out 
209715200 bytes (210 MB) copied, 9.1094 s, 23.0 MB/s 
[root@mfs-client mfsdata]# mfsgetgoal test.file 
test.file: 1 
[root@mfs-client mfsdata]# mfssetgoal 3 test.file 
test.file: 3 
[root@mfs-client mfsdata]# mfsgetgoal test.file 
test.file: 3 

补充:

用mfsgetgoal –r和mfssetgoal –r同样的操作可以对整个树形目录递归操作

[root@mfs-client mfsdata]# mkdir dir/dir1/dir2/dir3 -p 
[root@mfs-client mfsdata]# touch dir/file1 
[root@mfs-client mfsdata]# touch dir/dir1/file2 
[root@mfs-client mfsdata]# touch dir/dir1/dir2/file3
[root@mfs-client mfsdata]# mfsgetgoal -r dir 
dir: 
files with goal 1 : 3 
directories with goal 1 : 4
[root@mfs-client mfsdata]# mfssetgoal -r 3 dir 
dir: 
inodes with goal changed: 7 
inodes with goal not changed: 0 
inodes with permission denied: 0 

       实际的拷贝份数可以通过mfscheckfile 和 mfsfileinfo 命令来证实,例如:

[root@mfs-client mfsdata]# mfscheckfile test.file 
test.file: 
chunks with 1 copy: 4 
[root@mfs-client mfsdata]# mfsfileinfo test.file 
test.file: 
chunk 0: 00000000000000D2_00000001 / (id:210 ver:1) 
copy 1: 172.16.100.6:9422 
chunk 1: 00000000000000D3_00000001 / (id:211 ver:1) 
copy 1: 172.16.100.7:9422 
chunk 2: 00000000000000D4_00000001 / (id:212 ver:1) 
copy 1: 172.16.100.6:9422 
chunk 3: 00000000000000D5_00000001 / (id:213 ver:1) 
copy 1: 172.16.100.7:9422 

       需要注意的是,一个包含数据的零长度的文件,尽管没有设置为非零的目标(the non-zero goal),但是在使用命令查询时将返回一个空值

[root@mfs-client mfsdata]# touch a 
[root@mfs-client mfsdata]# mfscheckfile a 
a: 
[root@mfs-client mfsdata]# mfsfileinfo a 
a: 



2、回收

       一个删除文件能够存放在一个“垃圾箱”的时间就是一个隔离时间,这个时间可以用 mfsgettrashtime 命令来验证,也可以用 mfssettrashtime 命令来设置。例如:

[root@mfs-client mfsdata]# mfsgettrashtime test.file 
test.file: 86400
[root@mfs-client mfsdata]# mfssettrashtime 0 test.file 
test.file: 0
$ mfsgettrashtime /mnt/mfs-test/test1
/mnt/mfs-test/test1: 0 

这些工具也有个递归选项-r,可以对整个目录树操作,例如:


[root@mfs-client mfsdata]# mfsgettrashtime -r dir 
dir: 
files with trashtime 86400 : 3 
directories with trashtime 86400 : 4 
[root@mfs-client mfsdata]# mfssettrashtime -r 0 dir 
dir: 
inodes with trashtime changed: 7 
inodes with trashtime not changed: 0 
inodes with permission denied: 0 
[root@mfs-client mfsdata]# mfsgettrashtime -r dir 
dir: 
files with trashtime 0 : 3 
directories with trashtime 0 : 4 

       时间的单位是秒(有用的值有:1小时是3600秒,24 – 86400秒,1 – 604800秒)。就像文件被存储的份数一样, 为一个目录 设定存放时间是要被新创建的文件和目录所继承的。数字0意味着一个文件被删除后, 将立即被彻底删除,在想回收是不可能的

       删除文件可以通过一个单独安装 MFSMETA 文件系统。特别是它包含目录 / trash (包含任然可以被还原的被删除文件的信息)和 / trash/undel (用于获取文件)。只有管理员有权限访问MFSMETA(用户的uid 0,通常是root)。

       在开始mfsmount进程时,用一个-m或-o mfsmeta的选项,这样可以挂接一个辅助的文件系统MFSMETA,这么做的目的是对于意外的从MooseFS卷上删除文件或者是为了释放磁盘空间而移动的文件而又此文件又过去了垃圾文件存放期的恢复,例如:

mfsmount -m /mnt/mfsmeta 

需要注意的是,如果要决定挂载mfsmeta,那么一定要在 mfsmaster 的 mfsexports.cfg 文件中加入如下条目:

 *                       .       rw 

原文件中有此条目,只要将其前的#去掉就可以了。

否则,你再进行挂载mfsmeta的时候,会报如下错误:

mfsmaster register error: Permission denied 

下面将演示此操作:

$ mfssettrashtime 3600 /mnt/mfs-test/test1
/mnt/mfs-test/test1: 3600 

       从“垃圾箱”中删除文件结果是释放之前被它站用的空间(删除有延迟,数据被异步删除)。在这种被从“垃圾箱”删除的情况下,该文件是不可能恢复了。

       可以通过mfssetgoal工具来改变文件的拷贝数,也可以通过mfssettrashtime工具来改变存储在“垃圾箱”中的时间。

       在 MFSMETA 的目录里,除了trash和trash/undel两个目录外,还有第三个目录reserved,该目录内有已经删除的文件,但却有一直打开着。在用户关闭了这些被打开的文件后,reserved目录中的文件将被删除,文件的数据也将被立即删除。在reserved目录中文件的命名方法同trash目录中的一样,但是不能有其他功能的操作。



3、快照

       MooseFS系统的另一个特征是利用mfsmakesnapshot工具给文件或者是目录树做快照,例如:

$ mfsmakesnapshot source ... destination 

       Mfsmakesnapshot 是在一次执行中整合了一个或是一组文件的拷贝,而且任何修改这些文件的源文件都不会影响到源文件的快照, 就是说任何对源文件的操作,例如写入源文件,将不会修改副本(或反之亦然)。

       文件快照可以用mfsappendchunks,就像MooseFS1.5中的mfssnapshot一样,,作为选择,二者都可以用。例如:

$ mfsappendchunks destination-file source-file ... 

       当有多个源文件时,它们的快照被加入到同一个目标文件中(每个chunk的最大量是chunk)。五、额外的属性文件或目录的额外的属性(noowner, noattrcache, noentrycache),可以被mfsgeteattr,mfsseteattr,mfsdeleattr工具检查,设置,删除,其行为类似mfsgetgoal/mfssetgoal or或者是mfsgettrashtime/mfssettrashtime,详细可见命令手册。


二、综合测试

1、破坏性测试

 a、模拟MFS各角色宕机测试

 b、mfs 灾难与恢复各种场景测试


2、性能测试

       针对 MooseFS 的性能测试,我这边也没有详细去做。通过伟大的互联网,我找到了几位前辈,针对 MooseFS 所做的详细性能测试,这里我就贴出来展示一下。

1、基准测试情况:

随机读

点击查看原图

随机写

点击查看原图

顺序读

点击查看原图

顺序写

点击查看原图



小文件性能测试情况

点击查看原图

点击查看原图

点击查看原图

点击查看原图

点击查看原图

点击查看原图

        如果想看更多有关 MooseFS 性能方面的测试报告,可以去参考如下链接:

        http://blog.liuts.com/post/203/          MooseFS性能图表[原创]




三、监控

1、mfs内置的监控工具mfscgiserv

       针对 Moosefs 每个组件的监控,Moosefs自带了一个监控工具 mfscgiserv,它是一个 python 编写的 web 监控页面,监听端口为9425。该监控页面为我们提供了 Master Server、Metalogger Server、Chunk Servers以及所有Client挂载的状态信息及相关性能指标图示。

       在我们安装好 Master Server 时,它就已经默认安装上了,我们可以在/usr/local/mfs/share/mfscgi/  目录下看到这个监控页面的文件。

[root@mfs-master-1 mfs]# ll /usr/local/mfs/share/mfscgi/         # 这个 mfscgi 目录里面存放的是master图形监控界面的程序
total 136 
-rwxr-xr-x. 1 root root 1881 Dec 29 00:10 chart.cgi 
-rw-r--r--. 1 root root 270 Dec 29 00:10 err.gif 
-rw-r--r--. 1 root root 562 Dec 29 00:10 favicon.ico 
-rw-r--r--. 1 root root 510 Dec 29 00:10 index.html 
-rw-r--r--. 1 root root 3555 Dec 29 00:10 logomini.png 
-rwxr-xr-x. 1 root root 107456 Dec 29 00:10 mfs.cgi 
-rw-r--r--. 1 root root 5845 Dec 29 00:10 mfs.css 

       我们可以通过执行如下命令启动该监控程序。

/moosefs_install_path/sbin/mfscgiserv start 

       启动完毕之后,我们可以通过访问http://IP:9425来访问该监控页面。

       下面,我列出启动 mfscgiserv 监控工具的操作:

[root@mfs-master-1 mfs]# /usr/local/mfs/sbin/mfscgiserv start   # 启动mfs图形控制台 
lockfile created and locked 
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs-1.6.27/share/mfscgi)
[root@mfs-master-1 mfs]# netstat -lantup|grep 9425 
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 7940/python 
tcp 0 0 172.16.100.1:9425 172.16.100.100:50693 ESTABLISHED 7940/python 
tcp 0 0 172.16.100.1:9425 172.16.100.100:50692 ESTABLISHED 7940/python 
[root@mfs-master-1 mfs]# lsof -i tcp:9425 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
python 7940 root 3u IPv4 27066 0t0 TCP *:9425 (LISTEN) 
python 7940 root 7u IPv4 27136 0t0 TCP 172.16.100.1:9425->172.16.100.100:50693 (ESTABLISHED) 
python 7940 root 8u IPv4 27124 0t0 TCP 172.16.100.1:9425->172.16.100.100:50692 (ESTABLISHED) 

下面是访问的页面:

spacer.gif点击查看原图


2、使用zabbix监控mfs

1、监控要点

        根据 MooseFS 中各个组件的特点,我们所需要监控的要点主要有如下几点:

        a、Master Server的9420、9421端口,Chunk Server 的9422端口

        b、Chunk Server 的磁盘空间

2、实施步骤

        通过在各个组件的对应服务器上部署好zabbix监控的代理端,然后分别添加端口监控和磁盘监控即可!


        操作过程略!



八、维护

1、常用管理命令

mfsgetgoal              # 获取mfs目录、文件的副本数
mfssetgoal              # 设置mfs目录、文件的副本数
mfscheckfile            # 查看副本数简单
mfsfileinfo             # 查看详细的副本数,chunks/分片
mfsdirinfo              # 以数量的方法显示mfsfileinfo
mfsgettrashtime         # 获取垃圾箱的定隔时间
mfssettrashtime         # 设置垃圾箱的定隔时间(和memcached类)
mfsmakesnapshot         # 快照 



2、可能存在的问题

A、mfscgiserv的访问安全问题

       mfscgiserv只是一个非常简单的HTTP服务器,只用来编写运行MooseFS CGI脚本。它不支持任何的附加功能,比如HTTP认证。如果公司出于对监控界面的安全访问需求,我们可以使用功能丰富的HTTP服务器,比如apache、nginx等。在使用这些更强大的HTTP服务器时,我们只需要将CGI和其它数据文件(index.html、mfs.cgi、chart.cgi、mfs.css、logomini.png、err.gif)存放到选择的站点根目录下。我们可以创建一个新的虚拟机,来设定特定的主机名和端口来进行访问。


B、Master Server 的单点问题

       Master server的单点问题,在前面介绍 MooseFS 的优缺点时已经提到过了。由于官方提供的解决方案,在恢复的时候还是需要一定时间的,因此我们建议使用第三方的高可用方案(heartbeat+drbd+moosefs)来解决 Master Server 的单点问题。


3、性能瓶颈的解决办法

       由于 MooseFS 的高可扩展性,因此我们可以很轻松的通过增加 Chunk Server 的磁盘容量或增加 Chunk Server 的数量来动态扩展整个文件系统的存储量和吞吐量,这些操作丝毫不会影响到在线业务。


4、安全开启/停止MFS集群

1、启动 MooseFS 集群

安全的启动 MooseFS 集群(避免任何读或写的错误数据或类似的问题)的步骤如下:

       1、启动 mfsmaster 进程

       2、启动所有的 mfschunkserver 进程

       3、启动 mfsmetalogger 进程(如果配置了mfsmetalogger)

       4、当所有的 chunkservers 连接到 MooseFS master 后,任何数目的客户端可以利用 mfsmount 去挂载被 export 的文件系统。(可以通过检查 master 的日志或是 CGI 监控页面来查看是否所有的chunkserver 被连接)。



2、停止 MooseFS 集群

安全的停止 MooseFS 集群的步骤如下:

       1、在所有的客户端卸载MooseFS 文件系统(用umount命令或者是其它等效的命令)

       2、用 mfschunkserver –s命令停止chunkserver进程

       3、用 mfsmetalogger –s命令停止metalogger进程

       4、用 mfsmaster –s命令停止master进程


5、增加块设备(会自动平均)

        针对增加块设备的情况,其实就是说针对chunk server 有变化(增加或减少)的情况。

        为了增加一个案例说明,这里就以 UC 在使用 MooseFS 中遇到的一个问题为案例,讲解新增加 chunk server 时,MooseFS集群发生的变化,其实也就是 Master Server 发生的变化。


        UC在使用 MooseFS 集群的过程中,有次一台 Chunk Server 挂了,于是就涉及到了后期的恢复问题。在问题Chunk Server修复之后,就从新加入到了集群当中。此时,新增加的 chunk server 启动之后会向 Master 汇报 Chunk 的信息,Master接收到 Chunk 信息之后会逐个检查 Chunk_id是否存在。如果不存在,就表示该chunk_id其实已经删除了(chunk_id过期),然后会调用chunk_new()创建该chunk,并设置lockedio属性为7天后。这些操作都是属于内存操作,并且Master是单线程的进程,并不存在全局锁,因此不会导致 Master 阻塞无响应。因此,针对增加chunk server的情况,是不会对MooseFS集群产生什么大的影响的。

        以上就是新增加 Chunk Server 后的,MooseFS 集群中 Master Server 的变化。而针对各个Chunk Server,Master Server会重新去调整块文件的磁盘空间,然后全部重新动态分配块文件。如果遇到空间不够的磁盘,Master Server会自动调整块文件的分布,从不够的磁盘里动态的把块服务移动到有大的磁盘块服务器里

        当然,如果按照上面的情况这次就不会是故障了,因此并不会对 MooseFS 集群产生什么大的影响。由于他们当时因为资源紧张,就把 Master Server 放到了虚拟机上,而虚拟机的磁盘是挂载的iscsi磁盘。并且他们的MooseFS使用的版本并不是最新的1.6.27,而是1.6.19。在1.6.19版本中,会把chunk的汇报过程写入磁盘,这样就导致了几十万条的磁盘写入,由于磁盘是前面提到的网络盘,就最终酿成了 Master Server 恢复时无响应几十分钟。

         因此,我们在生产环境中,针对Master Server的选型一定不能使用虚拟机,而是使用大内存量的物理机

 

允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1602616