Ceph 管理和使用
阅读原文时间:2021年08月25日阅读:1

ceph 管理

上次介绍了Ceph集群架构并且搭建了ceph集群,本节介绍ceph用户认证流程和挂载、cephFS、ceph RBD以及ceph mds高可用

1.1. ceph 认证机制

Ceph 使用 cephx 协议对客户端进行身份认证。cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授 权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx 认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。

1.1.1. 授权流程

首先客户端向 ceph-mon 服务请求数据,mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key,session key 通过客户端秘钥进行加密,秘钥是在客户端提前配置好的,/etc/ceph/ceph.client.admin.keyring,客户端使用key解密后得到session key, 然后使用 session key 向 ceph-mon 请求所需要的服务,ceph-mon 收到请求后会向客户端提供一个 tiket,用于向实际处理数据的 OSD 等服务验证客户端身份, ceph-mon 和 ceph-osd 服务共享同一个 secret,因此 ceph-osd 会信任所有 ceph-mon 发放的 tiket。

每个 ceph-mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 ceph-mon 节点就不存在单点故障和认证性能瓶颈。同时请注意,tiket 存在有效期,认证流程图如下:

无论 ceph 客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象:

  • ceph 用户需要拥有存储池访问权限,才能读取和写入数据
  • ceph 用户必须拥有执行权限才能使用 ceph 的管理命令

1.2 ceph 用户管理

用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池 及存储池中的数据。ceph 支持多种类型的用户,但可管理的用户都属于 client 类型区分用户类型的原因在于,MON/OSD/MDS 等系统组件都使用 cephx 协议,但是它们不算是客户端。

用户管理功能可让 Ceph 集群管理员能够直接在 Ceph 集群中创建、更新和删除用户。 在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问 ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于 linux 系统的中的/etc/passwd 文件。

# 列出用户
ubuntu@ceph-deploy:~$ sudo ceph auth list
installed auth entries:

osd.0
        key: AQD2GxphV+RyDBAAQFRomuzg4uDfIloEq5BI1g==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.1
        key: AQC6HBph1knDMhAA35GE09CWb6OLmS5JqmJQOQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.10
        key: AQBUHRphi4mpBBAAoWWLdTr4g6o6ACRS5N1OQw==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.11
        key: AQBfHRphtKOUDRAA29zlbCF0ucKFP7lAo+zrIQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.12
        key: AQBsHRphvK+HORAAT5bs2AlrqrMEw7gtu21bMQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.13
        key: AQB4HRphOHNuEhAAa98YTpyZFo/mrS3BmNHnTg==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.14
        key: AQCDHRphWeMVGxAA+NagThVA2EhR/f8w5a+3SA==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.15
        key: AQCOHRphFZOUJxAArQGoaoRw3B8D1aJ6ixv+9g==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.2
        key: AQDFHBphCMUdNRAAZnDeDQE5QqTkBSiE2aXYeA==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.21
        key: AQAMZCBhQAFIHhAAM5NaqCIldLooGGV0EI3j3A==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.3
        key: AQAnryFhN432FBAAeUMWfj0O7jraGwRfMXMoJQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.4
        key: AQANHRphwInjJBAA7vOTTU2kfLVthu0tuRTjRw==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.5
        key: AQAYHRph3xokMRAAyqYTH0DBO8RPbhEH/mn7vQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.6
        key: AQAjHRphKMkMMRAAOPxDEQK/zQ+HDO31ONl95A==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.7
        key: AQAuHRphiH+cOhAAAdQNL/bausHnAWyokLISEg==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.8
        key: AQA9HRph8Xp0ExAAVNo/SvF9GNZWZT69+eDgeQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
osd.9
        key: AQBIHRphEYHPNhAAkOM4JfKztb+RpVaJ2gyplQ==
        caps: [mgr] allow profile osd
        caps: [mon] allow profile osd
        caps: [osd] allow *
client.admin
        key: AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
        caps: [mds] allow *
        caps: [mgr] allow *
        caps: [mon] allow *
        caps: [osd] allow *
client.bootstrap-mds
        key: AQD+BBphn4TlEhAAZIRY7MzA5EmBBn6VIB0NWQ==
        caps: [mon] allow profile bootstrap-mds
client.bootstrap-mgr
        key: AQD+BBphFJPlEhAAXIb6KfAtBAS6SDU6TW9pCA==
        caps: [mon] allow profile bootstrap-mgr
client.bootstrap-osd
        key: AQD+BBph8p/lEhAAlZzVZrUoKFMsHqzZV/eT+g==
        caps: [mon] allow profile bootstrap-osd
client.bootstrap-rbd
        key: AQD+BBphwK3lEhAAkx5vuPcOg25bLKS+14HoFA==
        caps: [mon] allow profile bootstrap-rbd
client.bootstrap-rbd-mirror
        key: AQD+BBphXrvlEhAAtPPtNSikm8u8zPmamAUhqQ==
        caps: [mon] allow profile bootstrap-rbd-mirror
client.bootstrap-rgw
        key: AQD+BBph7cflEhAA9LZFIKACQh7CeK6E/EeB+Q==
        caps: [mon] allow profile bootstrap-rgw
mgr.ceph-mgr1
        key: AQCmFBphsiG/NRAAKgyv3gbmwv30PDMgmMPegw==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *
mgr.ceph-mgr2
        key: AQBQJBphSEBXNhAAH+NZhGJipY8IRw4YOIeOww==
        caps: [mds] allow *
        caps: [mon] allow profile mgr
        caps: [osd] allow *

# 列出指定用户信息
ubuntu@ceph-deploy:~$ sudo ceph auth get client.admin
exported keyring for client.admin
[client.admin]
        key = AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"

注意: TYPE.ID 表示法

针对用户采用TYPE.ID表示法,例如osd.0指定是osd类并且ID为0的用户(节点),client.admin 是 client 类型的用户,其 ID 为 admin。

另请注意,每个项包含一个 key=xxx 项,以及一个或多个 caps 项。

可以结合使用-o 文件名选项和 ceph auth list 将输出保存到某个文件

$ ceph auth list -o client.admin.key

1.2.1. ceph授权

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户,可针对 MON/OSD 或 MDS 使用的授权范围或级别。

通用的语法格式:daemon-type 'allow caps' […]

能力一览表:

权限

说明

r

向用户授予读取权限。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力。

w

向用户授予针对对象的写入权限。

x

