Ceph

作者: 想成为大师的学徒小纪 | 来源:发表于2022-04-23 00:26 被阅读0次

    一、简介

    Ceph 是一个开源的分布式存储系统。

    可靠的自主分布式对象存储(RADOS

    统一存储(支持多种类型,根据使用场景选择),提供对象,块和文件存储。

    Ceph 特点:

    • 高扩展性:使用普通x86服务器,支持10~1000台服务器,支持TB到PB级的扩展。

    • 高可靠性:没有单点故障,多数据副本,自动管理,自动修复。

    • 高性能:数据分布均衡,并行化度高。对于objects storage和block storage,不需要元数据服务器。

    硬件推荐

    架构

    Ceph 高度可靠、易于管理且免费。

    Ceph 提供了一个基于 RADOS 的可无限扩展的Ceph 存储集群

    模块名称 功能描述
    RADOS RADOS(Reliable Autonomic Distributed Object Store,RADOS)是Ceph存储集群的基础。Ceph中的一切都以对象的形式存储,而RADOS就负责存储这些对象,而不考虑它们的数据类型。RADOS层确保数据一致性和可靠性。对于数据一致性,它执行数据复制、故障检测和恢复,还包括数据在集群节点间的recovery。
    OSD 实际存储数据的进程。通常一个OSD daemon绑定一个物理磁盘。Client write/read数据最终都会走到OSD去执行write/read操作。
    MON Monitor在Ceph集群中扮演者管理者的角色,维护了整个集群的状态,是Ceph集群中最重要的组件。MON保证集群的相关组件在同一时刻能够达成一致,相当于集群的领导层,负责收集、更新和发布集群信息。为了规避单点故障,在实际的Ceph部署环境中会部署多个MON,同样会引来多个MON之前如何协同工作的问题。
    MGR MGR目前的主要功能是一个监控系统,包含采集、存储、分析(包含报警)和可视化几部分,用于把集群的一些指标暴露给外界使用。
    MDS Ceph元数据服务器,跟踪文件层次结构并存储只供CephFS使用的元数据。Ceph块设备和RADOS网关不需要元数据。MDS不直接给Client提供数据服务。
    Librados 简化访问RADOS的一种方法,目前支持PHP、Ruby、Java、Python、C和C++语言。它提供了Ceph存储集群的一个本地接口RADOS,并且是其他服务(如RBD、RGW)的基础,此外,还为CephFS提供POSIX接口。Librados API支持直接访问RADOS,使开发者能够创建自己的接口来访问Ceph集群存储。
    RBD Ceph块设备,对外提供块存储。可以像磁盘一样被映射、格式化和挂载到服务器上。
    RGW Ceph对象网关,提供了一个兼容S3和Swift的RESTful API接口。RGW还支持多租户和OpenStack的Keystone身份验证服务。
    CephFS 提供了一个任意大小且兼容POSlX的分布式文件系统。CephFS依赖Ceph MDS来跟踪文件层次结构,即元数据。

    CRUSH 算法 ?

    Ceph把客户端的数据以对象的形式存储到了存储池里。利用CRUSH算法,Ceph可以计算出安置组所包含的对象,并能进一步计算出Ceph OSD集合所存储的安置组。CRUSH算法能够使Ceph存储集群拥有动态改变大小、再平衡和数据恢复的能力。

    存储类型对比

    类型 使用场景 优点 缺点
    块存储(RBD) 容器、虚拟机磁盘存储分配,日志、文件储存 数据冗余;廉价;硬盘组合提高容量,提升读写效率 无法共享数据;采用SAN架构组网时,光纤交换机,造价成本高。
    文件存储(CephFS) 日志存储,FTP,NFS,文件存储 造价低,方便共享 读写速率低;传输速率慢
    对象存储(RGW) 图片、视频存储 块设备的效率,文件存储的共享特性

    Ceph 对比其他集群架构优势

    Pools

    Pools 是用于存储对象的逻辑分区。规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code)

    Ceph 将数据作为对象存储在逻辑存储池中。使用 CRUSH算法,Ceph 计算出哪个归置组应该包含该对象,并进一步计算出哪个 Ceph OSD Daemon 应该存储该归置组。CRUSH 算法使 Ceph 存储集群能够动态扩展、重新平衡和恢复。

    # 列出集群池
    ceph osd lspools
    
    # 创建
    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>]
    
    # 修改 ceph osd pool set {pool-name} {key} {value}
    ceph osd pool set {pool-name} pg_num {pg_num}
    
    # 设置每个池的最大字节数和/或最大对象数设置池配额。
    ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
    ceph osd pool set-quota data max_objects 10000
    
    # 删除 pools,监视器的配置中将 mon_allow_pool_delete 标志设置为 true。否则他们将拒绝移除游泳池。
    ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
    
    # ceph 查看存储池利用率
    rados df
    # 获取特地池的I/O信息
    ceph osd pool stats [{pool-name}]
    
    # 重命名池
    ceph osd pool rename {current-pool-name} {new-pool-name}
    
    # 创建快照
    ceph osd pool mksnap {pool-name} {snap-name}
    # 删除快照
    ceph osd pool rmsnap {pool-name} {snap-name}
    

    Erasure-code

    创建 Pool 默认是复制,该类型可以用来代替 replicated 以节省空间。类似于 RAID5

    erasure pool 将每个对象存储为K+M块。它分为 K数据块和M编码块。该池被配置为具有大小,K+M以便每个块都存储在代理集中的 OSD 中。块的等级存储为对象的属性。

    默认情况适用于 RGW。

    Erasure-coding

    Erasure-code-profile

    # 创建 erasure pool 
    ceph osd pool create ecpool erasure
    
    # 默认纠删码配置文件支持丢失两个 OSD。相当于一个大小为 3 的复制池,存储 1TB 的是数据要 2TB 而不是 3TB。
    ceph osd erasure-code-profile get default
    k=2
    m=2
    plugin=jerasure
    technique=reed_sol_van
    
    # 正确配置,创建 pool 后无法修改,最重要的参数是K、M和 crash-failure-domain,因为它们定义了存储开销和数据持久性。
    $ ceph osd erasure-code-profile set myprofile \
       k=3 \  # 对象将在三个(被划分K = 3)
       m=2 \  # M 的值定义了可以同时丢失多少 OSD 而不会丢失任何数据。
       crush-failure-domain=rack # 创建一个 CRUSH 规则,以确保没有两个块存储在同一个机架中。
    $ ceph osd pool create ecpool erasure myprofile
    $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
    $ rados --pool ecpool get NYAN -
    ABCDEFGHI
    
    # 获取配置文件名称 {name}
    ceph osd erasure-code-profile ls
    
    # 获取配置文件
    ceph osd erasure-code-profile get {name}
    
    # 删除配置文件
    ceph osd erasure-code-profile rm {name}
    

    PG

    PG是 Ceph 如何分发数据的内部实现细节。每个池都有多个归置组。CRUSH 动态地将 PG 映射到 OSD。

    放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略;简单点说就是相同PG内的对象都会放到相同的硬盘上;

    PG ID

    Ceph 客户端将计算对象应该在哪个归置组中。它通过散列对象 ID 并根据定义的池中 PG 的数量和池的 ID 应用操作来实现这一点。

    1. 客户端输入池名称和对象 ID。(例如,pool = “liverpool” 和 object-id = “john”)

    2. Ceph 获取对象 ID 并对其进行哈希处理。

    3. Ceph 以 PG 的数量为模计算哈希。(例如,58)获得PG ID。

    4. Ceph 根据池名称获取池 ID(例如,“liverpool” = 4

    5. Ceph 将池 ID 附加到 PG ID(例如,4.58)。

    计算 PG

    How Data Is Stored In CEPH Cluster

    # 每个 pool 的 pg 数目计算,同样要取最接近的 2 的幂。
    Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count
    
                            (OSDs * 100)
    Total PGs = ------------
                  Replicas
    # 官方例子,200 个 OSD 和 3个副本集的 pool,计算 PG 数量
    (200×100)/ 3=6667.2 的最近幂:8192
    

    PG 配置参考

    基础操作

    # 创建 pool,如果有 50 个以上的 OSD,每个 OSD 大约 50 个 PG 的值可能是合理的。
    ceph osd pool create {pool-name} [pg_num]
    
    # 每个pools、其相对利用率以及对PG计数 
    ceph osd pool autoscale-status
    
    # 更改归置组的数量
    ceph osd pool set {pool-name} pg_num {pg_num}
    ceph osd pool set {pool-name} pgp_num {pgp_num}
    # 获取池中归置组的数量
    ceph osd pool get {pool-name} pg_num
    # 获取 PG 的统计信息
    ceph pg dump --format {plain|json}
    # 获取特定归置组的归置组映射
    ceph pg map {pg-id}
    
    # 清理 PG
    ceph pg scrub {pg-id}
    # 特定池中清除所有归置组
    ceph osd pool scrub {pool-name}
    
    # 设置每个 OSD 的目标 PG 数量(默认:100)
    ceph config set global mon_target_pg_per_osd 100
    
    # 设置自动缩放模式 pg_autoscale_mode (off|on|warn)
    # 设置 pool 默认值 ceph config set global osd_pool_default_pg_autoscale_mode <mode>
    # off: 禁用此池的自动缩放
    # on: 启用自动缩放
    # warn: 健康警报
    ceph osd pool set <pool-name> pg_autoscale_mode <mode>
    
    # 设置 pool 使用率,mypool 预计将消耗 100 TiB 的空间
    ceph osd pool set mypool target_size_bytes 100T
    ceph osd pool set mypool target_size_ratio 1.0
    

    CephX

    为了识别用户并防止中间人攻击,Ceph 提供了其cephx身份验证系统来对用户和守护程序进行身份验证。

    cephx 协议不涉及传输中的数据加密(例如 SSL/TLS)或静态加密。

    # 1.创建client.admin密钥,会覆盖现在有的密钥。对已有的集群不建议执行
    ceph auth get-or-create client.admin mon 'allow *' mds 'allow *' mgr 'allow *' osd 'allow *' -o /etc/ceph/ceph.client.admin.keyring
    
    # 2.为 MON 密钥环并生成一个监视器密钥。集群的每个 MON 都需要ceph-{$id}/keyring
    ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
    
    # 3.为 MGR 生成一个秘钥。
    ceph auth get-or-create mgr.{$id} mon 'allow profile mgr' mds 'allow *' osd 'allow *' -o /var/lib/ceph/mgr/ceph-{$id}/keyring
    
    # 4.为 OSD 生成一个秘钥。
    ceph auth get-or-create osd.{$id} mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-{$id}/keyring
    
    # 5.为 MDS 生成一个秘钥。
    ceph auth get-or-create mds.{$id} mon 'allow rwx' osd 'allow *' mds 'allow *' mgr 'allow profile mds' -o /var/lib/ceph/mds/ceph-{$id}/keyring
    
    # 配置文件中 ceph.conf 禁用 CephX
    auth_cluster_required = none
    auth_service_required = none
    auth_client_required = none
    
    # 启动当前机器所有 ceph 服务
    systemctl start ceph.target
    

    Ceph 协议

    Ceph 客户端

    Ceph Bluestore

    REFERNECE-bluestore-config

    Ceph 后端存储引擎

    从 Ceph Luminous v12.2.z 开始,默认采用了新型的 BlueStore 作为 Ceph OSD 后端,用于管理存储磁盘。

    传统的 Ceph OSD 是将数据存储到现有的文件存储模块,例如XFS文件系统。但是这样的性能开销较大,因为需要实现 Ceph 数据到 POSIX 的转换。

    BlueStore 是在底层裸块设备上建立的存储系统,内建了 RocksDB key/value 数据库用于管理内部元数据。一个小型的内部接口组件称为 BludFS 实现了类似文件系统的接口,以便提供足够功能让 RocksDB 来存储它的"文件"并向 BlueStroe 共享相同的裸设备。

    BlueStore 的优势:

    • 对于大型写入操作,避免了原先 FileStore 的两次写入 (注意,很多FileStore将journal日志存放到独立到SSD上,也能够获得类似的性能提升,不过分离journal的部署方式是绕开FileStore的短板)

    • 对于小型随机写入,BlueStore 比 FileStore with journal 性能还要好

    • 对于 Key/value 数据 BlueStore 性能明显提升

    • 当集群数据接近爆满时,BlueStore 避免了 FileStore 的性能陡降问题

    • 在 BlueStore 上使用 raw 库的小型顺序读性能有降低,和 BlueStore 不采用预读 (readahead) 有关,但可以通过上层接口(如 RBD 和 CephFS )来实现性能提升

    • BlueStore 在 RBD 卷或 CephFS 文件中采用了 copy-on-write 提升了性能

    Firestore 的问题:

    • 数据前需要先写journal,会有一倍的写放大;

    • filestore一开始只是对于SATA/SAS这一类机械盘进行设计的,没有专门针对SSD这一类的Flash介质盘做考虑。

    组件

    一个Ceph存储集群要求至少有一个Ceph监视器和两个Ceph OSD守护进程。当运行Ceph文件系统客户端时,必须要有Ceph元数据服务器。

    • 块存储:通过RBD,支持精简配置、快照、克隆 。

    • 读写快,不利于共享

    • 文件存储:通过CEPHFS ,Posix接口,支持快照 。

    • 读写慢,利于共享

    • 对象存储:通过RADOSGW

    • 读写快,利于共享

    • 原生存储:通过LIBRADOS 库

    1.Monitors (ceph-mon)

    HA ceph-mon > 3

    只维护集群的主副本,对CPU需求不高。

    • 维护集群状态的映射,包括 Maps

      • Monitor Map:包含fsid每个监视器的集群、位置、名称地址和端口。它还指示当前时期、地图创建时间以及上次更改时间。要查看监视器映射,请执行。`ceph mon dump

      • OSD Map:包含集群fsid、映射创建和上次修改的时间、池列表、副本大小、PG 编号、OSD 列表及其状态(例如upin)。要查看 OSD 地图,请执行 。ceph osd dump

      • PG Map:包含 PG 版本、它的时间戳、最后一个 OSD 映射 epoch、完整比率以及每个归置组的详细信息,例如 PG ID、Up Set、Acting Set、PG 的状态(例如, ) 和每个池的数据使用统计信息。active + clean

      • CRUSH Map:包含存储设备列表、故障域层次结构(例如,设备、主机、机架、行、房间等)以及存储数据时遍历层次结构的规则。要查看 CRUSH 地图,请执行 ; 然后,通过执行反编译它 。您可以在文本编辑器中或使用.ceph osd getcrushmap -o {filename}``crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}``cat

      • MDS Map:包含当前 MDS 地图时期、地图创建时间以及上次更改时间。它还包含用于存储元数据的池、元数据服务器列表以及哪些元数据服务器是upin。要查看 MDS 映射,请执行。ceph fs dump

    • Ceph 守护进程通过这些集群状态相互协调。

    • 负责管理守护进程和客户端之间的身份验证。

    2.Manager (ceph-mgr)

    HA ceph-mgr > 2

    • 负责跟踪运行时指标和 Ceph 集群的当前状态,包括存储利用率、当前性能指标和系统负载。

    3.OSDs (ceph-osd)

    REFERNECE-osd-config

    HA ceph-osd > 3

    Ceph OSD 守护进程将数据作为对象存储在平面命名空间中。

    • cpu密集型,运行RADOS服务,使用CRUSH计算数据放置,复制数据,维护集群映射副本。

    OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程。

    • 创建存储池命令最后的两个数字,比如ceph osd pool create default.rgw.buckets.data 1024 1024中的两个1024分别代表存储池的pg_num和pgp_num,即存储池对应的pg数量。Ceph官方文档建议整个集群所有存储池的pg数量之和大约为:(OSD数量 * 100)/数据冗余因数,数据冗余因数对副本模式而言是副本数,对EC模式而言是数据块+校验块之和。例如,三副本模式是3,EC4+2模式是6。

    • 此处整个集群3台服务器,每台服务器15个OSD,总共45个OSD,按照上述公式计算应为1500,一般建议pg数取2的整数次幂。由于default.rgw.buckets.data存放的数据量远大于其他几个存储池的数据量,因此该存储池也成比例的分配更多的pg。

    综上,default.rgw.buckets.data的pg数量取1024,default.rgw.buckets.index的pg数量取128或者256。

    • 对象存储守护进程,存储数据,处理数据复制,恢复,平衡。

    • 获取心跳信息为 ceph-mon 和 ceph-mgr 提供些监视信息。

    4.MDS (ceph-mds)

    CephFS 使用元数据来存储文件属性

    • cpu密集型,动态分配负载
    • 代表 Ceph 文件系统存储元数据(对象存储和块设备不使用),允许POSIX文件系统的用户执行命令。

    二、Deploy

    从 Ceph 10.x(Jewel)开始,你应该使用至少一个 4.x 内核。如果您必须使用较旧的内核,则应使用fuse客户端而不是内核客户端。

    REFERNECE-Ceph-系统版本

    REFERNECE-Ansible

    Ceph 存储集群

    Install Ceph Storage Cluster — Ceph Documentation

    1. 集群至少需要一个监视器。

    2. OSD,一块硬盘可以是一个OSD,一个分区可以是一个OSD。

    3. 启动初始监视器是部署 Ceph 存储集群的第一步。

    1.安装 Ceph

    # 1.安装依赖
    yum install yum-plugin-priorities
    # 确保文件存在
    cat /etc/yum/pluginconf.d/priorities.conf 
    [main]
    enabled = 1
    
    # 2.配置 ceph.repo
    cat > /etc/yum.repos.d/ceph.repo << EOF
    [ceph]
    name=Ceph packages for $basearch
    baseurl=https://download.ceph.com/rpm-15.2.9/el7/\$basearch
    enabled=1
    priority=2
    gpgcheck=1
    gpgkey=https://download.ceph.com/keys/release.asc
    
    [ceph-noarch]
    name=Ceph noarch packages
    baseurl=https://download.ceph.com/rpm-15.2.9/el7/noarch
    enabled=1
    priority=2
    gpgcheck=1
    gpgkey=https://download.ceph.com/keys/release.asc
    
    [ceph-source]
    name=Ceph source packages
    baseurl=https://download.ceph.com/rpm-15.2.9/el7/SRPMS
    enabled=0
    priority=2
    gpgcheck=1
    gpgkey=https://download.ceph.com/keys/release.asc
    EOF
    
    # 3.安装必要的 packages
    yum install snappy leveldb gdisk python-argparse gperftools-libs -y
    
    # 4.安装 ceph
    yum install ceph -y
    

    2.配置 ceph-mon

    Monitor Config Reference — Ceph Documentation

    MONITOR CONFIG REFERENCE

    1. 集群唯一标识符 fsid

    2. 集群名称(default: Ceph)

    3. 集群每个监视器名称唯一

    4. 监视器映射:fsid、集群名称、主机名和 IP 地址。

    5. 监视器密钥:监视器通过密钥通信

    6. 管理员密钥:CLI 工具

    # 1.生成集群唯一ID "fsid"
    $ uuidgen
    
    # 2.创建 ceph-mon 配置文件。
    # https://docs.ceph.com/en/latest/rados/configuration/common/#example-ceph-conf
    cat > /etc/ceph/ceph.conf <<EOF
    [global]
    fsid = 091bbf99-0937-43f7-a47a-969936d15a23
    mon_initial_members = mon-node01,mon-node02,mon-node03
    mon_host = 192.168.83.62,192.168.83.63,192.168.83.64
    mon_data = /data/ceph/mon/$cluster-$id
    public_network = 192.168.83.0/24
    auth_cluster_required = cephx     # 表示启动认证,方式就是cephx
    auth_service_required = cephx
    auth_client_required = cephx
    osd_journal_size = 1024
    osd_pool_default_size = 3                 # osd 的数据会复制多少份
    osd_pool_default_min_size = 2     # 允许降级状态下写入几个副本,通常 {osds (n -1 )} > 2
    osd_pool_default_pg_num = 333     # pg放置组数量
    osd_pool_default_pgp_num = 333    # 与pg一致即可
    osd_crush_chooseleaf_type = 1     # 默认是1,表示不允许把数据的不同副本放到1个节点上
    mon_allow_pool_delete = true      # 默认false,是否允许删除pool。生产不建议开启
    EOF
    
    # 3.集群创建一个密钥环并生成一个监控密钥。(注意其中的点.)
    ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
    
    # 4.生成管理员密钥环,生成 client.admin 用户并将用户添加到密钥环。
    ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
    
    # 5.生成 bootstrap-osd 密钥环,生成 client.bootstrap-osd 用户并将用户添加到密钥环。
    ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
    
    # 6.将生成的密钥添加到 ceph.mon.keyring
    ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
    ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
    
    # 7.更改所有者 ceph.mon.keyring
    chown ceph:ceph /tmp/ceph.mon.keyring
    
    # 8.使用主机名、主机IP地址和FSID 生成一个monitor映射。将其保存为/tmp/monmap。
    # 格式为:monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
    monmaptool --create --add mon-node01 192.168.83.62 --fsid 99bd63b3-31a1-4b82-b731-c9a396b3ad56 /tmp/monmap
    
    # 9.创建数据目录。
    # 默认目录 mon_data = /var/lib/ceph/mon/$cluster-$id 通过配置文件 ceph.conf 修改
    # mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
    mkdir -pv /data/ceph/mon
    
    # 10.使用监视器映射和密钥环填充监视器守护程序。
    # 格式:sudo -u ceph ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    sudo -u ceph ceph-mon --mkfs -i mon-node01 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    
    # 11.启动监视器。
    systemctl start ceph-mon@mon-node01
    systemctl enable ceph-mon@mon-node01
    
    # 12.验证监视器是否正在运行。
    $ ceph status
      cluster:
        id:     091bbf99-0937-43f7-a47a-969936d15a23
        health: HEALTH_WARN
                1 monitors have not enabled msgr2 
      services:
        mon: 1 daemons, quorum mon-node01 (age 24m)
        mgr: no daemons active
        osd: 0 osds: 0 up, 0 in
      data:
        pools:   0 pools, 0 pgs
        objects: 0 objects, 0 B
        usage:   0 B used, 0 B / 0 B avail
        pgs:
    

    其他节点

    # 1.配置 hosts
    # 2.copy 配置文件
    scp /etc/ceph/* 192.168.83.63:/etc/ceph/
    scp /var/lib/ceph/bootstrap-osd/ceph.keyring 192.168.83.63:/var/lib/ceph/bootstrap-osd/
    scp /tmp/ceph.mon.keyring 192.168.83.63:/tmp/
    
    # 3.创建数据目录
    mkdir -pv /data/ceph/mon && chown -R ceph. /data/ceph
    
    # 4.更改 ceph.mon.keyring 所有者
    chown ceph.ceph /tmp/ceph.mon.keyring
    
    # 5.获取密钥和 monmap 信息
    ceph auth get mon. -o /tmp/ceph.mon.keyring && ceph mon getmap -o /tmp/monmap
    
    # 6.用监视器 map 和密钥填充监视器守护进程
    sudo -u ceph ceph-mon --mkfs -i mon-node02 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
    
    # 7.启动监视器
    systemctl start ceph-mon@mon-node02
    systemctl enable ceph-mon@mon-node02
    

    3.配置 ceph-mgr

    ceph-mgr administrator’s guide — Ceph Documentation

    运行 ceph-mon 守护进程的每个节点上,还应该设置一个 ceph-mgr 守护进程。

    # 1.创建 mgr 密钥目录,命名为:集群名-主机名
    sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-mgr-node01
    
    # 2.创建 mgr 身份验证密钥 注意里面的 mgr.mgr-node01, mgr-node01 为主机名
    ceph auth get-or-create mgr.mgr-node01 mon 'allow profile mgr' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mgr/ceph-mgr-node01/keyring
    
    # 3.安装依赖
    pip3 install pecan werkzeug
    
    # 4.启动 mgr (最好与 monitor 设置的 $name 保持一致)
    # 手动启动 `ceph-mgr -i mgr-node01 --setuser ceph --setgroup ceph`
    systemctl start ceph-mgr@mgr-node01
    
    # 5.验证
    ceph -s
    mgr active: $name
    

    4.配置 OSD

    https://docs.ceph.com/en/latest/install/manual-deployment/?#adding-osds

    # 创建过程可以分为两个阶段
    # 1.准备 OSD
    ceph-volume lvm prepare --data /dev/sdc
    # 2.激活 OSD ,需要 ID 和 FSID (FSID 通过 ceph-volume lvm list 获取)
    ceph-volume lvm activate 0 e5d3ed81-2e24-47b8-8749-24178e848199
    
    # 验证
    systemctl status ceph-osd@0
    

    Tips: 手动添加 OSD 到集群

    5.配置 MDS

    https://docs.ceph.com/en/latest/cephfs/add-remove-mds/#deploying-metadata-servers

    每个 CephFS 文件系统至少需要一个 MDS。建议为 MDS 服务器配备具有足够内核的高级 CPU。 MDS 是单线程和 CPU 密集型的大多数活动,包括响应客户端请求。

    mds config refernece

    mds states

    # node01 节点,格式:/var/lib/ceph/mds/{cluster-name}-{id},id可以随意
    # 1.创建 msd 数据目录,用来存放密钥
    sudo -u ceph mkdir -p /var/lib/ceph/mds/ceph-mds-node01
    
    # 2.创建 mds 密钥环
    sudo -u ceph ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-mds-node01/keyring --gen-key -n mds.mds-node01
    
    # 3.导入 key 并设置 caps
    ceph auth add mds.mds-node01 osd "allow rwx" mds "allow *" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-mds-node01/keyring
    
    # 4.添加配置到 ceph.conf
    cat << EOF >> /etc/ceph/ceph.conf 
    
    [mds.mds-node01]
    host = mds-node01
    EOF
    
    # 5.启动 msd 服务,systemctl start ceph-mds@mds-node01
    # 格式:ceph-mds --cluster {cluster-name} -i {id} -m {mon-hostname}:{mon-port} [-f]
    ceph-mds --cluster ceph --id mds-node01 --setuser ceph --setgroup ceph
    
    # 删除 MDS
    systemctl stop ceph-mds@${id}
    rm -rf /var/lib/ceph/mds/ceph-${id}
    

    6.配置 Dashboard

    Ceph Dashboard — Ceph Documentation

    # 1.安装 Dashboard 依赖
    yum -y install ceph-grafana-dashboards ceph-prometheus-alerts
    pip3 install CherryPy
    pip3 install Routes
    pip3 install PyJWT
    
    # 2.安装 Dashboard https://download.ceph.com/rpm-15.2.9/el7/noarch/
    wget https://mirrors.ustc.edu.cn/ceph/rpm-15.2.9/el7/noarch/ceph-mgr-dashboard-15.2.9-0.el7.noarch.rpm
    rpm -ivh ceph-mgr-dashboard-15.2.9-0.el7.noarch.rpm --nodeps
    
    # 3.验证是否安装成功
    ceph mgr module ls | jq .enabled_modules
    
    # 4.启动 Dashboard 模块
    ceph mgr module enable dashboard
    
    # 5.生成并安装自签名证书
    # 禁用ssl `ceph config set mgr mgr/dashboard/ssl false` 
    ceph dashboard create-self-signed-cert
    
    # 6.创建管理员用户
    # ceph dashboard ac-user-create <username> <password> administrator
    ceph dashboard ac-user-create admin ABCabc123 administrator
    
    # 7.查看mgr服务
    ceph mgr services
    
    # 8.修改仪表盘地址
    $ ceph config set mgr mgr/dashboard/server_addr $IP
    $ ceph config set mgr mgr/dashboard/server_port $PORT
    $ ceph config set mgr mgr/dashboard/ssl_server_port $PORT
    
    # 9.单独配置每个实例的地址,$name 为 ceph-mgr 实例 ID
    $ ceph config set mgr mgr/dashboard/$name/server_addr $IP
    $ ceph config set mgr mgr/dashboard/$name/server_port $PORT
    $ ceph config set mgr mgr/dashboard/$name/ssl_server_port $PORT
    

    4.1 Dashboard 进阶

    REFERNECE-配置SSL/TLS 支持

    # 生成自签名证书
    $ ceph dashboard create-self-signed-cert
    
    # 更改 SSL 证书和密钥,需要重启 Ceph 管理进程,也可以通过模块开关来处理
    $ ceph mgr module disable dashboard
    $ ceph mgr module enable dashboard
    
    # 检查是否启用了 SSL/TSL 支持:
    $ ceph config get mgr mgr/dashboard/ssl
    # 获取证书
    $ ceph config-key get mgr/dashboard/crt
    $ ceph config-key get mgr/dashboard/key
    

    REFERNECE-Dashboard-用户角色管理

    用户权限和角色

    # 显示用户
    $ ceph dashboard ac-user-show [<username>]
    # 创建账号
    $ ceph dashboard ac-user-create <username> -i <file-containing-password> administrator
    # 更改密码
    $ ceph dashboard ac-user-set-password [--force-password] <username> -i <file-containing-password>
    # 解锁账号
    # 禁用尝试次数 `$ ceph dashboard set-account-lockout-attempts 0`
    $ ceph dashboard ac-user-enable <username>
    
    # 查看角色
    $ ceph dashboard ac-role-show [<rolename>]
    # 创建角色
    $ ceph dashboard ac-role-create <rolename> [<description>]
    

    REFERNECE-启用 ISCSI 管理

    REFERNECE-启用 GRAFANA 仪表板

    # 配置 Ceph 仪表板将用于访问 Grafana 的连接信息,url 的格式为:<protocol>:<IP-address>:<port>
    $ ceph dashboard set-grafana-api-url <grafana-server-url>  # default: ''
    # 清配置的 Grafana API URL
    $ ceph dashboard reset-grafana-api-url
    # 禁用证书验证避免拒接连接
    $ ceph dashboard set-grafana-api-ssl-verify False
    

    REFERNECE-启用单点登录 (SSO)

    REFERNECE-启用 PROMETHEUS 警报

    REFERNECE-代理配置

    # 配置 URL 前缀 http://$IP:$PORT/$PREFIX/
    $ ceph config set mgr mgr/dashboard/url_prefix $PREFIX
    
    # 禁用重定向,配置错误代码和 HAPROXY 配置
    

    REFERNECE-审计

    REFERNECE-Troubleshooting the dashboard

    # 查看 Dashboard 访问路口
    $ ceph mgr services | jq .dashboard
    "https://host:port"
    
    # 验证模块是否启用
    $ ceph mgr module ls | jq .enabled_modules
    
    # 查看日志
    $ ceph config get mgr log_to_file
    $ ceph config get mgr log_file
    
    # 启用 Debug 日志
    $ ceph dashboard debug enable
    
    # 提高管理器守护进程的日志记录级别
    $ ceph tell mgr config set debug_mgr 20
    # CLI 调整 Ceph Dashboard 模块的日志记录级别
    $ bin/ceph config set mgr mgr/dashboard/log_level debug
    
    # 10 daemons have recently crashed
    $ ceph crash ls
    

    Ceph 文件系统 (CephFS)

    https://docs.ceph.com/en/latest/cephfs/#ceph-file-system

    • 符合 POSIX 的文件系统。

    • 构建在 Ceph 的分布式对象存储 RADOS 之上。

    • CephFS 致力于为各种应用程序提供最先进的、多用途、高可用性和高性能的文件存储。

    1.创建文件系统

    Create a Ceph file system — Ceph Documentation

    Ceph 文件系统至少需要两个 RADOS 池,一个用于数据,一个用于元数据。元数据池最多只有几 GB 的数据。因此,通常建议使用较小的 PG 计数。64 或 128 在实践中通常用于大型集群。

    # 1.创建 Ceph Pools
    ceph osd pool create cephfs_data 128
    ceph osd pool create cephfs_metadata 128
    
    # 2.创建 Pools 后,启用文件系统 `$ ceph fs new <fs_name> <metadata> <data>`
    ceph fs new cephfs cephfs_metadata cephfs_data
    

    2.CephFS 添加 MDS

    Deploying Metadata Servers — Ceph Documentation

    # 1.创建一个 mds 数据点,守护进程只使用这个目录来存储它的密钥
    sudo -u ceph mkdir /var/lib/ceph/mds/ceph-${id}
    
    # 2.使用 CephX,创建身份验证密钥
    sudo ceph auth get-or-create mds.${id} mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > /var/lib/ceph/mds/ceph-${id}/keyring
    
    # 3.启动服务
    systemctl start ceph-mds@${id}
    
    # 4.配置 MDS 应该加入的文件系统 
    # ceph config set mds.${id} mds_join_fs ${fs}
    ceph config set mds.b mds_join_fs cephfs
    

    3.CephFS 客户端配置

    CephFS Client Capabilities — Ceph Documentation

    使用 Ceph 身份验证功能

    默认情况下,客户端在允许挂载的路径上不受限制。

    # 配置对指定目录的 rw 访问权限
    ceph fs authorize <fs_name> client.<client_id> <path-in-cephfs> rw
    
    # 客户端 foo 只能在 bar cephfs_a 文件系统的目录中读写
    ceph fs authorize cephfs_a client.foo / r /bar rw
    
    results in:
    client.foo
      key: *key*
      caps: [mds] allow r, allow rw path=/bar
      caps: [mon] allow r
      caps: [osd] allow rw tag cephfs data=cephfs_a
    
    # 限制客户端在指定的子目录中
    ceph-fuse -n client.foo mnt -r /bar
    
    # 客户端只能看到它授权的FS
    ceph fs authorize cephfs client.someuser / rw
    ceph fs ls -n client.someuser -k ceph.client.someuser.keyring
    
    # MDS 限制 https://docs.ceph.com/en/latest/cephfs/client-auth/#mds-communication-restriction
    

    4.CephFS 挂载

    Mount CephFS: Prerequisites — Ceph Documentation

    1. 客户端主机具有访问 Ceph 配置文件 和 MDS 的 CephX 用户密钥的权限

    2. 这两个文件必须已经存在于 Ceph MON 所在的主机上。

    # 1.修改目录权限
    # on client host
    mkdir -p -m 755 /etc/ceph
    ssh {user}@{mon-host} "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf
    chmod 644 /etc/ceph/ceph.conf
    
    # 2.创建一个 CephX 用户并获取其密钥:
    ssh {user}@{mon-host} "sudo ceph fs authorize cephfs client.foo / rw" | sudo tee /etc/ceph/ceph.client.foo.keyring
    chmod 600 /etc/ceph/ceph.client.foo.keyring
    

    内核驱动挂载

    需要Linux内核的支持

    # 内核驱动挂载 CephFS 的命令如下所示:
    # mount -t ceph {device-string}:{path-to-mounted} {mount-point} -o {key-value-args} {other-args}
    # option 之后的键值参数-o是 CephX 凭证; name是我们用来挂载 CephFS 的 CephX 用户的用户名。其缺省值name是guest。
    mkdir /mnt/mycephfs
    mount -t ceph 192.168.0.1:6789,192.168.0.2:6789:/ /mnt/mycephfs -o name=foo,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
    # 确保对密钥文件的权限是适当的(最好是 600)。
    mount -t ceph :/ /mnt/mycephfs -o name=foo,secretfile=/etc/ceph/foo.secret
    
    # 挂载 CephFS 根的子树,请将路径附加到设备字符串:
    mount -t ceph :/subvolume/dir1/dir2 /mnt/mycephfs -o name=fs
    
    # Ceph 集群上有多个文件系统,你可以按如下方式挂载非默认文件系统:
    mount -t ceph :/ /mnt/mycephfs2 -o name=fs,fs=mycephfs2
    
    # 开机启动 /etc/fstab
    # [{ipaddress}:{port}]:/ {mount}/{mountpoint} ceph [name=username,secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]
    :/     /mnt/ceph    ceph    name=admin,noatime,_netdev    0       2
    

    FUSE 挂载 CEPHFS

    空间文件系统 FUSE(Filesystem in Userspace)进行的网络磁盘挂载,Linux上的一个应用软件

    # 不是 root 用户,需要在/etc/fuse.conf添加选项 user_allow_other
    # 挂载,option: --id 用户名 
    mkdir /mnt/mycephfs
    ceph-fuse --id foo /mnt/mycephfs
    ceph-fuse --id foo -k /path/to/keyring /mnt/mycephfs
    ceph-fuse --id foo -m 192.168.0.1:6789 /mnt/mycephfs
    
    # 特定目录
    ceph-fuse --id foo -r /path/to/dir /mnt/mycephfs
    # 多个文件系统
    ceph-fuse --id foo --client_fs mycephfs2 /mnt/mycephfs2
    
    # 开机启动 /etc/fstab
    # none    /mnt/mycephfs  fuse.ceph ceph.id={user-ID}[,ceph.conf={path/to/conf.conf}],_netdev,defaults  0 0
    none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,_netdev,defaults  0 0
    none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,ceph.conf=/etc/ceph/foo.conf,_netdev,defaults  0 0
    
    # 挂载子目录
    none    /mnt/mycephfs  fuse.ceph ceph.id=myuser,ceph.client_mountpoint=/path/to/dir,_netdev,defaults  0 0
    

    5.CephFS 管理命令

    CephFS Administrative commands — Ceph Documentation

    # 列出所有 CephFS 功能
    ceph fs feature ls
    
    # 命令详解
    ceph tell mds.* help
    
    # 默认只允许创建一个文件系统。多个文件系统需要设置
    ceph fs flag set enable_multiple true
    ceph fs new <file system name> <metadata pool name> <data pool name>
    
    # 更改文件系统上的设置
    ceph fs set <file system name> <var> <val>
    # 文件系统添加数据池
    ceph fs add_data_pool <file system name> <pool name/id>
    # 文件系统的数据池列表中删除指定的池
    ceph fs rm_data_pool <file system name> <pool name/id>
    
    # 重命名 Ceph 文件系统
    ceph fs rename <file system name> <new file system name> [--yes-i-really-mean-it]
    
    # 删除文件系统,元数据池和数据池不受影响,必须单独销毁。
    ceph fs rm <file system name> [--yes-i-really-mean-it]
    
    # 关闭集群
    ceph fs set <fs_name> down true
    # 重新联机
    ceph fs set <fs_name> down false
    
    # 文件系统状态重置为默认值,名称和池除外。非零等级保存在停止集合中
    ceph fs reset <file system name>
    

    CephFS Volume

    • FS 卷,CephFS 文件系统的抽象

    • FS 子卷,独立 CephFS 目录树的抽象

    • FS 子卷组,对高于 FS 子卷的目录级别的抽象,以跨一组子卷影响策略

    # 创建一个 CephFS 文件系统及其数据和元数据池。
    ceph fs volume create <vol_name> [<placement>]
    
    # 删除卷
    ceph fs volume rm <vol_name> [--yes-i-really-mean-it]
    

    CephFS Quotas 配额设置

    # CephFS 允许在系统中的任何目录上设置配额。配额可以限制字节数或 目录层次结构中该点下存储的文件数。
    # 设置
    setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir     # 100 MB
    setfattr -n ceph.quota.max_files -v 10000 /some/dir         # 10,000 files
    
    # 查看,扩展属性的值为0,则表示未设置配额。
    getfattr -n ceph.quota.max_bytes /some/dir
    getfattr -n ceph.quota.max_files /some/dir
    
    # 删除
    setfattr -n ceph.quota.max_bytes -v 0 /some/dir
    setfattr -n ceph.quota.max_files -v 0 /some/dir
    

    CephFS MDS 集群升级

    CephFS 插件 cephfs-top

    CephFS 文件系统清理

    CephFS 元数据修复工具

    CephFS 数据恢复

    Ceph 块设备 (RBD)

    Ceph Block Device — Ceph Documentation

    Ceph 块设备利用 RADOS功能,包括快照、复制和强一致性。Ceph 块存储客户端通过内核模块或librbd库与 Ceph 集群通信。

    rbd-config-settings

    [图片上传失败...(image-b56df8-1650644760963)]

    1.创建块设备

    # 创建块设备池,初始化 rbd
    ceph osd pool create rbd
    rbd pool init rbd
    
    # 创建块设备用户
    # ceph auth get-or-create client.{ID} mon 'profile rbd' osd 'profile {profile name} [pool={pool-name}][, profile ...]' mgr 'profile rbd [pool={pool-name}]'
    ceph auth get-or-create client.test mon 'profile rbd' osd 'profile rbd pool=rbd, profile rbd-read-only pool=rbd' mgr 'profile rbd pool=rbd' -o /etc/ceph/ceph.client.test.keyring
    # 验证用户
    ceph auth ls
    
    # 创建块映像,不指定 pool 默认 rbd。rbd create --size {megabytes} {pool-name}/{image-name}
    rbd create --size 1024 test
    # 调整块设备映像大小
    rbd resize --size 2048 foo (to increase)
    rbd resize --size 2048 foo --allow-shrink (to decrease)
    

    2.Ceph 块设备操作

    Ceph Block Device Operations — Ceph Documentation

    # 查询块设备映像
    rbd ls
    # 查询延迟删除的设备
    rbd trash ls 
    
    # 查询映像
    rbd info {pool-name}/{image-name}
    # 删除映像设备
    rbd rm {pool-name}/{image-name}
    # 将块设备丢至垃圾桶
    rbd trash mv {pool-name}/{image-name}
    # 延迟删除映像设备
    rbd trash rm {pool-name}/{image-id}
    
    # 恢复映像设备
    rbd trash restore {pool-name}/{image-id}
    

    RBD 快照

    # 创建
    rbd snap create {pool-name}/{image-name}@{snap-name}
    # 回滚
    rbd snap rollback {pool-name}/{image-name}@{snap-name}
    # 清除
    rbd snap purge {pool-name}/{image-name}
    # 删除
    rbd snap rm {pool-name}/{image-name}@{snap-name}
    

    RBD 镜像

    RBD 镜像可以在两个 Ceph 集群之间异步镜像。

    # 启用池上的镜像。image:镜像;pool:日志
    rbd mirror pool enable {pool-name} {image|pool}
    
    # 禁用
    rbd mirror pool disable {pool-name}
    

    RBD 镜像迁移

    RBD 镜像可以在同一个集群内的不同池之间实时迁移;在不同的图像格式和布局之间;或来自外部数据源。启动时,源将被深度复制到目标映像,提取所有快照历史记录,同时尽可能保留数据的稀疏分配。

    RBD 持久只读缓存

    RBD 持久写回缓存

    3.Ceph 块设备第 3 方集成

    Ceph Block Device 3rd Party Integration — Ceph Documentation

    • 集成内核

    • Qemu

    • VM

    • Kubernetes

    • Nomad

    • Openstack

    • Cloudstack

    • ISCSI

    • Windows

    Ceph 对象网关 (RGW)

    Ceph Object Gateway — Ceph Documentation

    Ceph 对象存储使用 Ceph 对象网关守护进程 ( radosgw),它是一个 HTTP 服务器,用于与 Ceph 存储集群交互。

    对象存储的核心资源有用户(User)、存储桶(Bucket)和对象(Object)。

    Ceph 对象网关有自己的用户管理。Ceph RGW 可以使用 RBD 和 CephFS 的存储集群。

    • radosgw : 用来启动radosgw服务,并且提供restful的访问方式,也是下文讨论的对象

    • radosgw-admin : 用来提供admin的管理服务,如创建user等

    1.创建对象网关

    radosgw – rados REST gateway — Ceph Documentation

    rgw 相关资源池

    .rgw:region和zone配置信息。
    .rgw.root:region和zone配置信息。
    .rgw.control:存放notify信息。
    .rgw.gc:用于资源回收。
    .rgw.buckets:存放数据。
    .rgw.buckets.index:存放元数据信息。
    .rgw.buckets.extra:存放元数据扩展信息。
    .log:日志存放。
    .intent-log:日志存放。
    .usage:存放用户已用容量信息。
    .users:存放用户信息。
    .users.email:存放用户E-mail信息。
    .users.swift:存放swift类型的账号信息。
    .users.uid:存放用户信息。

    # 参考文档:https://docs.ceph.com/en/latest/man/8/radosgw/
    # 1.安装radosgw
    yum -y install ceph-radosgw
    
    # 2.配置,重启mon
    vim /etc/ceph/ceph.conf
    [global]
    mon_max_pg_per_osd = 1000
    
    # 3.生成用户密钥
    # 格式:ceph-authtool -C rgw/ceph-{id}/keyring -n client.radosgw.{id} --cap 子系统类型 "权限"
    ceph-authtool -C -n client.rgw.rgw001 --gen-key /etc/ceph/ceph.client.rgw.keyring
    # 添加用户权限
    ceph-authtool -n client.rgw.rgw001 --cap mon 'allow rw' --cap osd 'allow rwx' /etc/ceph/ceph.client.rgw.keyring
    # 添加用户身份验证
    ceph auth add client.rgw.rgw001 --in-file=/etc/ceph/ceph.client.rgw.keyring
    
    # 4.编辑 ceph.conf
    [client.rgw.rgw001]      # 实例会获取此配置信息,对应用户密钥名称
    host = rgw001            # 必须是主机名,不包括域名
    keyring = /etc/ceph/ceph.client.rgw.keyring
    log file = /var/log/ceph/client.rgw.rgw001.log
    rgw frontends = civetweb port=17801
    # print continue 执行 PUT 操作时可能会遇到问题,
    rgw print continue = false
    
    # 5.启动radosgw网关
    systemctl start ceph-radosgw@rgw.rgw001
    systemctl enable ceph-radosgw@rgw.rgw001
    

    2.启用网关管理

    Ceph Dashboard — Ceph Documentation

    # 启用网关管理前端
    # 创建一个系统用户
    # 格式:radosgw-admin user create --uid=<user_id> --display-name=<display_name> --system
    radosgw-admin user create --uid=dashboard --display-name="dashboard" --system
    ## 注意记录输出中的access_key和secret_key,后面会用到
                "access_key": "RG8Q7LB92B2J80J8MUEF",
                "secret_key": "I8iP4zZIXpNtRh5LLRLBZD7IolNB9N554rTmB0O5"
    
    # 获取用户凭证,如果忘记了用户凭证可以使用该方法获取
    # radosgw-admin user info --uid=<user_id>
    radosgw-admin user info --uid=dashboard
    
    # 将accessKey和secretKey提供给dashboard,dashboard需要凭证才能访问到对象存储网关
    ceph dashboard set-rgw-api-access-key <access_ke>
    ceph dashboard set-rgw-api-secret-key <secret_key>
    
    # 手动设置主机
    $ ceph dashboard set-rgw-api-host <host>
    $ ceph dashboard set-rgw-api-port <port>
    

    3.配置引导密钥环

    Ceph 对象网关 | 部署指南 | SUSE Enterprise Storage 6

    替代方法是创建对象网关引导密钥,然后基于该密钥创建对象网关密钥环:

    # 1.在某个 Monitor 节点上创建对象网关引导密钥
    ceph \
     auth get-or-create client.bootstrap-rgw mon 'allow profile bootstrap-rgw' \
     --connect-timeout=25 \
     --cluster=ceph \
     --name mon. \
     --keyring=/var/lib/ceph/mon/ceph-NODE_HOST/keyring \
     -o /var/lib/ceph/bootstrap-rgw/keyring
    
    # 2.创建 /var/lib/ceph/radosgw/ceph-RGW_NAME 目录以存储引导密钥
    mkdir \
    /var/lib/ceph/radosgw/ceph-RGW_NAME
    
    # 3.基于新建的引导密钥环创建对象网关密钥:
    ceph \
     auth get-or-create client.rgw.RGW_NAME osd 'allow rwx' mon 'allow rw' \
     --connect-timeout=25 \
     --cluster=ceph \
     --name client.bootstrap-rgw \
     --keyring=/var/lib/ceph/bootstrap-rgw/keyring \
     -o /var/lib/ceph/radosgw/ceph-RGW_NAME/keyring
    
    # 4.对象网关密钥环复制到对象网关主机
    scp \
    /var/lib/ceph/radosgw/ceph-RGW_NAME/keyring \
    RGW_HOST:/var/lib/ceph/radosgw/ceph-RGW_NAME/keyring
    

    Ceph Error

    ceph osd

    Error ERANGE: pg_num 333 size 3 would mean 1002 total pgs, which exceeds max 750 (mon_max_pg_per_osd 250 * num_in_osds 3

    问题原因:

    osd (near) full

    # 解决方法
    # 手动修改配置
    osd pool default pg num = 200
    osd pool default pgp num = 200
    
    # 根本解决之道是添加 osd,临时解决方法是删除无用数据,osd full 时所有的读写操作都无法进行,可通过两种方法恢复读写后再执行删除数据的命令:
    # 一是调整 full osd 的权重:
    ceph osd crush reweight osd.33 0.7 或者 ceph osd reweight-by-utilization
    # 二是调高 full 的上限:
    # https://docs.ceph.com/en/latest/rados/troubleshooting/troubleshooting-osd/#no-free-drive-space
    ceph osd set-full-ratio 0.98
    

    ceph rbd

    Events:

    kubernetes.io/csi: blockMapper.SetUpDevice failed to get CSI client: driver name rbd.csi.ceph.com not found in the list of registered CSI drivers

    问题原因:

    ceph-csi官方的deploy目录下的daemonset的配置中,默认是不允许在master节点上部署pod的,这样导致,master节点上通过ceph-csi申请volume的pod,可以申请到PV但却无法挂载到pod

    # 解决方法
    # csi-rbdplugin.yaml 中的DaemonSet的spec中添加如下配置 csi-rbdplugin.yaml
        spec:
          tolerations:
          - key: node-role.kubernetes.io/master
            effect: NoSchedule
          serviceAccountName: rbd-csi-nodeplugin
          hostNetwork: true
          hostPID: true
    

    相关文章

      网友评论

          本文标题:Ceph

          本文链接:https://www.haomeiwen.com/subject/wxboertx.html