温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Ceph 自动reweight脚本

发布时间:2020-08-11 18:23:03 来源:ITPUB博客 阅读:162 作者:jesselyu 栏目:云计算

Ceph的数据分布是由CRUSH Map解决定的,而CRUSH算法是伪HASH的,所以在一定时间内,数据会存在倾斜,这就需要我们用脚本来进行定期的reweight:

#author jesse.js.lyu@gmail.com

#reweight for ceph osds

 

 

import hashlib

import commands

import threading

import sys

from time import ctime,sleep

import urllib2

import json

def doReweight(osdMaxUtilId, osdTargetReweight):

    print 'ceph osd reweight ' + str(osdMaxUtilId) + ' ' + str(osdTargetReweight)

    (status,output) = commands.getstatusoutput('ceph osd reweight '+ str(osdMaxUtilId) +' ' + str(osdTargetReweight))

    print status,output

def  canOSDReweight():

    #

    canDoReweight = False

    pgStateIsOk = False

    osdUtilDiffEnough = False

    #determine pg status

    (status,output) = commands.getstatusoutput('ceph -s --format=json-pretty')

    pgMapJson = json.loads(output)

    #print pgMapJson['pgmap']['pgs_by_state']

    numPGS = pgMapJson['pgmap']['num_pgs']

    for pgState in pgMapJson['pgmap']['pgs_by_state']:

        if pgState['state_name'] == 'active+clean' and pgState['count'] == numPGS:

            pgStateIsOk = True

    if pgStateIsOk == False:

        print "pg is reweighting or can't do reweight right now...."

        exit

    #determine OSD util diff

    (status,output) = commands.getstatusoutput('ceph osd df --format=json-pretty')

    #print status,output

    osdMaxUtil=0

    osdMaxUtilId=-1

    osdMaxReweight=1

    osdMinUtil=100

    osdMinUtilId=-1

    osdReweightStep=0.01

    if status == 0:

        osdDictJson = json.loads(output)

        for node in osdDictJson['nodes']:

                if node['utilization'] > osdMaxUtil:

                        osdMaxUtilId = node['id']

                        osdMaxUtil = node['utilization']

                        osdMaxReweight = node['reweight']

                if node['utilization'] < osdMinUtil:

                        osdMinUtilId = node['id']

                        osdMinUtil = node['utilization']

        osdTargetReweight = osdMaxReweight - osdReweightStep

        osdUtilDiff = (osdMaxUtil - osdMinUtil)/osdMinUtil*100

        if osdUtilDiff > 10:

            osdUtilDiffEnough = True

            print "Max and Min OSD's utilization diff is " + str(osdUtilDiff)

        else:

            print "Max and Min OSD's utilization diff is " + str(osdUtilDiff) + ",less then 10%, give up..."

            exit

    if  pgStateIsOk == True and osdUtilDiffEnough == True and osdTargetReweight > 0: 

        print "================ doing reweight ==============="

        print osdMaxUtilId,osdMaxUtil,osdMaxReweight

        print osdMinUtilId,osdMinUtil

        doReweight(osdMaxUtilId, osdTargetReweight)

def invokeOSDReweight():

    while True:

        sleep(30)

        canOSDReweight()

if __name__ == '__main__':

    invokeOSDReweight()

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI