开发者社区> blackpiglet> 正文

如何在单节点 Ceph 中配置多数据副本

简介: crush.png 在服务器资源不足,或者测试环境下,Ceph 通常只有一个节点,就算有多个服务器组成集群,往往存储服务器也往往只有一台,Ceph 的默认配置下,只能设置单数据备份,也就是说数据只存了一份,如果磁盘坏了,数据就丢了。
+关注继续查看
img_031b635aef5e4469f7a893b593a06fd7.png
crush.png

在服务器资源不足,或者测试环境下,Ceph 通常只有一个节点,就算有多个服务器组成集群,往往存储服务器也往往只有一台,Ceph 的默认配置下,只能设置单数据备份,也就是说数据只存了一份,如果磁盘坏了,数据就丢了。虽然测试环境数据没那么重要,总保不齐就会有关键数据放在上面,所以还是要想办法在资源有限的条件下实现数据的高可用,另外这也是一个很好的进一步理解 Ceph 概念的好机会,接下来就让我们来看看是如何实现的吧。

1. CRUSH map 规则介绍

为了把这件事说清楚,我们需要了解 CRUSH map 一些具体规则,所以先来看一下默认的 CRUSH map。

$ cat crush-map-decompiled
...
# buckets
host rbd-osd1 {
    id -3       # do not change unnecessarily
    id -4 class hdd     # do not change unnecessarily
    # weight 130.992
    alg straw2
    hash 0  # rjenkins1
    item osd.0 weight 5.458
    item osd.1 weight 5.458
    item osd.2 weight 5.458
    item osd.3 weight 5.458
    item osd.4 weight 5.458
    item osd.5 weight 5.458
    item osd.6 weight 5.458
    item osd.7 weight 5.458
    item osd.8 weight 5.458
    item osd.9 weight 5.458
    item osd.10 weight 5.458
    item osd.11 weight 5.458
    item osd.12 weight 5.458
    item osd.13 weight 5.458
    item osd.14 weight 5.458
    item osd.15 weight 5.458
    item osd.16 weight 5.458
    item osd.17 weight 5.458
    item osd.18 weight 5.458
    item osd.19 weight 5.458
    item osd.20 weight 5.458
    item osd.21 weight 5.458
    item osd.22 weight 5.458
    item osd.23 weight 5.458
}
root default {
    id -1       # do not change unnecessarily
    id -2 class hdd     # do not change unnecessarily
    # weight 130.992
    alg straw2
    hash 0  # rjenkins1
    item rbd-osd1 weight 130.992
}

# rules
rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type host
    step emit
}

我们可以看到,Ceph 集群中只有一台存储服务器:rbd-osd1,上面有 24 块硬盘。
要实现单存储上多备份,关键就在这行配置上:step chooseleaf firstn 0 type host
这句话的意思是,从选定的 bucket(也就是 host rbd-osd1)中,获取默认个(也就是 osd_pool_default_size 个,这是在 /etc/ceph/ceph.conf 中配置的)叶子节点(也就是 rbd-osd1 中包含的那 24 个 item),叶子节点的类型为 host。
默认配置出问题的地方就是在叶子节点的类型上,osd_pool_default_size 默认值是三,也就是说,需要找三个 host 类型的 bucket,host 对应的就是存储服务器,我们现在只有一个,当然不满足需求了。从 ceph 的状态上也能看出来,所有的 OSD 都因为 OSD 数量不足,处于 active+undersized 状态。

$ ceph -s
...
  data:
    pools:   1 pools, 64 pgs
    objects: 0 objects, 0 bytes
    usage:   25001 MB used, 130 TB / 130 TB avail
    pgs:     64 active+undersized

2. 修改 CRUSH map

了解到问题所在,接下来就动手修改吧,CRUSH map 支持两种修改方式,一种是命令行,优点是单条命令很简单,缺点是不够直观;第二种是手动修改配置文件,优点是所见即所得,缺点是麻烦一点,需要先导出,解码,修改,最后再编码,导入。这里因为修改的内容颇为具体,所以采用第二种方法。

