Ahoana ny fomba fanaovana autoscaler ho an'ny cluster

Salama! Manofana ny olona hiasa amin'ny angona lehibe izahay. Tsy azo atao ny maka sary an-tsaina ny programa fanabeazana amin'ny angon-drakitra lehibe tsy misy cluster azy manokana, izay iarahan'ny mpandray anjara rehetra. Noho izany antony izany dia manana izany foana ny programantsika :) Mirotsaka amin'ny fanamboarana azy, ny faneno ary ny fitantanana azy izahay, ary ny lehilahy dia manomboka mivantana ny asa MapReduce ao ary mampiasa Spark.

Amin'ity lahatsoratra ity dia holazainay aminao ny fomba namaha ny olan'ny fametahana cluster tsy mitongilana amin'ny alΓ lan'ny fanoratana ny autoscaler manokana amin'ny alΓ lan'ny rahona. Mail.ru Cloud Solutions.

olana

Ny cluster dia tsy ampiasaina amin'ny fomba mahazatra. Tena tsy mitovy ny fanariana. Ohatra, misy kilasy azo ampiharina, rehefa mandeha any amin'ny cluster ny olona 30 sy mpampianatra iray ary manomboka mampiasa izany. Na indray, misy andro mialoha ny fe-potoana izay mitombo be ny entana. Ny sisa amin'ny fotoana dia miasa amin'ny fomba underload ny cluster.

Vahaolana #1 dia ny fitazonana cluster izay mahatanty enta-mavesatra be indrindra, fa tsy miasa mandritra ny fotoana rehetra.

Ny vahaolana #2 dia ny fitazonana cluster kely, izay ampidirinao tanana alohan'ny kilasy sy mandritra ny enta-mavesatra.

Vahaolana #3 dia ny fitazonana cluster kely ary manoratra autoscaler izay hanara-maso ny enta-mavesatry ny cluster amin'izao fotoana izao ary, amin'ny fampiasana API isan-karazany, manampy sy manala ny nodes amin'ny cluster.

Amin'ity lahatsoratra ity dia hiresaka momba ny vahaolana #3 isika. Ity autoscaler ity dia miankina betsaka amin'ny anton-javatra ivelany fa tsy ny anatiny, ary matetika ny mpamatsy dia tsy manome izany. Mampiasa ny fotodrafitrasa rahona Mail.ru Cloud Solutions izahay ary nanoratra autoscaler mampiasa ny MCS API. Ary satria mampianatra ny fomba fiasa miaraka amin'ny angona izahay, dia nanapa-kevitra ny hampiseho ny fomba ahafahanao manoratra autoscaler mitovy amin'izany ho an'ny tanjonao manokana ary mampiasa izany amin'ny rahonao

zavatra takiana alohan'ny

Voalohany, tsy maintsy manana cluster Hadoop ianao. Ohatra, mampiasa ny fizarana HDP izahay.

Mba hanampiana sy hanesorana haingana ny nodeso, dia tsy maintsy manana fizarana andraikitra sasantsasany amin'ireo nodes ianao.

  1. Master node. Eny, tsy misy zavatra tena ilaina hazavaina eto: ny node lehibe amin'ny cluster, izay, ohatra, ny mpamily Spark dia natomboka, raha mampiasa ny fomba interactive ianao.
  2. Node daty. Ity no node itahirizanao angona ao amin'ny HDFS sy toerana misy ny kajy.
  3. Node computing. Ity dia node iray tsy ahitanao na inona na inona ao amin'ny HDFS, fa toerana misy ny kajy.

Hevi-dehibe. Hitranga ny autoscaling noho ny nodes amin'ny karazana fahatelo. Raha manomboka maka sy mampiditra nodes amin'ny karazany faharoa ianao, dia ho ambany dia ambany ny hafainganam-pandehan'ny valiny - haharitra ora maro ao amin'ny cluster anao ny fanafoanana sy ny famerenana indray. Mazava ho azy fa tsy izany no antenainao amin'ny autoscaling. Izany hoe, tsy mikasika ny nodes amin'ny karazana voalohany sy faharoa. Izy ireo dia hisolo tena vondron'olona azo tsapain-tanana kely indrindra izay hisy mandritra ny faharetan'ny fandaharana.

