เบชเบฐเบเบฒเบเบเบต! เบเบงเบเปเบฎเบปเบฒเบเบถเบเบญเบปเบเบฎเบปเบกเบเบปเบเปเบซเปเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเปเปเบกเบนเบเปเบซเบเป. เบกเบฑเบเปเบเบฑเบเปเบเบเปเปเปเบเปเบเบตเปเบเบฐเบเบดเบเบเบฐเบเบฒเบเบฒเบเปเบเบเบเบฒเบเบเบฒเบเบชเบถเบเบชเบฒเบเปเบฝเบงเบเบฑเบเบเปเปเบกเบนเบเปเบซเบเปเปเบเบเบเปเปเบกเบตเบเบธเปเบกเบเบญเบเบเบปเบเปเบญเบ, เปเบเบดเปเบเบเบนเปเปเบเบปเปเบฒเบฎเปเบงเบกเบเบฑเบเบซเบกเบปเบเปเบฎเบฑเบเบงเบฝเบเบฎเปเบงเบกเบเบฑเบ. เบชเปเบฒเบฅเบฑเบเปเบซเบเบเบปเบเบเบตเป, เปเบเบผเปเบเบผเบกเบเบญเบเบเบงเบเปเบฎเบปเบฒเบชเบฐเปเบซเบกเบตเบกเบตเบกเบฑเบ :) เบเบงเบเปเบฎเบปเบฒเบกเบตเบชเปเบงเบเบฎเปเบงเบกเปเบเบเบฒเบเบเบฑเปเบเบเปเบฒ, เบเบฒเบเบเบฑเบเปเบเปเบเปเบฅเบฐเบเบฒเบเบเปเบฅเบดเบซเบฒเบเบเบญเบเบกเบฑเบ, เปเบฅเบฐเบเบนเปเบเบฒเบเปเบเบเบเบปเบเปเบเบตเบเบเบปเบงเบงเบฝเบ MapReduce เบขเบนเปเบเบตเปเบเบฑเปเบเปเบฅเบฐเปเบเป Spark.
เปเบเบเบปเบเบเบฝเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบญเบเบเปเบฒเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบเบฑเบเบซเบฒเบเบฒเบเปเบซเบผเบเบเบญเบเบเบธเปเบกเบเบตเปเบเปเปเบชเบฐ เปเปเบต เบเบฒเบเปเบเบเบเบฒเบเบเบฝเบเบเบปเบงเบเบฐ เปเบฒเบ เบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบญเบเปเบเบเปเบเป cloud.
เบเบฑเบเบซเบฒ
เบเบธเปเบกเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเปเปเปเบเปเปเบเปเปเบเบฎเบนเบเปเบเบเบเบปเบเบเบฐเบเบด. เบเบฒเบเบเบดเปเบกเบเบตเปเปเบซเบเบทเปเบญเปเบกเปเบเบกเบตเบเบงเบฒเบกเบเปเปเบชเบฐเปเบซเบกเบตเบเบฒเบเบชเบนเบ. เบเบปเบงเบขเปเบฒเบ, เบกเบตเบซเปเบญเบเบฎเบฝเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ, เปเบกเบทเปเบญเบเบฑเบเบซเบกเบปเบ 30 เบเบปเบเปเบฅเบฐเบเบนเบชเบญเบเปเบเบซเบฒเบเบธเปเบกเปเบฅเบฐเปเบฅเบตเปเบกเปเบเปเบกเบฑเบ. เบซเบผเบทเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ, เบกเบตเบกเบทเปเบเปเบญเบเปเบชเบฑเปเบเบเบฒเบเปเบเปเบงเบฅเบฒเบเบตเปเบเบฒเบเปเบซเบผเบเปเบเบตเปเบกเบเบถเปเบเบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบ. เบชเปเบงเบเบเบตเปเปเบซเบผเบทเบญเบเบญเบเปเบงเบฅเบฒเบเบตเปเบเบธเปเบกเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบเปเบซเบกเบ underload.
เบเบฒเบโเปเบเปโเปเบ #1 เปเบกเปเบโเบเบฒเบโเบฎเบฑเบโเบชเบฒโเบเบธเปเบกโเบเบตเปโเบเบฐโเบเบปเบโเบเบฒเบโเบเปเปโเบเบฒเบโเปเบซเบผเบโเบชเบนเบโเบชเบธเบโ, เปเบเปโเบเบฐโเบเปเปโเปเบเปโเปเบฎเบฑเบโเบงเบฝเบโเปเบโเปเบงโเบฅเบฒโเบเบตเปโเปเบซเบผเบทเบญโ.
เบเบฒเบโเปเบเปโเปเบ #2 เปเบกเปเบโเบเบฒเบโเบฎเบฑเบโเบชเบฒโเบเบธเปเบกโเบเบฐโเบซเบเบฒเบโเบเปเบญเบโ, เบเบตเปโเบเปเบฒเบโเบเบฐโเปเบเบตเปเบกโเบเปเปโเบเบญเบโเบเบปเบโเบเปเบญเบโเบซเปเบญเบโเบฎเบฝเบโเปเบฅเบฐโเปเบโเบฅเบฐโเบซเบงเปเบฒเบโเบเบฒเบโเปเบซเบผเบโเบชเบนเบโเบชเบธเบโ.
เบเบฒเบเปเบเปเปเบ #3 เปเบกเปเบเปเบเบทเปเบญเบฎเบฑเบเบชเบฒเบเบธเปเบกเบเบฐเบซเบเบฒเบเบเปเบญเบเปเบฅเบฐเบเบฝเบ autoscaler เบเบตเปเบเบฐเบเบดเบเบเบฒเบกเบเบฒเบเปเบซเบผเบเบเบฐเบเบธเบเบฑเบเบเบญเบ cluster เปเบฅเบฐ, เบเบฒเบเบเปเบฒเปเบเป APIs เบเปเบฒเบเป, เปเบเบตเปเบกเปเบฅเบฐเปเบญเบปเบฒ nodes เบญเบญเบเบเบฒเบ cluster.
เปเบเบเบปเบเบเบฝเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเปเบเปเปเบ #3. autoscaler เบเบตเปเปเบกเปเบเบเบถเปเบเบเบฑเบเบเบฑเบเปเบเบเบฒเบเบเบญเบเบซเบผเบฒเบเบเปเบงเบฒเบเบฒเบเปเบ, เปเบฅเบฐเบเบนเปเปเบซเปเบเปเบฅเบดเบเบฒเบเบกเบฑเบเบเบฐเบเปเปเบชเบฐเบซเบเบญเบเบกเบฑเบ. เบเบงเบเปเบฎเบปเบฒเปเบเปเปเบเบเบชเปเบฒเบเบเบฅเบฒเบงเบเบญเบ Mail.ru Cloud Solutions เปเบฅเบฐเบเบฝเบเบเบปเบงเบเบฐเบซเบเบฒเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบเบเปเบเป MCS API. เปเบฅเบฐเบเบฑเบเบเบฑเปเบเปเบเปเบเบงเบเปเบฎเบปเบฒเบชเบญเบเบงเบดเบเบตเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบเปเปเบกเบนเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบตเปเบเบฐเบชเบฐเปเบเบเบงเบดเบเบตเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฝเบ autoscaler เบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบธเบเบเบฐเบชเบปเบเบเบญเบเบเปเบฒเบเปเบญเบเปเบฅเบฐเบเปเบฒเปเบเปเบกเบฑเบเบเบฑเบเบเบฅเบฒเบงเบเบญเบเบเปเบฒเบ.
เบเปเบฒเบซเบเบปเบเปเบเบทเปเบญเบเบเบปเปเบ
เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบเปเบฒเบเบเปเบญเบเบกเบตเบเบธเปเบก Hadoop. เบเบปเบงเบขเปเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฒเบเปเบเบเบขเบฒเบ HDP.
เปเบเบทเปเบญเปเบซเป nodes เบเบญเบเบเปเบฒเบเบเบทเบเปเบเบตเปเบกเปเบฅเบฐเปเบญเบปเบฒเบญเบญเบเบขเปเบฒเบเปเบงเบงเบฒ, เบเปเบฒเบเบเปเบญเบเบกเบตเบเบฒเบเปเบเปเบเบฐเบเบฒเบเบเบตเปเปเบเปเบเบญเบเบเบญเบเบเบฒเบฅเบฐเบเบปเบเบเบฒเบเบฅเบฐเบซเบงเปเบฒเบ nodes.
- เปเบกเปเบเบปเบ node. เบเบต, เบเปเปเบกเบตเบซเบเบฑเบเบเบดเปเบชเบเบเบตเปเบเบฐเบญเบฐเบเบดเบเบฒเบเบขเบนเปเบเบตเปเบเบตเป: เปเบซเบเบเบเบปเปเบเบเปเบเบญเบเบเบธเปเบก, เปเบเบดเปเบ, เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เปเบเปเบงเบต Spark เบเบทเบเปเบเบตเบเบเบปเบง, เบเปเบฒเบเปเบฒเบเปเบเปเปเบซเบกเบเปเบเปเบเบญเบ.
- เปเบซเบเบเบงเบฑเบเบเบต. เบเบตเปโเปเบกเปเบ node เบเบตเปโเบเปเบฒเบโเปเบเบฑเบโเบเปเปโเบกเบนเบโเบเปเบฝเบงโเบเบฑเบ HDFS เปเบฅเบฐโเบเปเบญเบโเบเบตเปโเบเบฒเบโเบเบดเบโเปเบฅเปโเปเบเบตเบโเบเบถเปเบโ.
- เปเบเบเบเบญเบกเบเบดเบงเปเบเบต. เบเบตเปเปเบกเปเบ node เบเปเบญเบเบเบตเปเบเปเบฒเบเบเปเปเปเบเบฑเบเบฎเบฑเบเบชเบฒเบซเบเบฑเบเบขเบนเปเปเบ HDFS, เปเบเปเบเปเบญเบเบเบตเปเบเบฒเบเบเบดเบเปเบฅเปเปเบเบตเบเบเบถเปเบ.
เบเบธเบเบชเปเบฒเบเบฑเบ. Autoscaling เบเบฐเปเบเบตเบเบเบถเปเบเปเบเบทเปเบญเบเบเบฒเบ nodes เบเบญเบเบเบฐเปเบเบเบเบตเบชเบฒเบก. เบเปเบฒเบเปเบฒเบเปเบฅเบตเปเบกเบเบดเบเปเบฅเบฐเปเบเบตเปเบกเบเปเปเบเบญเบเบเบฐเปเบเบเบเบตเบชเบญเบ, เบเบงเบฒเบกเปเบงเบเบฒเบเบเบญเบเบชเบฐเบซเบเบญเบเบเบฐเบเปเปเบฒเบซเบผเบฒเบ - decommissioning and recommitting will take hours on your cluster . เบเบตเป, เปเบเปเบเบญเบ, เบเปเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเปเบฒเบเบเบฒเบเบซเบงเบฑเบเบเบฒเบ autoscaling. เบเบฑเปเบเปเบกเปเบ, เบเบงเบเปเบฎเบปเบฒเบเปเปเปเบเปเบชเปเบฒเบเบฑเบเบเบฑเบเบเปเปเบเบญเบเบเบฐเปเบเบเบเปเบฒเบญเบดเบเปเบฅเบฐเบเบตเบชเบญเบ. เบเบงเบเบกเบฑเบเบเบฐเปเบเบฑเบเบเบปเบงเปเบเบเบเบญเบเบเบธเปเบกเบเบตเปเบกเบตเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเปเปเบฒเบชเบธเบเบเบตเปเบเบฐเบกเบตเบขเบนเปเบเบฐเบซเบผเบญเบเปเบฅเบเบฐเปเบงเบฅเบฒเบเบญเบเปเบเบเบเบฒเบ.
เบเบฑเปเบเบเบฑเปเบ, autoscaler เบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบทเบเบเบฝเบเปเบงเปเปเบ Python 3, เปเบเป Ambari API เปเบเบทเปเบญเบเบฑเบเบเบฒเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบธเปเบก, เปเบเป
เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบเบฒเบเปเบเปเปเบ
- เปเบกเบเบนเบ
autoscaler.py
. เบกเบฑเบเบเบฐเบเบญเบเบเปเบงเบเบชเบฒเบกเบเบฑเปเบเบฎเบฝเบ: 1) เบซเบเปเบฒเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ Ambari, 2) เบซเบเปเบฒเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ MCS, 3) เบซเบเปเบฒเบเบตเปเบเบตเปเบเปเบฝเบงเบเปเบญเบเปเบเบเบเบปเบเบเบฑเบเปเบซเบเบเบปเบเบเบญเบ autoscaler. - เบชเบฐเบเบฃเบดเบ
observer.py
. เปเบเบเบเบทเปเบเบเบฒเบเปเบฅเปเบงเบกเบฑเบเบเบฐเบเบญเบเบเปเบงเบเบเบปเบเบฅเบฐเบเบฝเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ: เปเบงเบฅเบฒเปเบเปเบฅเบฐเปเบงเบฅเบฒเปเบเบเบตเปเบเบฐเปเบเบซเบฒเบเบฑเบเบเบฑเบ autoscaler. - เปเบเบฅเปเบเบฒเบเบเบฑเปเบเบเปเบฒ
config.py
. เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เบกเบฑเบเบกเบตเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบ nodes เบญเบฐเบเบธเบเบฒเบเปเบซเปเบชเปเบฒเบฅเบฑเบ autoscaling เปเบฅเบฐเบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบเบญเบทเปเบเปเบเบตเปเบกเบตเบเบปเบเบเบฐเบเบปเบ, เบเบปเบงเบขเปเบฒเบ, เปเบฅเบเบฐเปเบงเบฅเบฒเบฅเปเบเปเบฒเบเบฒเบเบเบฑเบเบเบธเบเบฑเบ node เปเบซเบกเปเปเบเปเบเบทเบเปเบเบตเปเบก. เบเบญเบเบเบฑเปเบเบเบฑเบเบกเบตเบเบฒเบเบชเบฐเปเบเบกเปเบงเบฅเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบซเปเบญเบเบฎเบฝเบ, เบเบฑเปเบเบเบฑเปเบเบเปเบญเบเบซเปเบญเบเบฎเบฝเบ, เบเบฒเบเบเบฑเปเบเบเปเบฒเบเบธเปเบกเบเบตเปเบญเบฐเบเบธเบเบฒเบเบชเบนเบเบชเบธเบเปเบกเปเบเปเบเบตเบเบเบปเบง.
เบเบญเบเบเบตเปเปเบซเปเปเบเบดเปเบเบเบดเปเบเบชเปเบงเบเบเบญเบเบฅเบฐเบซเบฑเบเบเบฒเบเปเบเบชเบญเบเปเบเบฅเปเบเปเบฒเบญเบดเบ.
1. เปเบกเบเบนเบ Autoscaler.py
เบซเปเบญเบเบฎเบฝเบ Ambari
เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบฅเบฐเบซเบฑเบเบเบตเปเบกเบตเบซเปเบญเบเบฎเบฝเบเบกเบตเบฅเบฑเบเบชเบฐเบเบฐเปเบเบฑเบ 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
, เปเบเบดเปเบเบขเบธเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบฑเบเบซเบกเบปเบเปเบ node cluster เบเบตเปเบเปเบญเบเบเบฒเบ.
เบขเบนเปเบเบฒเบเปเบเบปเปเบฒเบซเปเบญเบเบฎเบฝเบ 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. เบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบตเปเบชเบปเบกเปเบซเบเบชเบปเบกเบเบปเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบญเบดเบเปเบเปเบฎเบฑเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเปเบฅเปเบเบขเบนเปเปเบ node, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฒเบกเบเปเบฝเบงเบเบฑเบเบเบธเปเบกเบเบตเปเปเบซเป, เปเบ node เปเบเบซเบเบถเปเบ, เปเบเบทเปเบญเปเบญเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบฒเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเปเบเบซเบฒเบฅเบฑเบ. INSTALLED
. เบเบฑเบเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบตเบเบเบปเบงเบเปเบฅเบดเบเบฒเบเบเบฑเบเบซเบกเบปเบ, เบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบญเบ nodes เบเบฑเบเบฅเบฑเบ Maintenance
เปเบฅเบฐเบญเบทเปเบเปเปเบเบดเปเบเบเปเบฒเบเบเบทเบเบฑเบ - เบเบงเบเปเบเบปเบฒเปเบกเปเบเบเบฝเบเปเบเปเบเบฒเบเบฎเปเบญเบเบเปเบเปเบฒเบเบงเบเบซเบเปเบญเบเบเปเบฒเบ API.
เบซเปเบญเบเบฎเบฝเบ Mcs
เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบฅเบฐเบซเบฑเบเบเบตเปเบกเบตเบซเปเบญเบเบฎเบฝเบเบกเบตเบฅเบฑเบเบชเบฐเบเบฐเปเบเบฑเบ 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
เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบ id เปเบเบเบเบฒเบเบเบฒเบเปเบเบเบฅเบฒเบงเปเบฅเบฐ id เบเบนเปเปเบเป, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบญเบเบฅเบฒเบง. เบขเบนเปเปเบเบซเบเปเบฒเบเบตเป vm_turn_on
เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบเบตเบเปเบเบทเปเบญเบเบซเบเบถเปเบ. เปเบซเบเบเบปเบเบขเบนเปเบเบตเปเบเบตเปเปเบกเปเบเบชเบฑเบเบชเบปเบเบเบงเปเบฒเปเบฅเบฑเบเบเปเบญเบ. เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบฅเบฐเบซเบฑเบ, เบชเบฒเบกเบซเบเปเบฒเบเบตเปเบญเบทเปเบเปเบญเบตเปเบเบงเปเบฒ: 1) เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบฎเบฑเบ token, 2) เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเปเบฝเบ hostname เปเบเบฑเบเบเบทเปเบเบญเบเปเบเบทเปเบญเบเปเบ MCS, 3) เปเบเป id เบเบญเบเปเบเบทเปเบญเบเบเบตเป. เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฝเบเปเบเปเปเบฎเบฑเบเบเปเบฒเบฎเปเบญเบเบเปเบเบญเบเปเบฅเบฐเปเบเบตเบเบเบปเบงเปเบเบทเปเบญเบเบเบตเป.
เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบซเบเปเบฒเบเบตเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเปเบฎเบฑเบ 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
เบซเปเบญเบเบฎเบฝเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบ
เบซเปเบญเบเบฎเบฝเบเบเบตเปเบกเบตเบเบฑเบเบเบฑเบเบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบ logic เบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบญเบเบกเบฑเบเปเบญเบ.
เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบฅเบฐเบซเบฑเบเบเบญเบเบเบฑเปเบเบฎเบฝเบเบเบตเปเปเบเบดเปเบเบเบทเบงเปเบฒ:
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
, เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบ nodes เบเบตเปเปเบเปเบฎเบฑเบเบญเบฐเบเบธเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบซเบเบฒเบ, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบเบเบญเบ node: เบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเปเบฅเบฐ cpu เบเบฑเบเบชเบฑเบเปเบซเปเบเบฑเบ node เปเบ YARN. เบเบญเบเบเบฒเบเบเบตเปเบเบฑเบเบกเบต 2 เบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบเบเบฒเบเปเบ q_ram, q_cpu, เปเบเบดเปเบเปเบเบฑเบเปเบเบง. เบเบฒเบเบเปเบฒเปเบเปเบเบงเบเบกเบฑเบ, เบเบงเบเปเบฎเบปเบฒเปเบเบฑเบเบเปเบฒเบเบญเบเบเบฒเบเปเบซเบผเบเบเบญเบเบเบธเปเบกเบเบฐเบเบธเบเบฑเบ. เบเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบซเบฑเบเบงเปเบฒเปเบเปเบฅเบเบฐ 5 เบเบฒเบเบตเบเบตเปเบเปเบฒเบเบกเบฒเบกเบตเบเบฒเบเปเบซเบผเบเปเบเบตเปเบกเบเบถเปเบเบขเปเบฒเบเบเปเปเปเบเบทเปเบญเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบชเบดเบเปเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบก +1 node เบเบฑเบเบเบธเปเบก. เบญเบฑเบเบเบฝเบงเบเบฑเบเปเบกเปเบเปเบเบฑเบเบเบงเบฒเบกเบเบดเบเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฐเบเบญเบ cluster underutilization.
เบฅเบฐเบซเบฑเบเบเปเบฒเบเปเบเบดเบเบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบฑเบเบเบฑเบเบเบตเปเปเบญเบปเบฒเปเบเบทเปเบญเบเบเบฑเบเบญเบญเบเบเบฒเบ cluster เปเบฅเบฐเบขเบธเบเบกเบฑเบเบขเบนเปเปเบเบเบฅเบฒเบง. เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบกเบตเบเบฒเบเบเบปเบเปเบฅเบตเบ YARN Nodemanager
, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบซเบกเบเปเบเบตเบ Maintenance
, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบขเบธเบเปเบเบปเบฒเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบฑเบเบซเบกเบปเบเปเบเปเบเบทเปเบญเบเปเบฅเบฐเบเบดเบเปเบเบทเปเบญเบ virtual เปเบเบเบฅเบฒเบง.
2. script 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)
เปเบเบกเบฑเบ, เบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบเบดเปเบเบงเปเบฒเปเบเบทเปเบญเบเปเบเบเปเบฒเบเปเปเบเปเบเบทเบเบชเปเบฒเบเบเบทเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบตเปเบกเบเบงเบฒเบกเบญเบฒเบเบชเบฒเบกเบฒเบเบเบญเบเบเบธเปเบกเปเบฅเบฐเบงเปเบฒเบกเบตเปเบเบทเปเบญเบเบเบฑเบเปเบเปเบขเบนเปเปเบเบชเบฐเบซเบเบงเบ, เปเบญเบปเบฒเบเบทเปเปเบเบปเปเบฒเบเบฒเบเบเบญเบเบซเบเบถเปเบเปเบเบเบฑเปเบ, เปเบเบตเปเบกเบกเบฑเบเปเบชเปเบเบธเปเบกเปเบฅเบฐเปเบเบตเบเปเบเปเบเปเปเบเบงเบฒเบกเบเปเบฝเบงเบเบฑเบเบกเบฑเบเบขเบนเปเปเบ Slack เบเบญเบเบเบตเบกเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบกเบฑเบเปเบฅเบตเปเบกเบเบปเปเบ cooldown_period
, เปเบกเบทเปเบญเบเบงเบเปเบฎเบปเบฒเบเปเปเปเบเบตเปเบกเบซเบผเบทเปเบญเบปเบฒเบชเบดเปเบเปเบเบญเบญเบเบเบฒเบเบเบธเปเบก, เปเบเปเบเบฝเบเปเบเปเบเบดเบเบเบฒเบกเบเบฒเบเปเบซเบผเบ. เบเปเบฒเบกเบฑเบเบกเบตเบเบงเบฒเบกเบซเบกเบฑเปเบเบเบปเบเปเบฅเบฐเบขเบนเปเปเบเปเบฅเบงเปเบชเบเบเบฐเบเบดเบเบเบญเบเบกเบนเบเบเปเบฒเบเบฒเบเปเบซเบผเบเบเบตเปเบเบตเบเบตเปเบชเบธเบ, เบเบงเบเปเบฎเบปเบฒเบเบฝเบเปเบเปเบชเบทเบเบเปเปเบเบดเบเบเบฒเบก. เบเปเบฒเบซเบเบถเปเบ node เบเปเปเบเบฝเบเบเป, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเปเบเบตเปเบกเบญเบตเบเบญเบฑเบเบซเบเบถเปเบ.
เบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบปเบเบฎเบฝเบเบฅเปเบงเบเบซเบเปเบฒ, เบเบงเบเปเบฎเบปเบฒเบฎเบนเปเปเบฅเปเบงเบงเปเบฒเบซเบเบถเปเบ node เบเบฐเบเปเปเบเบฝเบเบเป, เบเบฑเปเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบตเปเบฅเบตเปเบกเบเบปเปเบ nodes เบเบฃเบตเบเบฑเบเบซเบกเบปเบเปเบฅเบฐเบฎเบฑเบเบชเบฒเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเบกเบตเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเบเบปเบเบเปเบงเบฒเปเบเบเบญเบเบเปเบฒเบเบเบญเบเบเบปเบเบฎเบฝเบเปเบเป. เบญเบฑเบเบเบตเปเปเบเบตเบเบเบถเปเบเปเบเบเปเบเปเบฅเบฒเบเบเบทเปเปเบงเบฅเบฒเบเบญเบเบเบดเบเบเบฐเบเปเบฒ.
เบชเบฐเบซเบฅเบธเบ
Autoscaler เปเบเบฑเบเบเบฒเบเปเบเปเปเบเบเบตเปเบเบตเปเบฅเบฐเบชเบฐเบเบงเบเบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเปเบซเบผเบปเปเบฒเบเบฑเปเบเปเบกเบทเปเบญเบเปเบฒเบเบเบฐเบชเบปเบเบเบฑเบเบเบฒเบเปเบซเบผเบเบเบญเบเบเบธเปเบกเบเบตเปเบเปเปเบชเบฐเปเบซเบกเบตเบเบฑเบ. เบเปเบฒเบเบเปเบญเบกเปเบเบฑเบเบเบฑเบเบฅเบธเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบธเปเบกเบเบตเปเบเปเบญเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบซเบผเบเบชเบนเบเบชเบธเบเปเบฅเบฐเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบเบเปเปเบฎเบฑเบเบชเบฒเบเบธเปเบกเบเบตเปเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบซเบผเบ, เบเบฐเบซเบเบฑเบเปเบเบดเบ. เบเบต, เบเบงเบเบเบฑเบเบซเบกเบปเบเบเบตเปเปเบเบตเบเบเบถเปเบเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบเบเบเปเปเบกเบตเบเบฒเบเปเบเบปเปเบฒเบฎเปเบงเบกเบเบญเบเบเปเบฒเบ. autoscaler เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบเปเบกเปเบเบเปเปเบกเบตเบซเบเบฑเบเบเบญเบเปเบซเบเบทเบญเบเบฒเบเบเปเบฒเบเบปเบเบเบฒเบเบฎเปเบญเบเบเปเปเบซเป API เบเบนเปเบเบฑเบเบเบฒเบเบเบธเปเบกเปเบฅเบฐ API เบเบนเปเปเบซเปเบเปเบฅเบดเบเบฒเบเบเบฑเบ, เบเบฝเบเบเบฒเบกเปเบซเบเบเบปเบเบเบตเปเปเบเปเบเบญเบ. เบชเบดเปเบเบเบตเปเบเปเบฒเบ เบเบณ เปเบเบฑเบเบเปเบญเบเบเบทเปเบขเปเบฒเบเปเบเปเบเบญเบเปเบกเปเบเบเบฒเบเปเบเปเบเบชเปเบงเบเบเบญเบเบเปเปเบญเบญเบเปเบเบฑเบ 3 เบเบฐเปเบเบ, เบเบฑเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฝเบเบเปเบญเบ เปเปเบฒ เบเบตเป. เปเบฅเบฐเปเบเบปเปเบฒเบเบฐเบกเบตเบเบงเบฒเบกเบชเบธเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com