我目前正在评估 xenserver 的存储系统。由于发生故障时数据复制非常重要,因此我对 ceph 中的复制有疑问。
据我所知,节点中的每个磁盘本身都是一个 osd(磁盘不在任何 raid 配置中)。ceph 复制算法是否知道 2 个 osd 位于同一个节点上,因此不会复制这些 osd 上的数据?
最小示例:2 个节点,每个节点有 2 个磁盘。由于非 raid 设置,每个磁盘都是一个 osd -> 4 个 osd。节点 A:OSD1、OSD2;节点 B:OSD3、OSD4。我将复制量设置为 2,并将对象保存到 ceph 中。对象是否会被保存和复制,以便在节点发生故障时数据完全可访问?
谢谢您的回答
答案1
- 是的
- 您可以定义按节点、机架、数据中心等进行复制的策略。
答案2
默认情况下,CRUSH 复制规则 (replicated_ruleset) 规定复制处于主持人级别。您可以通过导出 Crush 地图来检查这一点:
ceph osd getcrushmap -o /tmp/compiled_crushmap
crushtool -d /tmp/compiled_crushmap -o /tmp/decompiled_crushmap
地图将显示这些信息:
rule replicated_ruleset {
ruleset 0
type replicated
min_size 1
max_size 10
step take default
step chooseleaf firstn 0 type host
复制的类型列于图的开头:
# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 region
type 10 root
为了达到 HEALTH_OK 状态并根据规则复制对象,您必须将复制类型更改为操作系统在您的特定情况下。可以通过运行以下命令重新编译地图:
crushtool -c /tmp/decompiled_crushmap -o /tmp/compiled_crushmap
ceph osd setcrushmap -i /tmp/compiled_crushmap
你可以在 ceph 文档中找到有关如何使用 CRUSH 映射的更多信息:http://docs.ceph.com/docs/master/rados/operations/crush-map/
可以使用以下方法找到特定对象的位置:
ceph osd map {pool-name} {object-name}
如果您想要检查所有对象的地图,您可以通过查看放置组转储来实现(考虑显示您自己的信息):
ceph pg dump | awk '{print $1 "\t" $2 "\t" $15 "\t" $16}'
关于 OSD,您可以将 OSD 视为任何类型的逻辑物理存储单元(文件夹/分区/逻辑卷/磁盘/ LUN)