授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能力。

*

授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力

class-read

授予用户调用类读取方法的能力,属于是 x 能力的子集。

class-write

授予用户调用类写入方法的能力,属于是 x 能力的子集。

profile osd

授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告。

profile mds

授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限。

profile bootstrap-osd

授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授 权给部署工具,使其在引导 OSD 时有权添加密钥。

profile bootstrap-mds

授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导 元数据服务器时有权添加密钥。

MON 能力:

包括 r/w/x 和 allow profile cap(ceph 的运行图),示例:

mon 'allow rwx'
mon 'allow profile osd'

OSD 能力:

包括 r、w、x、class-read、class-write(类读取))和 profile osd(类写入),另外 OSD 能力还允许进行存储池和名称空间设置。
osd 'allow capability' [pool=poolname] [namespace=namespace-name]

MDS 能力:

只需要 allow 或空都表示允许。
mds 'allow'

1.2.2. 管理操作

添加一个用户会创建用户名 (TYPE.ID)、机密密钥,以及包含在命令中用于创建该用户的所 有能力,用户可使用其密钥向 Ceph 存储集群进行身份验证。用户的能力授予该用户在 Ceph monitor (mon)、Ceph OSD (osd) 或 Ceph 元数据服务器 (mds) 上进行读取、写入或执行的 能力,可以使用以下几个命令来添加用户:

ceph auth add

此命令是添加用户的规范方法。它会创建用户、生成密钥,并添加所有指定的能力。

# 先创建一个存储池,现有集群一共16个osd,根据官方建议,每个osd一般建议100~200个PG,而我们的osd磁盘控件较小,定为60个PG每个osd,总的可设置的PG 16 x 60 / 3 = 320个可设置的PG,每个存储池的PG暂定为32个总共可设置10个pool

# 1、创建存储池
ubuntu@ceph-deploy:~$ sudo ceph osd pool create mypool1 32 32
pool 'mypool1' created
ubuntu@ceph-deploy:~$ sudo ceph osd lspools
1 device_health_metrics
5 mypool1

# 给客户端alice添加认证key
ubuntu@ceph-deploy:~$ sudo ceph auth add client.alice mon 'allow r' osd 'allow rwx pool=mypool1'
added key for client.alice
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
        key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"
ceph auth get-or-create

ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥, 还可以使用 -o 指定文件名选项将输出保存到某个文件。

# 创建一个新用户
ubuntu@ceph-deploy:~$ sudo ceph auth get-or-create client.tom mon 'allow r' osd 'allow rwx pool=mypool1'
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
# 验证用户
ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"
# 再次创建
ubuntu@ceph-deploy:~$ sudo ceph auth get-or-create client.tom mon 'allow r' osd 'allow rwx pool=mypool1'
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==

ceph auth get-or-create-key

此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非 常有用。如果该用户已存在,此命令只返回密钥。您可以使用 -o 文件名选项将输出保存到 某个文件。 创建客户端用户时,可以创建不具有能力的用户。不具有能力的用户可以进行身份验证,但 不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能 力,可以使用 ceph auth caps 命令创建一个不具有能力的用户。

典型的用户至少对 Ceph monitor 具有读取功能,并对 Ceph OSD 具有读取和写入功能。此外,用户的 OSD 权限通常限制为只能访问特定的存储池。

ubuntu@ceph-deploy:~$ sudo ceph auth get-or-create-key client.tom mon 'allow r' osd 'allow rwx pool=mypool1'
AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
# 用户有 key 就显示没有就创建
ceph auth print-key

只获取单个指定用户的 key 信息

ubuntu@ceph-deploy:~$ sudo ceph auth print-key client.alice
AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
修改用户能力

使用 ceph auth caps 命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前 的能力,因此要加上之前的用户已经拥有的能和新的能力,如果看当前能力,可以运行 ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式时还需要指定现有能力:

# ceph auth caps USERTYPE.USERID daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]' [daemon 'allow [r|w|x|*|...] \
[pool=pool-name] [namespace=namespace-name]']

示例

# 查看用户当前权限
ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"

# 修改用户权限
ubuntu@ceph-deploy:~$ sudo ceph auth caps client.tom mon 'allow r' osd 'allow rw pool=mypool1'
updated caps for client.tom
# 验证
ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
exported keyring for client.tom
[client.tom]
        key = AQAzBSJhCK/wIBAAxdwEVBMIy53xxRLOHjPVYg==
        caps mon = "allow r"
        caps osd = "allow rw pool=mypool1"
删除用户
# 要删除用户使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用户名或守护进程的 ID。
ubuntu@ceph-deploy:~$ sudo ceph auth del client.tom
updated

ubuntu@ceph-deploy:~$ sudo ceph auth get client.tom
Error ENOENT: failed to find client.tom in keyring
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
        key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
        caps mon = "allow r"
        caps osd = "allow rwx pool=mypool1"

1.3. 秘钥环管理

ceph 的秘钥环是一个保存了 secrets、keys、certificates 并且能够让客户端通认证访问 ceph 的 keyring file(集合文件),一个 keyring file 可以保存一个或者多个认证信息,每一个 key 都有一个实体名称加权限,类型为:

{client、mon、mds、osd}.name

当客户端访问 ceph 集群时,ceph 会使用以下四个密钥环文件预设置密钥环设置:

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring # 保存单个用户的 keyring
/etc/ceph/cluster.keyring                                 # 保存多个用户的 keyring
/etc/ceph/keyring                                         # 未定义集群名称的多个用户的 keyring
/etc/ceph/keyring.bin                                     # 编译后的二进制文件

1.3.1. 通过秘钥环文件备份与恢复用户

使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件。创建 keyring 文件命令格式:

ceph-authtool --create-keyring FILE
1.3.1.1 导出用户认证信息至 keyring 文件
# 创建密钥环文件
ubuntu@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.alice.keyring
creating ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ ls
ceph-cluster  ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ cat ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ file ceph.client.alice.keyring
ceph.client.alice.keyring: empty

# 导出 keyring 到指定文件
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice -o ceph.client.alice.keyring
exported keyring for client.alice
ubuntu@ceph-deploy:~$ cat ceph.client.alice.keyring
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=mypool1"

在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名及 keyring 来命名,并将其保存在 /etc/ceph 目录中。例如为 client.alice 用户创建 ceph.client.alice.keyring。

1.3.1.2 keyring 文件恢复用户认证信息