Noho izany, ny autoscaler dia nosoratana tamin'ny Python 3, mampiasa ny API Ambari hitantana ny serivisy cluster, fampiasana API avy amin'ny Mail.ru Cloud Solutions (MCS) ho an'ny milina fanombohana sy fampiatoana.

Architecture vahaolana

  1. Module autoscaler.py. Misy kilasy telo izy io: 1) fiasa miasa amin'ny Ambari, 2) fiasa miasa amin'ny MCS, 3) fiasa mifandraika mivantana amin'ny lojikan'ny autoscaler.
  2. teny observer.py. Amin'ny ankapobeny dia misy fitsipika samihafa: rahoviana ary amin'ny fotoana inona no hiantsoana ny fiasan'ny autoscaler.
  3. Fikirakirana config.py. Izy io dia misy, ohatra, ny lisitry ny node navela ho an'ny autoscaling sy ny masontsivana hafa izay misy fiantraikany, ohatra, ny faharetan'ny fiandrasana manomboka amin'ny fotoana nampidirana node vaovao. Misy ihany koa ny mari-pamantarana ho an'ny fanombohan'ny kilasy, ka alohan'ny kilasy dia atomboka ny firafitry ny cluster azo atao.

Andeha hojerentsika ireo sombin-kaody ao anatin'ireo rakitra roa voalohany.

1. Module Autoscaler.py

kilasy Ambari

Toy izao ny endriky ny kaody misy kilasy iray Ambari:

class Ambari:
    def __init__(self, ambari_url, cluster_name, headers, auth):
        self.ambari_url = ambari_url
        self.cluster_name = cluster_name
        self.headers = headers
        self.auth = auth

    def stop_all_services(self, hostname):
        url = self.ambari_url + self.cluster_name + '/hosts/' + hostname + '/host_components/'
        url2 = self.ambari_url + self.cluster_name + '/hosts/' + hostname
        req0 = requests.get(url2, headers=self.headers, auth=self.auth)
        services = req0.json()['host_components']
        services_list = list(map(lambda x: x['HostRoles']['component_name'], services))
        data = {
            "RequestInfo": {
                "context":"Stop All Host Components",
                "operation_level": {
                    "level":"HOST",
                    "cluster_name": self.cluster_name,
                    "host_names": hostname
                },
                "query":"HostRoles/component_name.in({0})".format(",".join(services_list))
            },
            "Body": {
                "HostRoles": {
                    "state":"INSTALLED"
                }
            }
        }
        req = requests.put(url, data=json.dumps(data), headers=self.headers, auth=self.auth)
        if req.status_code in [200, 201, 202]:
            message = 'Request accepted'
        else:
            message = req.status_code
        return message

Etsy ambony, ho ohatra, azonao jerena ny fampiharana ny asa stop_all_services, izay manakana ny serivisy rehetra amin'ny node cluster tiana.

Eo am-pidirana ny kilasy Ambari mandalo ianao:

  • ambari_url, ohatra, tahaka 'http://localhost:8080/api/v1/clusters/',
  • cluster_name - ny anaran'ny cluster misy anao any Ambari,
  • headers = {'X-Requested-By': 'ambari'}
  • ary ao anatiny auth Ity ny anaranao sy ny tenimiafinao momba an'i Ambari: auth = ('login', 'password').

Ny fiasa dia tsy inona fa antso roa amin'ny alΓ lan'ny REST API mankany Ambari. Avy amin'ny fomba fijery lojika, dia mahazo lisitry ny serivisy mandeha amin'ny node aloha isika, ary avy eo manontany amin'ny cluster iray, amin'ny node iray, hamindra serivisy avy amin'ny lisitra mankany amin'ny fanjakana. INSTALLED. Fampiasa amin'ny fandefasana ny serivisy rehetra, amin'ny famindrana ny nodes mankany amin'ny fanjakana Maintenance sns dia mitovitovy - fangatahana vitsivitsy fotsiny amin'ny alΓ lan'ny API.

Class Mcs

Toy izao ny endriky ny kaody misy kilasy iray Mcs:

