1. 程式人生 > >騰訊雲災備方案

騰訊雲災備方案

客戶需求

上海區雲、北京區雲、IDC互通。
上海區是生產環境、北京區是災備、IDC是辦公室機房

  • 具體要求:
    1、2條專線分別從IDC-上海、IDC-北京,能做到雙活切換
    2、上海、北京互通,北京災備保持與上海的資料一致。

實施難點

  • 網段重疊:客戶的上海、北京、IDC均是172.18.0.0/16網段
  • 專線切換:IDC-上海、IDC-北京,任意一條專線中斷可自動切換到另外一條。

需求分析

1、由於網段重疊,無法使用對等連線,只能使用雲聯網 來解決網段重疊問題。
2、客戶IDC也是172.18.0.0/16網段,導致在上海、北京分別到IDC的路由衝突,無法同時存在。故只能做到主備,正常開啟上海的路由,上海-IDC專線中斷後切換到北京-IDC。使用python呼叫雲聯網SDK操作開啟/關閉路由。
3、北京災備方面,雲資料庫用DTS實時同步資料、網站檔案利用COS遷移工具將上海CVM資料遷移到北京COS,然後北京伺服器再從COS取資料。或者直接使用rsync同步資料。北京伺服器可由上海已配置環境的伺服器做映象,映象複製到北京,再利用映象開出伺服器。

image

操作配置

  • 1、雲聯網配置
    • 新建雲聯網(目前公測階段,需要申請此產品),並關聯對應例項
      image
    • 關聯例項後會自動把例項所擁有的路由自動新增到雲聯網路由表裡。
  • 2、專線配置(雲平臺)

    • 專線閘道器建立配置(雲產品->私有網路->專線閘道器)
      image
      新建專線閘道器時,關聯網路型別要選擇為雲聯網,雲聯網例項可現在關聯也可之後關聯。
    • 專用通道建立配置(雲產品->專線接入->專用通道)

    image

    建立專用通道時選擇專線型別,本例使用的是共享專線,需要填寫專線提供方的賬戶ID、共享專線ID,接入網路選擇雲聯網。一條專線(專用通道)對應一個專線閘道器。

    image

    VLAN ID、IDC側BGP AS號這些需向專線提供方索要,邊界IP和專線提供方協商規劃。這些配置完畢後等待專線提供方接受提交的申請,然後再IDC設定上配置BGP宣告IDC內網網段,如果路由方式是靜態路由那就在裝置上寫到雲上的路由。

  • 3、專線閘道器上新增路由

    • 點選需要新增路由的專線閘道器,進入IDC網段新增需要的IDC網段
      image

    如果此專線閘道器未加入雲聯網,請在雲聯網下關聯此專線閘道器,在專線閘道器上新增的路由會自動新增到雲聯網路由表裡。

    image
    在雲聯網路由表裡可看出路由的詳情,下一跳、是否啟動該路由等。如果存在路由重疊,優先匹配長掩碼(例如同網段24和25掩碼,優先匹配25掩碼的路由)。如果路由網段相同後新增的則自動禁用此路由。

