Ceph 存储集群-低级运维
低级集群运维包括启动、停止、重启集群内的某个具体守护进程;更改某守护进程或子系统配置;增加或拆除守护进程。低级运维还经常遇到扩展、缩减 Ceph 集群,以及更换老旧、或损坏的硬件。
一、增加/删除 OSD
如果您的集群已经在运行,你可以在运行时添加或删除 OSD 。
增加 OSD
你迟早要扩容集群, Ceph 允许在运行时增加 OSD 。在 Ceph 里,一个 OSD 一般是一个 ceph-osd 守护进程,它运行在硬盘之上,如果你有多个硬盘,可以给每个硬盘启动一个 ceph-osd 守护进程。
通常,你应该监控集群容量,看是否达到了容量上限,因为达到了它的 near full 比率后,要增加一或多个 OSD 来扩容。
注意:不要等空间满了再增加 OSD ,空间使用率达到 near full 比率后, OSD 失败可能导致集群空间占满。
部署硬件
如果你通过增加主机来增加 OSD ,关于 OSD 服务器硬件的配置请参见硬件推荐。要把一台 OSD 主机加入到集群,首先要安装最新版的 Linux ,而且存储硬盘要做好必要的准备,详情参见文件系统推荐。
把 OSD 主机添加到集群机架上,连接好网络、确保网络通畅。详情见网络配置参考。
安装必要软件
在手动部署的集群里,你必须手动安装 Ceph 软件包,详情见安装 Ceph (手动)。你应该配置一个无密码登录 SSH 的用户,且他有 root 权限。
增加 OSD (手动)
此过程要设置一个 ceph-osd 守护进程,让它使用一个硬盘,且让集群把数据发布到 OSD 。如果一台主机有多个硬盘,可以重复此过程,把每个硬盘配置为一个 OSD 。
要添加 OSD ,要依次创建数据目录、把硬盘挂载到目录、把 OSD 加入集群、然后把它加入 CRUSH 图。
往 CRUSH 图里添加 OSD 时建议设置权重,硬盘容量每年增长 40% ,所以较新的 OSD 主机拥有更大的空间(即它们可以有更大的权重)
1.创建 OSD 。如果未指定 UUID , OSD 启动时会自动生成一个。下列命令会输出 OSD 号,后续步骤你会用到
ceph osd create [{uuid} [{id}]]
如果指定了可选参数 {id} ,那么它将作为 OSD id 。要注意,如果此数字已使用,此命令会出错。
注意:一般来说,我们不建议指定 {id} 。因为 ID 是按照数组分配的,跳过一些依然会浪费内存;尤其是跳过太多、或者集群很大时,会更明显。若未指定 {id} ,将用最小可用数字。
2.在新 OSD 主机上创建默认目录。
ssh {new-osd-host} sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
3.如果准备用于 OSD 的是单独的而非系统盘,先把它挂载到刚创建的目录下:
ssh {new-osd-host} sudo mkfs -t {fstype} /dev/{drive} sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
4.初始化 OSD 数据目录
ssh {new-osd-host} ceph-osd -i {osd-num} --mkfs --mkkey
运行 ceph-osd 时目录必须是空的。
5.注册 OSD 认证密钥, ceph-{osd-num} 路径里的 ceph 值应该是 $cluster-$id ,如果你的集群名字不是 ceph ,那就用改过的名字
ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
6.把 OSD 加入 CRUSH 图,这样它才开始收数据。用 ceph osd crush add 命令把 OSD 加入 CRUSH 分级结构的合适位置。如果你指定了不止一个桶,此命令会把它加入你所指定的桶中最具体的一个,并且把此桶挪到你指定的其它桶之内。重要:如果你只指定了 root 桶,此命令会把 OSD 直接挂到 root 下面,但是 CRUSH 规则期望它位于主机内。
若用的是 v0.48 版,执行下列命令:
ceph osd crush add {id} {name} {weight} [{bucket-type}={bucket-name} ...]
若用的是 v0.56 及更高版,执行下列命令:
ceph osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]
你也可以反编译 CRUSH 图、把 OSD 加入设备列表、以桶的形式加入主机(如果它没在 CRUSH 图里)、以条目形式把设备加入主机、分配权重、重编译并应用它。详情参见增加/移动 OSD 。
Argonaut 0.48 版最佳实践
为降低对用户 I/O 性能的影响,加入 CRUSH 图时应该把 OSD 的初始权重设为 ,然后每次增大一点、逐步增大 CRUSH 权重。例如每次增加 0.2 : ceph osd crush reweight {osd-id} . 迁移完成前,可以依次把权重重置为 0.4 、 0.6 等等,直到达到期望权重。 为降低 OSD 失败的影响,你可以设置: mon osd down 它防止挂了的 OSD 自动被标记为 out ,然后逐步降低其权重: ceph osd reweight {osd-num} . 还是等着集群完成数据迁移,然后再次调整权重,直到权重为 。注意,这会阻止集群在发生故障时自动重复制数据,所以要确保监控的及时性,以便管理员迅速介入。 注意,以上经验在 Bobtail 及后续版本已不再必要。
启动 OSD
把 OSD 加入 Ceph 后, OSD 就在配置里了。然而它还没运行,它现在的状态为 down 且 out 。你必须先启动 OSD 它才能收数据。可以用管理主机上的 service ceph 、或从 OSD 所在主机启动。
在 CentOS/RHEL 上用 sysvinit 。
sudo /etc/init.d/ceph start osd.{osd-num}
一旦你启动了 OSD ,其状态就变成了 up 且 in 。
观察数据迁移
把新 OSD 加入 CRUSH 图后, Ceph 会重新均衡服务器,一些归置组会迁移到新 OSD 里,你可以用 ceph 命令观察此过程。
ceph -w
你会看到归置组状态从 active+clean 变为 active, some degraded objects (有降级的对象)、且迁移完成后回到 active+clean 状态。( Ctrl-c 退出)
删除 OSD (手动)
要想缩减集群尺寸或替换硬件,可在运行时删除 OSD 。在 Ceph 里,一个 OSD 通常是一台主机上的一个 ceph-osd 守护进程、它运行在一个硬盘之上。如果一台主机上有多个数据盘,你得挨个删除其对应 ceph-osd 。通常,操作前应该检查集群容量,看是否快达到上限了,确保删除 OSD 后不会使集群达到 near full 比率。
注意:删除 OSD 时不要让集群达到 full ratio 值,删除 OSD 可能导致集群达到或超过 full ratio 值。
把 OSD 踢出集群
删除 OSD 前,它通常是 up 且 in 的,要先把它踢出集群,以使 Ceph 启动重新均衡、把数据拷贝到其他 OSD 。
ceph osd out {osd-num}
观察数据迁移
一旦把 OSD 踢出( out )集群, Ceph 就会开始重新均衡集群、把归置组迁出将删除的 OSD 。你可以用 ceph 工具观察此过程。
ceph -w
你会看到归置组状态从 active+clean 变为 active, some degraded objects 、迁移完成后最终回到 active+clean 状态。( Ctrl-c 中止)。
有时候,(通常是只有几台主机的“小”集群,比如小型测试集群)拿出( out )某个 OSD 可能会使 CRUSH 进入临界状态,这时某些 PG 一直卡在 active+remapped 状态。如果遇到了这种情况,你应该把此 OSD 标记为 in ,用这个命令:
ceph osd in {osd-num}
等回到最初的状态后,把它的权重设置为 0 ,而不是标记为 out ,用此命令:
ceph osd crush reweight osd.{osd-num}
执行后,你可以观察数据迁移过程,应该可以正常结束。把某一 OSD 标记为 out 和权重改为 0 的区别在于,前者,包含此 OSD 的桶、其权重没变;而后一种情况下,桶的权重变了(降低了此 OSD 的权重)。某些情况下, reweight 命令更适合“小”集群。
停止 OSD
把 OSD 踢出集群后,它可能仍在运行,就是说其状态为 up 且 out 。删除前要先停止 OSD 进程。
ssh {osd-host} sudo /etc/init.d/ceph stop osd.{osd-num}
停止 OSD 后,状态变为 down 。
删除 OSD
此步骤依次把一个 OSD 移出集群 CRUSH 图、删除认证密钥、删除 OSD 图条目、删除 ceph.conf 条目。如果主机有多个硬盘,每个硬盘对应的 OSD 都得重复此步骤。
1.删除 CRUSH 图的对应 OSD 条目,它就不再接收数据了。你也可以反编译 CRUSH 图、删除 device 列表条目、删除对应的 host 桶条目或删除 host 桶(如果它在 CRUSH 图里,而且你想删除主机),重编译 CRUSH 图并应用它。详情参见删除 OSD 。
ceph osd crush remove {name}
2.删除 OSD 认证密钥:
ceph auth del osd.{osd-num}
ceph-{osd-num} 路径里的 ceph 值是 $cluster-$id ,如果集群名字不是 ceph ,这里要更改。
3.删除 OSD 。
ceph osd rm {osd-num} #for example ceph osd rm
4.登录到保存 ceph.conf 主拷贝的主机。
ssh {admin-host} cd /etc/ceph vim ceph.conf
5.从 ceph.conf 配置文件里删除对应条目。
[osd.] host = {hostname}
6.从保存 ceph.conf 主拷贝的主机,把更新过的 ceph.conf 拷贝到集群其他主机的 /etc/ceph 目录下。
二、增加/删除监视器
你的集群启动并运行后,可以在运行时增加、或删除监视器。
增加监视器
Ceph 监视器是轻量级进程,它维护着集群运行图的主副本。一个集群可以只有一个监视器,我们推荐生产环境至少 3 个监视器。 Ceph 使用 Paxos 算法的一个变种对各种图、以及其它对集群来说至关重要的信息达成共识。由于 Paxos 算法天生要求大部分监视器在运行,以形成法定人数(并因此达成共识)。
正因为监视器是轻量级的,所以有可能在作为 OSD 的主机上同时运行它;然而,我们推荐运行于单独主机,因为与内核的 fsync 问题会影响性能。
注意:这里的大多数监视器之间必须能互通,这样才能形成法定人数。
部署硬件
如果你增加新监视器时要新增一台主机,关于其最低硬件配置请参见硬件推荐。要增加一个监视器主机,首先要安装最新版的 Linux (如 Ubuntu 12.04 或者 RHEL 7 )。
把监视器主机安装上架,连通网络。
安装必要软件
手动部署的集群, Ceph 软件包必须手动装,详情参见安装软件包。应该配置一个用户,使之可以无密码登录 SSH 、且有 root 权限。
增加监视器(手动)
本步骤创建 ceph-mon 数据目录、获取监视器运行图和监视器密钥环、增加一个 ceph-mon 守护进程。如果这导致只有 2 个监视器守护进程,你可以重演此步骤来增加一或多个监视器,直到你拥有足够多 ceph-mon 达到法定人数。
现在该指定监视器的标识号了。传统上,监视器曾用单个字母( a 、 b 、 c ……)命名,但你可以指定任何形式。在本文档里,要记住 {mon-id} 应该是你所选的标识号,不包含 mon. 前缀,如在 mon.a 中,其 {mon-id} 是 a 。
1.在新监视器主机上创建默认目录: ssh {new-mon-host} sudo mkdir /var/lib/ceph/mon/ceph-{mon-id} 2. 创建临时目录 {tmp} ,用以保存此过程中用到的文件。此目录要不同于前面步骤创建的监视器数据目录,且完成后可删除。 mkdir {tmp} 3.获取监视器密钥环, {tmp} 是密钥环文件保存路径、 {filename} 是包含密钥的文件名。 ceph auth get mon. -o {tmp}/{key-filename} 4.获取监视器运行图, {tmp} 是获取到的监视器运行图、 {filename} 是包含监视器运行图的文件名。 ceph mon getmap -o {tmp}/{map-filename} 5. 准备第一步创建的监视器数据目录。必须指定监视器运行图路径,这样才能获得监视器法定人数和它们 fsid 的信息;还要指定监视器密钥环路径。 sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename} 6.启动新监视器,它会自动加入机器。守护进程需知道绑定到哪个地址,通过 --public-addr {ip:port} 或在 ceph.conf 里的相应段设置 mon addr 可以指定。 ceph-mon -i {mon-id} --public-addr {ip:port}
删除监视器
从集群删除监视器时,必须认识到, Ceph 监视器用 PASOX 算法关于主集群运行图达成共识。必须有足够多的监视器才能对集群运行图达成共识。
删除监视器(手动)
本步骤从集群删除 ceph-mon 守护进程,如果此步骤导致只剩 2 个监视器了,你得增加或删除一个监视器,直到凑足法定人数所必需的 ceph-mon 数。
1.停止监视器。 service ceph -a stop mon.{mon-id} 2.从集群删除监视器。 ceph mon remove {mon-id} 3.删除 ceph.conf 对应条目。
从不健康集群删除监视器
本步骤从不健康集群删除 ceph-mon ,例如集群内的监视器不能形成法定人数。
1.停止所有监视器主机上的所有 ceph-mon 守护进程。
ssh {mon-host} service ceph stop mon || stop ceph-mon-all # 要在所有监视器主机上执行
2.找出一个活着的监视器并登录其所在主机。
ssh {mon-host}
3.提取 monmap 副本。
ceph-mon -i {mon-id} --extract-monmap {map-path} # 多数情况下都是: ceph-mon -i `hostname` --extract-monmap /tmp/monmap
4.删除不保留或有问题的监视器。例如,如果你有 3 个监视器 mon.a 、 mon.b 和 mon.c ,其中仅保留 mon.a ,按如下步骤:
monmaptool {map-path} --rm {mon-id} # 例如 monmaptool /tmp/monmap --rm b monmaptool /tmp/monmap --rm c
5.把去除过监视器后剩下的运行图注入存活的监视器。比如,用下列命令把一张运行图注入 mon.a 监视器:
ceph-mon -i {mon-id} --inject-monmap {map-path} # for example, ceph-mon -i a --inject-monmap /tmp/monmap
6.只启动保留下来的监视器。
7.确认这些监视器形成了法定人数( ceph -s )。
8你也许得把已删除监视器的数据目录 /var/lib/ceph/mon 备份到安全位置,如果您对其余监视器很有信心、或者有足够的冗余,也可以删除。
更改监视器的 IP 地址
注意:现有监视器不应该更改其 IP 地址。
监视器是 Ceph 集群的关键组件,它们要维护一个法定人数,这样整个系统才能正常工作。要确立法定人数,监视器得互相发现对方, Ceph 对监视器的发现要求严格。
Ceph 客户端及其它 Ceph 守护进程用 ceph.conf 发现监视器,然而,监视器之间用监视器运行图发现对方,而非 ceph.conf 。例如,你看过的增加监视器(手动),会发现创建新监视器时得获取当前集群的 monmap ,因为它是 ceph-mon -i {mon-id} \ --mkfs 命令的必要参数。下面几段解释了 Ceph 监视器的一致性要求,和几种改 IP 的安全方法。
一致性要求
监视器发现集群内的其它监视器时总是参照 monmap 的本地副本,用 monmap 而非 ceph.conf 可避免因配置错误(例如在 ceph.conf 指定监视器地址或端口时拼写错误)而损坏集群。正因为监视器用 monmaps 相互发现、且共享于客户端和其它 Ceph 守护进程间,所以 monmap 给监视器提供了苛刻的一致性保证。
苛刻的一致性要求也适用于 monmap 的更新,因为任何有关监视器的更新、 monmap 的更改都通过名为 Paxos 的分布式一致性算法运行。为保证法定人数里的所有监视器都持有同版本 monmap ,所有监视器都要赞成 monmap 的每一次更新,像增加、删除监视器。 monmap 的更新是增量的,这样监视器都有最近商定的版本以及一系列之前版本,这样可使一个有较老 monmap 的监视器赶上集群当前的状态。
如果监视器通过 Ceph 配置文件而非 monmap 相互发现,就会引进额外风险,因为 Ceph 配置文件不会自动更新和发布。监视器有可能用了较老的 ceph.conf 而导致不能识别某监视器、掉出法定人数、或者发展为一种 Paxos 不能精确确定当前系统状态的情形。总之,更改现有监视器的 IP 地址必须慎之又慎。
更改监视器 IP 地址(正确方法)
仅仅在 ceph.conf 里更改监视器的 IP 不足以让集群内的其它监视器接受更新。要更改一个监视器的 IP 地址,你必须以先以想用的 IP 地址增加一个监视器(见增加监视器(手动)),确保新监视器成功加入法定人数,然后删除用旧 IP 的监视器,最后更新 ceph.conf 以确保客户端和其它守护进程得知新监视器的 IP 地址。
例如,我们假设有 3 个监视器,如下:
[mon.a] host = host01 addr = [mon.b] host = host02 addr = [mon.c] host = host03 addr =
要把 host04 上 mon.c 的 IP 改为 10.0.0.4 ,按照增加监视器(手动)里的步骤增加一个新监视器 mon.d ,确认它运行正常后再删除 mon.c ,否则会破坏法定人数;最后依照删除监视器(手动)删除 mon.c 。 3 个监视器都要更改的话,每次都要重复一次。
更改监视器 IP 地址(凌乱方法)
可能有时候监视器不得不挪到不同的网络、数据中心的不同位置、甚至不同的数据中心,这是可能的,但过程有点惊险。
在这种情形下,一种方法是用所有监视器的新 IP 地址生成新 monmap ,并注入到集群内的所有监视器。对大多数用户来说,这并不简单,好在它不常见。再次重申,监视器不应该更改 IP 地址。
以前面的监视器配置为例,假设你想把所有监视器的 IP 从 10.0.0.x 改为 10.1.0.x ,并且两个网络互不相通,步骤如下:
1.获取监视器运行图,其中 {tmp} 是所获取的运行图路径, {filename} 是监视器运行图的文件名。
ceph mon getmap -o {tmp}/{filename}
2.下面是一个 monmap 内容示例:
$ monmaptool --print {tmp}/{filename}monmaptool: monmap file {tmp}/{filename} epoch fsid -96bb-ea6332a19e61 last_changed -- ::41.591248 created -- ::41.591248 : / mon.a : / mon.b : / mon.c
3.删除现有监视器。
$ monmaptool --rm a --rm b --rm c {tmp}/{filename} monmaptool: monmap file {tmp}/{filename} monmaptool: removing a monmaptool: removing b monmaptool: removing c monmaptool: writing epoch to {tmp}/{filename} ( monitors)
4.添加新监视器位置。
$ monmaptool --add a --add b --add c {tmp}/{filename} monmaptool: monmap file {tmp}/{filename} monmaptool: writing epoch to {tmp}/{filename} ( monitors)
5.检查新内容。
$ monmaptool --print {tmp}/{filename} monmaptool: monmap file {tmp}/{filename} epoch fsid -96bb-ea6332a19e61 last_changed -- ::41.591248 created -- ::41.591248 : / mon.a : / mon.b : / mon.c
从这里开始,假设监视器(及存储)已经被安装到了新位置。下一步把修正的 monmap 散播到新监视器,并且注入每个监视器。
1.首先,停止所有监视器,注入必须在守护进程停止时进行。
2.注入 monmap 。
ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
3.重启监视器。
到这里,到新位置的迁移完成,监视器应该照常运行了。
三、命令参考
监视器命令
监视器命令用 ceph 工具发出:
ceph [-m monhost] {command}
命令格式通常是(但不总是):
ceph {subsystem} {command}
系统命令
下列命令显示集群状态:
ceph -s ceph status
下列命令显示集群状态的运行摘要、及主要事件:
ceph -w
下列命令显示监视器法定人数状态,包括哪些监视器参与着、哪个是首领。
ceph quorum_status
下列命令查询单个监视器状态,包括是否在法定人数里。
ceph [-m monhost] mon_status
认证子系统
要添加一个 OSD 的密钥环,执行下列命令:
ceph auth add {osd} {--in-file|-i} {path-to-osd-keyring}
要列出集群的密钥及其能力,执行下列命令:
ceph auth list
归置组子系统
要显示所有归置组的统计信息,执行下列命令:
ceph pg dump [--format {format}]
可用输出格式有 plain (默认)和 json 。
要显示卡在某状态的所有归置组,执行下列命令:
ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}]
--format 可以是 plain (默认)或 json
--threshold 定义了多久算“卡住了”(默认 300 秒)
Inactive 归置组不能处理读或写,因为它们在等待数据及时更新的 OSD 回来。
Unclean 归置组包含副本数未达期望值的对象,它们应该在恢复中。
Stale 归置组处于未知状态——归置组所托付的 OSD 有一阵没向监视器报告了(由 mon osd report timeout 配置)。
删除“丢失”对象,或者恢复到其先前状态,可以是前一版本、或如果刚创建就干脆删除。
ceph pg {pgid} mark_unfound_lost revert|delete
OSD 子系统
查询 OSD 子系统状态:
ceph osd stat
把最新的 OSD 运行图拷贝到一个文件,参见 osdmaptool :
ceph osd getmap -o file
从最新 OSD 运行图拷出 CRUSH 图:
ceph osd getcrushmap -o file
前述功能等价于:
ceph osd getmap -o /tmp/osdmap osdmaptool /tmp/osdmap --export-crush file
转储 OSD 运行图, -f 的可用格式有 plain 和 json ,如未指定 --format 则转储为纯文本。
ceph osd dump [--format {format}]
把 OSD 运行图转储为树,每个 OSD 一行、包含权重和状态。
ceph osd tree [--format {format}]
找出某对象在哪里或应该在哪里:
ceph osd map <pool-name> <object-name>
增加或挪动一个新 OSD 条目,要给出 id/name/weight 和位置参数。
ceph osd crush set {id} {weight} [{loc1} [{loc2} ...]]
从现有 CRUSH 图删除存在的条目( OSD ):
ceph osd crush remove {name}
从现有 CRUSH 图删除存在的空桶:
ceph osd crush remove {bucket-name}
把有效的桶从分级结构里的一个位置挪到另一个。
ceph osd crush move {id} {loc1} [{loc2} ...]
设置 {name} 所指条目的权重为 {weight} 。
ceph osd crush reweight {name} {weight}
创建集群快照。
ceph osd cluster_snap {name}
把 OSD 标记为丢失,有可能导致永久性数据丢失,慎用!
ceph osd lost {id} [--yes-i-really-mean-it]
创建新 OSD 。如果未指定 ID ,有可能的话将自动分配个新 ID 。
ceph osd create [{uuid}]
删除指定 OSD 。
ceph osd rm [{id}...]
查询 OSD 运行图里的 max_osd 参数。
ceph osd getmaxosd
导入指定 CRUSH 图。
ceph osd setcrushmap -i file
设置 OSD 运行图的 max_osd 参数,扩展存储集群时有必要。
ceph osd setmaxosd
把 ID 为 {osd-num} 的 OSD 标记为 down 。
ceph osd down {osd-num}
把 OSD {osd-num} 标记为数据分布之外(即不给分配数据)。
ceph osd out {osd-num}
把 OSD {osd-num} 标记为数据分布之内(即分配了数据)。
ceph osd in {osd-num}
列出 Ceph 集群载入的类。
ceph class list
设置或清空 OSD 运行图里的暂停标记。若设置了,不会有 IO 请求发送到任何 OSD ;用 unpause 清空此标记会导致重发未决的请求。
ceph osd pause ceph osd unpause
把 {osd-num} 的权重设置为 {weight} ,权重相同的两个 OSD 大致会收到相同的 I/O 请求、并存储相同数量的数据。 ceph osd reweight 命令可给 OSD 设置一个增益权重,有效值在 0 和 1 之间,它使得 CRUSH 重新归置一定数量的、本应该放到此处的数据。它不会影响 crush 图里所分配的权重,在 CRUSH 分布算法没能理想地执行时,它可作为一种纠正手段。比如,假设你的某个 OSD 使用率达到了 90% ,但其它的大致都在 50% ,这时你就可以试着下调此权重来补偿它。
ceph osd reweight {osd-num} {weight}
重设所有滥用 OSD 的权重,它默认会下调达到平均利用率 120% 的那些OSD ,除非你指定了阀值。
ceph osd reweight-by-utilization [threshold]
增加、删除黑名单里的地址。增加地址的时候可以指定有效期,否则有效期为 1 小时。黑名单里的地址不允许连接任何 OSD ,此技术常用于防止滞后的元数据服务器“错爱” OSD 上的数据。
这些命令大多只在故障测试时有用,因为黑名单是自动维护的,无需手动干涉。
ceph osd blacklist add ADDRESS[:source_port] [TIME] ceph osd blacklist rm ADDRESS[:source_port]
创建/删除存储池快照。
ceph osd pool mksnap {pool-name} {snap-name} ceph osd pool rmsnap {pool-name} {snap-name}
创建/删除/重命名存储池。
ceph osd pool create {pool-name} pg_num [pgp_num] ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it] ceph osd pool rename {old-name} {new-name}
更改存储池设置。
ceph osd pool set {pool-name} {field} {value}
可用的 field 值有:
获取存储池配置值。
ceph osd pool get {pool-name} {field}
可用的 field 值有:
pg_num: 归置组数量; pgp_num: 计算归置组存放的有效数量; lpg_num: 本地归置组数量; lpgp_num: 用于存放本地归置组的数量。
向 OSD {osd-num} 下达一个洗刷命令,用通配符 * 把命令下达到所有 OSD 。
ceph osd scrub {osd-num}
向 osdN 下达修复命令,用 * 下达到所有 OSD 。
ceph osd repair N
在 osdN 上进行个简单的吞吐量测试,每次写入 BYTES_PER_WRITE 、一共写入 TOTAL_BYTES 。默认以 4MB 增量写入 1GB 。 此压力测试是非破坏性的,不会覆盖已有 OSD 数据,但可能会暂时影响同时访问此 OSD 的客户端性能。
ceph tell osd.N bench [NUMER_OF_OBJECTS] [BYTES_PER_WRITE]
MDS 子系统
更改在运行 mds 的参数:
ceph tell mds.{mds-id} injectargs --{switch} {value} [--{switch} {value}]
例如:
ceph tell mds. injectargs --debug_ms --debug_mds
打开了调试消息。
ceph mds stat
显示所有元数据服务器状态。
ceph mds fail
把活跃 MDS 标记为失败,如果有候补此命令会触发故障转移。
注意:ceph mds 子命令缺少文档:set, dump, getmap, stop, setmap
监视器子系统
查看监视器状态:
ceph mon stat -- ::59.044395 mon {- [mon,stat] -- :: -} )
末尾的 quorum 列表列出了当前法定人数里的监视器节点。
也可以更直接地获取:
$ ./ceph quorum_status -- ::20.417705 mon {- [quorum_status] -- :: -}
'{ "election_epoch": 10, "quorum": [ , , ], , "fsid": "444b489c-4f16-4b75-83f0-cb8097468898", "modified": "2011-12-12 13:28:27.505520", "created": "2011-12-12 13:28:27.505520", "mons": [ { , "name": "a", "addr": "127.0.0.1:6789\/0"}, { , "name": "b", "addr": "127.0.0.1:6790\/0"}, { , "name": "c", "addr": "127.0.0.1:6791\/0"}]}}' (0)
如果法定人数未形成,上述命令会一直等待。
你刚刚连接的监视器的状态(用 -m HOST:PORT 另外指定):
ceph mon_status -- ::30.644414 mon {- [mon_status] -- :: -}
'{ "name": "a", , "state": "leader", , "quorum": [ , , ], "outside_quorum": [], , "fsid": "444b489c-4f16-4b75-83f0-cb8097468898", "modified": "2011-12-12 13:28:27.505520", "created": "2011-12-12 13:28:27.505520", "mons": [ { , "name": "a", "addr": "127.0.0.1:6789\/0"}, { , "name": "b", "addr": "127.0.0.1:6790\/0"}, { , "name": "c", "addr": "127.0.0.1:6791\/0"}]}}' (0)
监视器状态转储:
ceph mon dump -- ::08.015333 mon {- [mon,dump] -- :: -} ) epoch fsid 444b489c-4f16-4b75-83f0-cb8097468898 last_changed -- ::27.505520 created -- ::27.505520 : / mon.a : / mon.b : / mon.c
Ceph 存储集群-低级运维的更多相关文章
- Ceph 存储集群4-高级运维:
一.高级运维 高级集群操作主要包括用 ceph 服务管理脚本启动.停止.重启集群,和集群健康状态检查.监控和操作集群. 操纵集群 运行 Ceph 每次用命令启动.重启.停止Ceph 守护进程(或整个集 ...
- Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项
所有 Ceph 部署都始于 Ceph 存储集群.基于 RADOS 的 Ceph 对象存储集群包括两类守护进程: 1.对象存储守护进程( OSD )把存储节点上的数据存储为对象: 2.Ceph 监视器( ...
- vivo大规模 Kubernetes 集群自动化运维实践
作者:vivo 互联网服务器团队-Zhang Rong 一.背景 随着vivo业务迁移到K8s的增长,我们需要将K8s部署到多个数据中心.如何高效.可靠的在数据中心管理多个大规模的K8s集群是我们面临 ...
- Ceph 存储集群第一部分:配置和部署
内容来源于官方,经过个人实践操作整理,官方地址:http://docs.ceph.org.cn/rados/ 所有 Ceph 部署都始于 Ceph 存储集群. 基于 RADOS 的 Ceph 对象存储 ...
- Ceph 存储集群
Ceph 存储集群 Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解 ...
- hadoop记录-hadoop集群日常运维命令
hadoop集群日常运维命令 #1.namenode hadoop namenode -format #格式化,慎用 su hdfs hadoop-daemon.sh start namenode h ...
- 002.RHCS-配置Ceph存储集群
一 前期准备 [kiosk@foundation0 ~]$ ssh ceph@serverc #登录Ceph集群节点 [ceph@serverc ~]$ ceph health #确保集群状态正常 H ...
- Ceph 存储集群 - 搭建存储集群
目录 一.准备机器 二.ceph节点安装 三.搭建集群 四.扩展集群(扩容) 一.准备机器 本文描述如何在 CentOS 7 下搭建 Ceph 存储集群(STORAGE CLUSTER). 一共4 ...
- Ceph 存储集群搭建
前言 Ceph 分布式存储系统,在企业中应用面较广 初步了解并学会使用很有必要 一.简介 Ceph 是一个开源的分布式存储系统,包括对象存储.块设备.文件系统.它具有高可靠性.安装方便.管理简便.能够 ...
随机推荐
- $CH5104\ I-country$ 线性$DP$
CH Sol ”凸联通块“是什么意思呢? 其实就是图形的左端点先减小再增大,右端点先增大再减小 阶段 考虑到第k行,已经选了i个格子 状态 1.第i行的左端点与右端点 2.这一行的左端点相对于上一行的 ...
- Django 链接MySQL及数据操作
Django 链接MySQL Django创建的项目自带的数据库是SQLite3,我们想要链接MySQL的话,需要更改settings.py中的配置 1.在MySQL中创建好数据库,Django项目不 ...
- 2020面试还搞不懂MyBatis?快看看这27道面试题!(含答案和思维导图)
前言 MyBatis是一个优秀的持久层ORM框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statem ...
- Excel获取当前日期和时间
在Excel中获取当前时间 1.第一种在空的单元格内输入函数“NOW()”回车即可获取当前时间如图 2.第二种选中空单元格“按住CTRL+:”回车即可获取当前时间 3.第一种在空的单元格内输入函数“t ...
- DFT与IDFT
[转]https://blog.csdn.net/mingzhuo_126/article/details/88044390 二.编程实现考滤到DFT和IDFT算法过程中有部分相似,可以把它们合成到一 ...
- ZooKeeper Java Example
A Simple Watch Client Requirements Program Design The Executor Class The DataMonitor Class Complete ...
- 【转】在Ubuntu下建立Eclipse的Android开发环境
本文将介绍如何建立Ubuntu下基于Eclipse的Android开发环境的方法. 大部分的Android开发者都是使用Eclipse来开发Android,本文将向各位介绍一下建立Ubuntu下基于E ...
- ATOM插件及快捷键
xml-formatter :https://atom.io/packages/xml-formatter xml格式化工具 SHIFT-CTRL-X:快速格式化 SHIFT-CTRL-M:移除换行符 ...
- 2019年面试官最喜欢问的28道ZooKeeper面试题
前言 ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务.它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护.域名服务.分布式同步.组服务等. ZooKeeper 的 ...
- No property andp found for type String! Traversed path: CmsPage.siteId.
Respository没有找到该参数 1)由该参数,函数名写错,不符合JPA规范 2)实体类没有该参数