ืืขืื! ืืืจ ืืึทื ืืขื ืืฉื ืฆื ืึทืจืืขืื ืืื ืืจืืืก ืืึทืื. ืขืก ืืื ืืืืืขืืืขื ืฆื ืืืึทืืืฉืึทื ืึท ืืืืืื ืืงืจืืื ืคึผืจืึธืืจืึทื ืืืืฃ ืืจืืืก ืืึทืื ืึธื ืึทื ืืืืืขื ืข ืงื ืืื, ืืืืฃ ืืืึธืก ืึทืืข ืคึผืึทืจืืืกืึทืคึผืึทื ืฅ ืึทืจืืขื ืฆืืืึทืืขื. ืคึฟืึทืจ ืืขื ืกืืื, ืืื ืืืขืจ ืคึผืจืึธืืจืึทื ืฉืืขื ืืืง ืืื ืขืก ๐ ืืืจ ืืขื ืขื ืคืึทืจืงื ืึทืกื ืืื ืืืึทื ืงืึทื ืคืืืืขืจืืืฉืึทื, ืืื ืื ื ืืื ืึทืืืื ืืกืืจืึทืฆืืข, ืืื ืื ืืืื ืืืืื ืงืึทืืขืจ MapReduce ืืืฉืึธืืก ืืึธืจื ืืื ื ืืฆื ืกืคึผืึทืจืง.
ืืื ืืขื ืคึผืึธืกืื ืืืจ ืืืขื ืืึธืื ืืืจ ืืื ืืืจ ืกืึทืืืื ืื ืคึผืจืึธืืืขื ืคืื ืึทื ืืืืึทื ืงื ืืื ืืึธืืืื ื ืืืจื ืฉืจืืืื ืืื ืืืขืจ ืืืืืขื ืข ืึทืืืึธืกืงืึทืืขืจ ื ืืฆื ืื ืืืึธืืงื
ืคึผืจืึธืืืขื
ืืื ืืืขืจ ืงื ืืื ืืื ื ืืฉื ืืขื ืืฆื ืืื ืึท ืืืคึผืืฉ ืืึธืืข. ืืึทืืืึทืืืงืื ื ืืื ืืขืืกื ืึทื ืืืืึทื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืขืก ืืขื ืขื ืคึผืจืึทืงืืืฉ ืงืืืกื, ืืืขื ืึทืืข 30 ืืขื ืืฉื ืืื ืึท ืืขืจืขืจ ืืืื ืฆื ืื ืงื ืืื ืืื ืึธื ืืืืื ืฆื ื ืืฆื ืขืก. ืึธืืขืจ ืืืืืขืจ, ืขืก ืืขื ืขื ืืขื ืืืืืขืจ ืื ืืขืจืืื ืืืขื ืื ืืึทืกืข ืื ืงืจืืกืื ืืืืขืจ. ืื ืื ืืื ืคืื ืื ืฆืืื, ืื ืงื ืืื ืึทืคึผืขืจืืืฅ ืืื ืื ืืขืจืืึธืึทื ืืึธืืข.
ืืืืืื ื #1 ืืื ืฆื ืืึทืืื ืึท ืงื ืืื ืืืึธืก ืืืขื ืืืืืกืืึทื ื ืฉืคึผืืฅ ืืึธืืื, ืึธืืขืจ ืืืขื ืืืื ืืืืืืง ืื ืื ืืื ืคืื ืื ืฆืืื.
ืืืืืื ื #2 ืืื ืฆื ืืึทืืื ืึท ืงืืืื ืงื ืืื, ืฆื ืืืึธืก ืืืจ ืืึทื ืืืึทืื ืืืืื ื ืึธืืื ืืืืืขืจ ืงืืืกื ืืื ืืขืฉืึทืก ืฉืคึผืืฅ ืืึธืืื.
ืืืืืื ื #3 ืืื ืฆื ืืึทืืื ืึท ืงืืืื ืงื ืืื ืืื ืฉืจืืึทืื ืึท ืึทืืืึธืกืงืึทืืขืจ ืืืึธืก ืืืขื ืืึธื ืืืึธืจ ืื ืงืจืึทื ื ืืึทืกืข ืคืื โโืืขื ืงื ืืื ืืื, ื ืืฆื ืคืึทืจืฉืืื ืึทืคึผืืก, ืืืืื ืืื ืึทืจืึธืคึผื ืขืืขื ื ืึธืืื ืคืื ืืขื ืงื ืืื.
ืืื ืืขื ืคึผืึธืกืื ืืืจ ืืืขืื ืจืขืื ืืืขืื ืืืืืื ื #3. ืืขืจ ืึทืืืึธืกืงืึทืืขืจ ืืื ืืขืืกื ืึธืคืขื ืืืง ืืืืฃ ืคืื ืืจืืืกื ืืืง ืกืืืืช ืืื ืืื ืื ืขืจืืขื ืึธื ืขืก, ืืื ืคึผืจืึทืืืืืืขืจื ืึธืคื ืืึธื ื ืื ืฆืืฉืืขืื ืขืก. ืืืจ ื ืืฆื ืื Mail.ru ืงืืึธืื ืกืึทืืืฉืึทื ื ืืืึธืืงื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืืื ืืขืฉืจืืื ืึทื ืึทืืืึธืกืงืึทืืขืจ ืืื ืื MCS API. ืืื ืืื ื ืืืจ ืืขืจื ืขื ืืื ืฆื ืึทืจืืขืื ืืื ืืึทืื, ืืืจ ืืึทืฉืืึธืกื ืฆื ืืืืึทืื ืืื ืืืจ ืงืขื ืขื ืฉืจืืึทืื ืึท ืขื ืืขื ืึทืืืึธืกืงืึทืืขืจ ืคึฟืึทืจ ืืืื ืืืืืขื ืข ืฆืืืขืงื ืืื ื ืืฆื ืขืก ืืื ืืืื ืืืึธืืงื.
ืคึผืจืขืจืขืงืืืืกืืืขืก
ืขืจืฉืืขืจ, ืืืจ ืืืื ืืึธืื ืึท Hadoop ืงื ืืื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืืจ ื ืืฆื ืื HDP ืคืึทืจืฉืคึผืจืืืืื ื.
ืึผืื ืืืื ื ืึธืืื ืืขืฉืืืื ื ืฆืืืขืืืืื ืืื ืึทืืืขืงืืขื ืืืขื, ืืืจ ืืืื ืืึธืื ืึท ืืืืขืจ ืคืึทืจืฉืคึผืจืืืืื ื ืคืื ืจืึธืืขืก ืฆืืืืฉื ืื ื ืึธืืื.
- ืืขื ื ืึธืืข. ื ื, ืขืก ืืื ื ืื ืืึทืจืคึฟื ืฆื ืืขืจืงืืขืจื ืขืคึผืขืก ืกืคึผืขืฆืืขื: ืื ืืืืคึผื ื ืึธืืข ืคืื โโืืขื ืงื ืืื, ืืืืฃ ืืืึธืก, ืืืฉื, ืืขืจ ืึธื ืฆืื ืื ืฉืึธืคืขืจ ืืื ืืึธื ืืฉื, ืืืื ืืืจ ื ืืฆื ืื ืื ืืขืจืึทืงืืืื ืืึธืืข.
- ืืึทืืข ื ืึธืืข. ืืึธืก ืืื ืืขืจ ื ืึธืืข ืืืืฃ ืืืึธืก ืืืจ ืงืจืึธื ืืึทืื ืืืืฃ HDFS ืืื ืืื ืืฉืืื ืืช ื ืขืืขื ืึธืจื.
- ืงืึทืืคึผืืืืื ื ื ืึธืืข. ืืึธืก ืืื ืึท ื ืึธืืข ืืื ืืืจ ืืึธื ื ืื ืงืจืึธื ืขืคึผืขืก ืืืืฃ HDFS, ืึธืืขืจ ืืื ืืฉืืื ืืช ืคึผืึทืกืืจื.
ืืืืืืืง ืคืื ื. ืึทืืืึธืกืงืึทืืื ื ืืืขื ืคึผืึทืกืืจื ืจืขืื ืฆื ื ืึธืืื ืคืื ืื ืืจืื ืืืคึผ. ืืืื ืืืจ ืึธื ืืืืื ืฆื ื ืขืืขื ืืื ืืืืื ื ืึธืืื ืคืื ืื ืจืืข ืืืคึผ, ืื ืขื ืืคืขืจ ืืืืงืืึทื ืืืขื ืืืื ืืืืขืจ ื ืืืขืจืืง - ืืืงืึทืืืฉืึทื ืื ื ืืื ืจืืงืึธืืืืืื ื ืืืขื ื ืขืืขื ืฉืขื ืืืืฃ ืืืื ืงื ืืื. ืืึธืก, ืคืื ืงืืจืก, ืืื ื ืืฉื ืืืึธืก ืืืจ ืืขืจืืืึทืจืื ืคืื ืึทืืืึธืกืงืึทืืื ื. ืึทื ืืื, ืืืจ ืืึธื ื ืื ืึธื ืจืืจื ื ืึธืืื ืคืื ืืขืจ ืขืจืฉืืขืจ ืืื ืจืืข ืืืคึผ. ืืื ืืืขืื ืคืึธืจืฉืืขืื ืึท ืืื ืืืื ืืืืืึทืืึทื ืงื ืืื ืืืึธืก ืืืขื ืขืงืกืืกืืืจื ืืืืขืจ ืืขืจ ืืขืืืืขืจ ืคืื ืื ืคึผืจืึธืืจืึทื.
ืึทืืื, ืืื ืืืขืจ ืึทืืืึธืกืงืึทืืขืจ ืืื ืืขืฉืจืืื ืืื Python 3, ื ืืฆื ืื Ambari API ืฆื ืคืืจื ืงื ืืื ืืึทืืื ืื ืืก, ื ืืฆื
ืืืืืื ื ืึทืจืงืึทืืขืงืืฉืขืจ
- ืืึธืืืืข
autoscaler.py
. ืขืก ืึผืืื ืืจืื ืงืืืกื: 1) ืคืึทื ืืงืฉืึทื ื ืคึฟืึทืจ ืืจืืขืื ืืื Ambari, 2) ืคืึทื ืืงืฉืึทื ื ืคึฟืึทืจ ืืจืืขืื ืืื MCS, 3) ืคืึทื ืืงืฉืึทื ื ืืืืื ืฉืืึทืืืช ืฆื ืื ืึทืืืึธืกืงืึทืืขืจ ืืึธืืืง. - ืฉืจืืคื
observer.py
. ืืกืขื ืฉืึทืื ืขืก ืืืฉืืืื ืคืื ืคืึทืจืฉืืืขื ืข ืึผืืืื: ืืืขื ืืื ืืื ืืืึธืก ืืึธืืืึทื ืฅ ืฆื ืจืืคื ืื ืึทืืืึธืกืงืึทืืขืจ ืคืึทื ืืงืฉืึทื ื. - ืงืึธื ืคืืืืจืึทืืืึธื ืืขืงืข
config.py
. ืขืก ืึผืืื, ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืึท ืจืฉืืื ืคืื ื ืึธืืื ืขืจืืืืื ืคึฟืึทืจ ืึทืืืึธืกืงืึทืืื ื ืืื ืื ืืขืจืข ืคึผืึทืจืึทืืขืืขืจืก ืืืึธืก ืืืืจืงื, ืืืฉื, ืืื ืืึทื ื ืฆื ืืืึทืจืื ืคึฟืื ืืขื ืืึธืืขื ื ืึท ื ืืึท ื ืึธืืข ืืื ืฆืืืขืืขืื. ืขืก ืืขื ืขื ืืืื ืืืืขืกืืึทืืคึผืก ืคึฟืึทืจ ืื ืึธื ืืืื ืคืื ืงืืืกื, ืึทืืื ืึทื ืืืืืขืจ ืื ืงืืึทืก ืื ืืึทืงืกืืืื ืืขืจืืืืื ืงื ืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืื ืืึธื ืืฉื.
ืืึธืืืจ ืืืฆื ืงืืงื ืืื ืื ืฉืืืง ืคืื ืงืึธื ืืื ืื ืขืจืฉืืขืจ ืฆืืืื ืืขืงืขืก.
1. Autoscaler.py ืืึธืืืืข
ืึทืืืึทืจื ืงืืึทืก
ืืึธืก ืืื ืืื ืึท ืฉืืืง ืคืื ืงืึธื ืืื ืึท ืงืืึทืก ืงืืงื ืืื 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
ืืืืื, ืืื ืึท ืืืึทืฉืคึผืื, ืืืจ ืงืขื ืขื ืืขื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื ืคืื ืงืฆืืข stop_all_services
, ืืืึธืก ืกืืึทืคึผืก ืึทืืข ืกืขืจืืืืกืขืก ืืืืฃ ืื ืืขืืขืื ืงื ืืื ื ืึธืืข.
ืืฒ ื ืืจืฒื ืืื ื ืฆื ื ืงืืืก Ambari
ืื ืคืืจืืื:
ambari_url
, ืืืฉื, ืืื'http://localhost:8080/api/v1/clusters/'
,cluster_name
- ืืขืจ ื ืึธืืขื ืคืื ืืืื ืงื ืืื ืืื Ambari,headers = {'X-Requested-By': 'ambari'}
- ืืื ืืื ืขืืืืื ืืง
auth
ืืึธ ืืื ืืืื ื ืืืขื ืืื ืคึผืึทืจืึธื ืคึฟืึทืจ Ambari:auth = ('login', 'password')
.
ืื ืคืื ืงืฆืืข ืืื ืืื ืืึธืจื ืืฉื ืืขืจ ืืื ืึท ืคึผืึธืจ ืคืื ืงืึทืืืก ืืืจื ืื REST API ืฆื Ambari. ืคึฟืื ืึท ืืึทืืืฉืืงืึทื ืคืื ื ืคืื ืืืื ืื ื, ืืืจ ืขืจืฉืืขืจ ืืึทืงืืืขื ืึท ืจืฉืืื ืคืื ืคืืืกื ืืืง ืืึทืืื ืื ืืก ืืืืฃ ืึท ื ืึธืืข, ืืื ืืึทื ืืขืื ืืืืฃ ืึท ืืขืืขืื ืงื ืืื, ืืืืฃ ืึท ืืขืืขืื ื ืึธืืข, ืฆื ืึทืจืืืขืจืคืืจื ืืึทืืื ืื ืืขื ืคืื ืืขืจ ืจืฉืืื ืฆื ืื ืฉืืึทื INSTALLED
. ืคืึทื ืืงืฉืึทื ื ืคึฟืึทืจ ืืึธื ืืฉืื ื ืึทืืข ืืึทืืื ืื ืืก, ืคึฟืึทืจ ืืจืึทื ืกืคืขืจืื ื ื ืึธืืื ืฆื ืฉืืึทื Maintenance
ืขืืง ืงืืง ืขื ืืขื - ืืื ืืขื ืขื ื ืึธืจ ืึท ืืืกื ืจืืงืืืขืก ืืืจื ืื ืึทืคึผื.
ืงืืึทืก ืืงืก
ืืึธืก ืืื ืืื ืึท ืฉืืืง ืคืื ืงืึธื ืืื ืึท ืงืืึทืก ืงืืงื ืืื 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
ืืฒ ื ืืจืฒื ืืื ื ืฆื ื ืงืืืก Mcs
ืืืจ ืคืึธืจื ืื ืคึผืจืืืขืงื ืฉืืึทื ืืื ืื ืืืึธืืงื ืืื ืื ืืึทื ืืฆืขืจ ืฉืืึทื, ืืื ืืขืืื ื ืืื ืืืื ืคึผืึทืจืึธื. ืืื ืคึฟืื ืงืฆืืข vm_turn_on
ืืืจ ืืืืื ืฆื ืืืขื ืื ืืืืฃ ืืืื ืขืจ ืคืื ืื ืืืฉืื ืขื. ืื ืืึธืืืง ืืึธ ืืื ืึท ืืืกื ืืขืจ ืงืึธืืคึผืืืฆืืจื. ืืื ืื ืึธื ืืืื ืคืื ืื ืงืึธื, ืืจืื ืื ืืขืจืข ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืขืจืืคื: 1) ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืงืืืขื ืึท ืกืืืขื, 2) ืืืจ ืืึทืจืคึฟื ืฆื ืืขืจ ืื ืืึธืกืื ืึทืืข ืืื ืื ื ืึธืืขื ืคืื ืื ืืึทืฉืื ืืื MCS, 3) ืืึทืงืืืขื ืื ืฉืืึทื ืคืื ืืขื ืืึทืฉืื. ืืขืจื ืึธื, ืืืจ ื ืึธืจ ืืึทืื ืึท ืคึผืึธืกืื ืืขืื ืืื ืงืึทืืขืจ ืืขื ืืึทืฉืื.
ืืึธืก ืืื ืืื ืื ืคืื ืงืฆืืข ืฆื ืืึทืงืืืขื ืึท ืกืืืขื ืงืืงื ืืื:
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
ืึทืืืึธืกืงืึทืืขืจ ืงืืึทืก
ืืขืจ ืงืืึทืก ืึผืืื ืคืึทื ืืงืฉืึทื ื ืฉืืึทืืืช ืฆื ืื ืึธืคึผืขืจืืืืื ื ืืึธืืืง ืืื.
ืืึธืก ืืื ืืื ืึท ืฉืืืง ืคืื ืงืึธื ืคึฟืึทืจ ืืขื ืงืืึทืก ืงืืงื ืืื:
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
ืืืจ ืึธื ื ืขืืขื ืงืืืกื ืคึฟืึทืจ ืคึผืึธืืืฆืืข. Ambari
ะธ Mcs
, ืึท ืจืฉืืื ืคืื ื ืึธืืื ืืืึธืก ืืขื ืขื ืขืจืืืืื ืคึฟืึทืจ ืกืงืืืืื ื, ืืื ืืขืืื ื ืืื ื ืึธืืข ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึผืึทืจืึทืืขืืขืจืก: ืืึผืจืื ืืื ืงืคึผื ืึทืืึทืงืืืืื ืฆื ืื ื ืึธืืข ืืื YARN. ืขืก ืืขื ืขื ืืืื 2 ืื ืขืจืืขื ืคึผืึทืจืึทืืขืืขืจืก q_ram, q_cpu, ืืืึธืก ืืขื ืขื ืงืืื. ื ืืฆื ืืื, ืืืจ ืงืจืึธื ืื ืืืึทืืืขืก ืคืื ืื ืงืจืึทื ื ืงื ืืื ืืึทืกืข. ืืืื ืืืจ ืืขื ืึทื ืืื ืื ืืขืฆืืข 5 ืืื ืื ืขืก ืืื ืืขืืืขื ืึท ืงืึทื ืกืืกืืึทื ืืื ืืขืืืืงืกื ืืึทืกืข, ืืืจ ืืึทืฉืืืกื ืึทื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืื +1 ื ืึธืืข ืฆื ืืขื ืงื ืืื. ืืขืจ ืืขืืืืงืขืจ ืืื ืืืช ืคึฟืึทืจ ืื ืงื ืืื ืื ืืขืจืืืืืืืืึทืืืึธื ืฉืืึทื.
ืืขืจ ืงืึธื ืืืืื ืืื ืึท ืืืืฉืคึผืื ืคืื ืึท ืคึฟืื ืงืฆืืข ืืืึธืก ืจืืืืืื ืึท ืืึทืฉืื ืคืื ืืขื ืงื ืืื ืืื ืกืืึทืคึผืก ืขืก ืืื ืื ืืืึธืืงื. ืขืจืฉืืขืจ ืขืก ืืื ืึท ืืืงืึทืืืฉืึทื ืื ื YARN Nodemanager
, ืืขืืึธืื ืืขืจ ืืึธืืข ืืืจื ืก ืืืืฃ Maintenance
, ืืขืืึธืื ืืืจ ืืึทืืื ืึทืืข ืกืขืจืืืืกืขืก ืืืืฃ ืื ืืึทืฉืื ืืื ืงืขืจ ืึทืืืขืง ืื ืืืืจืืืึทื ืืึทืฉืื ืืื ืื ืืืึธืืงื.
2. ืกืงืจืืคึผื observer.py
ืืืกืืขืจ ืงืึธื ืคึฟืื ืืึธืจื:
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)
ืืื ืขืก, ืืืจ ืงืึธื ืืจืึธืืืจื ืฆื ืื ืึธืื ืืขื ืขื ืืืฉืืคื ืคึฟืึทืจ ืื ืงืจืืกืื ื ืื ืงืึทืคึผืึทืฆืืืขื ืคืื ืืขื ืงื ืืื ืืื ืฆื ืขืก ืืขื ืขื ืงืืื ืืืฉืื ืขื ืืื ืจืขืืขืจืื, ืืึทืงืืืขื ืื ืืึทืืขืืึธืก ื ืึธืืขื ืคืื ืืืื ืขืจ ืคืื ืืื, ืืืืื ืขืก ืฆื ืื ืงื ืืื ืืื ืึทืจืืืกืืขืื ืึท ืึธื ืืึธื ืืืขืื ืืขื ืืื ืืื ืืืขืจ ืืึทื ืฉืึทืคึฟื ืก ืกืืึทืงืง. ื ืึธื ืืืึธืก ืขืก ืกืืึทืจืฅ cooldown_period
, ืืืขื ืืืจ ืืึธื ื ืื ืืืืื ืึธืืขืจ ืึทืจืึธืคึผื ืขืืขื ืขืคึผืขืก ืคืื ืืขื ืงื ืืื, ืึธืืขืจ ื ืึธืจ ืืึธื ืืืึธืจ ืื ืืึทืกืข. ืืืื ืขืก ืืื ืกืืืืืึทืืืืื ืืื ืืื ืืื ืื ืงืึธืจืืืึธืจ ืคืื ืึธืคึผืืืืึทื ืืึทืกืข ืืืึทืืืขืก, ืืืจ ืคืฉืื ืคืึธืจืืขืฆื ืืึธื ืืืึธืจืื ื. ืืืื ืืืื ื ืึธืืข ืืื ื ืืฉื ืืขื ืื, ืืืจ ืืืืื ืื ืืขืจื.
ืคึฟืึทืจ ืงืึทืกืขืก ืืืขื ืืืจ ืืึธืื ืึท ืืขืงืฆืืข ืคืึธืจืืืก, ืืืจ ืฉืืื ืืืืกื ืคึฟืึทืจ ืืืืขืจ ืึทื ืืืื ื ืึธืืข ืืืขื ื ืืฉื ืืืื ืืขื ืื, ืึทืืื ืืืจ ืืื ืึธื ืืืืื ืึทืืข ืื ืคึฟืจืืึท ื ืึธืืื ืืื ืืึทืืื ืืื ืึทืงืืืื ืืื ืืขื ืกืืฃ ืคืื ืื ืืขืงืฆืืข. ืืึธืก ืืึทืคึผืึทื ื ื ืืฆื ืึท ืจืฉืืื ืคืื ืึทืงืืืืืืืขื ืืืืขืกืืึทืืคึผืก.
ืกืึธืฃ
ืึทืืืึธืกืงืึทืืขืจ ืืื ืึท ืืื ืืื ืืึทืงืืืขื ืืืืืื ื ืคึฟืึทืจ ืื ืงืึทืกืขืก ืืืขื ืืืจ ืืขืจืคืึทืจืื ื ืึทื ืืืืึทื ืงื ืืื ืืึธืืืื ื. ืืืจ ืกืืืืึทืืืืื ืืึทืกืื ืืขืจืืจืืืื ืื ืืขืืขืื ืงื ืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืคึฟืึทืจ ืฉืคึผืืฅ ืืึธืืื ืืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื ืืึธื ื ืื ืืึทืืื ืืขื ืงื ืืื ืืขืฉืึทืก ืื ืืขืจืืึธืึทื, ืฉืคึผืึธืจื ืืขืื. ื ื, ืคึผืืืก ืืึธืก ืึทืืฅ ืืึทืคึผืึทื ื ืืืืืึธืืึทืืืฉ ืึธื ืืืื ืึธื ืืืื. ืื ืึทืืืึธืกืงืึทืืขืจ ืืื ืืื ืืึธืจื ืืฉื ืืขืจ ืืื ืึท ืกืืื ืคืื ืจืืงืืืขืก ืฆื ืื ืงื ืืื ืคืึทืจืืืึทืืืขืจ ืึทืคึผื ืืื ืื ืืืึธืืงื ืฉืคึผืืึทืืขืจ ืึทืคึผื, ืืขืฉืจืืื ืืืื ืึท ืืืืขืจ ืืึธืืืง. ืืืึธืก ืืืจ ืืืฉืืืื ืืึทืจืคึฟื ืฆื ืืขืืขื ืงืขื ืืื ืื ืึธืคึผืืืื ืคืื ื ืึธืืื ืืื 3 ืืืืคึผืก, ืืื ืืืจ ืืขืฉืจืืื ืคืจืืขืจ. ืืื ืืืจ ืืืขื ืืืื ืฆืืคืจืืื.
ืืงืืจ: www.habr.com