日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cmscore服务地址_cms core服务器

發布時間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cmscore服务地址_cms core服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

阿里云ECS在已有的系統事件的基礎上,通過云監控新發布了狀態變化類事件和搶占型實例的中斷通知事件。每當ECS實例的狀態發生變化的時候,都會觸發一條ECS實例狀態變化事件。這種變化包括您在控制臺/OpenAPI/SDK操作導致的變化,也包括彈性伸縮或欠費等原因而自動觸發的變化,還包括因為系統異常而觸發的變化。

云監控以前發布的系統事件,主要針對告警后人工介入的場景,而這次新發布的事件屬于正常類的信息通知,適合自動化的審計運維等場景。為了自動化處理ECS狀態變化事件,云監控提供了兩種主要途徑:一種是通過函數計算,另一種是通過MNS消息隊列。本文將為您介紹利用MNS消息隊列自動化處理ECS事件的三種最佳實踐。 自動化處理ECS狀態變化事件的準備工作

創建消息隊列

登錄MNS控制臺。

在隊列列表頁面,選擇地域,單擊右上角的創建隊列,進入新建隊列頁面。

輸入隊列的名稱(例如“ecs-cms-event”)等信息,單擊確認即可完成創建消息隊列。

創建事件報警規則

登錄云監控控制臺。

單擊左側導航欄中的事件監控,進入事件查詢頁面

單擊報警規則頁簽,然后單擊右上角的創建事件報警,彈出創建/修改事件報警對話框。

在基本信息區域,填寫報警規則名稱,例如如“ecs-test-rule”。

設置事件報警規則:選擇事件類型為系統事件。

產品類型、事件等級、事件名稱:產品類型選擇云服務器ECS,事件類型選擇StatusNotification,其余按照實際情況填寫。

資源范圍:選擇全部資源時,任何資源發生相關事件,都會按照配置發送通知;選擇應用分組時,只有指定分組內的資源發生相關事件時,才會發送通知。

在報警方式中,選擇消息隊列,然后選擇地域和隊列(例如ecs-cms-event)。

完成以上設置后,單擊確定按鈕即可完成創建事件報警規則。

安裝Python依賴

本文所有的代碼均使用Python 3.6測試通過,您也可以使用Java等其他編程語言。

請使用Pypi安裝以下Python依賴:

aliyun-python-sdk-core-v3>=2.12.1

aliyun-python-sdk-ecs>=4.16.0

aliyun-mns>=1.1.5

自動化處理ECS狀態變化事件的實施步驟

云監控會把云服務器ECS所有的狀態變化事件都投遞到MNS里面,接下來我們需要通過編寫代碼從MNS獲取消息并進行消息處理。 實踐一:對所有ECS的創建和釋放事件進行記錄

目前ECS控制臺無法查詢已經釋放的實例。如果您有查詢需求,可以通過ECS狀態變化事件把所有ECS的生命周期記錄在自己的數據庫或者日志里。每當創建ECS時,會首先發送一個Pending事件,每當釋放ECS時,會最后發送一個Deleted事件。我們需要對這兩種事件進行記錄。

編輯一個Conf文件。需包含mns的endpoint(可以登錄MNS的控制臺,在隊列列表頁,單擊獲取Endpoint得到)、阿里云的access key和secrect、region id(例如cn-beijing)以及mns queue的名字。

class Conf:

endpoint = 'http://.mns..aliyuncs.com/'

access_key = ''

access_key_secret = ''

region_id = 'cn-beijing'

queue_name = 'test'

vsever_group_id = ''

使用MNS的SDK編寫一個MNS Client用來獲取MNS消息。

# -*- coding: utf-8 -*-

import json

from mns.mns_exception import MNSExceptionBase

import logging

from mns.account import Account

from . import Conf

class MNSClient(object):

def __init__(self):

self.account = Account(Conf.endpoint, Conf.access_key, Conf.access_key_secret)

self.queue_name = Conf.queue_name

self.listeners = dict()

def regist_listener(self, listener, eventname='Instance:StateChange'):

if eventname in self.listeners.keys():

self.listeners.get(eventname).append(listener)

else:

self.listeners[eventname] = [listener]

def run(self):

queue = self.account.get_queue(self.queue_name)

while True:

try:

message = queue.receive_message(wait_seconds=5)

event = json.loads(message.message_body)

if event['name'] in self.listeners:

for listener in self.listeners.get(event['name']):

listener.process(event)

