เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฒเจˆ เจ†เจชเจฃเจพ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจ‡เจ† เจœเจพเจตเฉ‡

เจธเจค เจธเฉเจฐเฉ€ เจ…เจ•เจพเจฒ! เจ…เจธเฉ€เจ‚ เจฒเฉ‹เจ•เจพเจ‚ เจจเฉ‚เฉฐ เจตเฉฑเจกเฉ‡ เจกเฉ‡เจŸเจพ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจธเจฟเจ–เจฒเจพเจˆ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจฆเฉ‡ เจ†เจชเจฃเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจตเฉฑเจกเฉ‡ เจกเฉ‡เจŸเจพ 'เจคเฉ‡ เจตเจฟเจฆเจฟเจ…เจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ€ เจ•เจฒเจชเจจเจพ เจ•เจฐเจจเจพ เจ…เจธเฉฐเจญเจต เจนเฉˆ, เจœเจฟเจธ 'เจคเฉ‡ เจธเจพเจฐเฉ‡ เจญเจพเจ—เฉ€เจฆเจพเจฐ เจ‡เจ•เฉฑเจ เฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจจ. เจ‡เจธ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡, เจธเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจตเจฟเฉฑเจš เจนเจฎเฉ‡เจธเจผเจพ เจ‡เจน เจนเฉเฉฐเจฆเจพ เจนเฉˆ ๐Ÿ™‚ เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ, เจŸเจฟเจŠเจจเจฟเฉฐเจ— เจ…เจคเฉ‡ เจชเฉเจฐเจธเจผเจพเจธเจจ เจตเจฟเฉฑเจš เจฐเฉเฉฑเจเฉ‡ เจนเฉ‹เจ เจนเจพเจ‚, เจ…เจคเฉ‡ เจฒเฉ‹เจ• เจธเจฟเฉฑเจงเฉ‡ MapReduce เจจเฉŒเจ•เจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ‰เฉฑเจฅเฉ‡ เจฒเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจธเจชเจพเจฐเจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

เจ‡เจธ เจชเฉ‹เจธเจŸ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเฉฑเจธเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เจฒเจพเจ‰เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจชเจฃเจพ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจฒเจฟเจ– เจ•เฉ‡ เจ…เจธเจฎเจพเจจ เจ•เจฒเฉฑเจธเจŸเจฐ เจฒเฉ‹เจกเจฟเฉฐเจ— เจฆเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉฑเจฒ เจ•เฉ€เจคเจพ เจนเฉˆเฅค Mail.ru เจ•เจฒเจพเจ‰เจก เจนเฉฑเจฒ.

เจธเจฎเฉฑเจธเจฟเจ†

เจธเจพเจกเจพ เจ•เจฒเฉฑเจธเจŸเจฐ เจ‡เฉฑเจ• เจ†เจฎ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจจเจฟเจชเจŸเจพเจฐเจพ เจฌเจนเฉเจค เจ…เจธเจฎเจพเจจ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจชเฉเจฐเฉˆเจ•เจŸเฉ€เจ•เจฒ เจ•เจฒเจพเจธเจพเจ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ, เจœเจฆเฉ‹เจ‚ เจธเจพเจฐเฉ‡ 30 เจฒเฉ‹เจ• เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ…เจงเจฟเจ†เจชเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจตเจฐเจคเจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจœเจพเจ‚ เจฆเฉเจฌเจพเจฐเจพ, เจกเฉˆเฉฑเจกเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฆเฉ‡ เจฆเจฟเจจ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจœเจฆเฉ‹เจ‚ เจฒเฉ‹เจก เจฌเจนเฉเจค เจตเจง เจœเจพเจ‚เจฆเจพ เจนเฉˆ. เจฌเจพเจ•เฉ€ เจธเจฎเจพเจ‚ เจ•เจฒเฉฑเจธเจŸเจฐ เจ…เฉฐเจกเจฐเจฒเฉ‹เจก เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจนเฉฑเจฒ #1 เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฐเฉฑเจ–เจฃเจพ เจนเฉˆ เจœเฉ‹ เจชเฉ€เจ• เจฒเฉ‹เจก เจฆเจพ เจธเจพเจฎเฉเจนเจฃเจพ เจ•เจฐเฉ‡เจ—เจพ, เจชเจฐ เจฌเจพเจ•เฉ€ เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš เจตเจฟเจนเจฒเจพ เจฐเจนเฉ‡เจ—เจพเฅค

