Heim >Betrieb und Instandhaltung >Betrieb und Wartung von Linux >So verwenden Sie das Alibaba Cloud ECS SDK, um präemptive Instanzen angemessen und schnell zu erstellen und zu verwalten
Der Inhalt dieses Artikels befasst sich mit der sinnvollen und schnellen Verwendung des Alibaba Cloud ECS SDK. Ich hoffe, dass er für Sie hilfreich ist. .
Präemptive Instanzen verwalten
Vorbereitung
Bevor Sie den Vorgang durchführen, benötigen Sie:
Informieren Sie sich über die Instanzspezifikationen und Regionen, die Ihren Geschäftsanforderungen entsprechen.
Machen Sie sich mit den Grundkenntnissen und Aufrufmethoden des Alibaba Cloud ECS SDK vertraut. Einzelheiten finden Sie in den SDK-Nutzungsanweisungen.
Hinweis:
Der präemptive Instanzcode erfordert ECS SDK Version 4.2.0 oder höher. Am Beispiel der Java-POM-Abhängigkeit ändern und führen Sie die POM-Abhängigkeit ein:
<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>
Fragen Sie die Region und die verfügbaren Instanzspezifikationen ab
Verwenden Sie OpenAPI DescribeZones-Abfrage zum Erstellen der Region und der verfügbaren Instanzspezifikationen präemptiver Instanzen. Beispielcode ist unten dargestellt.
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)); } }
Das Folgende ist das Ausgabeergebnis. Sie können die verfügbaren Instanzspezifikationen, Festplattentypen, Netzwerktypen und andere Informationen für jede Region anzeigen.
{ "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" ] } ] }
Fragen Sie den historischen Preis von präemptiven Instanzen ab
Verwenden Sie OpenAPI DescribeSpotPriceHistory, um die Preisänderungsdaten von präemptiven Instanzen im letzten abzufragen 30 Tage, um die Regions- und Spezifikationsinformationen mit dem besten Preis-Leistungs-Verhältnis zu erhalten, lautet der Beispielcode (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 { } } }
Das Folgende ist ein Beispiel für die zurückgegebenen Ergebnisse.
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
Wiederholen Sie die obigen Schritte, und Sie können den Preistrend und den aktuellen Preis von Ressourcen dieser Spezifikation in der Verfügbarkeitszone ermitteln.
Hinweis:
Sie können den Durchschnittspreis und den Höchstpreis verwenden, um zu entscheiden, ob Sie den Kauf der präemptiven Instanz akzeptieren können, oder Sie können ein vernünftigeres Datenmodell verwenden, um historische Preisdaten zu analysieren und passen Sie die Erstellung von Ressourcenspezifikationen und Verfügbarkeitszonen jederzeit an, um das beste Preis-/Leistungsverhältnis zu erzielen.
Erstellen einer präemptiven Instanz
Bevor Sie eine präemptive Instanz erstellen, müssen Sie Folgendes ausführen:
Wenn Sie verwenden Um eine Instanz auf Abruf aus einem benutzerdefinierten Image zu erstellen, müssen Sie ein benutzerdefiniertes Image erstellt haben.
Erstellen Sie eine Sicherheitsgruppe in der Konsole oder verwenden Sie OpenAPI CreateSecurityGroup, um eine Sicherheitsgruppe zu erstellen und die Sicherheitsgruppen-ID (SecurityGroupId) abzurufen.
Erstellen Sie eine VPC und einen Switch in der Konsole oder verwenden Sie OpenAPI CreateVpc und CreateVSwitch, um sie zu erstellen und die Switch-ID (VSwitchId) abzurufen.
Erstellen Sie eine präemptive Instanz mit OpenAPI CreateInstance. Der Beispielcode (CreateInstaneSample.java) lautet wie folgt.
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()); } }
Recycling von präemptiven Instanzen
Präemptive Instanzen können aufgrund von Preisfaktoren oder Änderungen bei Marktangebot und -nachfrage zwangsweise recycelt werden. Zu diesem Zeitpunkt wird der Interrupt der präemptiven Instanz ausgelöst. Vor der Freigabe wechselt die präemptive Instanz in den gesperrten Zustand, was darauf hinweist, dass die Instanz automatisch recycelt wird. Sie können die Exit-Logik für eine Instanz basierend auf ihrem Recyclingstatus automatisieren.
Derzeit können Sie den Unterbrechungssperrstatus einer präemptiven Instanz mit einer der folgenden Methoden abrufen:
Erhalten Sie ihn über Instanzmetadaten. Führen Sie den folgenden Befehl aus:
curl 'http://100.100.100.200/latest/meta-data/instance/spot/termination-time'
Wenn der Rückgabewert leer ist, kann die Instanz kontinuierlich verwendet werden. Wenn Informationen in einem ähnlichen Format wie 2015-01-05T18:02:00Z (UTC-Zeit) zurückgegeben werden, bedeutet dies, dass die Instanz zu diesem Zeitpunkt freigegeben wird.
Verwenden Sie OpenAPI DescribeInstances, um anhand der zurückgegebenen OperationLocks zu bestimmen, ob die Instanz in den Status „Ausstehende Wiederverwertung“ eingetreten ist. Das Codebeispiel lautet wie folgt (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; } } } }
Das Ausgabeergebnis, wenn das Recycling ausgelöst wird, ist wie folgt:
instance:i-bp1ecbyds24ij63w146c-->lockReason:Recycling,vmStatus:Stopped spot instance will be recycled immediately, instance id:i-bp1ecbyds24ij63w146c
Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Alibaba Cloud ECS SDK, um präemptive Instanzen angemessen und schnell zu erstellen und zu verwalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!