• 【云原生 | Kubernetes 系列】---Ceph Crush


    1. Ceph Crush进阶

    ceph集群中由mon服务器维护的五种运行图:

    1. Monitor map
    2. OSD Map
    3. Pg Map # pg中有多少个osd,那个osd是主的,那个是备的
    4. Crush Map #可控的,可复制的,可伸缩的一致性hash算法
    5. MDS Map # cephfs metadata map

    crush算法针对目的节点的选择,有5种算法来实现:

    1. Uniform
    2. List
    3. Tree
    4. Straw
    5. Straw2

    1.1 PG与OSD映射

    默认情况下,crush算法自行对创建的pool中的PG分配OSD,但是可以手动基于权重设置crush算法分配数据倾向性,比如1T的磁盘权重是1,2T的是2,推荐使用相同大小的设备

    1.1.1 查看当前状态

    weight表示设备的容量相对值.weight就是基于磁盘空间分配PG数量,让crush算法尽可能往磁盘空间大的OSD分配PG,往小的OSD分配较少的PG.

    Reweight参数目的就是重新平衡ceph的crush算法随机分配的PG,默认的分配时概率上的均衡,即使OSD都是一样的磁盘空间也会产生一些PG分布不均匀的情况.此时可以通过调整reweight参数,让ceph集群立即重新平衡当前磁盘的PG,以达到数据均衡分布的目的.

    $ ceph osd df 
    ID  CLASS  WEIGHT   REWEIGHT  SIZE      RAW USE  DATA     OMAP    META     AVAIL     %USE  VAR   PGS  STATUS
    10    hdd  0.00099   1.00000  1020 MiB   59 MiB   16 MiB     0 B   43 MiB   961 MiB  5.80  1.13   60      up
    11    hdd  0.00099   1.00000  1020 MiB   71 MiB   22 MiB     0 B   49 MiB   949 MiB  6.93  1.35   60      up
    12    hdd  0.00099   1.00000  1020 MiB   64 MiB   21 MiB     0 B   43 MiB   956 MiB  6.29  1.23   63      up
    13    hdd  0.00099   1.00000  1020 MiB   66 MiB   17 MiB     0 B   49 MiB   954 MiB  6.48  1.26   55      up
     2    hdd  0.00099   1.00000  1020 MiB   14 MiB   12 MiB     0 B   37 MiB  1006 MiB  1.35  0.26   54      up
     3    hdd  0.00099   1.00000  1020 MiB   67 MiB   22 MiB     0 B   45 MiB   953 MiB  6.53  1.27   64      up
     4    hdd  0.00099   1.00000  1020 MiB   65 MiB   15 MiB     0 B   50 MiB   955 MiB  6.37  1.24   59      up
     5    hdd  0.00099   1.00000  1020 MiB   79 MiB   23 MiB     0 B   56 MiB   941 MiB  7.70  1.50   59      up
     6    hdd  0.00099   1.00000  1020 MiB   52 MiB   27 MiB   2 KiB   25 MiB   968 MiB  5.05  0.99   56      up
     7    hdd  0.00099   1.00000  1020 MiB   52 MiB   13 MiB   3 KiB   39 MiB   968 MiB  5.09  0.99   68      up
     8    hdd  0.00099   1.00000  1020 MiB   42 MiB   10 MiB   7 KiB   31 MiB   978 MiB  4.08  0.80   50      up
     9    hdd  0.00099   1.00000  1020 MiB   32 MiB   11 MiB   4 KiB   22 MiB   988 MiB  3.18  0.62   54      up
    14    hdd  0.00099   1.00000  1020 MiB   44 MiB   19 MiB   3 KiB   25 MiB   976 MiB  4.32  0.84   51      up
    15    hdd  0.00099   1.00000  1020 MiB   46 MiB   21 MiB   2 KiB   26 MiB   974 MiB  4.53  0.88   57      up
    16    hdd  0.00099   1.00000  1020 MiB   40 MiB   10 MiB   3 KiB   30 MiB   980 MiB  3.96  0.77   50      up
    17    hdd  0.00099   1.00000  1020 MiB   45 MiB   13 MiB   3 KiB   32 MiB   975 MiB  4.40  0.86   55      up
                           TOTAL    16 GiB  837 MiB  271 MiB  31 KiB  601 MiB    15 GiB  5.13                   
    

    1.1.2 修改权重

    权重高的服务器,会承载更多的数据,实时生效.

    # 权重调高,数据优先写入osd.10
    $ ceph osd crush reweight osd.10 0.0015
    reweighted item id 10 name 'osd.10' to 0.0015 in crush map
    $ ceph osd df 
    ID  CLASS  WEIGHT   REWEIGHT  SIZE      RAW USE  DATA     OMAP    META     AVAIL     %USE   VAR   PGS  STATUS
    10    hdd  0.00150   1.00000  1020 MiB  146 MiB   58 MiB     0 B   88 MiB   874 MiB  14.30  2.11   91      up
    11    hdd  0.00099   1.00000  1020 MiB   79 MiB   20 MiB     0 B   60 MiB   941 MiB   7.75  1.14   45      up
    12    hdd  0.00099   1.00000  1020 MiB   76 MiB   22 MiB     0 B   54 MiB   944 MiB   7.45  1.10   53      up
    13    hdd  0.00099   1.00000  1020 MiB   73 MiB   19 MiB     0 B   54 MiB   947 MiB   7.20  1.06   55      up
     2    hdd  0.00099   1.00000  1020 MiB   15 MiB   14 MiB     0 B   45 MiB  1005 MiB   1.51  0.22   51      up
     3    hdd  0.00099   1.00000  1020 MiB   79 MiB   23 MiB     0 B   55 MiB   941 MiB   7.71  1.14   62      up
     4    hdd  0.00099   1.00000  1020 MiB   76 MiB   17 MiB     0 B   60 MiB   944 MiB   7.50  1.11   53      up
     5    hdd  0.00099   1.00000  1020 MiB   88 MiB   25 MiB     0 B   63 MiB   932 MiB   8.58  1.27   58      up
     6    hdd  0.00099   1.00000  1020 MiB   66 MiB   28 MiB   2 KiB   37 MiB   954 MiB   6.42  0.95   50      up
     7    hdd  0.00099   1.00000  1020 MiB   67 MiB   15 MiB   3 KiB   53 MiB   953 MiB   6.59  0.97   66      up
     8    hdd  0.00099   1.00000  1020 MiB   51 MiB   12 MiB   7 KiB   38 MiB   969 MiB   4.96  0.73   48      up
     9    hdd  0.00099   1.00000  1020 MiB   46 MiB   13 MiB   4 KiB   33 MiB   974 MiB   4.51  0.66   55      up
    14    hdd  0.00099   1.00000  1020 MiB   63 MiB   24 MiB   3 KiB   39 MiB   957 MiB   6.19  0.91   52      up
    15    hdd  0.00099   1.00000  1020 MiB   61 MiB   22 MiB   2 KiB   39 MiB   959 MiB   5.99  0.88   59      up
    16    hdd  0.00099   1.00000  1020 MiB   63 MiB   16 MiB   3 KiB   47 MiB   957 MiB   6.16  0.91   56      up
    17    hdd  0.00099   1.00000  1020 MiB   58 MiB   14 MiB   3 KiB   43 MiB   962 MiB   5.64  0.83   60      up
                           TOTAL    16 GiB  1.1 GiB  341 MiB  31 KiB  808 MiB    15 GiB   6.78
    # 权重调低,数据从osd.7迁出
    $ ceph osd crush reweight osd.7 0.00095
    reweighted item id 7 name 'osd.7' to 0.00095 in crush map
    $ ceph osd df 
    ID  CLASS  WEIGHT   REWEIGHT  SIZE      RAW USE  DATA     OMAP    META     AVAIL     %USE   VAR   PGS  STATUS
    10    hdd  0.00150   1.00000  1020 MiB  106 MiB   14 MiB     0 B   92 MiB   914 MiB  10.44  1.55   75      up
    11    hdd  0.00099   1.00000  1020 MiB   81 MiB   20 MiB     0 B   61 MiB   939 MiB   7.93  1.18   47      up
    12    hdd  0.00099   1.00000  1020 MiB   78 MiB   23 MiB     0 B   56 MiB   942 MiB   7.69  1.14   56      up
    13    hdd  0.00099   1.00000  1020 MiB   75 MiB   20 MiB     0 B   56 MiB   945 MiB   7.38  1.10   57      up
     2    hdd  0.00099   1.00000  1020 MiB   16 MiB   15 MiB     0 B   47 MiB  1004 MiB   1.58  0.23   49      up
     3    hdd  0.00099   1.00000  1020 MiB   81 MiB   24 MiB     0 B   57 MiB   939 MiB   7.90  1.17   61      up
     4    hdd  0.00099   1.00000  1020 MiB   78 MiB   17 MiB     0 B   61 MiB   942 MiB   7.70  1.14   55      up
     5    hdd  0.00099   1.00000  1020 MiB   85 MiB   21 MiB     0 B   64 MiB   935 MiB   8.37  1.24   57      up
     6    hdd  0.00099   1.00000  1020 MiB   68 MiB   29 MiB   2 KiB   39 MiB   952 MiB   6.65  0.99   53      up
     7    hdd  0.00095   1.00000  1020 MiB   69 MiB   15 MiB   3 KiB   54 MiB   951 MiB   6.79  1.01   66      up
     8    hdd  0.00099   1.00000  1020 MiB   53 MiB   13 MiB   7 KiB   40 MiB   967 MiB   5.17  0.77   49      up
     9    hdd  0.00099   1.00000  1020 MiB   48 MiB   13 MiB   4 KiB   35 MiB   972 MiB   4.69  0.70   52      up
    14    hdd  0.00099   1.00000  1020 MiB   66 MiB   25 MiB   3 KiB   41 MiB   954 MiB   6.43  0.96   56      up
    15    hdd  0.00099   1.00000  1020 MiB   64 MiB   23 MiB   2 KiB   41 MiB   956 MiB   6.24  0.93   62      up
    16    hdd  0.00099   1.00000  1020 MiB   66 MiB   17 MiB   3 KiB   49 MiB   954 MiB   6.47  0.96   57      up
    17    hdd  0.00099   1.00000  1020 MiB   64 MiB   19 MiB   3 KiB   45 MiB   956 MiB   6.29  0.93   63      up
                           TOTAL    16 GiB  1.1 GiB  308 MiB  31 KiB  835 MiB    15 GiB   6.73                   
    MIN/MAX VAR: 0.23/1.55  STDDEV: 1.86
    

    1.2 crush 运行图管理

    1.2.1 导出crush运行图

    导出的运行图是二进制格式,无法通过文本编辑器打开,需要使用crushtool工具转换为文本后才能通过vim等工具查看或编辑

    # mkdir /ceph/crush -p
    # ceph osd getcrushmap -o /ceph/crush/crushmap-202209201501
    51
    

    1.2.2 将crush运行图转换成文本

    root@ceph-mgr01:~# crushtool -d /ceph/crush/crushmap-202209201501 > /ceph/crush/crushmap-202209201501.txt
    root@ceph-mgr01:~# file /ceph/crush/crushmap-202209201501
    /ceph/crush/crushmap-202209201501: GLS_BINARY_LSB_FIRST
    root@ceph-mgr01:~# file /ceph/crush/crushmap-202209201501.txt
    /ceph/crush/crushmap-202209201501.txt: ASCII text
    root@ceph-mgr01:~# head /ceph/crush/crushmap-202209201501.txt
    # begin crush map
    tunable choose_local_tries 0
    tunable choose_local_fallback_tries 0
    tunable choose_total_tries 50
    tunable chooseleaf_descend_once 1
    tunable chooseleaf_vary_r 1
    tunable chooseleaf_stable 1
    tunable straw_calc_version 1
    tunable allowed_bucket_algs 54
    

    1.2.3 修改配置

    # types		# 当前支持的bucket类型
    type 0 osd	#osd守护进程,对应到一个磁盘设备
    type 1 host	#一个主机
    type 2 chassis#刀片服务器的机箱
    type 3 rack#一个机柜
    type 4 row#一列
    type 5 pdu#一个电源pdu
    type 6 pod#一个机房区域
    type 7 room#一个房间
    type 8 datacenter#一个dc
    type 9 zone#一个区域
    type 10 region#一个地域
    type 11 root#bucket分层最顶部
    # buckets
    host ceph-node01 {  # 类型host名字是ceph-node01
    	id -3		# do not change unnecessarily 不要修改
    	id -4 class hdd		# do not change unnecessarily 不要修改
    	# weight 0.004
    	alg straw2		# crush算法,管理OSD角色
    	hash 0	# rjenkins1   hash算法 0表示选择rjenkins1算法
    	item osd.10 weight 0.001   # osd10权重比,crush会自动根据磁盘空间进行计算,不同磁盘的空间不同权重也不同.
    	item osd.11 weight 0.001
    	item osd.12 weight 0.001
    	item osd.13 weight 0.001
    }
    root default {  # 根的配置
    	id -1		# do not change unnecessarily
    	id -2 class hdd		# do not change unnecessarily
    	# weight 0.016
    	alg straw2
    	hash 0	# rjenkins1
    	item ceph-node01 weight 0.004
    	item ceph-node02 weight 0.004
    	item ceph-node03 weight 0.004
    	item ceph-node04 weight 0.004
    }
    # rules
    rule replicated_rule {  #副本池的默认配置
    	id 0
    	type replicated
    	min_size 1
    	max_size 10  # 默认最大副本为10   <----将这个值改为20
    	step take default  # 基于default定义的主机分配OSD
    	step chooseleaf firstn 0 type host # 选择主机,故障域类型为主机
    	step emit  # 弹出配置即返回客户端
    }
    

    1.2.4 文本转crush格式

    修改文本配置,改完后将文本转回二进制

    # crushtool -c /ceph/crush/crushmap-202209201501.txt -o /ceph/crush/crushmap-202209201501-2
    

    1.2.5 导入新的crush

    导入运行图会立即覆盖原有的运行图并立即生效

    # ceph osd setcrushmap -i /ceph/crush/crushmap-202209201501-2
    52
    

    1.2.5 确认修改是否成功

    # ceph osd crush rule dump 
    [
        {
            "rule_id": 0,
            "rule_name": "replicated_rule",
            "ruleset": 0,
            "type": 1,
            "min_size": 1,
            "max_size": 20,   # <---刚才修改的值
            "steps": [
                {
                    "op": "take",
                    "item": -1,
                    "item_name": "default"
                },
                {
                    "op": "chooseleaf_firstn",
                    "num": 0,
                    "type": "host"
                },
                {
                    "op": "emit"
                }
            ]
        }
    ]
    

    1.3 crush数据分类管理

    ceph crush 算法分配的PG的时候可以将PG分配到不同主机的OSD上,以实现以主机为单位的高可用,这也是默认机制,但是无法保证不同PG位于不同机柜或者机房的主机,如果要事先基于机柜或者是更高级的IDC等方式的数据高可用,而且也不能实现A项目的数据在SSD,B项目的数据在机械盘,如果想要实现此功能需要导出crush运行图,进行手工编辑之后再导入覆盖原有crush运行图.

    1.3.1 导出crush运行图并编辑

    ## 1.导出配置
    # ceph osd getcrushmap -o /ceph/crush/crushmap-202209201601
    # crushtool -d /ceph/crush/crushmap-202209201601 > /ceph/crush/crushmap-202209201601.txt
    ## 2.修改配置
    ## 编辑/ceph/crush/crushmap-202209201601.txt追加以下内容
    # vi /ceph/crush/crushmap-202209201601.txt
    host ceph-ssdnode01 {
            id -103           # do not change unnecessarily
            id -104 class hdd         # do not change unnecessarily
            # weight 0.004
            alg straw2
            hash 0  # rjenkins1
            item osd.10 weight 0.001
    }
    host ceph-ssdnode02 {
            id -105           # do not change unnecessarily
            id -106 class hdd         # do not change unnecessarily
            # weight 0.004
            alg straw2
            hash 0  # rjenkins1
            item osd.2 weight 0.001
    }
    host ceph-ssdnode03 {
            id -107           # do not change unnecessarily
            id -108 class hdd         # do not change unnecessarily
            alg straw2
            hash 0  # rjenkins1
            item osd.14 weight 0.001
    }
    root ssd {
            id -110           # do not change unnecessarily
            id -200 class hdd         # do not change unnecessarily
            # weight 0.016
            alg straw2
            hash 0  # rjenkins1
            item ceph-ssdnode01 weight 0.004
            item ceph-ssdnode02 weight 0.004
            item ceph-ssdnode03 weight 0.004
    }
    rule ssd_rule {
            id 100
            type replicated
            min_size 1
            max_size 10
            step take ssd		## 这个类型调用ssd中的主机创建PG
            step chooseleaf firstn 0 type host
            step emit
    }
    
    ## 3. 导入配置
    ## 转成2进制
    # crushtool -c /ceph/crush/crushmap-202209201601.txt -o /ceph/crush/crushmap-202209201601-2
    ## 导入2进制
    # ceph osd setcrushmap -i /ceph/crush/crushmap-202209201601-2
    53
    
    

    1.3.2 查看规则是否生成

    # ceph osd crush rule dump
    [
        {
            "rule_id": 0,
            "rule_name": "replicated_rule",
            "ruleset": 0,
            "type": 1,
            "min_size": 1,
            "max_size": 20,
            "steps": [
                {
                    "op": "take",
                    "item": -1,
                    "item_name": "default"
                },
                {
                    "op": "chooseleaf_firstn",
                    "num": 0,
                    "type": "host"
                },
                {
                    "op": "emit"
                }
            ]
        },
        {
            "rule_id": 100,
            "rule_name": "ssd_rule",
            "ruleset": 100,
            "type": 1,
            "min_size": 1,
            "max_size": 10,
            "steps": [
                {
                    "op": "take",
                    "item": -110,
                    "item_name": "ssd"
                },
                {
                    "op": "chooseleaf_firstn",
                    "num": 0,
                    "type": "host"
                },
                {
                    "op": "emit"
                }
            ]
        }
    ]
    

    1.3.3 使用ssd规则创建pool

    固态盘分别是osd.10,osd.2,osd.14 可以看到下面创建的pg中的osd范围只在这3个盘之上.

    # ceph osd pool create sap-ssd-pool 32 32 ssd_rule
    pool 'sap-ssd-pool' created
    # ceph pg ls-by-pool sap-ssd-pool|awk '{print $1,$2,$15}'
    PG OBJECTS ACTING
    15.0 0 [14,2,10]p14
    15.1 0 [14,10,2]p14
    15.2 0 [10,2,14]p10
    15.3 0 [14,10,2]p14
    15.4 0 [2,14,10]p2
    15.5 0 [10,2,14]p10
    15.6 0 [2,14,10]p2
    15.7 0 [14,10,2]p14
    15.8 0 [14,2,10]p14
    15.9 0 [10,14,2]p10
    15.a 0 [14,2,10]p14
    15.b 0 [10,14,2]p10
    15.c 0 [10,14,2]p10
    15.d 0 [14,10,2]p14
    15.e 0 [14,2,10]p14
    15.f 0 [14,10,2]p14
    15.10 0 [10,2,14]p10
    15.11 0 [14,2,10]p14
    15.12 0 [10,2,14]p10
    15.13 0 [10,14,2]p10
    15.14 0 [2,14,10]p2
    15.15 0 [14,2,10]p14
    15.16 0 [10,2,14]p10
    15.17 0 [2,14,10]p2
    15.18 0 [10,14,2]p10
    15.19 0 [2,14,10]p2
    15.1a 0 [14,2,10]p14
    15.1b 0 [2,14,10]p2
    15.1c 0 [14,2,10]p14
    15.1d 0 [14,10,2]p14
    15.1e 0 [14,10,2]p14
    15.1f 0 [14,10,2]p14
    
  • 相关阅读:
    Java常见工具类
    Sql Prompt 10下载安装图文教程
    云计算【第一阶段(27)】DHCP原理与配置以及FTP的介绍
    Java参数校验详解:使用@Valid注解和自定义注解进行参数验证
    词法、语法、语义分析编译原理设计
    .Net Redis的秒杀Dome和异步执行
    这种动态规划你见过吗——状态机动态规划之股票问题(上)
    Java while dowhile语法
    事务管理,事务的概念(原子性、一致性、隔离性和持久性(ACID特性))、事务的控制(BEGIN、COMMIT和ROLLBACK)
    java基础之适配器模式[30]
  • 原文地址:https://blog.csdn.net/qq_29974229/article/details/126956568