Biaya pemindahan layanan

Faktor yang dipertimbangkan Service Fabric Cluster Resource Manager ketika mencoba menentukan perubahan apa yang harus dilakukan pada kluster adalah biaya perubahan tersebut. Gagasan "biaya" diperdagangkan terhadap seberapa banyak kluster dapat ditingkatkan. Biaya diperhitungkan ketika memindahkan layanan untuk menyeimbangkan, defragmentasi, dan persyaratan lainnya. Tujuannya adalah untuk memenuhi persyaratan dengan cara yang paling tidak mengganggu atau mahal.

Memindahkan layanan memerlukan biaya waktu CPU dan bandwidth jaringan minimal. Untuk layanan stateful, diperlukan penyalinan status layanan tersebut, yang menggunakan memori dan disk tambahan. Meminimalkan biaya solusi yang muncul dengan Azure Service Fabric Cluster Resource Manager membantu memastikan bahwa sumber daya kluster dihabiskan dengan efisien. Namun, Anda juga tidak ingin mengabaikan solusi yang akan secara signifikan meningkatkan alokasi sumber daya dalam kluster.

Cluster Resource Manager memiliki dua cara biaya komputasi dan membatasinya saat mencoba mengelola kluster. Mekanisme pertama adalah hanya menghitung setiap pemindahan yang akan dilakukannya. Jika dua solusi dihasilkan dengan keseimbangan (skor) yang sama, Cluster Resource Manager lebih suka yang memiliki biaya terendah (jumlah total pemindahan).

Strategi ini berfungsi dengan baik. Tetapi seperti halnya beban default atau statis, tidak mungkin dalam sistem yang kompleks bahwa semua pemindahan sama. Beberapa cenderung jauh lebih mahal.

Mengatur Biaya Pemindahan

Anda dapat menentukan biaya pemindahan default untuk layanan saat dibuat:

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -DefaultMoveCost Medium

C#:

FabricClient fabricClient = new FabricClient();
StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
//set up the rest of the ServiceDescription
serviceDescription.DefaultMoveCost = MoveCost.Medium;
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Anda juga dapat menentukan atau memperbarui MoveCost secara dinamis untuk layanan setelah layanan dibuat:

PowerShell:

Update-ServiceFabricService -Stateful -ServiceName "fabric:/AppName/ServiceName" -DefaultMoveCost High

C#:

StatefulServiceUpdateDescription updateDescription = new StatefulServiceUpdateDescription();
updateDescription.DefaultMoveCost = MoveCost.High;
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), updateDescription);

Menentukan biaya pemindahan secara dinamis berdasarkan per replika

Cuplikan sebelumnya adalah semua untuk menentukan MoveCost untuk seluruh layanan sekaligus dari luar layanan itu sendiri. Namun, biaya pemindahan paling berguna ketika biaya pemindahan objek layanan tertentu berubah selama masa pakainya. Karena layanan itu sendiri mungkin memiliki ide terbaik tentang seberapa mahal mereka untuk memindahkan waktu tertentu, ada API untuk layanan untuk melaporkan biaya pemindahan individu mereka sendiri selama runtime.

C#:

this.Partition.ReportMoveCost(MoveCost.Medium);

Catatan

Anda hanya dapat mengatur biaya pergerakan untuk replika sekunder melalui kode.

Melaporkan biaya pemindahan untuk partisi

Bagian sebelumnya menjelaskan bagaimana replika atau instans layanan melaporkan MoveCost sendiri. Kami menyediakan Service Fabric API untuk melaporkan nilai MoveCost atas nama partisi lain. Terkadang replika atau instans layanan tidak dapat menentukan nilai MoveCost terbaik dengan sendirinya, dan harus bergantung pada logika layanan lain. Melaporkan MoveCost atas nama partisi lain, di samping melaporkan beban atas nama partisi lain, memungkinkan Anda untuk sepenuhnya mengelola partisi dari luar. API ini menghilangkan kebutuhan atas pola Sidecar, dari perspektif Cluster Resource Manager.

Anda dapat melaporkan pembaruan MoveCost untuk partisi lain dengan panggilan API yang sama. Anda perlu menentukan objek PartitionMoveCostDescription untuk setiap partisi yang ingin Anda perbarui dengan nilai baru MoveCost. API memungkinkan beberapa cara untuk memperbarui MoveCost:

  • Partisi layanan bersatus dapat memperbarui MoveCost replika utamanya.
  • Baik layanan tanpa status maupun berstatus dapat memperbarui MoveCost semua replika atau instans sekundernya.
  • Baik layanan tanpa status maupun berstatus dapat memperbarui MoveCost replika atau instans tertentu pada node.

