ceph 添加osd

ceph 添加osd,第1张

设置磁盘状态

./storcli64 /c0/e134/s6 set good farce

添加虚拟raid类型

./storcli64 /c0 add vd type=raid0 size=all drives=134:6

查看磁盘分布

ceph-disk list

设置新加盘

dd if=/dev/zero of=/dev/sde bs=1M count=10 oflag=sync

将新加盘设为动态盘

parted -s /dev/sde mklabel gpt

设置动态盘大小

parted -s /dev/sde mkpart primary 2048s 100%

查看

ceph-disk list

文件化

mkfs.xfs /dev/sde1

激活并分配journal卷

/dev/sdg1 ceph data, active, cluster ceph, osd.24, journal /dev/sdb5

设置盘类型sgdisk --typecode=1:4fbd7e29-9d25-41b8-afd0-062c0ceff05d /dev/sde

设置磁盘类型

sgdisk --typecode=3:45b0969e-9b03-4f30-b4c6-b4b80ceff106 /dev/sdb

查看

ceph-disk list

主控节点上

ceph-deploy --overwrite-conf osd prepare node-25:/dev/sde1:/dev/sdb3

ceph-deploy --overwrite-conf osd activate  node-25:/dev/sde1:/dev/sdb3

系统的开始使用一个 ceph 集群

本文将系统的介绍如何使用一个 ceph 集群。

涉及: crush、osd、pool、cache

ceph 版本:nautilus

ceph-deploy 版本:2.0.1

在基本使用需求下,一般需要存储集群提供高性能存储(SSD)和普通存储(hdd)。

在 ceph 中,具体表现为某些池使用高性能存储,某些池使用普通存储。而这种需求在 ceph 中由 crush 规则实现。

ceph 提供了缓存的概念。在普通的存储池之上架设一层高性能的缓存池,外部访问首先到达缓存池,如果发生未命中等情况再去访问存储池。这里需要提一点,并不是任何情况都需要缓存。

针对不同的场景,ceph 的使用方式多种多样,这里的介绍只能一切从简,但是会尽量全面。

一个标准的场景:一个存储池加一个缓存池,存储池使用普通设备,缓存池使用高性能设备。

首先添加一块高性能硬盘(我这里是虚拟环境,只能用普通硬盘充数)

然后需要利用 crush 让不同池使用不同的存储设备

这里只能拿普通的虚拟硬盘来做测试。

在 ceph02 虚拟机上增加一块 30G 的虚拟硬盘。

在 ceph03 虚拟机上增加一块 30G 的虚拟硬盘。

现在到部署节点进行 *** 作:

如图 ceph02 出现了 osd.6,ceph03 出现了 osd.7。

这里涉及到 root (根)的概念,在文章末尾【扩展】中会介绍。这里可以直接先使用。

将 osd.6 osd.7 加入名称为 cache 的根中(根名称会自动创建,注意,由于默认情况下 osd 在启动时读取的是 hostname,因此该方法只是临时生效,在文章末尾【扩展】中会介绍永久生效办法)

“高性能”存储盘现在已经有了,并且将其置于 cache 根下,这么做的意义在下一步中有体现。

现在可以进行下一步了。

当前环境下已经有一个默认的 crush 规则。

具体属性解释参考:

https://docs.ceph.com/docs/mimic/rados/operations/crush-map-edits/#crush-map-rules

如上图划线处,当前规则只会使用 default 根的 osd。

前面创建高性能设备时,将其设置根为 cache。我们现在就可以创建一个只使用 cache 根中的 osd 的规则,从而实现缓存池和存储池使用不同的设备。

创建缓存池使用的规则:

其中:

replicated_cache 指该规则的名字。

cache 指该规则使用的根。

host 指故障域级别。

再次查看所有规则:

现在我们有了一个只使用高性能存储设备的规则了。接下来就可以开始创建使用不同规则的池了。

创建存储池:

查看池:

查看该池的规则:

存储池至此已经好了。

缓存池在 ceph 中常以 hot 标识。

普通存储池在 ceph 中常以 cold 标识。

缓存有多种形式(官方文档列出以下几种,实际更多):

缓存参考:

https://docs.ceph.com/docs/master/rados/operations/cache-tiering/

创建缓存池

缓存池创建好以后,要将这个缓存池与对应存储池联系起来。这个联系的概念叫做 cache tiering,可以称之为缓存层,缓存代理。

参考:

https://docs.ceph.com/docs/master/rados/operations/cache-tiering/

对于 test_storage 池,我们有一个只读的缓存池了。只要我们读取 test_storage 中的某个对象,这个对象就应该自动的置于缓存池中一段时间。

可以发现,将对象上传回写模式的缓存池,存储池中也出现了对应的数据。

osd 的大小可能不相同,因此其上的数据量也不应该相同,因此引入权重来影响数据分布。

比如100G的 osd 权重为1,则200G的 osd 权重就应设置为2。

ceph osd tree 命令可以看到存储结构。可以结合自己机器执行的结果往下阅读。

一张官方图:

这是描述 ceph 存储结构的一张图。

首先这是一个树形结构。

其中最上层的 root default :root 是根的意思,default 就是这个根的名字。

中间 host foo :host 是主机的意思,foo 就是这个主机的名字。这里的主机名仅仅是个别称,不代表实际的主机,可以随意更改。

最下面的就是叶子节点了,具体指向 osd。

划分这三层结构的意义(不完全):

本文使用 ceph-deploy 添加 osd 时,并没有直接将其设置到最终根下,后续还需要手动配置。这么 *** 作是不合理的,暂时未找到 ceph-deploy 指定根的参数。

当前文章配置的缓存池是2副本的。

某些时候,缓存数据是允许丢失的,比如只读的缓存。这种缓存池单副本即可,但是经测试,单副本池在 ceph 中似乎困难重重。

可以通过修改该机器的 hostname ,一劳永逸

这个时候,当机器重启后,该机器的所有 osd 的 host 名称都一样了,导致 osd tree 混乱。这个时候可以在 ceph.conf 中具体配置某块盘的信息。

当前环境配置参考:

增加如下内容:

重启后,一切正常。

在 osd 的启动上做文章。

比如,配置 osd 的启动方式,容器化 osd,容器会记住某些信息,因此可以实现永久生效 hostname。

osd 上的 pg 数量会对整体集群性能造成影响,并不是越多越好,也不是越少越好。

由于池有副本的概念,因此产生了如下的计算方式:

官方建议每个 osd 上的 pg 数为 100。实际测试每个 osd 上的 pg 数到达 250 时开始告警,因此该集群的总 pg 数不应超过:

因此出现此问题的原因:

所有池的 pg 数加起来超过了设定的 总 pg 数 。但集群依然可正常使用,因此只是一个警告。

解决该问题的手段:

目前个人经验来说,不要使用单副本。

crush 规则参考:

https://docs.ceph.com/docs/master/rados/operations/crush-map/

DataTable dt = new DataTable()

dt.Columns.Add(new DataColumn("PreRevDate0", typeof(decimal)))

DataColumn col = new DataColumn()

col.ColumnName = "PreRevDate1"

col.Expression = "ABS(Convert.ToInt32(PreRevDate0))"

col.DataType = typeof(decimal)

dt.Columns.Add(col)

DataRow dr = dt.NewRow()

dr["PreRevDate0"] = -1

dt.Rows.Add(dr)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11534204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存