可以使用 ceph auth import -i 指定 keyring 文件并导入到 ceph,其实就是起到用户备份和恢复的目的:

# 验证用户
ubuntu@ceph-deploy:/etc/ceph$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=mypool1"
# 删除用户
ubuntu@ceph-deploy:/etc/ceph$ sudo ceph auth del client.alice
updated
# 验证
ubuntu@ceph-deploy:/etc/ceph$ sudo ceph auth get client.alice
Error ENOENT: failed to find client.alice in keyring
ubuntu@ceph-deploy:/etc/ceph$ cd ~/
ubuntu@ceph-deploy:~$ ls
ceph-cluster  ceph.client.alice.keyring
# 恢复账户
ubuntu@ceph-deploy:~$ sudo ceph auth import -i ceph.client.alice.keyring
imported keyring
# 验证用户
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=mypool1"

1.3.2 秘钥环文件多用户

一个 keyring 文件中可以包含多个不同用户的认证文件。

将多用户导出至秘钥环:

# 创建一个空的 keyring
ubuntu@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user1.keyring
creating ceph.client.user1.keyring
# 把指定的 admin 用户的 keyring 文件内容导入到 user1 用户的 keyring 文件
ubuntu@ceph-deploy:~$ sudo ceph-authtool --import-keyring /etc/ceph/ceph.client.admin.keyring ceph.client.user1.keyring
importing contents of /etc/ceph/ceph.client.admin.keyring into ceph.client.user1.keyring
# 验证
ubuntu@ceph-deploy:~$ sudo ceph-authtool -l ceph.client.user1.keyring
[client.admin]
    key = AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
    caps mds = "allow *"
    caps mgr = "allow *"
    caps mon = "allow *"
    caps osd = "allow *"

# 导入另一个用户的密钥环
ubuntu@ceph-deploy:~$ sudo ceph-authtool --import-keyring ceph.client.alice.keyring ceph.client.user1.keyring
importing contents of ceph.client.alice.keyring into ceph.client.user1.keyring
# 验证
ubuntu@ceph-deploy:~$ sudo ceph-authtool -l ceph.client.user1.keyring
[client.admin]
    key = AQD+BBphi27lEhAAMrU7KnwfJfn8SvOTVubqZQ==
    caps mds = "allow *"
    caps mgr = "allow *"
    caps mon = "allow *"
    caps osd = "allow *"
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=mypool1"

2.1 Ceph RBD 使用

RBD 架构图

Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS,RBD 即 RADOS Block Device 的简称,RBD 块存储是常用的存储类型之一,RBD 块设备类似磁盘可以被挂载, RBD 块设备具有快照、多副本、克隆和一致性等特性,数据以条带化的方式存储在 Ceph 集 群的多个 OSD 中。

条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。

# 1、创建存储池
ubuntu@ceph-deploy:~$ sudo ceph osd pool create rbd-pool-1 32 32
pool 'rbd-pool-1' created

ubuntu@ceph-deploy:~$ sudo ceph osd pool ls
device_health_metrics
mypool1
rbd-pool-1

# 2、对存储池启用 rbd
ubuntu@ceph-deploy:~$ sudo ceph osd pool application enable rbd-pool-1 rbd
enabled application 'rbd' on pool 'rbd-pool-1'

# 3、初始化 rbd
ubuntu@ceph-deploy:~$ sudo rbd pool init -p rbd-pool-1

创建 img 映像

# rbd 存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。rbd 命令可用于创建、查看及删除块设备相在的映像(image), 以及克隆映像、创建快照、将映像回滚到快照和查看快照等管理操作。例如,下面的命令能够在指定的 RBD 即 rbd-1 创建一个名为 rbd-img-1 的映像

ubuntu@ceph-deploy:~$ sudo rbd create rbd-img-1 --size 3G --pool rbd-pool-1 --image-format 2 --image-feature layering
ubuntu@ceph-deploy:~$ sudo rbd create rbd-img-2 --size 5G --pool rbd-pool-1 --image-format 2 --image-feature layering
# 验证
ubuntu@ceph-deploy:~$ sudo rbd ls --pool rbd-pool-1
rbd-img-1
rbd-img-2

# 列出详细信息
ubuntu@ceph-deploy:~$ sudo rbd ls --pool rbd-pool-1 -l
NAME       SIZE   PARENT  FMT  PROT  LOCK
rbd-img-1  3 GiB            2
rbd-img-2  5 GiB            2

查看镜像的详细信息

ubuntu@ceph-deploy:~$ sudo rbd --image rbd-img-1 --pool rbd-pool-1 info
rbd image 'rbd-img-1':
    size 3 GiB in 768 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: d41dee2cd129
    block_name_prefix: rbd_data.d41dee2cd129
    format: 2
    features: layering
    op_features:
    flags:
    create_timestamp: Sun Aug 22 08:53:33 2021
    access_timestamp: Sun Aug 22 08:53:33 2021
    modify_timestamp: Sun Aug 22 08:53:33 2021

ubuntu@ceph-deploy:~$ sudo rbd --image rbd-img-2 --pool rbd-pool-1 info
rbd image 'rbd-img-2':
    size 5 GiB in 1280 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: d420cab622d4
    block_name_prefix: rbd_data.d420cab622d4
    format: 2
    features: layering
    op_features:
    flags:
    create_timestamp: Sun Aug 22 08:53:48 2021
    access_timestamp: Sun Aug 22 08:53:48 2021
    modify_timestamp: Sun Aug 22 08:53:48 2021

以 json 格式显示镜像信息

ubuntu@ceph-deploy:~$ sudo rbd ls --pool rbd-pool-1 -l --format json --pretty-format
[
    {
        "image": "rbd-img-1",
        "id": "d41dee2cd129",
        "size": 3221225472,
        "format": 2
    },
    {
        "image": "rbd-img-2",
        "id": "d420cab622d4",
        "size": 5368709120,
        "format": 2
    }
]

