>  기사  >  운영 및 유지보수  >  Alibaba Cloud ECS SDK를 사용하여 선점형 인스턴스를 합리적이고 빠르게 생성하고 관리하는 방법

Alibaba Cloud ECS SDK를 사용하여 선점형 인스턴스를 합리적이고 빠르게 생성하고 관리하는 방법

坏嘻嘻
坏嘻嘻원래의
2018-09-28 11:08:403610검색

이 기사의 내용은 Alibaba Cloud ECS SDK를 사용하여 선점형 인스턴스를 합리적이고 빠르게 생성하고 관리하는 방법에 대한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다. . 돕다.

선점형 인스턴스 관리

준비

작업을 수행하기 전에 필요 사항:

비즈니스 요구 사항을 충족할 수 있는 인스턴스 사양과 지역을 이해하세요.

Alibaba Cloud ECS SDK의 기본 지식과 호출 방법을 숙지하세요. 자세한 내용은 SDK 사용 지침을 참조하세요.

참고:

선점형 인스턴스 코드에는 ECS SDK 버전 4.2.0 이상이 필요합니다. Java POM 종속성을 예로 들어 pom 종속성을 수정하고 도입합니다.

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-core</artifactId>
  <version>3.2.8</version>
</dependency>
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-java-sdk-ecs</artifactId>
  <version>4.2.0</version>
</dependency>

지역 및 사용 가능한 인스턴스 사양 쿼리#🎜 🎜##🎜 🎜#OpenAPI 설명 영역을 사용하여 선점형 인스턴스를 생성할 수 있는 지역과 사용 가능한 인스턴스 사양을 쿼리합니다. 샘플 코드는 아래와 같습니다.

OpenApiCaller.java
public class OpenApiCaller {
  IClientProfile profile;
  IAcsClient client;
  public OpenApiCaller() {
      profile = DefaultProfile.getProfile("cn-hangzhou", AKSUtil.accessKeyId, AKSUtil.accessKeySecret);
      client = new DefaultAcsClient(profile);
  }
  public  <T extends AcsResponse> T doAction(AcsRequest<T> var1) {
      try {
          return  client.getAcsResponse(var1);
      } catch (Throwable e) {
          e.printStackTrace();
          return null;
      }
  }
}
DescribeZonesSample.java
public class DescribeZonesSample {
  public static void main(String[] args) {
      OpenApiCaller caller = new OpenApiCaller();
      DescribeZonesRequest request = new DescribeZonesRequest();
      request.setRegionId("cn-zhangjiakou");//可以通过 DescribeRegionsRequest 获取每个地域的 RegionId
      request.setSpotStrategy("SpotWithPriceLimit");//对于查询是否可购买抢占式实例此项必填
      request.setInstanceChargeType("PostPaid");//后付费模式,抢占式实例必须是后付费模式
      DescribeZonesResponse response = caller.doAction(request);
      System.out.println(JSON.toJSONString(response));
  }
}

다음은 지역별 사용 가능한 인스턴스 사양, 디스크 유형, 네트워크 유형 및 기타 정보를 볼 수 있는 출력 결과입니다.

