ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ceph rbd-mirror 守护进程全解析:RBD 镜像复制、命令行选项与源码级实现

Ceph rbd-mirror 守护进程全解析:RBD 镜像复制、命令行选项与源码级实现 Ceph rbd-mirror 守护进程全解析RBD 镜像复制、命令行选项与源码级实现【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址: https://gitcode.com/gh_mirrors/ce/ceph本文以 Ceph 仓库中的rbd-mirror(8)手册doc/man/8/rbd-mirror.rst为主体结合完整的 RBD 镜像操作指南doc/rbd/rbd-mirroring.rst与守护进程源码src/tools/rbd_mirror/系统讲解 rbd-mirror 在跨集群异步镜像Disaster Recovery灾难恢复场景中的角色定位、全部命令行选项、两种镜像模式journal 与 snapshot、池/命名空间/镜像三级配置流程以及守护进程内部的运行机制。读完本文你将能够独立部署并运维一对启用了 RBD 镜像的 Ceph 集群并理解 rbd-mirror 底层是如何“看”到远程镜像变更并把它“回放”到本地集群的。rbd-mirror 是什么rbd-mirror是一个用于在 Ceph 集群之间对 RADOS 块设备RBD镜像进行异步镜像的守护进程daemon。它的核心职责是把远程集群中对镜像的变更“回放”到本地集群使本地维护一份可用于灾难恢复的副本。从 src/tools/rbd_mirror/main.cc 的入口实现可以看到rbd-mirror 是一个标准的 Ceph 守护进程程序它通过global_init以CEPH_ENTITY_TYPE_CLIENT客户端身份初始化main.cc 第 49-51 行支持-h/--help打印用法main.cc 第 21-29 行注册了 SIGHUP / SIGINT / SIGTERM 信号处理main.cc 第 59-62 行其中 SIGHUP 用于重开日志、SIGINT/SIGTERM 用于优雅退出启动时会显式关闭 librbd 本地缓存rbd_cachefalsemain.cc 第 67 行因为回放路径不需要客户端缓存。与远程集群的连接方式rbd-mirror 通过RADOS 协议连接远程集群连接时依赖 Ceph 默认的搜索路径来查找远程集群的ceph.conf、monitor 地址和认证信息即/etc/ceph/$cluster.conf/etc/ceph/$cluster.keyring/etc/ceph/$cluster.$name.keyring其中$cluster是集群的人类可读名称cluster name$name是用于连接的 rados 用户例如client.rbd-mirror。也就是说假设远程集群名为site-b、连接用户为client.rbd-mirror那么 rbd-mirror 会依次查找/etc/ceph/site-b.conf、/etc/ceph/site-b.keyring、/etc/ceph/site-b.client.rbd-mirror.keyring等文件来解析 monitor 地址与认证信息。需要注意集群名称在这里只用于定位配置文件名rbd-mirror并不要求源集群与目标集群的内部名称唯一——两个集群都可以也应该叫自己ceph。rbd-mirror 所需的本地与远程集群配置文件可以任意命名将守护进程容器化是在/etc/ceph之外维护这些文件的策略之一详见 doc/rbd/rbd-mirroring.rst 中 Pool Configuration 一节的说明。两种镜像模式RBD 镜像支持两种异步复制模式Journal-based基于日志Jewel 及以后版本该模式利用 RBD 的journaling镜像特性保证集群间基于时间点、崩溃一致的复制。每一次对 RBD 镜像的写入都会先记录到关联的 journal然后才修改真正的镜像数据。远程集群从这个 journal 读取事件并在本地镜像副本上按序回放。由于每次写镜像都伴随一次额外的 journal 写入相当于一次 I/O 变成了两次集群写入因此开启 journaling 特性后写延迟几乎翻倍——这是该模式需要权衡的代价。Snapshot-based基于快照Octopus 及以后版本该模式使用周期性调度或手动创建的 RBDmirror-snapshot镜像快照来复制崩溃一致的镜像。远程集群会比较两个 mirror-snapshot 之间的数据与元数据差异把增量delta拷贝到本地镜像副本。借助 RBD 的fast-diff镜像特性可以快速确定发生了变更的数据块而无需全量扫描镜像。该模式粒度不如 journal 细在故障切换failover场景下需要先同步两个快照之间的完整增量才能使用任何部分应用的增量会在切换瞬间回滚。版本前提journal-based 镜像要求 Ceph Jewel 或更高版本snapshot-based 镜像要求 Ceph Octopus 或更高版本。单向与双向复制根据容灾需求RBD 镜像可配置为单向或双向单向复制One-way数据只从主集群primary镜像到次级集群secondary时只在次级集群运行rbd-mirror守护进程。双向复制Two-way一个集群上的主镜像镜像到另一个集群的非主镜像反之亦然时两个集群都需要运行rbd-mirror守护进程。重要每个rbd-mirror守护进程实例都必须能同时连接本地与远程两个 Ceph 集群即两边的所有 monitor 与 OSD 主机。此外两个数据中心之间的网络需要有足够带宽来承载镜像工作负载。rbd-mirror 命令行选项rbd-mirror的命令行选项完整继承自 man pagedoc/man/8/rbd-mirror.rst 的 Options 一节汇总如下选项说明-c ceph.conf--confceph.conf使用指定的ceph.conf配置文件而不是默认的/etc/ceph/ceph.conf来确定启动时的 monitor 地址-m monaddress[:port]直接连接指定的 monitor不再从ceph.conf中解析-i ID--id ID设置 rbd-mirror 名称中的 ID 部分-n TYPE.ID--name TYPE.ID设置网关使用的 rados 用户名例如client.rbd-mirror--cluster NAME设置集群名称默认ceph-d前台运行日志输出到 stderr-f前台运行日志输出到常规位置此外从 main.cc 的 usage() 实现 可以看到 daemon 还支持下列常用参数选项说明--keyringpath指定本地集群 keyring 的路径--log-filelogfile指定记录调试输出的日志文件--debug-rbd-mirrorlog-level/memory-level设置 rbd-mirror 的调试级别-h/--help打印用法一个典型的前台运行示例手册中的原示例rbd-mirror -f --log-file{log_path}其中-f让守护进程以前台方式运行、日志写入常规位置默认如/var/log/ceph/ceph-rbd-mirror.log--log-file可以显式覆盖日志路径。systemd 管理rbd-mirror 由 systemd 单元管理单元文件见 systemd/ceph-rbd-mirror.service.in。其核心启动命令为ExecStartCMAKE_INSTALL_PREFIX/bin/rbd-mirror -f --id %i --setuser ceph --setgroup ceph即以-f前台方式运行--id %i把 systemd 实例名之后的部分作为 rbd-mirror 的 ID并以ceph用户/组降权运行。单元还配置了LimitNOFILE1048576等资源限制与多项加固选项PrivateTmp、ProtectSystemfull、Restarton-failure等并通过PartOfceph-rbd-mirror.target归属到镜像目标。每个 rbd-mirror 守护进程应使用唯一的 Ceph 用户 ID。使用ceph命令创建用户时需要授予 monitor 与 OSD 权限ceph auth get-or-create client.rbd-mirror.{unique id} mon profile rbd-mirror osd profile rbd然后通过 systemd 指定该用户 ID 作为守护进程实例来启用systemctl enable ceph-rbd-mirrorrbd-mirror.{unique id}配置 RBD 镜像管理操作总览镜像按池pool为单位在互为对等peer的集群中配置可以精确到池内的命名空间namespace或特定镜像子集使用 journal-based 模式时也可以镜像池或命名空间内的所有镜像。镜像使用rbd命令配置rbd-mirror守护进程负责把远程对等集群的镜像更新拉取并应用到本地集群的镜像上。手册明确指出镜像配置的核心流程是在池上启用镜像mirror pool enable→ 注册对等集群bootstrap 或手动添加 peer→ 按需对命名空间/镜像启用镜像 → 日常查看状态与执行故障切换promote/demote。启用 / 禁用池镜像在两个对等集群上都要执行池配置步骤。以下示例假定两个集群分别名为site-a与site-b并且从同一台主机可以访问它们两个对等集群上的池必须同名。启用镜像的通用命令格式rbd mirror pool enable [--site-name {local-site-name}] {pool-name} {mode}其中mode可以是image、pool或init-onlyimage该模式下必须在池的默认命名空间中为每个目标镜像显式启用镜像其他命名空间不受影响需要单独配置。pool该模式下池默认命名空间中所有启用了 journaling 特性的镜像都会被镜像其他命名空间不受影响需要单独配置。init-only该模式下池默认命名空间中没有镜像会被镜像但其他命名空间仍可配置。它通常用于允许某个命名空间镜像到远程池的默认命名空间单独使用也很有用。示例$ rbd --cluster site-a mirror pool enable --site-name site-a image-pool image $ rbd --cluster site-b mirror pool enable --site-name site-b image-pool image--site-name也可以延后修改用同样的mirror pool enable子命令但本地站点名与远程集群对应的站点名一般必须保持一致。禁用池镜像rbd mirror pool disable {pool-name}例如$ rbd --cluster site-a mirror pool disable image-pool $ rbd --cluster site-b mirror pool disable image-pool这样禁用后池内所有被显式启用镜像的镜像也会一并被禁用。引导对等集群Bootstrap Peers为了让rbd-mirror守护进程发现它的对等集群必须先注册对等关系并创建用户账户。该过程可以由rbd与mirror pool peer bootstrap create/mirror pool peer bootstrap import命令自动完成。在本地集群site-a生成 bootstrap token$ rbd --cluster site-a mirror pool peer bootstrap create --site-name site-a image-pool eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5IjoiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ输出的是一个 token应提供给另一集群的mirror pool peer bootstrap import命令。token 的导入命令格式为rbd mirror pool peer bootstrap import [--site-name {local-site-name}] [--direction {rx-only or rx-tx}] {pool-name} {token-path}--direction默认是rx-tx双向镜像也可设为rx-only单向镜像{token-path}是 token 文件的路径-表示从标准输入读取。例如在 site-b 上$ cat EOF token eyJmc2lkIjoiOWY1MjgyZGItYjg5OS00NTk2LTgwOTgtMzIwYzFmYzM5NmYzIiwiY2xpZW50X2lkIjoicmJkLW1pcnJvci1wZWVyIiwia2V5IjoiQVFBUnczOWQwdkhvQmhBQVlMM1I4RmR5dHNJQU50bkFTZ0lOTVE9PSIsIm1vbl9ob3N0IjoiW3YyOjE5Mi4xNjguMS4zOjY4MjAsdjE6MTkyLjE2OC4xLjM6NjgyMV0ifQ EOF $ rbd --cluster site-b mirror pool peer bootstrap import --site-name site-b image-pool token手动添加 / 移除集群对等如果当前安装的 Ceph 版本没有上述 bootstrap 命令或者出于其他原因需要手动指定对等集群可以按下面的方式操作。远程的rbd-mirror守护进程需要访问本地集群才能执行镜像。应为远程守护进程创建一个新的本地 Ceph 用户$ ceph auth get-or-create client.rbd-mirror-peer mon profile rbd-mirror-peer osd profile rbd生成的 keyring 应拷贝到另一集群的rbd-mirror守护进程主机上除非使用下文描述的 monitorconfig-key存储。手动添加镜像对等集群rbd mirror pool peer add {pool-name} {client-name}{cluster-name}例如$ rbd --cluster site-a mirror pool peer add image-pool client.rbd-mirror-peersite-b $ rbd --cluster site-b mirror pool peer add image-pool client.rbd-mirror-peersite-a默认情况下rbd-mirror 守护进程需要能访问位于/etc/ceph/{cluster-name}.conf的 Ceph 配置文件提供对等集群 monitor 的地址以及在默认或已配置的 keyring 搜索路径下{client-name}对应的 keyring例如/etc/ceph/{cluster-name}.{client-name}.keyring。可选的 config-key 存储方式对等集群的 monitor 地址和/或客户端 key 也可以安全地存放在本地 Ceph monitor 的config-key存储中。添加镜像对等时使用--remote-mon-host和--remote-key-file可选参数即可例如$ cat EOF remote-key-file AQAeuZdbMMoBChAAcj/XUxNOLFaWdtTREEsw EOF $ rbd --cluster site-a mirror pool peer add image-pool client.rbd-mirror-peersite-b --remote-mon-host 192.168.1.1,192.168.1.2 --remote-key-file remote-key-file $ rbd --cluster site-a mirror pool info image-pool --all Mode: pool Peers: UUID NAME CLIENT MON_HOST KEY 587b08db-3d33-4f32-8af8-421e77abb081 site-b client.rbd-mirror-peer 192.168.1.1,192.168.1.2 AQAeuZdbMMoBChAAcj/XUxNOLFaWdtTREEsw从 src/tools/rbd_mirror/ClusterWatcher.cc 的源码可以看到守护进程正是通过向 monitor 发起config-key get查询对应rbd_mirror相关的 config-key来动态获取镜像 peer 配置的ClusterWatcher.cc 第 197-244 行这使得添加 peer 后无需重启守护进程即可生效。移除对等集群时需要提供 peer 的 UUID可通过rbd mirror pool info获取rbd mirror pool peer remove {pool-name} {peer-uuid}例如$ rbd --cluster site-a mirror pool peer remove image-pool 55672766-c02b-4729-8567-f13a66893445 $ rbd --cluster site-b mirror pool peer remove image-pool 60c0e299-b38f-4234-91f6-eed0a367be08数据池Data Pools的选择当在目标集群创建镜像时rbd-mirror按下述规则选择数据池如果目标集群配置了默认数据池配置项rbd_default_data_pool则使用它否则如果源镜像使用了独立的数据池且目标集群存在同名池则使用该池以上都不满足时不设置数据池。命名空间配置池的非默认命名空间可以独立于默认命名空间启用镜像但池本身必须预先配置好镜像。一个命名空间可以镜像到远程池中同名或不同名的命名空间甚至可以镜像到远程的默认命名空间写作或。启用命名空间镜像的命令格式rbd mirror pool enable {pool-name}/{local-namespace-name} {mode} [--remote-namespace {remote-namespace-name}]mode为image需为命名空间内每个镜像显式启用或pool镜像命名空间内所有启用了 journaling 特性的镜像。例如在site-a的image-pool/namespace-a与site-b的image-pool/namespace-b之间建立 image 模式镜像$ rbd --cluster site-a mirror pool enable image-pool/namespace-a image --remote-namespace namespace-b $ rbd --cluster site-b mirror pool enable image-pool/namespace-b image --remote-namespace namespace-a本地集群配置的 namespace 与 remote-namespace 配对必须与远程集群的 remote-namespace 与 namespace 配对相互对应。若不提供--remote-namespace命名空间将镜像到远程池的同名命名空间。在site-a的image-pool默认命名空间与site-b的image-pool/namespace-c之间建立 pool 模式镜像$ rbd --cluster site-a mirror pool enable image-pool pool --remote-namespace namespace-c $ rbd --cluster site-b mirror pool enable image-pool init-only $ rbd --cluster site-b mirror pool enable image-pool/namespace-c pool --remote-namespace 同时建立“site-a 默认命名空间 → site-b namespace-d”的 pool 模式镜像以及“site-b 默认命名空间 → site-a namespace-e”的 image 模式镜像$ rbd --cluster site-a mirror pool enable image-pool pool --remote-namespace namespace-d $ rbd --cluster site-a mirror pool enable image-pool/namespace-e image --remote-namespace $ rbd --cluster site-b mirror pool enable image-pool image --remote-namespace namespace-e $ rbd --cluster site-b mirror pool enable image-pool/namespace-d pool --remote-namespace 禁用命名空间镜像rbd mirror pool disable {pool-name}/{namespace-name}注意命名空间以image模式配置时必须先显式禁用命名空间内所有已启用镜像的镜像然后才能禁用该命名空间的镜像。例如$ rbd --cluster site-a mirror pool disable image-pool/namespace-a $ rbd --cluster site-b mirror pool disable image-pool/namespace-b镜像级配置Image Configuration与池配置不同镜像配置只需在单个镜像对等集群上执行。被镜像的 RBD 镜像被标记为primary主或non-primary非主。这是镜像自身的属性而非池的属性被标记为非主的镜像不可修改。当镜像首次启用镜像时无论是 pool 模式下因镜像启用了 journaling 特性而隐式启用还是 image 模式下通过rbd命令显式启用镜像会被自动提升promote为主。启用镜像镜像当池以image模式配置镜像时必须为池中的每个镜像显式启用镜像rbd mirror image enable {pool-name}/{image-name} {mode}mode为journal默认或snapshotjournal默认使用 RBD journaling 镜像特性复制镜像内容如果镜像尚未启用该特性会自动启用。snapshot使用 RBD mirror-snapshot 复制镜像内容启用后会自动创建首个 mirror-snapshot后续镜像快照可由rbd命令创建。示例$ rbd --cluster site-a mirror image enable image-pool/image-1 snapshot $ rbd --cluster site-a mirror image enable image-pool/image-2 journal启用镜像 journaling 特性journal-based 镜像依赖 RBD 的 journaling 特性来保证复制出的镜像始终崩溃一致image镜像模式下镜像启用镜像时会自动启用 journaling 特性pool镜像模式下镜像要能被镜像到对等集群必须预先启用RBD journaling 特性。该特性可以在创建镜像时通过--image-feature exclusive-lock,journaling选项一并启用也可以对已存在的镜像动态启用rbd feature enable {pool-name}/{image-name} {feature-name}例如$ rbd --cluster site-a feature enable image-pool/image-1 journaling注意journaling 特性依赖 exclusive-lock 特性。如果 exclusive-lock 尚未启用应在启用 journaling 之前先启用它。提示可以在 Ceph 配置文件中添加rbd default features 125让所有新镜像默认启用 journaling从而默认支持镜像。性能提示rbd-mirror的可调参数默认值适合镜像整个池。当用rbd-mirror在集群间迁移单个卷时可以在本地或集中式配置的[client]段中设置rbd_journal_max_payload_bytes8388608对应源码 src/common/options/rbd.yaml.in 中默认16_K的rbd_journal_max_payload_bytes配置项以获得显著的性能提升。但注意该设置可能让 rbd-mirror 向目标集群呈现较大的写入负载迁移期间应密切监控集群性能并在并行运行多个迁移前仔细测试。创建镜像快照mirror-snapshotsnapshot-based 模式下需要定期创建 mirror-snapshot 以便镜像镜像的变更内容。手动创建rbd mirror image snapshot {pool-name}/{image-name}例如$ rbd --cluster site-a mirror image snapshot image-pool/image-1默认每个镜像最多保留5个 mirror-snapshot达到上限后自动修剪prune最近的镜像快照该上限可通过rbd_mirroring_max_mirroring_snapshots配置项覆盖源码中该配置默认值5、最小值3见 src/common/options/rbd.yaml.in。镜像被删除或镜像被禁用时mirror-snapshot 也会被自动删除。快照调度snapshot schedulesmirror-snapshot 还可以通过调度在全局、池级、镜像级三个层面周期性地自动创建。任何级别都可以定义多个快照调度但只有匹配某个镜像的最具体的调度会执行。当多个镜像共享同一调度间隔且未显式定义start-time时快照创建会在间隔内自动错开以减少调度峰值。添加调度rbd mirror snapshot schedule add [--pool {pool-name}] [--image {image-name}] {interval} [{start-time}]interval支持d天、h小时、m分钟后缀可选的start-time必须是 ISO 8601 时间格式未提供 UTC 偏移时按 UTC 处理。示例$ rbd --cluster site-a mirror snapshot schedule add --pool image-pool 24h 2020-01-14T11:3005:30 $ rbd --cluster site-a mirror snapshot schedule add --pool image-pool --image image1 6h移除调度使用与add参数匹配的rbd mirror snapshot schedule remove命令列出某级别全局/池/镜像的所有调度使用rbd mirror snapshot schedule ls可加--recursive列出指定级别及以下的所有调度。调度开始时间始终以 UTC 显示例如$ rbd --cluster site-a mirror snapshot schedule ls --pool image-pool --recursive POOL NAMESPACE IMAGE SCHEDULE image-pool - - every 1d starting at 2020-01-14 06:00:00 image-pool image1 every 6h查看下一次快照创建时间使用rbd mirror snapshot schedule status可带--pool/--image下一次调度时间始终以 UTC 显示例如$ rbd --cluster site-a mirror snapshot schedule status SCHEDULE TIME IMAGE 2026-01-24 06:00:00 image-pool/image1禁用镜像镜像rbd mirror image disable {pool-name}/{image-name}例如$ rbd --cluster site-a mirror image disable image-pool/image-1镜像提升promote与降级demote故障切换failover场景中需要把 primary 指定权移到对等集群的镜像上。推荐流程是先停止对主镜像的访问例如关闭 VM 或从 VM 中移除相关磁盘降级当前主镜像提升新的主镜像然后在备用集群上恢复对镜像的访问。注意RBD 只提供促成有序故障切换的必要工具。完整故障切换过程的协调例如降级前先关闭镜像需要外部机制来完成。降级单个镜像rbd mirror image demote {pool-name}/{image-name}例如$ rbd --cluster site-a mirror image demote image-pool/image-1降级池内所有主镜像rbd mirror pool demote {pool-name}例如$ rbd --cluster site-a mirror pool demote image-pool提升单个镜像为 primaryrbd mirror image promote [--force] {pool-name}/{image-name}例如$ rbd --cluster site-b mirror image promote image-pool/image-1提升池内所有非主镜像rbd mirror pool promote [--force] {pool-name}例如$ rbd --cluster site-a mirror pool promote image-pool提示由于 primary / non-primary 状态是按镜像的两个集群可以分担 I/O 负载并预演 failover / failback。注意--force可强制执行提升。当降级无法传播到对等集群例如对等集群故障、通信中断时需要强制提升。这会导致两个对等之间出现脑裂split-brain镜像在发出强制重新同步force resync命令之前将不再同步。强制镜像重新同步Force Image Resync如果rbd-mirror守护进程检测到脑裂事件它不会尝试镜像受影响的镜像直到问题被纠正。要恢复镜像先降级被判定为过期的镜像再请求对该主镜像重新同步rbd mirror image resync {pool-name}/{image-name}例如$ rbd mirror image resync image-pool/image-1注意rbd命令只是把镜像标记为需要 resync实际的 resync 由本地集群的rbd-mirror守护进程异步执行。注意snapshot-based 模式下resync 只把镜像内容复制到最近的 mirror-snapshot 为止。要在主镜像上同步最新更新需要创建新的 mirror-snapshot。查看镜像状态Mirror Status对等集群的复制状态会为每个主镜像保存可通过mirror image status与mirror pool status命令查询。查看单个镜像状态rbd mirror image status {pool-name}/{image-name}例如$ rbd mirror image status image-pool/image-1查看池级镜像汇总状态rbd mirror pool status {pool-name}例如$ rbd mirror pool status image-pool提示为mirror pool status命令添加--verbose选项可额外输出池内每个镜像的状态细节。rbd-mirror 守护进程的源码级实现主循环与池回放器管理从 src/tools/rbd_mirror/Mirror.cc 的实现看rbd-mirror 的核心类rbd::mirror::Mirror定义见 src/tools/rbd_mirror/Mirror.h负责“主循环 全局状态”并在“发现配置变更”与“应用这些变更”之间做协调init()阶段初始化本地 RADOS 句柄并连接本地集群、创建线程单例Threads、注册服务守护ServiceDaemon、创建ClusterWatcherMirror.cc 第 539-566 行run()主循环按rbd_mirror_pool_replayers_refresh_interval间隔周期性调用ClusterWatcher::refresh_pools()刷新池配置随后调用update_pool_replayers()增删重建每个池对应的PoolReplayer实例Mirror.cc 第 568-601 行update_pool_replayers()中体现了两个关键机制按 peer UUID 全量匹配决定保留还是重建 pool replayerpeer 更新即重建以及站点名变更、被 blocklist、运行失败时自动重建 pool replayerMirror.cc 第 698-770 行。PoolReplayer及其下辖的ImageReplayer、InstanceReplayer等组件src/tools/rbd_mirror/ 目录中分别有PoolReplayer.cc、ImageReplayer.cc、InstanceReplayer.cc、ImageSync.cc等实现共同完成“从远程集群读取 journal 事件/快照差异 → 在本地回放/同步”的复制工作。Admin Socket 运维命令Mirror构造时会注册一批admin socket 命令Mirror.cc 第 283-356 行用于在线运维调试rbd mirror status输出镜像状态调用print_statusrbd mirror start启动所有 pool replayerrbd mirror stop停止所有 pool replayerrbd mirror restart重启所有 pool replayerrbd mirror flush冲刷所有 pool replayerrbd mirror leader release释放 rbd mirror 的 leader多实例选主场景下用于主动让出。这些命令可通过ceph --admin-daemon {socket-path} rbd mirror status等方式调用是排查镜像问题的有力工具。性能计数器Perf Countersmain.cc 第 69-100 行 注册了两组性能计数器rbd_mirror_journalentries回放的事件数、replay_bytes回放的总字节数、replay_latency回放延迟rbd_mirror_snapshotsnapshots已同步的快照数、sync_time平均同步时间、sync_bytes同步的总字节数。计数器名称前缀体现了两种镜像模式的底层路径——journal 模式走“事件回放”snapshot 模式走“快照同步”。可通过ceph daemon ... perf dump或 Prometheus 等监控工具采集。信号处理与优雅退出守护进程收到SIGHUP时重开所有 pool replayer 与全局日志对应systemd单元的ExecReload/bin/kill -HUP $MAINPID收到SIGINT/SIGTERM时置停止标志并唤醒主循环随后并行停止所有 pool replayerMirror.cc 第 514-537 行。与镜像相关的常用配置项以下配置项定义于 src/common/options/rbd.yaml.in 的 RBD 服务段均在运行时通过守护进程读取配置项类型默认值说明rbd_mirroring_max_mirroring_snapshotsuint5最小值3每个镜像最多保留的 mirror-snapshot 数量达到上限自动修剪rbd_mirroring_replay_delayuint0rbd-mirror 异步复制的回放时间延迟秒rbd_mirroring_delete_delayuint0rbd-mirror 删除传播的时间延迟秒rbd_mirroring_resync_after_disconnectboolfalse镜像因 laggy 断开后是否自动开始 resyncrbd_journal_max_payload_bytessize16_K日志载荷超过该值前拆分迁移单卷时可调大以提升性能rbd_journal_orderuint24journal 数据对象的对象大小2 的幂取值范围 12-26rbd_journal_splay_widthuint4活跃 journal 对象数量rbd_journal_commit_agefloat5journal 提交时间间隔秒rbd_journal_object_flush_bytessize1_M每个 journal 对象的最大待提交字节数rbd_journal_object_flush_agefloat0待提交记录的最大存活时间秒rbd_journal_poolstr空存放 journal 对象的池默认与镜像同池rbd_journal_max_concurrent_object_setsuint0journal 客户端落后超过该数量的对象集时自动注销rbd_default_data_poolstr空目标集群创建镜像时的默认数据池影响 rbd-mirror 的数据池选择上述配置可通过ceph config set集中式配置或写入 Ceph 配置文件的[client]段如手册建议的rbd_journal_max_payload_bytes调优生效。可用性与参考rbd-mirror是 Ceph 的一部分——一个大规模可扩展的开源分布式存储系统。该守护进程包含在可选的rbd-mirror发行包中debian 打包见 debian/rbd-mirror.installRPM 打包见 ceph.spec.in。相关参考rbd 命令手册doc/man/8/rbd.rstRBD 镜像完整操作指南本文扩展的母本doc/rbd/rbd-mirroring.rst守护进程源码src/tools/rbd_mirror/systemd 单元systemd/ceph-rbd-mirror.service.in相关配置项定义src/common/options/rbd.yaml.in【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址: https://gitcode.com/gh_mirrors/ce/ceph创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表