一、概述
Ceph 是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供**块存储服务(rbd)*、*对象存储服务(rgw) 以及 文件系统存储服务(cephfs),Ceph 在存储的时候充分利用存储节点的计算能力,在存储每一个数据时都会通过计算得出该数据的位置,尽量的分布均衡。目前也是 OpenStack 的主流后端存储。
关于 Ceph 更详细的介绍和环境部署可以参考这篇文章:分布式存储系统 Ceph 介绍与环境部署
二、cephadm 工具的使用 cephadm 官方文档
1)cephadm 工具的介绍
cephadm 是用于管理 Ceph 集群的实用程序或者是管理工具。
Cephadm 的目标是提供一个功能齐全、健壮且维护良好的安装和管理层,可供不在 Kubernetes 中运行 Ceph 的任何环境使用。具体特性如下:
将所有组件部署在容器中 —— 使用容器简化了不同发行版之间的依赖关系和打包复杂度。当然,我们仍在构建 RPM 和 Deb 软件包,但是随着越来越多的用户过渡到 cephadm(或 Rook)并构建容器,我们看到的特定于操作系统的 bug 就越少。
与 Orchestrator API 紧密集成 —— Ceph 的 Orchestrator 界面在 cephadm 的开发过程中得到了广泛的发展,以匹配实现并清晰地抽象出 Rook 中存在的(略有不同)功能。最终结果是不管是看起来还是感觉都像 Ceph 的一部分。
不依赖管理工具 ——Salt 和 Ansible 之类的工具在大型环境中进行大规模部署时非常出色,但是使 Ceph 依赖于这种工具意味着用户还需要学习该相关的软件。更重要的是,与专为管理 Ceph 而专门设计的部署工具相比,依赖这些工具(Salt 和 Ansible 等)的部署最终可能变得更加复杂,难以调试并且(最显着)更慢。
最小的操作系统依赖性 —— Cephadm 需要Python 3
,LVM
和container runtime(Podman或Docker)
。任何当前的 Linux 发行版都可以。
将群集彼此隔离 —— 支持多个 Ceph 集群同时存在于同一主机上一直是一个比较小众的场景,但是确实存在,并且以一种健壮,通用的方式将集群彼此隔离,这使得测试和重新部署集群对于开发人员和用户而言都是安全自然的过程。
自动升级 —— 一旦 Ceph“拥有”自己的部署方式,它就可以以安全和自动化的方式升级 Ceph。
从“传统”部署工具轻松迁移 ——我们需要从现有工具(例如 ceph-ansible,ceph-deploy 和 DeepSea)中现有的 Ceph 部署轻松过渡到 cephadm。
以下是一些事情的列表 cephadm 可以做:
cephadm 可以将 Ceph 容器添加到集群。
cephadm 可以从集群中移除 Ceph 容器。
cephadm 可以更新 Ceph 容器。
2)cephadm 安装 1 2 3 4 5 6 7 8 9 10 11 12 13 mkdir -p /opt/ceph/my-cluster ; cd /opt/ceph/my-clustercurl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm -o cephadm chmod +x cephadm./cephadm install ceph-common ceph ./cephadm install which cephadmwhich cephcephadm --help
3)cephadm 常用命令使用 一般使用 cephadm 用作环境初始化,其它的操作交由 ceph 工具完成,常用命令如下:
cephadm 模型有一个简单的“ Bootstrap ”步骤,该步骤从命令行启动,该命令行在本地主机上启动一个最小的 Ceph 群集(一个 monitor 与 manager 守护程序)。然后,使用 orchestrator 命令部署集群的其余部分,以添加其他主机,使用存储设备并为集群服务部署守护程序。
1 2 3 4 5 6 7 8 9 ./cephadm add-repo --release octopus cephadm bootstrap --help cephadm bootstrap --mon-ip 192.168.182.130
4)启用 ceph shell cephadm 命令一般只是作为部署的引导作用。但是,我们建议启用对 ceph 命令,因为 ceph 命令更加简洁强大。
1 2 3 4 5 6 7 8 cephadm shell cephadm shell ceph status cephadm shell ceph -s
您可以安装 ceph-common
包,其中包含所有 Ceph 命令,包括 ceph, rbd, mount.ceph (用于安装 CephFS 文件系统)等:
1 2 3 4 cephadm add-repo --release quincy cephadm install ceph-common cephadm install ceph
接下来就可以开心的使用 ceph 命令部署软件等等。
三、ceph 命令使用 上面我们已经安装了 ceph 的全家桶,这里就不重复了。
1)添加新节点 1 2 3 4 5 6 7 8 9 ceph orch host add local-168-182-131 ceph orch host add local-168-182-132 ceph orch host add local-168-182-131 192.168.182.133 ceph orch host ls
2)使用 ceph 安装软件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ceph orch apply mon local-168-182-130,local-168-182-131,local-168-182-132 ceph orch device ls ceph orch apply osd --all-available-devices ceph orch daemon add osd local-168-182-130:/dev/sdb ceph orch daemon add osd local-168-182-130:/dev/sdc ceph orch daemon add osd local-168-182-131:/dev/sdb ceph orch daemon add osd local-168-182-131:/dev/sdc ceph orch daemon add osd local-168-182-132:/dev/sdb ceph orch daemon add osd local-168-182-132:/dev/sdc ceph orch apply mds myfs --placement="3 local-168-182-130 local-168-182-131 local-168-182-132" ceph orch apply rgw myorg us-east-1 --placement="3 local-168-182-130 local-168-182-131 local-168-182-132" ceph orch apply mgr local-168-182-130,local-168-182-131,local-168-182-132
删除 OSD 节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ceph osd stop x //(x 可以通过ceph osd ls 查看) ceph osd out osd.x ceph osd crush remove osd.x ceph osd rm osd.x ceph auth del osd.x
查看服务
1 2 3 4 5 ceph orch ps ceph orch ps --daemon-type alertmanager ceph orch ps --daemon-type osd
3)主机操作 1、列出主机
2、添加主机 要将每个新主机添加到群集,请执行以下步骤:
【1】在新主机的根用户的 authorized_keys 文件:
1 2 ssh-copy-id -f -i /etc/ceph/ceph.pub root@192.168.182.133
1 2 3 ceph orch host add local-168-182-130 192.168.182.130
还可以包含一个或多个标签以立即标记 新主机。
1 ceph orch host add local-168-182-130 192.168.182.130 --labels _admin
3、删除主机 删除所有守护程序后,可以安全地从集群中移除主机 从它。
【1】要从主机中排出所有守护程序,请运行以下形式的命令:
1 2 3 4 5 6 7 8 9 ceph orch host drain local-168-182-130 ceph orch osd rm status ceph orch ps local-168-182-130
【2】删除所有守护程序后,可以使用以下命令删除主机:
1 2 ceph orch host rm local-168-182-130
如果主机处于脱机状态且无法恢复,仍可以通过以下方法将其从群集中移除:
1 2 ceph orch host rm local-168-182-130 --offline --force
4、主机标签 业务流程协调程序支持将标签分配给主机。标签 是自由形式的,本身和每个主机都没有特定的含义 可以有多个标签。它们可用于指定放置 的守护进程。
1 2 3 4 5 ceph orch host add local-168-182-130 --labels=my_label1,my_label2 ceph orch host label add local-168-182-130 my_label
1 2 ceph orch host label rm local-168-182-130 my_label
特殊主机标签 以下宿主标签对头孢具有特殊含义。一切始于 _.
_no_schedule
: 不要在此主机上调度或部署守护程序.
此标签可防止 cephadm 在此主机上部署守护程序。如果它被添加到 已经包含 Ceph 守护进程的现有主机,将导致 cephadm 移动 其他位置的守护程序(OSD 除外,不会自动删除)。
_no_autotune_memory
: 不自动调整此主机上的内存.
此标签将阻止守护程序内存被调整,即使 osd_memory_target_autotune 或为一个或多个守护程序启用类似选项 在该主机上。
_admin
: 将 client.admin 和 ceph.conf 分发到此主机.
默认情况下,一个_admin
标签应用于群集中的第一个主机(其中 引导程序最初是运行的),并且 client.admin
密钥设置为分发 到该主机通过 功能。添加此标签 到其他主机通常会导致 CEPHADM 部署配置和密钥环文件 在 .从版本 16.2.10 和 17.2.1 开始 添加到默认位置 Cephadm 还存储配置和密钥环 文件中的文件 目录。ceph orch client-keyring .../etc/ceph/etc/ceph//var/lib/ceph/<fsid>/config
4)维护模式 将主机置于维护模式和退出维护模式(停止主机上的所有 Ceph 守护进程):
1 2 3 4 5 6 7 ceph orch host maintenance enter local-168-182-130 ceph orch host maintenance exit local-168-182-130
5)查看服务状态 查看一个的状态 在 Ceph 集群中运行的服务中,执行以下操作:
1 2 3 4 5 6 7 ceph orch ls ceph orch ls alertmanager ceph orch ls --service_name crash
6)查看守护进程状态 首先,打印业务流程协调程序已知的所有守护程序的列表:
1 2 3 4 5 ceph orch ps ceph orch ps --daemon_type osd --daemon_id 0
7)OSD 服务 1、列出设备 ceph-volume 按顺序不时扫描群集中的每个主机 确定存在哪些设备以及它们是否有资格 用作 OSD。
查看列表,运行以下命令:
1 2 3 4 5 ceph orch device ls ceph orch device ls --wide
在上面的示例中,您可以看到名为“运行状况”、“标识”和“故障”的字段。此信息通过与 libstoragemgmt.默认情况下, 此集成已禁用(因为 libstoragemgmt 可能不是 100% 与您的硬件兼容)。要使 cephadm 包括这些字段, 启用 CEPHADM 的“增强设备扫描”选项,如下所示;
1 ceph config set mgr mgr/cephadm/device_enhanced_scan true
2、创建新的 OSD 有几种方法可以创建新的 OSD:
【1】告诉 Ceph 使用任何可用和未使用的存储设备:
1 2 ceph orch apply osd --all-available-devices
1 2 3 4 5 6 7 8 9 10 11 ceph orch daemon add osd local-168-182-133:/dev/sdb ceph orch daemon add osd local-168-182-133:/dev/sdc ceph orch daemon add osd local-168-182-133:data_devices=/dev/sdb,/dev/sdc ceph orch daemon add osd host1:/dev/vg_osd/lvm_osd1701
1 2 3 ceph orch apply osd --all-available-devices --dry-run
3、移除 OSD 从集群中删除 OSD 涉及两个步骤:
从集群中撤出所有归置组 (PG)
从集群中删除无 PG 的 OSD
以下命令执行这两个步骤:
4、监控 OSD 删除的状态
5、停止删除 OSD 1 2 ceph orch osd rm stop 4
6、激活现有 OSD 如果重新安装主机的操作系统,则需要激活现有的 OSD 再。对于此用例,cephadm 提供了一个包装器 激活 那 激活主机上的所有现有 OSD。
1 2 ceph cephadm osd activate local-168-182-133
7、查看数据延迟
8、详细列出集群每块磁盘的使用情况
8)pool 相关操作 1、查看 ceph 集群中的 pool 数量 1 2 3 ceph osd lspools ceph osd pool ls
2、在 ceph 集群中创建一个 pool 1 2 ceph osd pool create rbdtest 100
9)PG 相关 PG =“放置组”。当集群中的数据,对象映射到编程器,被映射到这些 PGS 的 OSD。
1、查看 pg 组的映射信息
2、查看一个 PG 的 map
3、查看 PG 状态
4、显示一个集群中的所有的 pg 统计 1 ceph pg dump --format plain
这里只是列举了一些常用的操作命令,更多的命令可以查看帮助或者查看官方文档。
四、实战操作演示 1)块存储使用(RDB )
1、 使用 create 创建 pool 池 1 2 3 4 5 6 7 ceph osd lspools ceph osd pool create ceph-demo 64 64
【温馨提示】PG (Placement Group),pg 是一个虚拟的概念,用于存放 object,PGP(Placement Group for Placement purpose),相当于是 pg 存放的一种 osd 排列组合。
获取 pool 池属性信息,可以重新设置,有很多参数,都可以如下设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ceph osd pool get ceph-demo pg_num ceph osd pool get ceph-demo pgp_num ceph osd pool get ceph-demo size ceph osd pool get ceph-demo crush_rule ceph osd pool set ceph-demo size 2 ceph osd pool set ceph-demo pg_num 128 ceph osd pool set ceph-demo pgp_num 128
2、需要初始化 pool
3、创建 rbd 块设备 1 2 3 4 5 6 7 8 rbd -p ceph-demo ls rbd create -p ceph-demo --image rbd-demo.img --size 10G rbd create ceph-demo/rbd-demo2.img --size 10G rbd -p ceph-demo ls
4、查看块设备信息 1 rbd info ceph-demo/rbd-demo2.img
5、删除块设备 1 rbd rm -p ceph-demo --image rbd-demo2.img
6、设备挂载 由于没有虚拟机进行挂载,所以需要使用内核 map 进行挂载;
1 rbd map ceph-demo/rbd-demo.img
[root@local-168-182-130 ceph]# rbd map ceph-demo/rbd-demo.img rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported
by the kernel with “rbd feature disable ceph-demo/rbd-demo.img object-map fast-diff deep-flatten”. In some cases useful info is found in syslog - try “dmesg | tail”. rbd: map failed
: (6) No such device or address
映射的过程当中出现错误,这是因为 Centos7 当中不支持这几个特性,我们可以在创建时指定 features 。
1 2 3 4 5 rbd feature disable ceph-demo/rbd-demo.img deep-flatten rbd feature disable ceph-demo/rbd-demo.img fast-diff rbd feature disable ceph-demo/rbd-demo.img object-map rbd feature disable ceph-demo/rbd-demo.img exclusive-lock
再次挂载,挂载成功
1 rbd map ceph-demo/rbd-demo.img
查看设备列表
通过 fdisk 查看设备列表
使用 rbd 设备
1 2 3 4 5 6 mkfs.ext4 /dev/rbd0 mkdir /mnt/rbd-demomount /dev/rbd0 /mnt/rbd-demo/
7、块设备扩容 设备可以扩容,也可以缩容,但不建议使用缩容,有可能产生数据丢失。
1 2 3 4 5 6 rbd resize ceph-demo/rbd-demo.img --size 10G rbd -p ceph-demo info --image rbd-demo.img lsblk
8、卸载
2)文件系统使用(CephFS)
1、查看 ceph 文件系统
2、创建存储池 1 2 3 4 5 ceph osd pool create cephfs_data 128 ceph osd pool create cephfs_metadata 128
【温馨提示】PG (Placement Group),pg 是一个虚拟的概念,用于存放 object,PGP(Placement Group for Placement purpose),相当于是 pg 存放的一种 osd 排列组合。
3、创建文件系统 1 2 3 4 5 ceph fs new 128 cephfs_metadata cephfs_data ceph fs ls ceph mds stat
4、查看存储池配额 1 ceph osd pool get-quota cephfs_metadata
5、内核驱动挂载 ceph 文件系统 【1】创建挂载点
【2】获取存储密钥,如果没有前往管理节点重新复制
1 2 3 4 5 6 7 cat /etc/ceph/ceph.client.admin.keyringvim /etc/ceph/admin.secret
【3】挂载
1 2 3 mount -t ceph 192.168.182.130:6789:/ /mnt/mycephfs -o name=admin,secretfile=/etc/ceph/admin.secret
【4】卸载
6、常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ceph osd pool get [存储池名称] size ceph osd pool set [存储池名称] size 3 ceph osd lspools ceph osd pool create [存储池名称] [pg_num的取值] ceph osd pool rename [旧的存储池名称] [新的存储池名称] ceph osd pool get [存储池名称] pg_num ceph osd pool get [存储池名称] pgp_num ceph osd pool set [存储池名称] pg_num [pg_num的取值] ceph osd pool set [存储池名称] pgp_num [pgp_num的取值]
3)对象存储使用(RGW) rados
是和 Ceph 的对象存储集群(RADOS),Ceph 的分布式文件系统的一部分进行交互是一种实用工具。
1、查看 ceph 集群中有多少个 pool
2、显示整个系统使用率
3、创建一个 pool 1 ceph osd pool create test
4、创建一个对象 object 1 rados create test-object -p test
5、查看对象文件
6、删除一个对象 1 rados rm test-object -p test
7、通过 api 接口使用 Ceph 存储存储 为了使用 Ceph SGW REST 接口, 我们需要为 S3 接口初始化一个 Ceph 对象网关用户. 然后为 Swif 接口新建一个子用户,最后就可以通过创建的用户访问对象网关验证了。
ceph-restful-api 官方文档
这里使用radosgw-admin
,radosgw-admin
是 RADOS 网关用户管理工具,可用于创建和修改用户。
【1】创建 S3 网关用户
1 radosgw-admin user create --uid="rgwuser" --display-name="This is first rgw test user"
info
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 { "user_id" : "rgwuser" , "display_name" : "This is first rgw test user" , "email" : "" , "suspended" : 0 , "max_buckets" : 1000 , "subusers" : [ ] , "keys" : [ { "user" : "rgwuser" , "access_key" : "48AIAPCYK7S4X9P72VOW" , "secret_key" : "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX" } ] , "swift_keys" : [ ] , "caps" : [ ] , "op_mask" : "read, write, delete" , "default_placement" : "" , "default_storage_class" : "" , "placement_tags" : [ ] , "bucket_quota" : { "enabled" : false , "check_on_raw" : false , "max_size" : -1 , "max_size_kb" : 0 , "max_objects" : -1 } , "user_quota" : { "enabled" : false , "check_on_raw" : false , "max_size" : -1 , "max_size_kb" : 0 , "max_objects" : -1 } , "temp_url_keys" : [ ] , "type" : "rgw" , "mfa_ids" : [ ] }
【2】测试访问 S3 接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 yum install python-boto -y import boto import boto.s3.connection access_key = '48AIAPCYK7S4X9P72VOW' secret_key = 'oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX' conn = boto.connect_s3( aws_access_key_id = access_key, aws_secret_access_key = secret_key, host = 'local-168-182-130' , port=80, is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.create_bucket('my-first-s3-bucket' ) for bucket in conn.get_all_buckets(): print "{name}\t{created}" .format( name = bucket.name, created = bucket.creation_date, )
【温馨提示】这里使用了 python-boto 包,使用认证信息连接 S3,然后创建了一个 my-first-s3-bucket 的 bucket,最后列出所有已创建的 bucket,打印名称和创建时间。
【3】创建 Swift 用户
1 2 radosgw-admin subuser create --uid=rgwuser --subuser=rgwuser:swift --access=full
info
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 { "user_id" : "rgwuser" , "display_name" : "This is first rgw test user" , "email" : "" , "suspended" : 0 , "max_buckets" : 1000 , "subusers" : [ { "id" : "rgwuser:swift" , "permissions" : "full-control" } ] , "keys" : [ { "user" : "rgwuser" , "access_key" : "48AIAPCYK7S4X9P72VOW" , "secret_key" : "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX" } ] , "swift_keys" : [ { "user" : "rgwuser:swift" , "secret_key" : "6bgDOAsosiD28M0eE8U1N5sZeGyrhqB1ca3uDtI2" } ] , "caps" : [ ] , "op_mask" : "read, write, delete" , "default_placement" : "" , "default_storage_class" : "" , "placement_tags" : [ ] , "bucket_quota" : { "enabled" : false , "check_on_raw" : false , "max_size" : -1 , "max_size_kb" : 0 , "max_objects" : -1 } , "user_quota" : { "enabled" : false , "check_on_raw" : false , "max_size" : -1 , "max_size_kb" : 0 , "max_objects" : -1 } , "temp_url_keys" : [ ] , "type" : "rgw" , "mfa_ids" : [ ] }
【4】创建密钥
1 2 3 radosgw-admin key create --subuser=rgwuser:swift --key-type=swift --gen-secret
info
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 { "user_id" : "rgwuser" , "display_name" : "This is first rgw test user" , "email" : "" , "suspended" : 0 , "max_buckets" : 1000 , "subusers" : [ { "id" : "rgwuser:swift" , "permissions" : "full-control" } ] , "keys" : [ { "user" : "rgwuser" , "access_key" : "48AIAPCYK7S4X9P72VOW" , "secret_key" : "oC5qKL0BMMzUJHAS76rQAwIoJh4s6NwTnLklnQYX" } ] , "swift_keys" : [ { "user" : "rgwuser:swift" , "secret_key" : "AVThl3FGiVQW3VepkQl4Wsoyq9lbPlLlpKhXLhtR" } ] , "caps" : [ ] , "op_mask" : "read, write, delete" , "default_placement" : "" , "default_storage_class" : "" , "placement_tags" : [ ] , "bucket_quota" : { "enabled" : false , "check_on_raw" : false , "max_size" : -1 , "max_size_kb" : 0 , "max_objects" : -1 } , "user_quota" : { "enabled" : false , "check_on_raw" : false , "max_size" : -1 , "max_size_kb" : 0 , "max_objects" : -1 } , "temp_url_keys" : [ ] , "type" : "rgw" , "mfa_ids" : [ ] }
【5】测试访问 Swift 接口
1 2 3 4 5 6 yum install python-pip -y pip install --upgrade python-swiftclient swift -A http://192.168.182.130/auth/1.0 -U rgwuser:swift -K 'AVThl3FGiVQW3VepkQl4Wsoyq9lbPlLlpKhXLhtR' list
【5】S3 相关操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 radosgw-admin user rm --uid=rgwuser radosgw-admin caps add --uid=rgwuser --caps="users=*" radosgw-admin caps add --uid=rgwuser --caps="usage=read,write" radosgw-admin subuser rm --subuser=rgwuser:swift radosgw-admin bucket list radosgw-admin bucket stats --bucket=my-first-s3-bucket
一般是通过 api 接口使用对象存储。