Setiap pembaruan MoveCost untuk partisi harus berisi setidaknya satu nilai valid yang akan diubah. Misalnya, Anda dapat melewati pembaruan replika utama dengan menetapkan null untuk entri replika utama, entri lainnya akan digunakan selama pembaruan MoveCost dan kita akan melewati pembaruan MoveCost untuk replika utama. Karena memperbarui MoveCost untuk beberapa partisi dengan panggilan API tunggal dimungkinkan, API menyediakan daftar kode pengembalian untuk partisi yang sesuai. Jika kita berhasil menerima dan memproses permintaan pembaruan MoveCost, kode pengembalian akan Berhasil. Jika tidak, API menyediakan kode kesalahan:

  • PartitionNotFound - ID partisi yang ditentukan tidak ada.
  • ReconfigurationPending - Partisi saat ini sedang dikonfigurasi ulang.
  • InvalidForStatelessServices - Upaya dilakukan untuk mengubah MoveCost replika utama untuk partisi milik layanan tanpa status.
  • ReplicaDoesNotExist - Replika atau instans sekunder tidak ada pada simpul tertentu.
  • InvalidOperation - Memperbarui MoveCost untuk partisi milik aplikasi Sistem.

C#:

Guid partitionId = Guid.Parse("53df3d7f-5471-403b-b736-bde6ad584f42");
string nodeName0 = "NodeName0";

OperationResult<UpdatePartitionMoveCostResultList> updatePartitionMoveCostResults =
    await this.FabricClient.UpdatePartitionMoveCostAsync(
        new UpdatePartitionMoveCostQueryDescription
        {
            new List<PartitionMoveCostDescription>()
            {
                new PartitionMoveCostDescription(
                    partitionId,
                    MoveCost.VeryHigh,
                    MoveCost.Zero,
                    new List<ReplicaMoveCostDescription>()
                    {
                        new ReplicaMoveCostDescription(nodeName0, MoveCost.Medium)
                    })
            }
        },
        this.Timeout,
        cancellationToken);

Dengan contoh ini, Anda akan melakukan pembaruan biaya pemindahan terakhir yang dilaporkan untuk partisi 53df3d7f-5471-403b-b736-bde6ad584f42. Biaya pemindahan replika utama akan berupa VeryHigh. Semua biaya pemindahan replika sekunder akan menjadi Nol, kecuali biaya pemindahan untuk replika sekunder tertentu yang terletak di node NodeName0. Biaya pemindahan untuk replika tertentu akan menjadi Medium. Jika ingin melewatkan pembaruan biaya pemindahan untuk replika primer atau semua replika sekunder, Anda dapat meninggalkan entri yang sesuai sebagai null.

Dampak biaya pemindahan

MoveCost memiliki lima level: Zero, Low, Medium, High, dan VeryHigh. Aturan berikut ini akan berlaku:

  • MoveCosts relatif satu sama lain, kecuali Zero dan VeryHigh.
  • Biaya pemindahan nol berarti bahwa gerakan bebas dan tidak boleh dihitung terhadap skor solusi.
  • Mengatur biaya pemindahan Anda ke High atau VeryHigh tidak memberikan jaminan bahwa replika tidak akan pernah dipindahkan.
  • Replika dengan biaya pemindahan VeryHigh akan dipindahkan hanya jika ada pelanggaran batasan dalam kluster yang tidak dapat diperbaiki dengan cara lain (bahkan jika memerlukan pemindahan banyak replika lain untuk memperbaiki pelanggaran)

Memindahkan biaya sebagai faktor dalam memilih replika untuk pergerakan

MoveCost membantu Anda menemukan solusi yang menyebabkan gangguan paling sedikit secara keseluruhan dan paling mudah dicapai saat masih tiba pada keseimbangan yang setara. Gagasan biaya layanan dapat relatif terhadap banyak hal. Faktor yang paling umum dalam menghitung biaya pemindahan Anda adalah:

  • Jumlah negara atau data yang harus dipindahkan oleh layanan.
  • Biaya pemutusan klien. Memindahkan replika utama biasanya lebih mahal daripada biaya memindahkan replika sekunder.
  • Biaya mengganggu operasi dalam penerbangan. Beberapa operasi di tingkat penyimpanan data atau operasi yang dilakukan sebagai respons terhadap panggilan klien mahal. Setelah titik tertentu, Anda tidak ingin menghentikannya jika Anda tidak perlu. Jadi saat operasi sedang berlangsung, Anda meningkatkan biaya pemindahan objek layanan ini untuk mengurangi kemungkinan pemindahannya. Ketika operasi selesai, Anda mengatur biaya kembali ke normal.

Penting

Menggunakan biaya pemindahan VeryHigh harus dipertimbangkan dengan cermat karena secara signifikan membatasi kemampuan Cluster Resource Manager untuk menemukan solusi penempatan yang optimal secara global di kluster. Replika dengan biaya pemindahan VeryHigh akan dipindahkan hanya jika ada pelanggaran batasan dalam kluster yang tidak dapat diperbaiki dengan cara lain (bahkan jika memerlukan pemindahan banyak replika lain untuk memperbaiki pelanggaran)

Mengaktifkan biaya pemindahan di kluster Anda

Agar MoveCosts yang lebih terperinci diperhitungkan, MoveCost harus diaktifkan di kluster Anda. Tanpa pengaturan ini, mode default pemindahan penghitungan digunakan untuk menghitung MoveCost, dan laporan MoveCost diabaikan.

Contoh konfigurasi yang mengatur timer ini di bawah ini:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="UseMoveCostReports" Value="true" />
        </Section>

melalui ClusterConfig.json untuk penyebaran Mandiri atau Template.json untuk klaster yang dihosting Azure:

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "UseMoveCostReports",
          "value": "true"
      }
    ]
  }
]

Langkah berikutnya