{
  "requestId": "388D6321-E587-470C-8CFA-8985E2963DAE",
  "zones": [
      {
          "localName": "华北 3 可用区 A",
          "zoneId": "cn-zhangjiakou-a",
          "availableDiskCategories": [
              "cloud_ssd",
              "cloud_efficiency"
          ],
          "availableInstanceTypes": [
              "ecs.e4.large",
              "ecs.n4.4xlarge",
              "ecs.sn2.medium",
              "ecs.i1.2xlarge",
              "ecs.se1.2xlarge",
              "ecs.n4.xlarge",
              "ecs.se1ne.2xlarge",
              "ecs.se1.large",
              "ecs.sn2.xlarge",
              "ecs.se1ne.xlarge",
              "ecs.xn4.small",
              "ecs.sn2ne.4xlarge",
              "ecs.se1ne.4xlarge",
              "ecs.sn1.medium",
              "ecs.n4.8xlarge",
              "ecs.mn4.large",
              "ecs.e4.2xlarge",
              "ecs.mn4.2xlarge",
              "ecs.mn4.8xlarge",
              "ecs.n4.2xlarge",
              "ecs.e4.xlarge",
              "ecs.sn2ne.large",
              "ecs.sn2ne.xlarge",
              "ecs.sn1ne.large",
              "ecs.n4.large",
              "ecs.sn1.3xlarge",
              "ecs.e4.4xlarge",
              "ecs.sn1ne.2xlarge",
              "ecs.e4.small",
              "ecs.i1.4xlarge",
              "ecs.se1.4xlarge",
              "ecs.sn2ne.2xlarge",
              "ecs.sn2.3xlarge",
              "ecs.i1.xlarge",
              "ecs.n4.small",
              "ecs.sn1ne.4xlarge",
              "ecs.mn4.4xlarge",
              "ecs.sn1ne.xlarge",
              "ecs.se1ne.large",
              "ecs.sn2.large",
              "ecs.i1-c5d1.4xlarge",
              "ecs.sn1.xlarge",
              "ecs.sn1.large",
              "ecs.mn4.small",
              "ecs.mn4.xlarge",
              "ecs.se1.xlarge"
          ],
          "availableResourceCreation": [
              "VSwitch",
              "IoOptimized",
              "Instance",
              "Disk"
          ],
          "availableResources": [
              {
                  "dataDiskCategories": [
                      "cloud_ssd",
                      "cloud_efficiency"
                  ],
                  "instanceGenerations": [
                      "ecs-3",
                      "ecs-2"
                  ],
                  "instanceTypeFamilies": [
                      "ecs.mn4",
                      "ecs.sn1",
                      "ecs.sn2",
                      "ecs.sn1ne",
                      "ecs.xn4",
                      "ecs.i1",
                      "ecs.se1",
                      "ecs.e4",
                      "ecs.n4",
                      "ecs.se1ne",
                      "ecs.sn2ne"
                  ],
                  "instanceTypes": [
                      "ecs.n4.4xlarge",
                      "ecs.sn2.medium",
                      "ecs.i1.2xlarge",
                      "ecs.se1.2xlarge",
                      "ecs.n4.xlarge",
                      "ecs.se1ne.2xlarge",
                      "ecs.se1.large",
                      "ecs.sn2.xlarge",
                      "ecs.se1ne.xlarge",
                      "ecs.xn4.small",
                      "ecs.sn2ne.4xlarge",
                      "ecs.se1ne.4xlarge",
                      "ecs.sn1.medium",
                      "ecs.n4.8xlarge",
                      "ecs.mn4.large",
                      "ecs.mn4.2xlarge",
                      "ecs.mn4.8xlarge",
                      "ecs.n4.2xlarge",
                      "ecs.sn2ne.large",
                      "ecs.sn2ne.xlarge",
                      "ecs.sn1ne.large",
                      "ecs.n4.large",
                      "ecs.sn1.3xlarge",
                      "ecs.sn1ne.2xlarge",
                      "ecs.e4.small",
                      "ecs.i1.4xlarge",
                      "ecs.se1.4xlarge",
                      "ecs.sn2ne.2xlarge",
                      "ecs.sn2.3xlarge",
                      "ecs.i1.xlarge",
                      "ecs.n4.small",
                      "ecs.sn1ne.4xlarge",
                      "ecs.mn4.4xlarge",
                      "ecs.sn1ne.xlarge",
                      "ecs.se1ne.large",
                      "ecs.sn2.large",
                      "ecs.i1-c5d1.4xlarge",
                      "ecs.sn1.xlarge",
                      "ecs.sn1.large",
                      "ecs.mn4.small",
                      "ecs.mn4.xlarge",
                      "ecs.se1.xlarge"
                  ],
                  "ioOptimized": true,
                  "networkTypes": [
                      "vpc"
                  ],
                  "systemDiskCategories": [
                      "cloud_ssd",
                      "cloud_efficiency"
                  ]
              }
          ],
          "availableVolumeCategories": [
              "san_ssd",
              "san_efficiency"
          ]
      }
  ]
}

선점형 인스턴스의 과거 가격 쿼리쿼리하려면 OpenAPI explainSpotPriceHistory 사용 선점형 인스턴스 지난 30일 동안의 인스턴스 가격 변동 데이터를 이용하여 가격 대비 성능이 가장 좋은 지역 및 사양 정보를 가져옵니다. 샘플 코드(DescribeSpotPriceHistorySample.java)는 다음과 같습니다.

