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 的初始权重设为 0 ,然后每次增大一点、逐步增大 CRUSH 权重。例如每次增加 0.2 :

ceph osd crush reweight {osd-id} .2

迁移完成前,可以依次把权重重置为 0.40.6 等等,直到达到期望权重。

为降低 OSD 失败的影响,你可以设置:

mon osd down out interval = 0

它防止挂了的 OSD 自动被标记为 out ,然后逐步降低其权重:

ceph osd reweight {osd-num} .8

还是等着集群完成数据迁移,然后再次调整权重,直到权重为 0 。注意,这会阻止集群在发生故障时自动重复制数据,所以要确保监控的及时性,以便管理员迅速介入。

注意,以上经验在 Bobtail 及后续版本已不再必要。

 

启动 OSD

把 OSD 加入 Ceph 后, OSD 就在配置里了。然而它还没运行,它现在的状态为 downout 。你必须先启动 OSD 它才能收数据。可以用管理主机上的 service ceph 、或从 OSD 所在主机启动。

在 CentOS/RHEL 上用 sysvinit 。

 

sudo /etc/init.d/ceph start osd.{osd-num}

 

一旦你启动了 OSD ,其状态就变成了 upin

 

 

观察数据迁移

把新 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 前,它通常是 upin 的,要先把它踢出集群,以使 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} 0

执行后,你可以观察数据迁移过程,应该可以正常结束。把某一 OSD 标记为 out 和权重改为 0 的区别在于,前者,包含此 OSD 的桶、其权重没变;而后一种情况下,桶的权重变了(降低了此 OSD 的权重)。某些情况下, reweight 命令更适合“小”集群。

 

停止 OSD

把 OSD 踢出集群后,它可能仍在运行,就是说其状态为 upout 。删除前要先停止 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 1

 

4.登录到保存 ceph.conf 主拷贝的主机。

ssh {admin-host}
cd /etc/ceph
vim ceph.conf

 

5.从 ceph.conf 配置文件里删除对应条目。

[osd.1]
        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 达到法定人数。

现在该指定监视器的标识号了。传统上,监视器曾用单个字母( abc ……)命名,但你可以指定任何形式。在本文档里,要记住 {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.amon.bmon.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 = 10.0.0.1:6789
[mon.b]
        host = host02
        addr = 10.0.0.2:6789
[mon.c]
        host = host03
        addr = 10.0.0.3:6789

 

要把 host04mon.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 1 fsid 224e376d-c5fe-4504-96bb-ea6332a19e61 last_changed 2012-12-17 02:46:41.591248 created 2012-12-17 02:46:41.591248 0: 10.0.0.1:6789/0 mon.a 1: 10.0.0.2:6789/0 mon.b 2: 10.0.0.3:6789/0 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 1 to {tmp}/{filename} (0 monitors)

 

4.添加新监视器位置。

 

$ monmaptool --add a 10.1.0.1:6789 --add b 10.1.0.2:6789 --add c 10.1.0.3:6789 {tmp}/{filename}

monmaptool: monmap file {tmp}/{filename}
monmaptool: writing epoch 1 to {tmp}/{filename} (3 monitors)

 

5.检查新内容。

    $ monmaptool --print {tmp}/{filename}

    monmaptool: monmap file {tmp}/{filename}
    epoch 1
    fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
    last_changed 2012-12-17 02:46:41.591248
    created 2012-12-17 02:46:41.591248
    0: 10.1.0.1:6789/0 mon.a
    1: 10.1.0.2:6789/0 mon.b
    2: 10.1.0.3:6789/0 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 的可用格式有 plainjson ,如未指定 --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.0 injectargs --debug_ms 1 --debug_mds 10

 

打开了调试消息。

ceph mds stat

 

显示所有元数据服务器状态。

ceph mds fail 0

 

把活跃 MDS 标记为失败,如果有候补此命令会触发故障转移。

注意:ceph mds 子命令缺少文档:set, dump, getmap, stop, setmap

 

监视器子系统

查看监视器状态:

ceph mon stat

2011-12-14 10:40:59.044395 mon {- [mon,stat]
2011-12-14 10:40:59.057111 mon.1 -} 'e3: 5 mons at {a=10.1.2.3:6789/0,b=10.1.2.4:6789/0,c=10.1.2.5:6789/0,d=10.1.2.6:6789/0,e=10.1.2.7:6789/0}, election epoch 16, quorum 0,1,2,3' (0)

 

末尾的 quorum 列表列出了当前法定人数里的监视器节点。

也可以更直接地获取:

 

$ ./ceph quorum_status

2011-12-14 10:44:20.417705 mon {- [quorum_status]
2011-12-14 10:44:20.431890 mon.0 -}

 

 

'{ "election_epoch": 10,
  "quorum": [
        0,
        1,
        2],
  "monmap": { "epoch": 1,
      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
      "modified": "2011-12-12 13:28:27.505520",
      "created": "2011-12-12 13:28:27.505520",
      "mons": [
            { "rank": 0,
              "name": "a",
              "addr": "127.0.0.1:6789\/0"},
            { "rank": 1,
              "name": "b",
              "addr": "127.0.0.1:6790\/0"},
            { "rank": 2,
              "name": "c",
              "addr": "127.0.0.1:6791\/0"}]}}' (0)

如果法定人数未形成,上述命令会一直等待。

你刚刚连接的监视器的状态(用 -m HOST:PORT 另外指定):

 

ceph mon_status


2011-12-14 10:45:30.644414 mon {- [mon_status]
2011-12-14 10:45:30.644632 mon.0 -}

 

 

 

'{ "name": "a",
  "rank": 0,
  "state": "leader",
  "election_epoch": 10,
  "quorum": [
        0,
        1,
        2],
  "outside_quorum": [],
  "monmap": { "epoch": 1,
      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
      "modified": "2011-12-12 13:28:27.505520",
      "created": "2011-12-12 13:28:27.505520",
      "mons": [
            { "rank": 0,
              "name": "a",
              "addr": "127.0.0.1:6789\/0"},
            { "rank": 1,
              "name": "b",
              "addr": "127.0.0.1:6790\/0"},
            { "rank": 2,
              "name": "c",
              "addr": "127.0.0.1:6791\/0"}]}}' (0)

 

监视器状态转储:

 

ceph mon dump

2011-12-14 10:43:08.015333 mon {- [mon,dump]
2011-12-14 10:43:08.015567 mon.0 -} 'dumped monmap epoch 1' (0)
epoch 1
fsid 444b489c-4f16-4b75-83f0-cb8097468898
last_changed 2011-12-12 13:28:27.505520
created 2011-12-12 13:28:27.505520
0: 127.0.0.1:6789/0 mon.a
1: 127.0.0.1:6790/0 mon.b
2: 127.0.0.1:6791/0 mon.c

 

 

转载于:https://www.cnblogs.com/zhongguiyao/p/7943580.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值