เจนเฉฑเจฒ #2 เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจ•เจฒเฉฑเจธเจŸเจฐ เจฐเฉฑเจ–เจฃเจพ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจคเฉเจธเฉ€เจ‚ เจ•เจฒเจพเจธเจพเจ‚ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ…เจคเฉ‡ เจชเฉ€เจ• เจฒเฉ‹เจก เจฆเฉŒเจฐเจพเจจ เจนเฉฑเจฅเฉ€เจ‚ เจจเฉ‹เจก เจœเฉ‹เฉœเจฆเฉ‡ เจนเฉ‹เฅค

เจนเฉฑเจฒ #3 เจ‡เฉฑเจ• เจ›เฉ‹เจŸเจพ เจ•เจฒเฉฑเจธเจŸเจฐ เจฐเฉฑเจ–เจฃเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจฒเจฟเจ–เจฃเจพ เจนเฉˆ เจœเฉ‹ เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจฒเฉ‹เจก เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเฉ‡เจ—เจพ เจ…เจคเฉ‡, เจตเฉฑเจ–-เจตเฉฑเจ– API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡, เจ•เจฒเฉฑเจธเจŸเจฐ เจคเฉ‹เจ‚ เจจเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจเจพ เจ…เจคเฉ‡ เจนเจŸเจพเจ‰เจฃเจพ เจนเฉˆเฅค

เจ‡เจธ เจชเฉ‹เจธเจŸ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจนเฉฑเจฒ #3 เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ‡เจน เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจ•เจพเจฐเจ•เจพเจ‚ เจฆเฉ€ เจฌเจœเจพเจ เจฌเจพเจนเจฐเฉ€ เจ•เจพเจฐเจ•เจพเจ‚ 'เจคเฉ‡ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจจเจฟเจฐเจญเจฐ เจนเฉˆ, เจ…เจคเฉ‡ เจชเฉเจฐเจฆเจพเจคเจพ เจ…เจ•เจธเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจ…เจธเฉ€เจ‚ Mail.ru Cloud Solutions เจ•เจฒเจพเจ‰เจก เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ MCS API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ‡เฉฑเจ• เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจฒเจฟเจ–เจฟเจ† เจนเฉˆเฅค เจ…เจคเฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเจฟเจ–เจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจกเฉ‡เจŸเจพ เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจ‡เจน เจฆเจฟเจ–เจพเจ‰เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจ‰เจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจ•เจฒเจพเจ‰เจก เจจเจพเจฒ เจตเจฐเจค เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจชเฉ‚เจฐเจฟ-เจฒเฉ‹เฉœเจพเจ‚