public class DescribeSpotPriceHistorySample {
    public static void main(String[] args) {
        OpenApiCaller caller = new OpenApiCaller();
        List<DescribeSpotPriceHistoryResponse.SpotPriceType>
         result = new ArrayList<DescribeSpotPriceHistoryResponse.SpotPriceType>();
        int offset = 0;
        while (true) {
            DescribeSpotPriceHistoryRequest request = new DescribeSpotPriceHistoryRequest();
            request.setRegionId("cn-hangzhou");
            //可以通过 DescribeRegionsRequest 获取可购买的每个地域的 RegionId
            request.setZoneId("cn-hangzhou-b");//可用区必填
            request.setInstanceType("ecs.sn2.medium");//参考 DescribeZones 返回的实例类型,必填
            request.setNetworkType("vpc");//参考 DescribeZones 返回的网络类型,必填
//            request.setIoOptimized("optimized");
                        //是否 I/O 优化类型,DescribeZones 返回的 IoOptimized,选填
//            request.setStartTime("2017-09-20T08:45:08Z");//价格开始时间,选填,默认 3 天内数据
//            request.setEndTime("2017-09-28T08:45:08Z");//价格结束时间,选填
            request.setOffset(offset);
            DescribeSpotPriceHistoryResponse response = caller.doAction(request);
            if (response != null && response.getSpotPrices() != null) {
                result.addAll(response.getSpotPrices());
            }
            if (response.getNextOffset() == null || response.getNextOffset() == 0) {
                break;
            } else {
                offset = response.getNextOffset();
            }
        }
        if (!result.isEmpty()) {
            for (DescribeSpotPriceHistoryResponse.SpotPriceType spotPriceType : result) {
                System.out.println(spotPriceType.getTimestamp() + "---> 
                spotPrice:" + spotPriceType.getSpotPrice() + "---->
                originPrice:" + spotPriceType.getOriginPrice());
            }
            System.out.println(result.size());
        } else {
        }
    }
}

다음은 반환된 결과의 예입니다.

2017-09-26T06:28:55Z--->spotPrice:0.24---->originPrice:1.2
2017-09-26T14:00:00Z--->spotPrice:0.36---->originPrice:1.2
2017-09-26T15:00:00Z--->spotPrice:0.24---->originPrice:1.2
2017-09-27T14:00:00Z--->spotPrice:0.36---->originPrice:1.2
2017-09-27T15:00:00Z--->spotPrice:0.24---->originPrice:1.2
2017-09-28T14:00:00Z--->spotPrice:0.36---->originPrice:1.2
2017-09-28T15:00:00Z--->spotPrice:0.24---->originPrice:1.2
2017-09-29T06:28:55Z--->spotPrice:0.24---->originPrice:1.2
위 단계를 반복하면 가용 영역에서 이 사양의 리소스에 대한 가격 추세와 최근 가격을 확인할 수 있습니다.

참고:

평균 가격과 최고 가격을 사용하여 선점형 인스턴스 구매를 수락할 수 있는지 여부를 결정하거나 보다 합리적인 데이터 모델을 사용하여 다음을 수행할 수 있습니다. 과거 가격 데이터를 분석하고, 생성된 리소스의 사양과 가용성 영역을 언제든지 조정하여 최고의 비용 효율성을 달성합니다.

선점형 인스턴스 생성 선점형 인스턴스를 생성하기 전에 다음을 완료해야 합니다. # 🎜🎜#

선점형 인스턴스를 생성하기 위해 커스텀 이미지를 사용하는 경우 커스텀 이미지를 생성했어야 합니다.

콘솔에서 보안 그룹을 생성하거나 OpenAPI CreateSecurityGroup을 사용하여 보안 그룹을 생성하고 보안 그룹 ID(SecurityGroupId)를 가져옵니다.

VPC를 생성하고 콘솔에서 전환하거나 OpenAPI CreateVpc 및 CreateVSwitch를 사용하여 VPC를 생성하고 스위치 ID(VSwitchId)를 가져옵니다.

OpenAPI CreateInstance를 사용하여 선점형 인스턴스를 만듭니다. 샘플 코드(CreateInstaneSample.java)는 다음과 같습니다.

public class CreateInstaneSample {
    public static void main(String[] args) {
        OpenApiCaller caller = new OpenApiCaller();
        CreateInstanceRequest request = new CreateInstanceRequest();
        request.setRegionId("cn-hangzhou");//地域 ID
        request.setZoneId("cn-hangzhou-b"); //可用区ID
        request.setSecurityGroupId("sg-bp11nhf94ivkdxwb2gd4");//提前创建的安全组 ID
        request.setImageId("centos_7_03_64_20G_alibase_20170818.vhd");
        //建议选择您自己在该地域准备的自定义镜像
        request.setVSwitchId("vsw-bp164cyonthfudn9kj5br");//VPC 类型需要交换机 ID
        request.setInstanceType("ecs.sn2.medium"); //填入您询价后需要购买的规格
        request.setIoOptimized("optimized");//参考 DescirbeZones 返回参数
        request.setSystemDiskCategory("cloud_ssd");
        //参考 DescirbeZones 返回参数,多选一 cloud_ssd, cloud_efficiency, cloud
        request.setSystemDiskSize(40);
        request.setInstanceChargeType("PostPaid");//抢占式实例必须后付费
        request.setSpotStrategy("SpotWithPriceLimit");
        //SpotWithPriceLimit 出价模式,SpotAsPriceGo 不用出价,最高按量付费价格
        request.setSpotPriceLimit(0.25F);//SpotWithPriceLimit 
        出价模式生效,您能接受的最高价格,单位为元每小时,必须高于当前的市场成交价才能成功
        CreateInstanceResponse response = caller.doAction(request);
        System.out.println(response.getInstanceId());
    }
}

선점형 인스턴스 재활용

선점형 인스턴스가 가격 요인이나 시장 변화의 영향을 받을 수 있는 경우 수요와 공급으로 인해 재활용이 불가피해졌습니다. 이때 선점형 인스턴스의 인터럽트가 트리거됩니다. 해제하기 전에 선점형 인스턴스는 잠금 상태로 전환되어 인스턴스가 자동으로 재활용됨을 나타냅니다. 재활용 상태에 따라 인스턴스의 종료 로직을 ​​자동화할 수 있습니다.

현재 다음 방법 중 하나를 통해 선점형 인스턴스의 인터럽트 잠금 상태를 얻을 수 있습니다.

인스턴스 메타데이터를 통해 가져옵니다. 다음 명령을 실행합니다.

curl &#39;http://100.100.100.200/latest/meta-data/instance/spot/termination-time&#39;

반환 값이 비어 있으면 인스턴스를 계속 사용할 수 있습니다. 2015-01-05T18:02:00Z(UTC 시간)과 유사한 형식의 정보가 반환되면 이때 인스턴스가 해제된다는 의미입니다.

OpenAPI 설명 인스턴스를 사용하여 반환된 OperationLock을 기반으로 인스턴스가 재활용 보류 상태에 들어갔는지 확인합니다. 코드 샘플은 다음과 같습니다(DescribeInstancesSample.java).

public class DescribeInstancesSample {
  public static void main(String[] args) throws InterruptedException {
      OpenApiCaller caller = new OpenApiCaller();
      JSONArray allInstances = new JSONArray();
      allInstances.addAll(Arrays.asList("i-bp18hgfai8ekoqwo0y2n", "i-bp1ecbyds24ij63w146c"));
      while (!allInstances.isEmpty()) {
          DescribeInstancesRequest request = new DescribeInstancesRequest();
          request.setRegionId("cn-hangzhou");
          request.setInstanceIds(allInstances.toJSONString());//指定实例 ID,效率最高
          DescribeInstancesResponse response = caller.doAction(request);
          List<DescribeInstancesResponse.Instance> instanceList = response.getInstances();
          if (instanceList != null && !instanceList.isEmpty()) {
              for (DescribeInstancesResponse.Instance instance : instanceList) {
                  System.out.println
               ("result:instance:" + instance.getInstanceId() + ",az:" + instance.getZoneId());
                  if (instance.getOperationLocks() != null) {
            for (DescribeInstancesResponse.Instance.LockReason 
            lockReason : instance.getOperationLocks()) {
   System.out.println("instance:" + instance.getInstanceId() + "-->
   lockReason:" + lockReason.getLockReason() + ",vmStatus:" + instance.getStatus());
          if ("Recycling".equals(lockReason.getLockReason())) {
           //do your action
  System.out.println("spot instance will be recycled immediately, 
  instance id:" + instance.getInstanceId());
        allInstances.remove(instance.getInstanceId());
                          }
                      }
                  }
              }
              System.out.print("try describeInstances again later ...");
              Thread.sleep(2 * 60 * 1000);
          } else {
              break;
          }
      }
  }
}

재활용이 트리거될 때의 출력 결과는 다음과 같습니다.

instance:i-bp1ecbyds24ij63w146c-->lockReason:Recycling,vmStatus:Stopped
spot instance will be recycled immediately, instance id:i-bp1ecbyds24ij63w146c

위 내용은 Alibaba Cloud ECS SDK를 사용하여 선점형 인스턴스를 합리적이고 빠르게 생성하고 관리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.