镜像的其他特性

  • layering: 支持镜像分层快照特性,用于快照及写时复制,可以对 image 创建快照并保护,然 后从快照克隆出新的 image 出来,父子 image 之间采用 COW 技术,共享对象数据。默认添加的特性

  • striping: 支持条带化 v2,类似 raid 0,只不过在 ceph 环境中的数据被分散到不同的对象中, 可改善顺序读写场景较多情况下的性能。

  • exclusive-lock: 支持独占锁,限制一个镜像只能被一个客户端使用。

  • object-map: 支持对象映射(依赖 exclusive-lock),加速数据导入导出及已用空间统计等,此特 性开启的时候,会记录 image 所有对象的一个位图,用以标记对象是否真的存在,在一些场 景下可以加速 io。

  • fast-diff: 快速计算镜像与快照数据差异对比(依赖 object-map)。 deep-flatten: 支持快照扁平化操作,用于快照管理时解决快照依赖关系等。

  • journaling: 修改数据是否记录日志,该特性可以通过记录日志并通过日志恢复数据(依赖独 占锁),开启此特性会增加系统磁盘 IO 使用。

jewel 默认开启的特性包括: layering/exlcusive lock/object map/fast diff/deep flatten

镜像特性的启用

# 启用指定存储池中的指定镜像的特性
ubuntu@ceph-deploy:~$ sudo rbd feature enable exclusive-lock --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd feature enable object-map --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd feature enable fast-diff --pool rbd-pool-1 --image rbd-img-1

# 验证镜像特性
ubuntu@ceph-deploy:~$ sudo rbd info --image rbd-img-1 --pool rbd-pool-1
rbd image 'rbd-img-1':
    size 3 GiB in 768 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: d41dee2cd129
    block_name_prefix: rbd_data.d41dee2cd129
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff
    op_features:
    flags: object map invalid, fast diff invalid
    create_timestamp: Sun Aug 22 08:53:33 2021
    access_timestamp: Sun Aug 22 08:53:33 2021
    modify_timestamp: Sun Aug 22 08:53:33 2021

镜像特性的禁用

ubuntu@ceph-deploy:~$ sudo rbd feature disable fast-diff --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd feature disable exclusive-lock --pool rbd-pool-1 --image rbd-img-1
ubuntu@ceph-deploy:~$ sudo rbd info --image rbd-img-1 --pool rbd-pool-1
rbd image 'rbd-img-1':
    size 3 GiB in 768 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: d41dee2cd129
    block_name_prefix: rbd_data.d41dee2cd129
    format: 2
    features: layering
    op_features:
    flags:
    create_timestamp: Sun Aug 22 08:53:33 2021
    access_timestamp: Sun Aug 22 08:53:33 2021
    modify_timestamp: Sun Aug 22 08:53:33 2021

2.2 配置客户端使用 RBD

在客户端挂载 RBD,并使用普通用户挂载 RBD 并验证使用。

客户端需要安装ceph-common

# 1、添加源
ubuntu@client:~$ wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
ubuntu@client:~$ apt-add-repository 'deb https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-octopus/ bionic main'
# 2、安装 ceph-common
ubuntu@client:~$ sudo apt install -y ceph-common

# 3、在客户端映射 rbd 映像
ubuntu@client:~$ sudo rbd map --pool rbd-pool-1 --image rbd-img-1
/dev/rbd0
ubuntu@client:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   30G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0   29G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   20G  0 lvm  /
sr0                        11:0    1  945M  0 rom
rbd0                      252:0    0    3G  0 disk

# 4、使用普通用户挂载测试
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=mypool1"
# 更改用户权限
ubuntu@ceph-deploy:~$ sudo ceph auth caps client.alice mon 'allow r' osd 'allow rwx pool=rbd-pool-1'
updated caps for client.alice
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice
exported keyring for client.alice
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=rbd-pool-1"

# 5、创建密钥环并拷贝到客户端
ubuntu@ceph-deploy:~$ sudo ceph-authtool --create-keyring ceph.client.alice.keyring
creating ceph.client.alice.keyring
ubuntu@ceph-deploy:~$ sudo ceph auth get client.alice -o ceph.client.alice.keyring
exported keyring for client.alice
ubuntu@ceph-deploy:~$ sudo cat ceph.client.alice.keyring
[client.alice]
    key = AQAwBCJhy/iIOBAAgPVXbcx1DP8yTssy90JB9g==
    caps mon = "allow r"
    caps osd = "allow rwx pool=rbd-pool-1"
# 拷贝密钥环
ubuntu@ceph-deploy:~$ scp ceph.client.alice.keyring ubuntu@ceph-client:/etc/ceph

# 6、查看集群,默认使用的是admin,需要使用 --user 指定用户
ubuntu@ceph-client:~$ sudo ceph --user alice -s
  cluster:
    id:     b7c42944-dd49-464e-a06a-f3a466b79eb4
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 8h)
    mgr: ceph-mgr1(active, since 32h), standbys: ceph-mgr2
    osd: 16 osds: 16 up (since 7h), 16 in (since 7h)

  data:
    pools:   3 pools, 65 pgs
    objects: 10 objects, 51 B
    usage:   16 GiB used, 143 GiB / 160 GiB avail
    pgs:     65 active+clean

# 7、使用普通用户映射rbd
ubuntu@ceph-client:~$ sudo rbd device map --pool rbd-pool-1 --image rbd-img-1 --user alice
/dev/rbd0
ubuntu@ceph-client:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                         8:0    0   30G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0   29G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   20G  0 lvm  /
sr0                        11:0    1  945M  0 rom
rbd0                      252:0    0    3G  0 disk

# 8、格式化并使用
ubuntu@ceph-client:~$ sudo mkfs.ext4 /dev/rbd0
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: bfcf3ca0-56ae-4cc1-a059-7579c98a4cd8
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

# 创建挂载点
ubuntu@ceph-client:~$ sudo mkdir -p /data
ubuntu@ceph-client:~$ sudo mount /dev/rbd0 /data/
ubuntu@ceph-client:~$  df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               954M     0  954M   0% /dev
tmpfs                              198M   11M  187M   6% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   20G  5.4G   14G  30% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/sda2                          976M  150M  759M  17% /boot
tmpfs                              198M     0  198M   0% /run/user/1000
/dev/rbd0                          2.9G  9.0M  2.8G   1% /data
# 通过nginx设置
ubuntu@ceph-client:~$ sudo apt install -y nginx
ubuntu@ceph-client:~$ cd /data
ubuntu@ceph-client:/data$ sudo mkdir -p www/html
ubuntu@ceph-client:/data$ ls
lost+found  www
ubuntu@ceph-client:/data$ cd www/html/