เจชเจนเจฟเจฒเจพเจ‚, เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจนเฉˆเจกเฉ‚เจช เจ•เจฒเฉฑเจธเจŸเจฐ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ HDP เจตเฉฐเจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจคเฉเจนเจพเจกเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจœเฉ‹เฉœเจจ เจ…เจคเฉ‡ เจนเจŸเจพเจ เจœเจพเจฃ เจฒเจˆ, เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจจเฉ‹เจกเจพเจ‚ เจตเจฟเฉฑเจš เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจ–เจพเจธ เจตเฉฐเจก เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค

  1. เจฎเจพเจธเจŸเจฐ เจจเฉ‹เจก. เจ–เฉˆเจฐ, เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉเจ เจตเฉ€ เจธเจฎเจเจพเจ‰เจฃ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจจเจนเฉ€เจ‚ เจนเฉˆ: เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเจพ เจฎเฉเฉฑเจ– เจจเฉ‹เจก, เจœเจฟเจธ 'เจคเฉ‡, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจธเจชเจพเจฐเจ• เจกเจฐเจพเจˆเจตเจฐ เจฒเจพเจ‚เจš เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฐเจŸเจฐเจเจ•เจŸเจฟเจต เจฎเฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹.
  2. เจฎเจฟเจคเฉ€ เจจเฉ‹เจก. เจ‡เจน เจ‰เจน เจจเฉ‹เจก เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ HDFS 'เจคเฉ‡ เจกเจพเจŸเจพ เจธเจŸเฉ‹เจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจœเจฟเฉฑเจฅเฉ‡ เจ—เจฃเจจเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค
  3. เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ— เจจเฉ‹เจก. เจ‡เจน เจ‡เฉฑเจ• เจจเฉ‹เจก เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ HDFS 'เจคเฉ‡ เจ•เฉเจ เจตเฉ€ เจธเจŸเฉ‹เจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡, เจชเจฐ เจœเจฟเฉฑเจฅเฉ‡ เจ—เจฃเจจเจพ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค

เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจฌเจฟเฉฐเจฆเฉ‚. เจคเฉ€เจœเฉ€ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‚เจœเฉ€ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉˆเจฃเจพ เจ…เจคเฉ‡ เจœเฉ‹เฉœเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจœเจตเจพเจฌ เจฆเฉ€ เจ—เจคเฉ€ เจฌเจนเฉเจค เจ˜เฉฑเจŸ เจนเฉ‹เจตเฉ‡เจ—เฉ€ - เจกเฉ€เจ•เจฎเจฟเจธเจผเจจเจฟเฉฐเจ— เจ…เจคเฉ‡ เจฐเฉ€เจ•เจฎเจฟเจŸเจฟเฉฐเจ— เจคเฉเจนเจพเจกเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ 'เจคเฉ‡ เจ˜เฉฐเจŸเฉ‡ เจฒเจตเฉ‡เจ—เฉ€เฅค เจ‡เจน, เจฌเฉ‡เจธเจผเจ•, เจ‰เจน เจจเจนเฉ€เจ‚ เจนเฉˆ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เฅค เจญเจพเจต, เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเฉ€ เจ…เจคเฉ‡ เจฆเฉ‚เจœเฉ€ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจ›เฉ‚เจนเจฆเฉ‡. เจ‰เจน เจ‡เฉฑเจ• เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจตเจฟเจนเจพเจฐเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเฉ€ เจจเฉเจฎเจพเจ‡เฉฐเจฆเจ—เฉ€ เจ•เจฐเจจเจ—เฉ‡ เจœเฉ‹ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฆเฉ‡ เจชเฉ‚เจฐเฉ‡ เจธเจฎเฉ‡เจ‚ เจฆเฉŒเจฐเจพเจจ เจฎเฉŒเจœเฉ‚เจฆ เจฐเจนเฉ‡เจ—เจพเฅค

เจ‡เจธ เจฒเจˆ, เจธเจพเจกเจพ เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจชเจพเจˆเจฅเจจ 3 เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ, เจ•เจฒเฉฑเจธเจŸเจฐ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจ เจฒเจˆ เจ…เฉฐเจฌเจฐเฉ€ API เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจตเจฐเจคเจฆเจพ เจนเฉˆ Mail.ru เจ•เจฒเจพเจ‰เจก เจนเฉฑเจฒ เจคเฉ‹เจ‚ API (MCS) เจฎเจธเจผเฉ€เจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจ…เจคเฉ‡ เจฌเฉฐเจฆ เจ•เจฐเจจ เจฒเจˆเฅค