class Mcs:
    def __init__(self, id1, id2, password):
        self.id1 = id1
        self.id2 = id2
        self.password = password
        self.mcs_host = 'https://infra.mail.ru:8774/v2.1'

    def vm_turn_on(self, hostname):
        self.token = self.get_mcs_token()
        host = self.hostname_to_vmname(hostname)
        vm_id = self.get_vm_id(host)
        mcs_url1 = self.mcs_host + '/servers/' + self.vm_id + '/action'
        headers = {
            'X-Auth-Token': '{0}'.format(self.token),
            'Content-Type': 'application/json'
        }
        data = {'os-start' : 'null'}
        mcs = requests.post(mcs_url1, data=json.dumps(data), headers=headers)
        return mcs.status_code

Eo am-pidirana ny kilasy Mcs mandalo ny id tetikasa ao anatin'ny rahona sy ny ID mpampiasa, ary koa ny tenimiafina. Amin'ny asany vm_turn_on tiantsika ny hampandeha ny iray amin'ireo milina. Ny lojika eto dia somary sarotra kokoa. Eo am-piandohan'ny kaody dia misy asa telo hafa antsoina hoe: 1) mila maka mari-pamantarana isika, 2) mila manova ny anaran'ny mpampiantrano amin'ny anaran'ny milina ao amin'ny MCS, 3) maka ny id amin'ity milina ity. Manaraka, manao fangatahana lahatsoratra fotsiny izahay ary manomboka ity milina ity.

Toy izao ny fiasan'ny fahazoana token:

def get_mcs_token(self):
        url = 'https://infra.mail.ru:35357/v3/auth/tokens?nocatalog'
        headers = {'Content-Type': 'application/json'}
        data = {
            'auth': {
                'identity': {
                    'methods': ['password'],
                    'password': {
                        'user': {
                            'id': self.id1,
                            'password': self.password
                        }
                    }
                },
                'scope': {
                    'project': {
                        'id': self.id2
                    }
                }
            }
        }
        params = (('nocatalog', ''),)
        req = requests.post(url, data=json.dumps(data), headers=headers, params=params)
        self.token = req.headers['X-Subject-Token']
        return self.token

Kilasy Autoscaler

Ity kilasy ity dia misy fiasa mifandraika amin'ny lojika miasa.

Toy izao ny endriky ny kaody ho an'ity kilasy ity:

class Autoscaler:
    def __init__(self, ambari, mcs, scaling_hosts, yarn_ram_per_node, yarn_cpu_per_node):
        self.scaling_hosts = scaling_hosts
        self.ambari = ambari
        self.mcs = mcs
        self.q_ram = deque()
        self.q_cpu = deque()
        self.num = 0
        self.yarn_ram_per_node = yarn_ram_per_node
        self.yarn_cpu_per_node = yarn_cpu_per_node

    def scale_down(self, hostname):
        flag1 = flag2 = flag3 = flag4 = flag5 = False
        if hostname in self.scaling_hosts:
            while True:
                time.sleep(5)
                status1 = self.ambari.decommission_nodemanager(hostname)
                if status1 == 'Request accepted' or status1 == 500:
                    flag1 = True
                    logging.info('Decomission request accepted: {0}'.format(flag1))
                    break
            while True:
                time.sleep(5)
                status3 = self.ambari.check_service(hostname, 'NODEMANAGER')
                if status3 == 'INSTALLED':
                    flag3 = True
                    logging.info('Nodemaneger decommissioned: {0}'.format(flag3))
                    break
            while True:
                time.sleep(5)
                status2 = self.ambari.maintenance_on(hostname)
                if status2 == 'Request accepted' or status2 == 500:
                    flag2 = True
                    logging.info('Maintenance request accepted: {0}'.format(flag2))
                    break
            while True:
                time.sleep(5)
                status4 = self.ambari.check_maintenance(hostname, 'NODEMANAGER')
                if status4 == 'ON' or status4 == 'IMPLIED_FROM_HOST':
                    flag4 = True
                    self.ambari.stop_all_services(hostname)
                    logging.info('Maintenance is on: {0}'.format(flag4))
                    logging.info('Stopping services')
                    break
            time.sleep(90)
            status5 = self.mcs.vm_turn_off(hostname)
            while True:
                time.sleep(5)
                status5 = self.mcs.get_vm_info(hostname)['server']['status']
                if status5 == 'SHUTOFF':
                    flag5 = True
                    logging.info('VM is turned off: {0}'.format(flag5))
                    break
            if flag1 and flag2 and flag3 and flag4 and flag5:
                message = 'Success'
                logging.info('Scale-down finished')
                logging.info('Cooldown period has started. Wait for several minutes')
        return message