使用雲聯網SDK自動切換路由

  • 1、編寫相關程式碼
    將程式碼放置到相關伺服器上,觸發指令碼條件可設定為ping隧道邊界ip及IDC內網ip,如果同時不通則觸發指令碼切換專線。

    #! /usr/bin/env python
    # -*- coding:utf-8 -*-
    # Auther: liyk time:2019/1/3
    # File : CCN.py
    from tencentcloud.common import credential
    from tencentcloud.vpc.v20170312 import vpc_client,models
    import json
    #
    def Auth_vpc(id,key):
    # 認證ak
    cred = credential.Credential(id,key)
    Vpc_client = vpc_client.VpcClient(cred,"ap-shanghai")
    return Vpc_client
    #
    def SH_DescribeCcnRoutesRequest(Vpc_client):
    # 獲取上海專線閘道器路由ID
    req = models.DescribeCcnRoutesRequest()
    req.CcnId = 'ccn-a187ua1z'
    resp = Vpc_client.DescribeCcnRoutes(req)
    result = json.loads(resp.to_json_string())
    RouteSet = result['RouteSet']
    SH_RouteIds = []
    for i in RouteSet:
        if i['InstanceName'] == "shanghai-IDC":
            SH_RouteId = i['RouteId']
            SH_RouteIds.append(SH_RouteId)
    return SH_RouteIds
    #
    def BJ_DescribeCcnRoutesRequest(Vpc_client):
    # 獲取北京專線閘道器路由ID
    req = models.DescribeCcnRoutesRequest()
    req.CcnId = 'ccn-a187ua1z'
    resp = Vpc_client.DescribeCcnRoutes(req)
    result = json.loads(resp.to_json_string())
    RouteSet = result['RouteSet']
    BJ_RouteIds = []
    for i in RouteSet:
        if i['InstanceName'] == "beijing-IDC":
            BJ_RouteId = i['RouteId']
            BJ_RouteIds.append(BJ_RouteId)
    return BJ_RouteIds
    #
    def SH_EnableCcnRoutes(Vpc_client,SH_id):
    # 開啟上海路由
    req = models.EnableCcnRoutesRequest()
    req.CcnId = 'ccn-a187ua1z'
    req.RouteIds = ['%s' %SH_id]
    print('開啟上海路由 %s' % SH_id)
    resp = Vpc_client.EnableCcnRoutes(req)
    # print(resp.to_json_string())
    #
    def BJ_EnableCcnRoutes(Vpc_client,BJ_id):
    # 開啟北京路由
    req = models.EnableCcnRoutesRequest()
    req.CcnId = 'ccn-a187ua1z'
    req.RouteIds = ['%s' %BJ_id]
    print('開啟北京路由 %s' % BJ_id)
    resp = Vpc_client.EnableCcnRoutes(req)
    #
    def SH_DisableCcnRoutes(Vpc_client,SH_id):
    req = models.DisableCcnRoutesRequest()
    req.CcnId = 'ccn-a187ua1z'
    req.RouteIds = ['%s' %SH_id]
    print('關閉上海路由 %s' % SH_id)
    resp = Vpc_client.DisableCcnRoutes(req)
    #
    def BJ_DisableCcnRoutes(Vpc_client,BJ_id):
    req = models.DisableCcnRoutesRequest()
    req.CcnId = 'ccn-a187ua1z'
    req.RouteIds = ["%s" %BJ_id]
    print('關閉北京路由 %s' % BJ_id)
    resp = Vpc_client.DisableCcnRoutes(req)
    #
    if __name__ == "__main__":
    id = 'AKID*******sTzK'
    key = 'KUWT*******M'
    Vpc_client = Auth_vpc(id, key)
    SH_RouteIds = SH_DescribeCcnRoutesRequest(Vpc_client)
    BJ_RouteIds = BJ_DescribeCcnRoutesRequest(Vpc_client)
    # 這裡可使用ping返回結果
    oper = "normal"
    if oper == "normal":
        for BJ_id in BJ_RouteIds:
            BJ_DisableCcnRoutes(Vpc_client, BJ_id)
        for SH_id in SH_RouteIds:
            SH_EnableCcnRoutes(Vpc_client, SH_id)
        # SH_DisableCcnRoutes(Vpc_client, SH_id)
    else:
        for SH_id in SH_RouteIds:
            SH_DisableCcnRoutes(Vpc_client, SH_id)
        for BJ_id in BJ_RouteIds:
            BJ_EnableCcnRoutes(Vpc_client, BJ_id)
  • 2、測試效果
    模擬異常時切換:
    image
    image
    image
    切換完畢時中間大概中斷30秒左右。
最佳方案

如果網路不重疊,2個VPC之間使用對等連線、使用2個雲聯網然後分別加入對應VPC和IDC的專線,這樣從IDC到雲上可實現雙活。例如IDC-上海中斷,可通過IDC-北京再通過對等連線到上海。