queue.delete_message(receipt_handle=message.receipt_handle)

except MNSExceptionBase as e:

if e.type == 'QueueNotExist':

logging.error('Queue %s not exist, please create queue before receive message.', self.queue_name)

else:

logging.error('No Message, continue waiting')

class BasicListener(object):

def process(self, event):

pass

上述代碼只是對MNS消息進行拉取,調用Listener消費消息之后刪除消息,后面的實踐也會用到。

注冊一個Listener進消費指定事件。這個簡單的Listener判斷收到Pending和Deleted事件時,打印一行日志。

# -*- coding: utf-8 -*-

import logging

from .mns_client import BasicListener

class ListenerLog(BasicListener):

def process(self, event):

state = event['content']['state']

resource_id = event['content']['resourceId']

if state == 'Panding':

logging.info(f'The instance {resource_id} state is {state}')

elif state == 'Deleted':

logging.info(f'The instance {resource_id} state is {state}')

Main函數可以這么寫:

mns_client = MNSClient()

mns_client.regist_listener(ListenerLog())

mns_client.run()

實際生產環境下,可能需要把事件存儲在數據庫里,或者利用SLS日志服務,方便后期的搜索和審計。

實踐二:ECS的關機自動重啟

在某些場景下,ECS會非預期的關機,您可能需要自動重啟已經關機的ECS。

為了實現這一目的,我們復用實踐一里面的MNS Client,添加一個新的Listener。當收到Stopped事件的時候,對該ECS執行一個Start命令。

-- coding: utf-8 --

import logging from aliyunsdkecs.request.v20140526 import StartInstanceRequest from aliyunsdkcore.client import AcsClient from .mns_client import BasicListener from .config import Conf

class ECSClient(object): def init(self, acs_client): self.client = acs_client

# 啟動ECS實例

def start_instance(self, instance_id):

logging.info(f'Start instance {instance_id} ...')

request = StartInstanceRequest.StartInstanceRequest()

request.set_accept_format('json')

request.set_InstanceId(instance_id)

self.client.do_action_with_exception(request)

class ListenerStart(BasicListener): def init(self): acs_client = AcsClient(Conf.access_key, Conf.access_key_secret, Conf.region_id) self.ecs_client = ECSClient(acs_client)

def process(self, event):

detail = event['content']

instance_id = detail['resourceId']

if detail['state'] == 'Stopped':

self.ecs_client.start_instance(instance_id)

在實際生產環境下,執行完Start命令后,可能還需要繼續接收后續的Starting/Running/Stopped等事件,再配合計時器和計數器,進行Start成功或失敗之后的處理。 實踐三:搶占型實例釋放前,自動從SLB移除

搶占型實例在釋放之前五分鐘左右,會發出釋放告警事件,您可以利用這短暫的時間運行一些業務不中斷的邏輯。例如,主動從SLB的后端服務器中去掉這臺即將被釋放的搶占型實例,而不是被動等待實例釋放后SLB的自動處理。

我們還是復用實踐一的MNS Client,添加一個新的Listener,當收到搶占型實例的釋放告警時,調用SLB的SDK。

-- coding: utf-8 --

from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest from .mns_client import BasicListener from .config import Conf

class SLBClient(object): def init(self): self.client = AcsClient(Conf.access_key, Conf.access_key_secret, Conf.region_id) self.request = CommonRequest() self.request.set_method('POST') self.request.set_accept_format('json') self.request.set_version('2014-05-15') self.request.set_domain('slb.aliyuncs.com') self.request.add_query_param('RegionId', Conf.region_id)

def remove_vserver_group_backend_servers(self, vserver_group_id, instance_id):

self.request.set_action_name('RemoveVServerGroupBackendServers')

self.request.add_query_param('VServerGroupId', vserver_group_id)

self.request.add_query_param('BackendServers',

"[{'ServerId':'" + instance_id + "','Port':'80','Weight':'100'}]")

response = self.client.do_action_with_exception(self.request)

return str(response, encoding='utf-8')

class ListenerSLB(BasicListener): def init(self, vsever_group_id): self.slb_caller = SLBClient() self.vsever_group_id = Conf.vsever_group_id

def process(self, event):

detail = event['content']

instance_id = detail['instanceId']

if detail['action'] == 'delete':

self.slb_caller.remove_vserver_group_backend_servers(self.vsever_group_id, instance_id)

總結

以上是生活随笔為你收集整理的cmscore服务地址_cms core服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。