# 一个比较好看的index首页
ubuntu@ceph-client:/data/www/html$ sudo vim index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <link rel="icon" href="img/avatar.jpg" type="image/x-icon">
    <link rel="dns-prefetch" href="/music">
    <link rel="dns-prefetch" href="https://azwnini.github.io">
    <link rel="dns-prefetch" href="/lab">
    <link rel="dns-prefetch" href="/code">
    <link rel="prerender" href="/music/index.html">
    <link rel="shortcut icon" href="/avatar.jpg">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta content="always" name="referrer">
    <meta http-equiv="x-dns-prefetch-control" content="on" />
    <title>Arch_Villain的个人主页</title>
    <canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas>
        <script type="text/javascript" src="js/anime.min.js"></script>
        <script type="text/javascript" src="js/fireworks.js"></script>
    <style type="text/css">
        body{font-family: arial, sans-serif;background-color: #ddd;transition:1s;}
        .title{position: fixed;bottom: 0;left: 0;text-align: center;width: 100%;color:#454545;}
        .nav{overflow:hidden;position: fixed;bottom: 0;left: 0;height: 420px;width: 100%;}
        .navs{width: 800px;height: 840px;margin:0 auto;transform-origin:50% 50%;transition: 1s;transform:rotate(0deg);z-index: 0;}
        .rotate{animation: rotate1 20s linear infinite;}
        .navs li{position: absolute;left: 50%;top: 20px;margin-left: -50px;width: 100px;height: 100px;line-height:100px;transform-origin:50% 400px;text-align: center;
                border-radius:5px;transition:border-radius .3s,box-shadow 1s;
                box-shadow:0 0px 10px 0 rgba(0, 0, 0, 0.12);
        }
        .navs li:hover{border-radius:50%;z-index: 1;}
        .navs li a:hover{transform:scale(1.1);}
        .navs li a{text-decoration: none;color:#fff;font-family:Microsoft YaHei;font-size: 20px;display:inline-block;width: 100%;height: 100%;}
        ul,li{margin: 0;padding: 0;list-style:none;}
        @keyframes rotate1{
            0%{
                transform:rotate(0deg);
            }
            50%{
                transform:rotate(180deg);
            }
            100%{
                transform:rotate(360deg);
            }
        }
        /*.resumes{text-align: center;margin-top: 50px;position: relative;z-index: 1;line-height:40px;}
        .resumes a{padding:5px 10px;background-color: #fff;text-decoration: none;color:#454545;font-family: microsoft YaHei;}*/
        .octicon{vertical-align:middle;vertical-align:text-bottom;padding-right: 5px;width: 22px;height: 22px;}
    </style>
</head>
<body>
    <div class="nav" id="nav">
        <ul class="navs" id="navs"</ul>
    </div>
    <h1 class="title">Arch_Villain的个人主页</h1>
    <br>
    <br>
    <br>
    <center><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=430 height=86 src="//music.163.com/outchain/player?type=2&id=536622304&auto=1&height=66"></iframe></center>
    <!--<div style="
        font-family: 微软雅黑;
        font-weight: bold;
        color: #fff;
        font-size: 60px;
        text-align: center;
            width:100%;
            position: fixed;
            bottom:500px">Hello World!</div> -->
    <!--div class="resumes">
        <a target="_blank" href="http://lmaomaoz.com/resume-md/">web版简历</a>
        <a target="_blank" href="https://github.com/CheshireJCat/resume-md">github版简历</a>
        <a target="_blank" href="http://lmaomaoz.com/resume-md/sources/cheshireCat.pdf">pdf版简历下载</a>
        <br>
        <a target="_blank" href="https://github.com/CheshireJCat"><svg aria-hidden="true" class="octicon" version="1.1" viewBox="0 0 16 16"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg>github</a>
        <a href="mail:727559597@qq.com"><svg class="octicon" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g class="transform-group"><g transform="scale(0.1953125, 0.1953125)"><path d="M512 63.791885c-247.538793 0-448.208115 200.669322-448.208115 448.208115s200.669322 448.208115 448.208115 448.208115 448.208115-200.669322 448.208115-448.208115S759.538793 63.791885 512 63.791885zM774.58958 323.779198 512.332575 544.363082l-262.240633-220.583884L774.58958 323.779198zM248.078075 342.614172l175.202301 148.376329L248.078075 700.015118 248.078075 342.614172zM268.360004 700.220802l167.104879-197.293435 76.81141 63.081711 76.95058-65.046459 167.096692 199.258183L268.360004 700.220802zM775.921925 700.015118 600.727811 490.9905l175.194114-148.376329L775.921925 700.015118z" fill="#272636"></path></g></g></svg>727559597@qq.com</a>
<br>
    <a href="http://lmaomaoz.com/music/" target="_blank">html5 音乐播放器</a>
    <a href="http://lmaomaoz.com/lab/css3/animatevideo/" target="_blank">纯css3视频</a>
    <a href="http://lmaomaoz.com/lab/canvas/mmd2/index.html" target="_blank">threejs-MMD-loader</a>
    </div-->
    <script type="text/javascript">
    (function(){
        function gc(){
            return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).substr(-6);
        }
        var data = [['首页','/home','#afaee8'],['音乐','music','#272626'],['博客','/','#0eb3af'],['番剧推荐','content/404.html','#40c4ff'],['code','content/404.html','#ee6e73'],['相册','picture','#bfafa0']];
        var max = 12;
        if(data.length<max){data = data.concat(data);}
        var mode = '<li style="background:{{background}};transform:rotate({{rotate}}deg)" data-index={{index}}><a href="{{href}}">{{word}}</a></li>',
            count = data.length,
            angle = 360/count,
            navs = document.getElementById('navs');
            navs.innerHTML = data.concat().map(function(x,i) {
                return mode.replace(/{{href}}/g,x[1])
                           .replace(/{{word}}/g,x[0])
                           .replace(/{{background}}/g,x[2])
                           .replace(/{{rotate}}/g,angle*i)
                           .replace(/{{index}}/g,i);
            }).join('');
        var t = new Date();
        var nowData = 0;
        var nowAngle = 0;
        function scrollFun(event){
            var t2 = new Date();
            if(t2-t<600){
                return false;
            }else{
                t = t2;
            }
            var e = event||window.event;
            var delta = arguments.length>0?(e.wheelDelta||-e.detail):1;
            var d = delta>0?1:-1;
            //var nowAngle = navs.style.transform.match(/rotate\((-?\d+)deg\)/);
            //nowAngle = nowAngle==null?0:nowAngle[1]*1;
            //nowAngle += angle*d;
            nowData += -d;
            nowData = nowData>max-1?nowData%max:nowData<0?nowData+max:nowData;
            nowAngle += angle*d;
            navs.style.transform = 'rotate('+nowAngle+'deg)';
            document.getElementsByTagName('body')[0].style.background = data[nowData][2];
        }
        var it = setInterval(scrollFun,2000);
        navs.onmouseenter = function(){
            //navs.classList.remove('rotate');
            clearInterval(it);
        };
        navs.onmouseleave = function(){
            //navs.classList.add('rotate');
            it = setInterval(scrollFun,2000);
        };
        if(document.addEventListener){
            document.addEventListener('DOMMouseScroll',scrollFun,false);
        }//W3C
        window.onmousewheel=document.onmousewheel=scrollFun;//IE/Opera/Chrome
    })();
    </script>
</body>
</html>

修改 nginx 配置

ubuntu@ceph-client:/data/www/html$ sudo vim /etc/nginx/sites-enabled/default
# 重启nginx服务
ubuntu@ceph-client:/data/www/html$ sudo /usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
ubuntu@ceph-client:/data/www/html$ sudo systemctl restart nginx

访问结果

挂载 rbd 之后系统内核会自动加载 libceph.ko 模块

2.3 Ceph FS 使用

ceph FS 即 ceph filesystem,可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使用 ceph 集群作为数据存储服务器。

Ceph FS 需要运行 Meta Data Services(MDS)服务,其守护进程为 ceph-mds,ceph-mds 进程管 理与 cephFS 上存储的文件相关的元数据,并协调对 ceph 存储集群的访问。

cephfs 的元数据使用的动态子树分区,把元数据划分名称空间对应到不同的 mds,写入元数据 的时候将元数据按照名称保存到不同主 mds 上,有点类似于 nginx 中的缓存目录分层一样.

2.3.1 部署MDS服务

如果要使用 cephFS,需要部署 ceph-mds 服务。这里将ceph-mds与ceph-mgr部署到一起

ubuntu@ceph-mgr1:~$ sudo apt -y install ceph-mds
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mgr1

root@ceph-mgr1:~# netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 172.31.0.11:3300        0.0.0.0:*               LISTEN      1127/ceph-mon
tcp        0      0 172.31.0.11:6789        0.0.0.0:*               LISTEN      1127/ceph-mon
tcp        0      0 172.31.0.11:6800        0.0.0.0:*               LISTEN      16734/ceph-mds
tcp        0      0 172.31.0.11:6801        0.0.0.0:*               LISTEN      16734/ceph-mds
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1025/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1539/sshd
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      1659/master
tcp6       0      0 :::22                   :::*                    LISTEN      1539/sshd
tcp6       0      0 :::25                   :::*                    LISTEN      1659/master

创建 CephFS metadata 和 data 存储池

使用 CephFS 之前需要事先于集群中创建一个文件系统,并为其分别指定元数据和数据相关 的存储池。下面创建一个名为 cephfs 的文件系统用于测试,它使用 cephfs-metadata 为元数 据存储池,使用 cephfs-data 为数据存储池:

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph osd pool create cephfs-metadata-pool-1 32 32
pool 'cephfs-metadata-pool-1' created
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph osd pool create cephfs-data-pool-1 64 64
pool 'cephfs-data-pool-1' created

创建 cephFS 并验证

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs new cephfs-test-1 cephfs-metadata-pool-1 cephfs-data-pool-1
new fs with metadata pool 7 and data pool 8

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs ls
name: cephfs-test-1, metadata pool: cephfs-metadata-pool-1, data pools: [cephfs-data-pool-1 ]
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status cephfs-test-1
cephfs-test-1 - 0 clients
=============
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata     0   45.0G
  cephfs-data-pool-1      data       0   45.0G

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mds stat
cephfs-test-1:1 {0=ceph-mon1=up:active}

创建客户端账户并验证cephfs

# 创建账户
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph auth add client.cephfs-test mon 'allow r' mds 'allow rw' osd 'allow rwx pool=cephfs-data-pool-1'
added key for client.cephfs-test
# 创建密钥环
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph-authtool --create-keyring ceph.client.cephfs-test.keyring
creating ceph.client.cephfs-test.keyring
# 验证账户
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph auth get client.cephfs-test
exported keyring for client.cephfs-test
[client.cephfs-test]
    key = AQBwJiJhJ/N3EBAAMJXwn2zOABiZCj+HDSvqEA==
    caps mds = "allow rw"
    caps mon = "allow r"
    caps osd = "allow rwx pool=cephfs-data-pool-1"
# 写入密钥环信息
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph auth get client.cephfs-test -o ceph.client.cephfs-test.keyring
exported keyring for client.cephfs-test

# 移动密钥环到/etc/ceph
ubuntu@ceph-deploy:~/ceph-cluster$ sudo mv ceph.client.cephfs-test.keyring /etc/ceph/

# 拷贝密钥
root@ceph-deploy:~# sudo ceph auth print-key client.cephfs-test > cephfs-test.key

# 查看集群
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph -s --user cephfs-test
  cluster:
    id:     b7c42944-dd49-464e-a06a-f3a466b79eb4
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 9h)
    mgr: ceph-mgr1(active, since 33h), standbys: ceph-mgr2
    mds: cephfs-test-1:1 {0=ceph-mon1=up:active}
    osd: 16 osds: 16 up (since 8h), 16 in (since 8h)

  data:
    pools:   5 pools, 161 pgs
    objects: 58 objects, 75 MiB
    usage:   17 GiB used, 143 GiB / 160 GiB avail
    pgs:     161 active+clean

# 挂载ceph文件系统
root@ceph-deploy:~# mount -t ceph -o name=cephfs-test,secretfile=cephfs-test.key 172.31.0.11:6789/ /data2
source mount path was not specified
unable to parse mount source: -22
# 注意别少加冒号吆
root@ceph-deploy:~# mount -t ceph -o name=cephfs-test,secretfile=cephfs-test.key 172.31.0.11:6789:/ /data2
root@ceph-deploy:~# df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               954M     0  954M   0% /dev
tmpfs                              198M   11M  187M   6% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   20G  5.5G   14G  30% /
tmpfs                              986M     0  986M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              986M     0  986M   0% /sys/fs/cgroup
/dev/sda2                          976M  150M  759M  17% /boot
tmpfs                              198M     0  198M   0% /run/user/1000
172.31.0.11:6789:/                  46G     0   46G   0% /data2

root@ceph-deploy:~# mkdir -p /data2/www/html/

root@ceph-deploy:~# vim /data2/www/html/index.html
# 将之前的首页弄过来
root@ceph-deploy:~# vim /etc/nginx/sites-enabled/default
# 修改nginx配置
root /data2/www/html;
# 重启nginx服务

访问页面成功

3.1. 添加MDS服务器

# 当前 ceph mds 集群状态
root@ceph-deploy:~# ceph mds stat
cephfs-test-1:1 {0=ceph-mon1=up:active}

# 添加 ceph-mon2、ceph-mon3 作为ceph mds 服务器
ubuntu@ceph-mon2:~$ sudo apt install ceph-mds -y
ubuntu@ceph-mon3:~$ sudo apt install ceph-mds -y

# 添加 mds 服务器
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mon2
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mon3

# 查看状态,1台激活,2台备份
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mds stat
cephfs-test-1:1 {0=ceph-mon1=up:active} 2 up:standby

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon1  Reqs:    0 /s    15     16
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  2099k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon2
 ceph-mon3
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

3.2. 查看当前文件系统

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs ls
name: cephfs-test-1, metadata pool: cephfs-metadata-pool-1, data pools: [cephfs-data-pool-1 ]

ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs get cephfs-test-1
Filesystem 'cephfs-test-1' (1)
fs_name    cephfs-test-1
epoch    34
flags    12
created    2021-08-22T10:20:06.781676+0000
modified    2021-08-24T13:12:39.190491+0000
tableserver    0
root    0
session_timeout    60
session_autoclose    300
max_file_size    1099511627776
min_compat_client    0 (unknown)
last_failure    0
last_failure_osd_epoch    289
compat    compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2}
max_mds    1
in    0
up    {0=64707}
failed
damaged
stopped
data_pools    [8]
metadata_pool    7
inline_data    disabled
balancer
standby_count_wanted    1
[mds.ceph-mon1{0:64707} state up:active seq 4 addr [v2:172.31.0.11:6800/1064976942,v1:172.31.0.11:6801/1064976942]]