เจนเฉฑเจฒ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ

  1. เจฎเฉ‹เจกเฉ€uleเจฒ autoscaler.py. เจ‡เจธ เจตเจฟเฉฑเจš เจคเจฟเฉฐเจจ เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจนเจจ: 1) เจ…เฉฐเจฌเจฐเฉ€ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจ, 2) MCS เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจ, 3) เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจฆเฉ‡ เจคเจฐเจ• เจจเจพเจฒ เจธเจฟเฉฑเจงเฉ‡ เจธเจฌเฉฐเจงเจค เจซเฉฐเจ•เจธเจผเจจเฅค
  2. เจธเจ•เฉเจฐเจฟเจชเจŸ observer.py. เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจธ เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– เจจเจฟเจฏเจฎ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ: เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฆเฉ‹เจ‚ เจ…เจคเฉ‡ เจ•เจฟเจนเฉœเฉ‡ เจชเจฒเจพเจ‚ 'เจคเฉ‡ เจ•เจพเจฒ เจ•เจฐเจจเจพ เจนเฉˆเฅค
  3. เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจ‡เจฒ 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, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, like 'http://localhost:8080/api/v1/clusters/',
  • cluster_name - เจ…เฉฐเจฌเจฐเฉ€ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ เจฆเจพ เจจเจพเจฎ,
  • headers = {'X-Requested-By': 'ambari'}
  • เจ…เจคเฉ‡ เจ…เฉฐเจฆเจฐ auth เจ…เฉฐเจฌเจฐเฉ€ เจฒเจˆ เจคเฉเจนเจพเจกเจพ เจฒเฉŒเจ—เจ‡เจจ เจ…เจคเฉ‡ เจชเจพเจธเจตเจฐเจก เจ‡เจน เจนเฉˆ: auth = ('login', 'password').

เจซเฉฐเจ•เจธเจผเจจ เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจ…เฉฐเจฌเจฐเฉ€ เจจเฉ‚เฉฐ REST API เจฆเฉเจ†เจฐเจพ เจฆเฉ‹ เจ•เจพเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ•เฉเจ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจคเจฐเจ•เจชเฉ‚เจฐเจจ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เฉฑเจ• เจจเฉ‹เจก 'เจคเฉ‡ เจšเฉฑเจฒ เจฐเจนเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เฉฑเจ• เจฆเจฟเฉฑเจคเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ 'เจคเฉ‡, เจฆเจฟเฉฑเจคเฉ‡ เจจเฉ‹เจก 'เจคเฉ‡, เจธเฉ‚เจšเฉ€ เจคเฉ‹เจ‚ เจฐเจพเจœ เจตเจฟเฉฑเจš เจธเฉ‡เจตเจพเจตเจพเจ‚ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐเจจ เจฒเจˆ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค INSTALLED. เจธเจพเจฐเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจ, เจจเฉ‹เจกเจธ เจจเฉ‚เฉฐ เจฐเจพเจœ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจฒเจˆ Maintenance เจ†เจฆเจฟ เจธเจฎเจพเจจ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ - เจ‰เจน API เจฆเฉเจ†เจฐเจพ เจ•เฉเจ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจนเจจเฅค

เจ•เจฒเจพเจธ เจเจฎ.เจธเฉ€.เจเจธ

เจ‡เจน เจ‰เจน เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจฒเจพเจธ เจตเจพเจฒเจพ เจ•เฉ‹เจก เจฆเจพ เจ‡เฉฑเจ• เจŸเฉเจ•เฉœเจพ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ 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, เจจเฉ‹เจกเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจœเฉ‹ เจธเจ•เฉ‡เจฒเจฟเฉฐเจ— เจฒเจˆ เจฎเจจเจœเจผเฉ‚เจฐ เจนเจจ, เจจเจพเจฒ เจนเฉ€ เจจเฉ‹เจก เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ: เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ…เจคเฉ‡ CPU 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, เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจ•เจฒเฉฑเจธเจŸเจฐ เจคเฉ‹เจ‚ เจ•เฉเจ เจตเฉ€ เจœเฉ‹เฉœเจฆเฉ‡ เจœเจพเจ‚ เจนเจŸเจพเจ‰เจ‚เจฆเฉ‡ เจจเจนเฉ€เจ‚ เจนเจพเจ‚, เจชเจฐ เจฌเจธ เจฒเฉ‹เจก เจฆเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจœเฉ‡ เจ‡เจน เจธเจฅเจฟเจฐ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจฒเฉ‹เจก เจฎเฉเฉฑเจฒเจพเจ‚ เจฆเฉ‡ เจ—เจฒเจฟเจ†เจฐเฉ‡ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจนเฉˆ, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซเจผ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚เฅค เจœเฉ‡ เจ‡เฉฑเจ• เจจเฉ‹เจก เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจธเฉ€, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจœเฉ‹เฉœเจฆเฉ‡ เจนเจพเจ‚.

