目录
副本存储池
在Ceph中,"副本池"(Replicated Pool)是一种数据存储池,它使用数据的完全复制策略来保障数据的冗余和可用性。在副本池中,每个对象会在多个存储节点(通常是物理服务器)上保留多个完全相同的副本。这意味着每个对象的多个副本都具有相同的数据,确保了数据的冗余和高可用性。
副本池的主要特点和优势包括:
-
冗余和可用性:由于每个对象都有多个副本,如果一个存储节点或副本不可用,仍然可以从其他副本中获取数据,从而提供了冗余和高可用性。
-
简单管理:副本池的管理相对简单,因为数据完全相同,不需要进行数据编码和恢复操作。
-
读取性能较好:由于副本之间的数据是完全相同的,读取操作通常可以在任何副本上执行,从而提供较好的读取性能。
一般来说,副本池适用于那些对数据可用性要求很高、不太关心存储成本的应用场景。但需要注意的是,由于每个对象都有多个副本,副本池通常需要更多的存储空间,并且写入操作需要在所有副本上进行,这可能会引起存储成本和性能问题。因此,在选择存储策略时,需要根据具体的需求来平衡可用性、性能和成本因素。
创建副本池
在Ceph中创建一个副本池,你可以使用命令行工具ceph osd pool create
。以下是创建副本池的基本命令格:
ceph osd pool create <pool_name> <pg_num> <pgp_num> replicated <pool_type>
其中:
<pool_name>
是你要创建的池的名称。<pg_num>
是PG(Placement Group)的数量,它用于数据分布和负载均衡。你可以根据你的需求选择合适的值。<pgp_num>
是PG的初始大小,通常与<pg_num>
相同。<pool_type>
是副本池的类型,应设置为 "replicated",以指示要创建一个副本池。
例如,要创建一个名为 "myreplicapool" 的副本池,你可以运行以下命令:
ceph osd pool create myreplicapool 128 128 replicated
这将在Ceph中创建一个名为 "myreplicapool" 的副本池,PG数量为128,并使用默认的PGP数量(通常与PG数量相同)。你可以根据你的需求调整PG数量以适应你的存储规模和性能需求。
一旦创建了副本池,你就可以将数据存储在其中,并利用Ceph的数据冗余机制来提供高可用性。
namespace
在Ceph中,"namespace" 是一种用于组织和管理池中对象的方式。一个池(pool)可以包含多个命名空间,每个命名空间可以包含对象。命名空间的作用类似于一个子目录或文件夹,它可以帮助你在池中更好地组织和管理数据。
命名空间的一些常见用途包括:
-
数据隔离:命名空间可以帮助将不同类型的数据隔离开,以便更容易进行管理和维护。例如,你可以在一个池中创建不同的命名空间来存储不同的应用程序数据或项目数据。
-
权限控制:你可以为每个命名空间设置不同的权限和访问控制策略,从而更好地控制谁可以访问和修改命名空间中的数据。
-
数据组织:命名空间可以用于更好地组织数据,使数据查找和管理更加方便。这对于大规模部署中的数据管理尤为重要。
你可以使用Ceph的命令行工具或Ceph API来创建、管理和操作命名空间。命名空间是Ceph池内部的逻辑组织单位,它帮助你更好地组织和管理池中的对象。
命名空间相关指令
在Ceph中,你可以使用命令行工具 rados
和 radosgw
(如果使用Ceph对象网关)来管理命名空间以及向命名空间中上传和删除对象。以下是一些与命名空间相关的命令示例:
注意:命名空间在Ceph的对象存储系统中比较常见,但在块设备或文件系统中可能不适用。以下示例假定你正在使用Ceph的对象存储部分。
-
创建命名空间:
- 使用
radosgw-admin
命令创建一个新的命名空间:radosgw-admin metadata user create --uid=<user_id> --namespace=<namespace_name>
- 使用
-
上传对象到命名空间:
- 使用
rados
命令上传一个对象到指定命名空间(<pool_name>
为池名称,<namespace_name>
为命名空间名称,<object_name>
为对象名称,<path_to_local_file>
为本地文件路径):rados -p <pool_name> --namespace=<namespace_name> put <object_name> <path_to_local_file>
- 使用
-
从命名空间删除对象:
- 使用
rados
命令从指定命名空间删除对象(<pool_name>
为池名称,<namespace_name>
为命名空间名称,<object_name>
为对象名称):rados -p <pool_name> --namespace=<namespace_name> rm <object_name>
- 使用
-
要查看特定命名空间中的文件:
rados -p <pool_name> --namespace=<namespace_name> ls
其中:
<pool_name>
是池的名称。<namespace_name>
是命名空间的名称。
-
下载到本地文件:
rados -p <pool_name> --namespace=<namespace_name> get <object_name> <local_file_name>
请注意,上述命令示例中的 <pool_name>
是池的名称,<namespace_name>
是命名空间的名称,<object_name>
是对象的名称,<path_to_local_file>
是本地文件路径,<user_id>
是Ceph用户的ID。具体的参数值应根据你的Ceph配置和需要进行相应的替换。
纠删码存储池
在 Ceph 存储集群中,纠删码池是一种用于数据冗余和容错的池类型。纠删码池是与传统数据池(data pool)不同的一种池,它使用纠删码技术来提供数据的冗余和容错能力,而不是采用复制数据的方式。这可以帮助降低存储成本,特别是在大规模存储环境中。
To summarize how erasure coded pools work:
- Each object's data is divided into k data chunks.
- m coding chunks are calculated.
- The coding chunk size is the same as the data chunk size.
- The object is stored on a total of k + m OSDs.
上图是Ceph纠删码池的工作原理:
-
数据切片:纠删码池将数据分割成若干块(chunks)或数据片段。通常,每个数据块都会被切割成一定数量的数据片段,这些数据片段将被用于生成纠删码。
-
纠删码编码:Ceph使用纠删码编码算法来创建冗余数据。这些冗余数据片段是通过对原始数据片段进行数学运算来生成的,通常是通过XOR操作来计算的。生成的冗余数据片段的数量通常比原始数据片段多,以增强数据的容错性。
-
数据分发:生成的数据片段和冗余数据片段被分发到Ceph集群中的不同存储节点。这个分发过程有助于保证数据的可用性和容错性,因为数据和冗余数据被分布在多个不同的地方。
-
数据恢复:当某个存储节点上的数据丢失或不可用时,Ceph可以通过计算纠删码来恢复丢失的数据。这涉及到在其他存储节点上找到足够数量的数据片段和纠删码片段,然后执行数学运算以重建丢失的数据。
-
容错性:纠删码池具有很强的容错性,因为它可以容忍多个存储节点的故障。只要有足够数量的数据片段和纠删码片段可用,数据就可以被恢复。
-
存储效率:相对于传统的副本复制方式,纠删码池可以更高效地使用存储空间,因为它不需要在多个存储节点上存储完全相同的数据副本,而只需存储少量的冗余数据片段。
纠删码池的工作原理有助于提高Ceph系统的数据冗余和可用性,降低存储成本,并减少数据传输带宽要求。这使其成为处理大规模数据的分布式存储解决方案的有力选择。在Ceph中的副本池(Replicated Pool)中,数据通常不会被切片存储。相反,数据在副本池中以完整的副本形式存储在多个不同的存储节点上。每个数据对象都有一个或多个完整的副本,这些副本存储在不同的物理存储节点上,以提供冗余和容错性。
创建纠删码池
要创建一个纠删码池(Erasure Coded Pool)在Ceph中,你需要使用Ceph的命令行工具或管理接口。以下是创建纠删码池的基本命令格式:
ceph osd pool create <pool_name> <pg_num> <pgp_num> erasure <erasure_profile>
这里是参数的解释:
<pool_name>
:指定要创建的纠删码池的名称。<pg_num>
:指定Placement Group(PG)的数量。PG是Ceph用于数据分布和负载均衡的单元。通常,你可以使用默认值或根据需要进行调整。<pgp_num>
:指定Placement Group Placement(PGP)的数量。PGP数量通常与PG数量相同,但在某些情况下,你可以根据需要进行调整。erasure
:指定创建一个纠删码池。<erasure_profile>
:指定纠删码配置文件的名称。这个配置文件包含关于如何编码和分布数据的信息。你需要在Ceph中预先定义这些配置文件,然后在创建池时使用。
请确保在执行这个命令之前,你已经正确配置了Ceph集群,包括CRUSH映射和纠删码配置文件。根据你的特定需求,你可以自定义<pg_num>
、<pgp_num>
和<erasure_profile>
的值。这个命令将创建一个名为<pool_name>
的纠删码池,以便你可以将对象写入该池,并根据纠删码配置进行编码和分布。
示例
以下是一个基本的示例,展示如何创建一个纠删码池:
[root@ceph1 ceph]# ceph osd erasure-code-profile ls
default
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd erasure-code-profile get default
k=2
m=1
plugin=jerasure
technique=reed_sol_van
[root@ceph1 ceph]# ceph osd erasure-code-profile set cephl25 k=3 m=2 crush-failure-domain=osd
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd erasure-code-profile get cephl25
crush-device-class=
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=3
m=2
plugin=jerasure
technique=reed_sol_van
w=8
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool create myecpool 64 64 erasure cephl25
副本池 VS 纠删码池
在Ceph中,副本池和纠删码池是两种不同的数据存储策略,它们有一些重要的区别:
-
副本池(Replicated Pool):
- 副本池使用数据的完全复制策略。每个对象在池中都有多个完全相同的副本,通常默认为3个副本。这意味着每个对象都会在多个存储设备上保留相同的数据,以提供冗余和高可用性,在Ceph的副本池中,每个对象通常是完整的,而不会被切割或分散存放到不同的OSD上。
- 副本池的优点是数据可用性很高,因为如果一个副本不可访问,仍然可以从其他副本中获取数据。但它的缺点是需要更多的存储空间,因为每个对象都有多个副本,而且写入操作需要在所有副本上进行,这可能会引起存储成本和性能问题。
-
纠删码池(Erasure-coded Pool):
- 纠删码池使用一种编码技术,将数据分为多个块,并生成冗余数据块,以恢复数据。这样,不需要像副本池那样保留完全相同的副本,因此可以显著减少存储空间的需求。
- 纠删码池的优点是节省存储空间,因为相对于副本,冗余数据块要小得多。然而,它的缺点是在读取时需要计算和恢复数据,这可能会对性能产生一些影响,尤其是在写入时。
总的来说,副本池提供了更高的数据可用性,但以更多的存储成本为代价。纠删码池可以减少存储成本,但可能会对性能产生一些影响。选择哪种池类型取决于你的具体需求,例如数据的重要性、存储成本和性能需求。 Ceph允许你在不同的池之间进行选择,以满足不同的数据存储需求。
默认的pool_type是什么
在Ceph中,默认的 pool_type
是 "replicated",这意味着当你使用 ceph osd pool create
命令创建新的池时,如果不显式指定 pool_type
,系统会将池类型设置为副本池。副本池使用数据的完全复制策略,即每个对象都在多个存储节点上保留多个完全相同的副本,以提供数据的冗余和高可用性。
如果你想创建一个不同类型的池,例如纠删码池(Erasure-coded Pool),你需要明确指定 pool_type
为 "erasure" 并提供相应的配置参数。不同的池类型适用于不同的数据冗余和性能需求,所以你应该根据你的具体需求来选择适当的池类型。
存储池相关指令
在Ceph中,你可以使用一系列命令来执行以下操作:创建池、查看池信息、修改池属性、上传文件、查看文件、删除文件等。下面是一些常用的相关指令:
-
创建池:
- 创建一个名为
myreplicapool
的副本池:ceph osd pool create myreplicapool 128 128 replicated
- 创建一个名为
-
查看池信息:
- 列出所有池的信息:
ceph osd lspools
- 查看特定池(例如
myreplicapool
)的信息:ceph osd pool ls detail myreplicapool
- 列出所有池的信息:
-
修改池属性:
- 修改池的副本数(例如,将
myreplicapool
的副本数修改为 2):ceph osd pool set myreplicapool size 2
- 修改池的副本数(例如,将
-
上传文件:
- 使用
rados
命令上传文件到特定池(例如myreplicapool
):rados -p myreplicapool put <object_name> <path_to_local_file>
- 使用
-
查看文件:
- 使用
rados
命令查看文件内容(例如myreplicapool
中的某个对象):rados -p myreplicapool get <object_name> <path_to_local_file>
- 使用
-
删除文件:
- 使用
rados
命令删除池中的对象(例如myreplicapool
中的某个对象):rados -p myreplicapool rm <object_name>
- 使用
请注意,这些是一些基本的命令示例,实际使用时需要根据你的环境和需求进行适当的调整。另外,Ceph还提供了更多高级操作和管理工具,具体操作可能会更复杂,具体取决于你的使用情况和配置。
副本池管理命令示例
[root@ceph1 ceph]# ceph osd pool create whirlpool 64
pool 'whirlpool' created
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool application enable whirlpool rbd
enabled application 'rbd' on pool 'whirlpool'
#Whirlpool 池可以存储不仅仅是 RBD 数据,也可以存储其他类型的数据,例如图片、文本、视频等,rbd 参数在命令中指定了要将哪个数据处理应用程序关联到名为 "whirlpool" 的池中。通常,不同的池可以有不同的数据处理应用程序或策略,这取决于池的用途和需求。因此,通过将 rbd 作为参数,明确指定了在 "whirlpool" 池上要启用的数据处理应用程序,这可能包括特定的数据处理配置和策略,以满足 RBD 存储需求。
#在 Ceph 存储集群中,默认情况下,池(pool)不会关联任何特定的数据处理应用程序。当您创建一个新的池时,该池将被视为通用池,不会自动与特定的数据处理应用程序相关联。这意味着池默认不会应用特定的数据处理策略或应用程序。
#您可以在需要的情况下,通过使用命令 ceph osd pool application enable 来关联特定的数据处理应用程序到池中,以满足特定的数据存储和处理需求。根据您的需求,您可以选择关联池与不同的应用程序,例如 rbd(用于块设备)、cephfs(用于文件系统)、rgw(用于对象存储)等等。
#请注意,默认情况下,池不会强制任何特定的数据处理策略或应用程序,因此您需要根据您的使用情况和需求来配置池的应用程序关联。
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool ls
whirlpool
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
60 GiB 57 GiB 3.0 GiB 5.03
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
whirlpool 4 0 B 0 18 GiB 0
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool rename whirlpool mypool
pool 'whirlpool' renamed to 'mypool'
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool ls detail
pool 4 'mypool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 45 flags hashpspool stripe_width 0 application rbd
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool set mypool size 4
set pool 4 size to 4
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool ls detail
pool 4 'mypool' replicated size 4 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 47 flags hashpspool stripe_width 0 application rbd
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# rados -p mypool -N system put testconf /etc/ceph/ceph.conf
[root@ceph1 ceph]#
[root@ceph1 ceph]# rados -p mypool put testkey /etc/ceph/ceph.client.admin.keyring
[root@ceph1 ceph]#
[root@ceph1 ceph]# rados -p mypool -N system ls
testconf
[root@ceph1 ceph]#
[root@ceph1 ceph]# rados -p mypool ls
testkey
[root@ceph1 ceph]#
[root@ceph1 ceph]# rados -p mypool --all ls
system testconf
testkey
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
pool 'mypool' removed
[root@ceph1 ceph]#
纠删码池管理命令示例
[root@ceph1 ceph]# ceph osd erasure-code-profile ls
default
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd erasure-code-profile get default
k=2
m=1
plugin=jerasure
technique=reed_sol_van
[root@ceph1 ceph]# ceph osd erasure-code-profile set cephl25 k=3 m=2 crush-failure-domain=osd
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd erasure-code-profile get cephl25
crush-device-class=
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=3
m=2
plugin=jerasure
technique=reed_sol_van
w=8
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool create myecpool 64 64 erasure cephl25
pool 'myecpool' created
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool application enable myecpool rgw
enabled application 'rgw' on pool 'myecpool'
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
60 GiB 57 GiB 3.0 GiB 5.04
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
whirlpool 5 0 B 0 18 GiB 0
myecpool 6 0 B 0 32 GiB 0
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool ls detail
pool 5 'whirlpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 53 flags hashpspool stripe_width 0 application rbd
pool 6 'myecpool' erasure size 5 min_size 4 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 last_change 58 flags hashpspool stripe_width 12288 application rgw
[root@ceph1 ceph]#
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph -s
cluster:
id: 809daa5d-0eb4-4eff-a88a-5b1892601411
health: HEALTH_WARN
Reduced data availability: 32 pgs incomplete
services:
mon: 1 daemons, quorum ceph1
mgr: ceph1(active)
osd: 6 osds: 6 up, 6 in
data:
pools: 2 pools, 96 pgs
objects: 0 objects, 0 B
usage: 6.1 GiB used, 114 GiB / 120 GiB avail
pgs: 33.333% pgs not active
64 active+clean
32 creating+incomplete
#自己搭建的测试环境中pg创建一直未完成,因此换到红帽的ceph环境中继续练习,以下是红帽的ceph练习环境
[ceph@serverc ~]$ ceph health
HEALTH_OK
[ceph@serverc ~]$
[ceph@serverc ~]$
[ceph@serverc ~]$ rados -p myecpool put mytest /usr/share/dict/words
[ceph@serverc ~]$
[ceph@serverc ~]$
[ceph@serverc ~]$ ceph df
GLOBAL:
SIZE AVAIL RAW USED %RAW USED
170G 169G 1077M 0.62
POOLS:
NAME ID USED %USED MAX AVAIL OBJECTS
...
myecpool 17 4837k 0 99059M 1
[ceph@serverc ~]$
[ceph@serverc ~]$
[ceph@serverc ~]$ rados -p myecpool get mytest /tmp/words
[ceph@serverc ~]$
[ceph@serverc ~]$
[ceph@serverc ~]$ diff /tmp/words /usr/share/dict/words
#如果diff命令不产生输出,则这两个文件是相同的。
[ceph@serverc ~]$