有两个在磁盘上存储数据的 Ceph
守护程序:数据库
Ceph
中的地方。通常而言,每一个 OSD
都由单个存储设备支持。OSD
还能够由多种设备组合来支持,例如用于大多数数据的 HDD
和用于某些元数据的 SSD
。群集中 OSD
的数量一般取决于存储的数据量,每一个存储设备的容量以及冗余(复制或Erasure
)的级别和类型OSD
能够经过两种方式管理它们存储的数据。从 Luminous 12.2.z
版本开始,新的默认(推荐)后端是 BlueStore
。在 Luminous
以前,默认(也是惟一的选项)是 FileStore
后端
BlueStore
是专用于存储的后端,专门用于管理 Ceph OSD
中的数据。BlueStore
的主要功能包括:安全
BlueStore
构建在裸磁盘设备之上,直接使用原始块设备或分区RocksDB
的元数据管理:嵌入 RocksDB
的键/值数据库管理内部元数据,例如从对象名称到磁盘上块位置的映射BlueStore
的数据和元数据都受到一个或多个校验和的保护。未经验证,不会从磁盘读取任何数据或元数据或将其返回给用户BlueStore
容许将其内部日志写入单独的高速设备,以提升性能。若是有大量的快速存储可用,内部元数据也能够存储在更快的设备上RBD
和 CephFS
快照依赖于在 BlueStore
中有效实现的写时复制克隆机制。这将为常规快照和Erasure Code
(依赖克隆实现高效的两阶段提交)提供高效的 IO
FileStore
是在 Ceph
中存储对象的传统方法。它依赖于标准文件系统(建议使用 XFS
)以及键/值数据库(传统上是 LevelDB
,如今是 RocksDB
)来处理某些元数据bash
FileStore
通过了充分的测试,并在生产中普遍使用,可是因为其整体设计和对用于存储对象数据的传统文件系统的依赖,所以存在许多性能缺陷服务器
FileStore
一般可以在大多数 POSIX
兼容文件系统(包括 btrfs
和 ext4
)上运行,可是咱们仅建议使用 XFS
。btrfs
和 ext4
都有已知的错误和缺陷,使用它们可能会致使数据丢失。默认状况下,全部 Ceph
工具都使用 XFS
当你启动 Ceph
服务时,初始化过程网络
将激活一系列在后台运行的守护程序。一个 Ceph 的存储集群上运行三种类型的守护程序:app
Ceph Monitor
Ceph Manager
Ceph OSD
支持 Ceph File System
的 Ceph
存储集群至少运行一台 Ceph Metadata Server
;支持 Ceph Object Storage
的 Ceph
集群至少运行一个 Gateway
守护程序ide
每一个 Ceph 守护进程,进程和库都将从如下列出的几个来源中提取其配置。若是同时存在,则列表后面的源将覆盖列表前面的源工具
Ceph
进程在启动时要作的第一件事之一就是解析命令行参数,环境和本地配置文件提供的配置选项。而后,该过程将与监视器群集联系,以检索整个群集集中存储的配置。一旦可得到完整的配置视图,则将继续执行守护程序或进程性能
全局配置(global
):global
的配置会影响 Ceph
存储集群中的全部守护进程和客户端
监视器配置(mon
):影响 ceph-mon
,并覆盖相同设置的 global
管理器配置(mgr
):影响 ceph-mgr
,并覆盖相同设置的 global
OSD
配置:影响 ceph-osd
,并覆盖相同设置的 global
元数据服务器配置(mds
):影响 ceph-mds
,并覆盖相同设置的 global
client
:客户端配置,影响全部的 Ceph
客户端(例如,已安装的 Ceph
文件系统,已安装的 Ceph
块设备等)以及 Rados Gateway
守护程序# 查看集群全部可配置对象 $ ceph config dump # 获取指定对象的配置信息 $ ceph config get <who> # 例如查看 mon 的配置信息 $ ceph config get mon # 修改指定组件的配置 $ ceph config set <who> <option> <value> # 例如修改配置以容许用户删除 pool $ ceph config set mon "mon_allow_pool_delete" true # 查看当前组件的运行时配置信息 $ ceph config show <who> # 例如查看 osd 组件信息 $ ceph config show osd.0 # 将从输入文件中提取配置文件,并将全部有效选项移至监视器的配置数据库。监视器没法识别,无效或没法控制的任何设置都将在输出文件中存储的简短配置文件中返回 。此命令对于从旧版配置文件过渡到基于集中式监视器的配置颇有用。 $ ceph config assimilate-conf -i <input file> -o <output file> # 查看指定组件的全部选项 $ ceph config show-with-defaults <who> # 例如查看 osd 组件支持的全部选项 $ ceph config show osd.0
当 Ceph
在启用身份验证和受权的状况下运行(默认状况下启用)时,您必须指定用户名和包含指定用户的私钥的密钥环(一般是经过命令行)。若是您未指定用户名,则 Ceph
将 client.admin
用做默认用户名。若是您未指定密钥环,则 Ceph
将经过 keyring
在 Ceph
的设置中寻找密钥环。例如,若是在不指定用户或密钥环的状况下执行命令:ceph health
$ ceph health # ceph 将解释以下 $ ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health # 或者, 可使用 CEPH_ARGS 环境变量来避免从新输入用户名和密码
不管 Ceph
客户端的类型是什么(例如,块设备,对象存储,文件系统,本机 API 等),Ceph
都将全部数据存储做为对象在 pool
中。Ceph
用户必须有权访问 pool
才能读取和写入数据。此外,Ceph
用户必须具备执行权限才能使用 Ceph
的管理命令
Ceph
用户具备用户类型 Type
的概念。出于用户管理的目的,类型始终为 client
Ceph
识别用户分隔形式由用户类型和用户 ID
组成:例如,TYPE.ID
,client.admin
,或 client.user1
引入用户类型的缘由是由于 Ceph
监视器,OSD
和 Metadata Servers
也使用 Cephx
协议,但它们不是客户端。区分用户类型有助于区分客户端用户和其余用户-简化访问控制,用户监控和可追溯性
在使用 Ceph
命令行时,若是指定 --user
或 --id
则可省略用户类型,若是指定 --name
或 -n
则必须指定类型和名称
Ceph 存储群集用户
与 Ceph
对象存储用户和 Ceph
文件系统用户不一样
Ceph 对象网关
使用 Ceph
存储群集用户在网关守护程序和存储群集之间进行通讯,可是网关对最终用户具备本身的用户管理功能
Ceph 文件系统
使用 POSIX
语义,与 Ceph
文件系统关联的用户空间与 Ceph
存储集群用户不一样
Ceph
使用 caps
来描述受权通过身份验证的用户行使监视器,OSD
和 MDS
的功能
caps
能够根据应用程序标记来限制对池中数据,池中的名称空间或一组池的访问。Ceph
管理用户在建立或更新用户时设置用户的 caps
caps
语法格式:
{daemon-type} '{cap-spec}[, {cap-spec} ...]'
监控器受权:
# mon cap 包括 r, w, x 访问设置 或 profile {name} $ mon 'allow {access-spec} [network {network/prefix}]' $ mon 'profile {name}' # {access-spec} 语法 $ * | all | [r][w][x] # 可选的 [network {network/prefix}] 表示限制受权客户端网络来源(例如10.3.0.0/16)
OSD受权:
# OSD cap 包括 r, w, x, class-read, class-write 访问设置 或 profile {name}; 此外 OSD 还支持 pool 和 namespace 的设置 $ osd 'allow {access-spec} [{match-spec}] [network {network/prefix}]' $ osd 'profile {name} [pool={pool-name} [namespace={namespace-name}]] [network {network/prefix}]' # {access-spec} 语法是如下状况之一 $ * | all | [r][w][x] [class-read] [class-write] $ class {class name} [{method name}] # {match-spec} 语法是如下状况之一 $ pool={pool-name} [namespace={namespace-name}] [object_prefix {prefix}] $ [namespace={namespace-name}] tag {application} {key}={value}
Manager 受权:
# mgr cap 包括 r, w, x 访问设置 或 profile {name} $ mgr 'allow {access-spec} [network {network/prefix}]' $ mgr 'profile {name} [{key1} {match-type} {value1} ...] [network {network/prefix}]' # 还能够为特定命令, 内置管理器服务导出的全部命令或特定附加模块导出的全部命令指定管理器功能 $ mgr 'allow command "{command-prefix}" [with {key1} {match-type} {value1} ...] [network {network/prefix}]' $ mgr 'allow service {service-name} {access-spec} [network {network/prefix}]' $ mgr 'allow module {module-name} [with {key1} {match-type} {value1} ...] {access-spec} [network {network/prefix}]' # {access-spec} 语法 $ * | all | [r][w][x] # {service-name} 语法是如下状况之一 mgr | osd | pg | py # {match-type} 语法是如下状况之一 = | prefix | regex
添加用户会建立一个用户名和一个秘钥。用户的密钥使用户能够经过 Ceph 存储群集进行身份验证。用户受权使用户在 ceph-mon
,ceph-osd
或 ceph-mds
上进行读取,写入或执行
添加用户的方式有如下几种:
ceph auth add
:此命令是添加用户的规范方法。它将建立用户,生成秘钥并添加指点权限ceph auth get-or-creat
:建立用户并返回用户名和密钥。若是用户已存在,则返回用户名和密钥ceph auth get-or-create-key
:建立用户并返回密钥。若是用户已存在,返回密钥通常状况下,一个用户至少须要在 ceph-mon
上具备读取功能,在 ceph-osd
上具备读写功能
示例:
[root@ceph01 ~]# ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool' added key for client.john [root@ceph01 ~]# ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool' [client.paul] key = AQBn5/peFEb0NhAA1PNAW7BNdW98xsIEsSyh1A== [root@ceph01 ~]# ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring [root@ceph01 ~]# cat george.keyring [client.george] key = AQB75/peKljJCBAAmXGwZJHVVGbQ/jFKnHQH/A== [root@ceph01 ~]# ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key [root@ceph01 ~]# cat ringo.key AQCT5/peSuHhJxAAr8sgvdoYO6iQnSr48NG3lA==
# 列出当前集群中的全部用户 [root@ceph01 ~]# ceph auth ls installed auth entries: client.admin key: AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ== caps: [mds] allow * caps: [mgr] allow * caps: [mon] allow * caps: [osd] allow * ...... # 查看指定用户的信息 [root@ceph01 ~]# ceph auth get client.admin exported keyring for client.admin [client.admin] key = AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" # 导出用户 [root@ceph01 ~]# ceph auth export client.admin -o client.admin export auth(key=AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ==) [root@ceph01 ~]# cat client.admin [client.admin] key = AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" # 打印用户秘钥 [root@ceph01 ~]# ceph auth print-key client.admin AQCiA/heKdmdBxAAfmu1yxvJA0DAZWx1gOB1lQ==
# 语法 $ 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}]'] # 示例 # 获取当前用户信息 [root@ceph01 ~]# ceph auth get client.john exported keyring for client.john [client.john] key = AQBU5/pew+gMLBAAbBj2BK+nrqt8Gm7zk/xRug== caps mon = "allow r" caps osd = "allow rw pool=liverpool" # 修改 mon 权限为 rw, osd 权限为 rwx, 添加 mgr 只读权限 [root@ceph01 ~]# ceph auth caps client.john mon 'allow rw' osd 'allow rwx pool=liverpool' mgr 'allow r' updated caps for client.john [root@ceph01 ~]# ceph auth get client.john exported keyring for client.john [client.john] key = AQBU5/pew+gMLBAAbBj2BK+nrqt8Gm7zk/xRug== caps mgr = "allow r" caps mon = "allow rw" caps osd = "allow rwx pool=liverpool"
# 语法 $ ceph auth del {TYPE}.{ID} # 删除 client.john [root@ceph01 ~]# ceph auth del client.john updated # 查看用户, 发现已经不存在 [root@ceph01 ~]# ceph auth get client.john Error ENOENT: failed to find client.john in keyring
# 语法 $ ceph auth import -i /etc/ceph/ceph.keyring # 示例 [root@ceph01 ~]# ceph auth import -i /etc/ceph/ceph.keyring # 注意:ceph 存储集群将添加新用户, 生成其密钥和权限; 并将更新现有用户和密钥即权限
pool
是 ceph
存储数据时的逻辑分区,它起到 namespace
的做用。每一个 pool
包含必定数量的 PG
,PG
里的对象被映射到不一样的 OSD
上,所以 pool
是分布到整个集群的
除了隔离数据,咱们也能够分别对不一样的 pool
设置不一样的策略,好比副本数、数据清洗次数、数据块及对象大小等
# 列出集群中的全部池 [root@ceph01 ~]# ceph osd lspools 1 device_health_metrics 2 cephfs_data 3 cephfs_metadata ...... # 查看池的规则 [root@ceph01 ~]# ceph osd pool get cephfs_data crush_rule crush_rule: replicated_rule # 列出集群中池的详细信息 [root@ceph01 ~]# ceph osd dump
# 建立池 # 语法 $ ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] [replicated] \ [crush-rule-name] [expected-num-objects] $ ceph osd pool create {pool-name} [{pg-num} [{pgp-num}]] erasure \ [erasure-code-profile] [crush-rule-name] [expected_num_objects] [--autoscale-mode=<on,off,warn>] # 示例 [root@ceph01 ~]# ceph osd pool create test_pool 16 16 pool 'test_pool' created
{pool-name}
:pool
名称,集群惟一{pg-num}
:pool
放置组总数,默认为 8,不适用于大多数状况{pgp-num}
:pool
用于放置目的的放置组总数,这应等于展现位置组的总数,默认为 8{replicated|erasure}
:replicated
类型经过保留对象的多个副本(默认是3),以便 OSD
发生故障时恢复; erasure
类型实现相似于 RAID5
功能。replicated
须要更多存储空间,但比 erasure
更加安全,erasure
须要较少的存储空间且性能相对较好,安全性相对较差。默认为 replicated
[crush-rule-name]
:用于此池的 CRUSH
规则的名称。指定的规则必须存在[erasure-code-profile=profile]
:仅用于 erasure pool
--autoscale-mode=<on,off,warn>
:自动缩放模式,若是将自动缩放模式设置为 on
或 warn
,则可让系统根据实际使用状况自动调整或建议对池中的放置组数量进行更改,默认行为由 osd pool default pg autoscale mode
选项控制,使用 ceph config get osd osd_pool_default_pg_autoscale_mode
查看[expected-num-objects]
:pool
预期对象数# 将 pool 关联到应用程序。池在使用前须要与应用程序关联 [root@ceph01 ~]# ceph osd pool application enable test_pool rbd enabled application 'rbd' on pool 'test_pool'
# 设置 mon 参数, 运行删除 pool [root@ceph01 ~]# ceph config set mon mon_allow_pool_delete true # 删除 pool, 要求指定两次 pool 以肯定 [root@ceph01 ~]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it pool 'test_pool' removed
# 设置 pool 参数, 语法以下 $ ceph osd pool set {pool-name} {key} {value} # 具体参数设置参考 https://ceph.readthedocs.io/en/latest/rados/operations/pools/#set-pool-values # 获取 pool 参数, 语法以下 $ ceph osd pool get {pool-name} {key} # 可获取 key 信息参考 https://ceph.readthedocs.io/en/latest/rados/operations/pools/#get-pool-values # 设置对象副本数 $ ceph osd pool set {poolname} size {num-replicas} # 设置最小副本数 $ ceph osd pool set {poolname} min_size 2 # 获取对象副本数 $ ceph osd dump | grep 'replicated size'
# 重命名池 $ ceph osd pool rename {current-pool-name} {new-pool-name} # 列出集群中全部池的使用信息 $ rados df # 得到集群中全部池或指定池的 I/O 信息 $ ceph osd pool stats [{pool-name}] # 建立快照 $ ceph osd pool mksnap {pool-name} {snap-name} # 查看快照 $ rados lssnap -p {pool-name} # 删除快照 $ ceph osd pool rmsnap {pool-name} {snap-name}