เจ‰เจนเจจเจพเจ‚ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจฒเจˆ เจœเจฆเฉ‹เจ‚ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจชเจพเจ  เจ…เฉฑเจ—เฉ‡ เจนเฉˆ, เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจพเจฃเจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจจเฉ‹เจก เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจคเฉเจฐเฉฐเจค เจธเจพเจฐเฉ‡ เจฎเฉเจซเจค เจจเฉ‹เจกเจพเจ‚ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจชเจพเจ  เจฆเฉ‡ เจ…เฉฐเจค เจคเฉฑเจ• เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจฐเจฟเจ†เจธเจผเฉ€เจฒ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจน เจ—เจคเฉ€เจตเจฟเจงเฉ€ เจŸเจพเจˆเจฎเจธเจŸเฉˆเจ‚เจชเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆเฅค

เจธเจฟเฉฑเจŸเจพ

เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจ‰เจนเจจเจพเจ‚ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจšเฉฐเจ—เจพ เจ…เจคเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจนเฉฑเจฒ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ…เจธเจฎเจพเจจ เจ•เจฒเฉฑเจธเจŸเจฐ เจฒเฉ‹เจกเจฟเฉฐเจ— เจฆเจพ เจ…เจจเฉเจญเจต เจ•เจฐเจฆเฉ‡ เจนเฉ‹เฅค เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจชเฉ€เจ• เจฒเฉ‹เจก เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจฆเฉ€ เจ•เจฒเฉฑเจธเจŸเจฐ เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจนเฉ€ เจชเฉˆเจธเฉ‡ เจฆเฉ€ เจฌเจšเจค เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ…เฉฐเจกเจฐเจฒเฉ‹เจก เจฆเฉŒเจฐเจพเจจ เจ‡เจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจจเจพ เจฐเฉฑเจ–เฉ‹เฅค เจ–เฉˆเจฐ, เจจเจพเจฒ เจนเฉ€ เจ‡เจน เจธเจญ เจคเฉเจนเจพเจกเฉ€ เจญเจพเจ—เฉ€เจฆเจพเจฐเฉ€ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆเฅค เจ†เจŸเฉ‹เจธเจ•เฉ‡เจฒเจฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจ•เจฒเฉฑเจธเจŸเจฐ เจฎเฉˆเจจเฉ‡เจœเจฐ API เจ…เจคเฉ‡ เจ•เจฒเจพเจ‰เจก เจชเฉเจฐเจฆเจพเจคเจพ API เจจเฉ‚เฉฐ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจธเจฎเฉ‚เจน เจคเฉ‹เจ‚ เจตเฉฑเจง เจ•เฉเจ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เฉฑเจ• เจ–เจพเจธ เจคเจฐเจ• เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจฏเจพเจฆ เจฐเฉฑเจ–เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ‰เจน เจนเฉˆ 3 เจ•เจฟเจธเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจจเฉ‹เจกเจพเจ‚ เจฆเฉ€ เจตเฉฐเจก, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฒเจฟเจ–เจฟเจ† เจธเฉ€เฅค เจ…เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ–เฉเจธเจผ เจนเฉ‹เจตเฉ‹เจ—เฉ‡เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