先将 CRUSH map 导出到文件 crush-map 中。

$ ceph osd getcrushmap -o crush-map

然后解码,并输出到文件 crush-map-decompiled 中。

$ crushtool -d crush-map -o crush-map-decompiled

修改 crush-map-decompiled,将 type 改为 osd,即可

$ cat crush-map-decompiled
...
# rules
rule replicated_rule {
    id 0
    type replicated
    min_size 1
    max_size 10
    step take default
    step chooseleaf firstn 0 type osd
    step emit
}

将改好的文件编码到文件 crush-map 中。

$ crushtool -c crush-map-decompiled -o crush-map

最后导入。

$ ceph osd setcrushmap -o crush-map

3. 修改 /etc/ceph/ceph.conf

不过事情没有那么简单,还需要配合 ceph.conf 的修改才行,我们要修改 osd_crush_chooseleaf_type
这个参数每个取值的意义在 Ceph 的官方文档中,有明确的说明,0 是给单节点的 ceph 集群使用的,而 1 是默认值,所以我们需要修改。

#Choose a reasonable crush leaf type.
#0 for a 1-node cluster.
#1 for a multi node cluster in a single rack
#2 for a multi node, multi chassis cluster with multiple hosts in a chassis
#3 for a multi node cluster with hosts across racks, etc.
osd crush chooseleaf type = {n}

集群是使用 ceph-deploy 来部署的,所以需要修改 ceph-deploy 目录下的文件,然后推送到 ceph 集群中的服务器中:

$ cat ceph.conf
...
osd_crush_chooseleaf_type = 0
...

$ ceph-deploy --overwrite-conf config push rbd-master1 rbd-osd1

4. 动态修改 ceph 配置

至此问题还是没有完全解决,原因是配置文件的变动需要,进程的重启才能生效,不重启有没有办法让改动生效呢?有的,需要使用的 ceph daemon 命令。

sudo ceph daemon mon.rbd-master1 config set osd_pool_default_size 0

5. 参考文档

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何在单节点 Ceph 中配置多数据副本
crush.png 在服务器资源不足,或者测试环境下,Ceph 通常只有一个节点,就算有多个服务器组成集群,往往存储服务器也往往只有一台,Ceph 的默认配置下,只能设置单数据备份,也就是说数据只存了一份,如果磁盘坏了,数据就丢了。
1103 0
配置 Ceph 内外网分离
luminous.jpg 1. 为什么要做内外网分离   先明确一下这么做的必要性。Ceph 的客户端,如 RADOSGW,RBD 等,会直接和 OSD 互联,以上传和下载数据,这部分是直接提供对外下载上传能力的;Ceph 一个基本功能是提供数据的冗余备份,OSD 负责数据的备份,跨主机间的数据备份当然要占用带宽,而且这部分带宽是无益于 Ceph 集群的吞吐量的。
1324 0
数据智能,触手可及!袋鼠云数栈推出 数据科学平台 DTinsight.Science
一句话了解DTinsight.Science DTinsight.Science是「可视化建模与交互式代码编写于一体的机器学习作业探索平台」,实现数据接入、可视化实验建模、Notebook编程、模型训练、模型部署、任务运维等开发场景,帮助企业构建算法服务能力,提供高效、安全、稳定的算法运行环境。
2449 0
ceph在扩展mon节点时,要注意的问题
我开始也是一步一步的按官方文档操作。 但后来还是遇到了问题。 当我要扩展mon节点时,死活出错。 (我就一共用了三个节点ceph-admin, ceph-node1, ceph-node2) 比如: ceph-deploy mon add ceph-node2 出错如下: [ceph_deploy.
2826 0
+关注
blackpiglet
云原生技术爱好者。
42
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载