Manaiky kilasy hidirana izahay. Ambari ΠΈ Mcs, lisitr'ireo node avela hanaovana scaling, ary koa ny mari-pamantarana fanamafisana node: fahatsiarovana sy cpu natokana ho an'ny node ao amin'ny YARN. Misy ihany koa ny masontsivana anatiny 2 q_ram, q_cpu, izay filaharana. Amin'ny fampiasana azy ireo dia mitahiry ny sandan'ny enta-mavesatra amin'izao fotoana izao isika. Raha hitantsika fa tao anatin'ny 5 minitra farany dia nisy entana nitombo tsy tapaka, dia manapa-kevitra isika fa mila manampy +1 node amin'ny cluster. Toy izany koa ho an'ny fanjakana underutilization cluster.

Ny kaody etsy ambony dia ohatra iray amin'ny fiasa manaisotra milina iray amin'ny cluster ary manakana azy ao anaty rahona. Voalohany dia misy ny decommissioning YARN Nodemanager, dia mandeha ny maody Maintenance, dia ajanonay ny serivisy rehetra amin'ny milina ary vonoinay ny milina virtoaly ao anaty rahona.

2. Observer.py

Kaody santionany avy any:

if scaler.assert_up(config.scale_up_thresholds) == True:
        hostname = cloud.get_vm_to_up(config.scaling_hosts)
        if hostname != None:
            status1 = scaler.scale_up(hostname)
            if status1 == 'Success':
                text = {"text": "{0} has been successfully scaled-up".format(hostname)}
                post = {"text": "{0}".format(text)}
                json_data = json.dumps(post)
                req = requests.post(webhook, data=json_data.encode('ascii'), headers={'Content-Type': 'application/json'})
                time.sleep(config.cooldown_period*60)

Ao anatin'izany dia manamarina isika raha noforonina ny fepetra hampitomboana ny fahafahan'ny cluster ary raha misy milina voatahiry, alao ny anaran'ny mpampiantrano ny iray amin'izy ireo, ampio ao amin'ny cluster ary mamoaka hafatra momba izany ao amin'ny Slack ekipanay. Aorian'izay dia manomboka izany cooldown_period, rehefa tsy manampy na manala na inona na inona ao amin'ny cluster isika, fa manara-maso fotsiny ny entana. Raha toa ka nilamina ary ao anatin'ny lalan'ny sandan'ny entana tsara indrindra, dia manohy ny fanaraha-maso fotsiny isika. Raha tsy ampy ny node iray dia ampiana iray hafa.

Ho an'ny tranga izay misy lesona mialoha dia efa fantatsika tsara fa tsy ho ampy ny node iray, noho izany dia manomboka avy hatrany ny nodes maimaim-poana rehetra ary mitazona azy ireo ho mavitrika hatramin'ny faran'ny lesona. Mitranga izany amin'ny alΓ lan'ny lisitr'ireo marika famantarana ny fotoana.

famaranana

Autoscaler dia vahaolana tsara sy mety ho an'ireo tranga ireo rehefa sendra tsy mitongilana ny fametahana cluster. Amin'izay fotoana izay ianao dia mahatratra ny fanamafisana cluster tiana ho an'ny enta-mavesatra ambony ary miaraka amin'izany dia tsy mitazona an'io cluster io ianao mandritra ny tsy fahampian-tsakafo, mitahiry vola. Eny ary, miampy izany rehetra izany dia mandeha ho azy raha tsy misy ny fandraisanao anjara. Ny autoscaler mihitsy dia tsy misy afa-tsy andiana fangatahana amin'ny API manager cluster sy ny API mpamatsy rahona, nosoratana araka ny lojika iray. Ny tena tokony hotadidinao dia ny fizarana ny nodes ho karazany 3, araka ny nosoratanay teo aloha. Ary ho faly ianao.

Source: www.habr.com

Add a comment