溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Ceph 自動(dòng)reweight腳本

發(fā)布時(shí)間:2020-08-11 18:23:03 來(lái)源:ITPUB博客 閱讀:183 作者:jesselyu 欄目:云計(jì)算

Ceph的數(shù)據(jù)分布是由CRUSH Map解決定的,而CRUSH算法是偽HASH的,所以在一定時(shí)間內(nèi),數(shù)據(jù)會(huì)存在傾斜,這就需要我們用腳本來(lái)進(jìn)行定期的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問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI