暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Ceph均衡读问题

Ceph运维技巧及源码分析 2019-09-11
896

最近比较忙,许久不更新,大家见谅 : -)



在Ceph的使用场景中,大量读的业务场景非常普遍,然而由于Ceph本身的读写机制设计,Ceph会出现读请求分布不均的问题,导致Ceph集群的OSD磁盘忙闲不均,容易产生慢请求,影响业务的使用。本文将讨论一下Ceph均衡读的问题~


要了解Ceph数据均衡读的问题,需要先从Ceph数据分布说起~


1. Ceph数据分布


1.1 Ceph数据分布过程


Ceph的数据分布式方式用一句话说就是 “算算就好”,客户端文件到集群磁盘的过程如下:



  1. 大文件会分片成4M(可配置)大小的对象

  2. 4M对象通过hash算法rjenkins(可配置)映射到PG(可理解为对象桶)

  3. PG到OSD磁盘的映射是通过crush算法决定的,在为客户端提供服务前已经全部创建


1.2 Ceph数据分布均衡性


数据分布一般追求一个目标,那就是数据在集群各磁盘上是均衡分布的。


保持磁盘数据均衡的好处:


  1. 磁盘数据均衡可提高集群磁盘的使用率,减少磁盘空间损失率,也就是木桶原理,空间使用率高的磁盘限制了整个集群的可用空间

  2. 磁盘数据均衡可提高集群的读性能,在相同的数据访问概率下,数据量大的磁盘会更加繁忙,对于机械磁盘本身性能不高,很容易达到性能瓶颈


用户数据最终会转化成对象,对象对PG是通过hash映射,在有足够数据量时,可认为各PG内的数据量是基本一致的。因此,要追求磁盘数据均衡,需要PG在OSD磁盘上是均衡分布的。


如果提高PG在OSD磁盘上分布的均衡性呢?


PG到OSD的映射是通过带权重的hash算法crush,要想hash分布均衡,需要样本要足,这里就是创建更多的PG。


在数据量一定的情况下,更多的PG,使每个PG的承载的数据量减少,这样PG从一个OSD迁移到另一个OSD,对OSD磁盘的使用率影响更小,更多的PG使得集群磁盘数据更加均衡。


PG越多数据越均衡,那可以尽情创建PG?


当然不是


  1. PG太多会导致OSD维护PG更加困难

  2. PG越多会导致数据可靠性降低(多磁盘同时故障时,丢数据的可能性提高)

  3. Ceph官方给出了PG/OSD值为100


在hash样本不足(PG/OSD ≈ 100)的情况下,怎么做到PG分布均衡?


我们需要研究下crush算法


1.3 crush算法


一句话,crush算法是用来给PG寻找归宿的~



crush算法:[ pgid, crushmap] -> crush -> [osd x, osd y, …]


crushmap包含三部分内容:


  1. 集群的拓扑结构

  2. 集群各节点的权重

  3. 节点的选取规则,如容灾域、副本策略等


crush算法工作流程:


举个例子,crush规则设置容灾域为机房,副本数为2,我们来看crush算法如何为pg 1.21 需要寻找归宿,crush算法会先为该PG的两个副本选取两个机房,然后从这两个机房中依次往下选取row、机架、host、磁盘。


crush是如何从多个机房中选取两个机房的?是如何从机房的多个row中选取一个row的?


每一次的选择可以使用不同的算法,crush默认采用抽签算法,以机房选取为例,抽签算法会计算每个机房的签长:


签长 = func( w_item_id ) * hash( pgid, cur_rep, item_id ) )


我为PG的第 1 个副本选取机房,此时,



由此,我们可以计算出每个机房的签长,选取签长最长的机房作为PG的第 1 个副本的目标机房,同理可以选取PG的第 2 个副本的目标机房。


通过抽签算法逐层往下选择,最终可为PG选取坐落的机房、row、机架、host、磁盘。


虽然磁盘的容量是一致的,可以设置不同的权重,来寻求pg均衡分布在osd磁盘上


调整后,各OSD上的pg数相对均衡,OSD的磁盘数据量也相对均衡,使用率相差3%以内。


在集群内磁盘数据如此均衡的情况下,大量读时,还会出现磁盘负载不均衡?


2. Ceph读模式


客户端的读请求只会发往PG的Primary副本。。

本节结束。。


3. 大量读均衡问题


对于读请求,只会发往Primary OSD,Primary OSD处理结束后即回复客户端。因此,大量读时,OSD磁盘的负载均衡不仅取决于磁盘的数据是否均衡,还取决于PG的Primary副本在OSD上是否分布均衡。


过一个脚本来看一个数据相对均衡的集群的PG的Primary副本在OSD上是否分布均衡:

    root@h235:/# ./check_primary_pg.sh  cephfs_data
    # PRIMARY PGs number per OSD sorted descending:
    osd.73 PGs number: 124
    osd.1 PGs number: 123
    osd.53 PGs number: 122
    osd.48 PGs number: 122
    osd.93 PGs number: 121
    ...
    osd.63 PGs number: 93
    osd.37 PGs number: 92
    osd.34 PGs number: 88
    osd.21 PGs number: 87
    Primary: Min=87 Max=124 Average=102.6667 Max/Ave=1.20779


    从数据来看,承载PG Primary副本最多的OSD承载了124个,最少的OSD承载了87个。在PG分布均衡时,PG的Primary副本分布却不均衡,由于读请求只由PG的Primary副本处理,从而导致大量读时,OSD磁盘负载不均衡。


    在应对大量读的业务时,在创建集群时,可以通过调整OSD的权重来调节PG的分布,让PG和PG的primary副本都分布均衡一些。


    : -)

    文章转载自Ceph运维技巧及源码分析,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论