3.3. 设置多主active

# 现在三台mds机器,可以设置多主存活
# 设置同时活跃的主 mds 最 大值为 2。
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs set cephfs-test-1 max_mds 2
# 验证
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mds stat
cephfs-test-1:2 {0=ceph-mon1=up:active,1=ceph-mon3=up:active} 1 up:standby
# 两个存活,一个备份
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon1  Reqs:    0 /s    15     16
 1    active  ceph-mon3  Reqs:    0 /s    10     13
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  3251k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon2
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

# 可以继续新增一台mds作为两主两从的架构
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy mds create ceph-mgr1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ubuntu/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/bin/ceph-deploy mds create ceph-mgr1
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ]  username                      : None
[ceph_deploy.cli][INFO  ]  verbose                       : False
[ceph_deploy.cli][INFO  ]  overwrite_conf                : False
[ceph_deploy.cli][INFO  ]  subcommand                    : create
[ceph_deploy.cli][INFO  ]  quiet                         : False
[ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f3b6c08ec30>
[ceph_deploy.cli][INFO  ]  cluster                       : ceph
[ceph_deploy.cli][INFO  ]  func                          : <function mds at 0x7f3b6c06b3d0>
[ceph_deploy.cli][INFO  ]  ceph_conf                     : None
[ceph_deploy.cli][INFO  ]  mds                           : [('ceph-mgr1', 'ceph-mgr1')]
[ceph_deploy.cli][INFO  ]  default_release               : False
[ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph-mgr1:ceph-mgr1
[ceph-mgr1][DEBUG ] connection detected need for sudo
[ceph-mgr1][DEBUG ] connected to host: ceph-mgr1
[ceph-mgr1][DEBUG ] detect platform information from remote host
[ceph-mgr1][DEBUG ] detect machine type
[ceph_deploy.mds][INFO  ] Distro info: Ubuntu 18.04 bionic
[ceph_deploy.mds][DEBUG ] remote host will use systemd
[ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph-mgr1
[ceph-mgr1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_deploy.mds][ERROR ] RuntimeError: config file /etc/ceph/ceph.conf exists with different content; use --overwrite-conf to overwrite
[ceph_deploy][ERROR ] GenericError: Failed to create 1 MDSs

# 上面如果报错,执行如下命令覆盖配置:
ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf mds create ceph-mgr1
# 我们新增了ceph-mgr1作为mds,看下文件系统状态
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status
cephfs-test-1 - 1 clients
=============
RANK  STATE      MDS        ACTIVITY     DNS    INOS
 0    active  ceph-mon1  Reqs:    0 /s    15     16
 1    active  ceph-mon3  Reqs:    0 /s    10     13
         POOL             TYPE     USED  AVAIL
cephfs-metadata-pool-1  metadata  3251k  45.0G
  cephfs-data-pool-1      data     192k  45.0G
STANDBY MDS
 ceph-mon2
 ceph-mgr1
MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

3.4. 设置多mds active加standby

  • 高可用优化

目前的状态是 ceph-mon1 和 ceph-mon3 分别是 active 状态,ceph-mon2 和 ceph-mgr1 分别处 于 standby 状态,现在可以将 ceph-mgr1 设置为 ceph-mon1 的 standby,将 ceph-mon3 设置 为 ceph-mon2 的 standby,以实现每个主都有一个固定备份角色的结构,则修改配置文件如 下:

# 对应关系
ceph-mgr1 => ceph-mon1
ceph-mon3 => ceph-mon2

# 修改 ceph.conf 配置文件
ubuntu@ceph-deploy:~/ceph-cluster$ cat ceph.conf
[global]
fsid = b7c42944-dd49-464e-a06a-f3a466b79eb4
public_network = 172.31.0.0/24
cluster_network = 192.168.10.0/24
mon_initial_members = ceph-mon1
mon_host = 172.31.0.11
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
[mon]
mon allow pool delete = true

[mds.ceph-mgr1]
mds_standby_for_name = ceph-mon1
mds_standby_replay = true

[mds.ceph-mon3]
mds_standby_for_name = ceph-mon2
mds_standby_replay = true
  • 分发配置文件到mds服务器并重启服务

    ubuntu@ceph-deploy:~/ceph-cluster$ ceph-deploy --overwrite-conf config push ceph-{mon1,mon2,mon3,mgr1}

    ubuntu@ceph-deploy:~/ceph-cluster$ for node in ceph-{mon1,mon2,mon3,mgr1}; do
    ssh $node "sudo systemctl restart ceph-mds@${node}"
    done

  • ceph集群 mds 高可用状态

    ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs status

    cephfs-test-1 - 1 clients

    RANK STATE MDS ACTIVITY DNS INOS
    0 active ceph-mon2 Reqs: 0 /s 18 16
    1 active ceph-mon1 Reqs: 0 /s 10 13
    POOL TYPE USED AVAIL
    cephfs-metadata-pool-1 metadata 3251k 45.0G
    cephfs-data-pool-1 data 192k 45.0G
    STANDBY MDS
    ceph-mon3
    ceph-mgr1
    MDS version: ceph version 15.2.14 (cd3bb7e87a2f62c1b862ff3fd8b1eec13391a5be) octopus (stable)

    高可用对应关系如下:

    ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph fs get cephfs-test-1

Ceph dashboard 是通过一个 web 界面,对已经运行的 ceph 集群进行状态查看及功能配置等 功能,早期 ceph 使用的是第三方的 dashboard 组件,如:

  • Calamari

Calamari 对外提供了十分漂亮的 Web 管理和监控界面,以及一套改进的 REST API 接口(不 同于 Ceph 自身的 REST API),在一定程度上简化了 Ceph 的管理。最初 Calamari 是作为 Inktank 公司的 Ceph 企业级商业产品来销售,红帽 2015 年收购 Inktank 后为了更好地推动 Ceph 的 发展,对外宣布 Calamari 开源。官网地址:https://github.com/ceph/calamari

优点:

  • 管理功能好

  • 界面友好

  • 可以利用它来部署 Ceph 和监控 Ceph

缺点:

  • 非官方

  • 依赖 OpenStack 某些包

  • VSM

Virtual Storage Manager (VSM)是 Intel 公司研发并且开源的一款 Ceph 集群管理和监控软件, 简化了一些 Ceph 集群部署的一些步骤,可以简单的通过 WEB 页面来操作。官网地址:https://github.com/intel/virtual-storage-manager

优点:

  • 易部署
  • 轻量级
  • 灵活(可以自定义开发功能)

缺点:

  • 监控选项少
  • 缺乏 Ceph 管理功能
  • Inkscope

Inkscope 是一个 Ceph 的管理和监控系统,依赖于 Ceph 提供的 API,使用 MongoDB 来 存储实时的监控数据和历史信息。官网地址:https://github.com/inkscope/inkscope

优点:

  • 易部署
  • 轻量级
  • 灵活(可以自定义开发功能)

缺点:

  • 监控选项少
  • 缺乏 Ceph 管理功能
  • Ceph-Dash

Ceph-Dash 是用 Python 开发的一个 Ceph 的监控面板,用来监控 Ceph 的运行状态。同时 提供 REST API 来访问状态数据。官网地址:http://cephdash.crapworks.de/

优点:

  • 易部署
  • 轻量级
  • 灵活(可以自定义开发功能)

缺点:

  • 功能相对简单

4.1. 启动 dashboard 插件

Ceph mgr 是一个多插件(模块化)的组件,其组件可以单独的启用或关闭,星新版本需要安装 dashboard 安保,而且必须安装在 mgr 节点,否则报错如下:

ubuntu@ceph-mgr1:~$ sudo apt-cache madison ceph-mgr-dashboard
ceph-mgr-dashboard | 15.2.14-1bionic | https://mirrors.tuna.tsinghua.edu.cn/ceph/debian-octopus bionic/main amd64 Packages
ubuntu@ceph-mgr1:~$ sudo apt install -y ceph-mgr-dashboard
Reading package lists... Done
Building dependency tree
Reading state information... Done
ceph-mgr-dashboard is already the newest version (15.2.14-1bionic).
ceph-mgr-dashboard set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.
# 启用模块
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph mgr module enable dashboard

4.2. 启用 dashboard 模块

Ceph dashboard 在 mgr 节点进行开启设置,并且可以配置开启或者关闭 SSL

# 关闭 SSL
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph config set mgr mgr/dashboard/ssl false
# 指定 dashboard 监听地址和端口
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph config set mgr mgr/dashboard/ceph-mgr1/server_addr 172.31.0.14
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph config set mgr mgr/dashboard/ceph-mgr1/server_port 9009

ubuntu@ceph-mgr1:~$ sudo systemctl restart ceph-mgr@ceph-mgr1.service
ubuntu@ceph-mgr1:~$ sudo systemctl status ceph-mgr@ceph-mgr1.service
● ceph-mgr@ceph-mgr1.service - Ceph cluster manager daemon
   Loaded: loaded (/lib/systemd/system/ceph-mgr@.service; indirect; vendor preset: enabled)
   Active: active (running) since Tue 2021-08-24 15:01:07 UTC; 9s ago
 Main PID: 4044 (ceph-mgr)
    Tasks: 33 (limit: 2287)
   CGroup: /system.slice/system-ceph\x2dmgr.slice/ceph-mgr@ceph-mgr1.service
           └─4044 /usr/bin/ceph-mgr -f --cluster ceph --id ceph-mgr1 --setuser ceph --setgroup ceph

Aug 24 15:01:07 ceph-mgr1 systemd[1]: Started Ceph cluster manager daemon.
ubuntu@ceph-mgr1:~$ sudo netstat -nlpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:33807         0.0.0.0:*               LISTEN      1444/containerd
tcp        0      0 172.31.0.14:6800        0.0.0.0:*               LISTEN      3750/ceph-mds
tcp        0      0 172.31.0.14:9009        0.0.0.0:*               LISTEN      4044/ceph-mgr
tcp        0      0 172.31.0.14:6801        0.0.0.0:*               LISTEN      3750/ceph-mds
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      1115/systemd-resolv
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1864/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1864/sshd

4.3. 设置 dashboard 账户及密码

ubuntu@ceph-deploy:~/ceph-cluster$ touch pass.txt
ubuntu@ceph-deploy:~/ceph-cluster$ echo "123456" > pass.txt
ubuntu@ceph-deploy:~/ceph-cluster$ sudo ceph dashboard set-login-credentials admin -i pass.txt
******************************************************************
***          WARNING: this command is deprecated.              ***
*** Please use the ac-user-* related commands to manage users. ***
******************************************************************
Username and password updated

本节暂时结束

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章