Kebijakan penempatan untuk layanan service fabric

Kebijakan penempatan adalah aturan tambahan yang dapat digunakan untuk mengatur penempatan layanan dalam beberapa skenario spesifik yang kurang umum. Beberapa contoh skenario tersebut adalah:

  • Kluster Service Fabric Anda mencakup jarak geografis, seperti beberapa pusat data lokal atau di seluruh wilayah Azure
  • Lingkungan Anda mencakup beberapa bidang pengendalian geopolitik atau hukum, atau beberapa kasus lain di mana Anda memiliki batas kebijakan yang perlu Anda berlakukan
  • Ada pertimbangan performa komunikasi atau latensi karena jarak yang besar atau penggunaan tautan jaringan yang lebih lambat atau kurang dapat diandalkan
  • Anda perlu menjaga beban kerja tertentu tetap berlokasi sebagai upaya terbaik, baik dengan beban kerja lain atau di dekat pelanggan
  • Anda memerlukan beberapa instans stateless dari partisi pada simpul tunggal

Sebagian besar persyaratan ini sejalan dengan tata letak fisik kluster, yang diwakili sebagai domain kesalahan kluster.

Kebijakan penempatan lanjutan yang membantu mengatasi skenario ini adalah:

  1. Domain tidak valid
  2. Domain yang diperlukan
  3. Domain pilihan
  4. Melarang pengemasan replika
  5. Izinkan beberapa instans stateless pada simpul

Sebagian besar kontrol berikut dapat dikonfigurasi melalui properti simpul dan batasan penempatan, tetapi sebagian lebih rumit. Untuk mempermudah, Service Fabric Cluster Resource Manager menyediakan kebijakan penempatan tambahan ini. Kebijakan penempatan dikonfigurasi berdasarkan instans layanan per nama. Mereka juga dapat diperbarui secara dinamis.

Menentukan domain yang tidak valid

Kebijakan penempatan InvalidDomain memungkinkan Anda menentukan bahwa Domain Kesalahan tertentu tidak valid untuk layanan tertentu. Kebijakan ini memastikan bahwa layanan tertentu tidak pernah berjalan di area tertentu, misalnya karena alasan kebijakan geopolitik atau perusahaan. Beberapa domain yang tidak valid dapat ditentukan melalui kebijakan terpisah.

Contoh Domain Tidak Valid

Kode:

ServicePlacementInvalidDomainPolicyDescription invalidDomain = new ServicePlacementInvalidDomainPolicyDescription();
invalidDomain.DomainName = "fd:/DCEast"; //regulations prohibit this workload here
serviceDescription.PlacementPolicies.Add(invalidDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("InvalidDomain,fd:/DCEast”)

Menentukan domain yang diperlukan

Kebijakan penempatan domain yang diperlukan mengharuskan layanan hanya ada di domain yang ditentukan. Beberapa domain yang diperlukan dapat ditentukan melalui kebijakan terpisah.

Contoh Domain yang Diperlukan

Kode:

ServicePlacementRequiredDomainPolicyDescription requiredDomain = new ServicePlacementRequiredDomainPolicyDescription();
requiredDomain.DomainName = "fd:/DC01/RK03/BL2";
serviceDescription.PlacementPolicies.Add(requiredDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("RequiredDomain,fd:/DC01/RK03/BL2")

Menentukan domain pilihan untuk replika utama layanan stateful

Domain Primer Pilihan menentukan domain kesalahan untuk menempatkan Primer. Primer berakhir di domain ini ketika semuanya sehat. Jika domain atau replika Utama gagal atau dimatikan, Primer berpindah ke beberapa lokasi lain, idealnya di domain yang sama. Jika lokasi baru ini tidak berada di domain pilihan, Cluster Resource Manager memindahkannya kembali ke domain pilihan sesegera mungkin. Tentu saja pengaturan ini hanya berfungsi untuk layanan stateful. Kebijakan ini paling berguna dalam kluster yang membentang di seluruh wilayah Azure atau beberapa pusat data tetapi memiliki layanan yang lebih suka penempatan di lokasi tertentu. Menjaga Primer dekat dengan pengguna mereka atau layanan lain membantu memberikan latensi yang lebih rendah, terutama untuk bacaan, yang ditangani oleh Primer secara default.

Failover dan Domain Utama Pilihan

ServicePlacementPreferPrimaryDomainPolicyDescription primaryDomain = new ServicePlacementPreferPrimaryDomainPolicyDescription();
primaryDomain.DomainName = "fd:/EastUS/";
serviceDescription.PlacementPolicies.Add(primaryDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("PreferredPrimaryDomain,fd:/EastUS")

Membutuhkan distribusi replika dan melarang pengemasan

Replika biasanya didistribusikan di seluruh domain kesalahan dan peningkatan ketika kluster sehat. Namun, ada kasus di mana lebih dari satu replika untuk partisi tertentu mungkin akhirnya dikemas sementara ke dalam satu domain. Misalnya, kluster ini memiliki sembilan simpul dalam tiga domain kesalahan, fd:/0, fd:/1, dan fd:/2. Misalnya, layanan Anda memiliki tiga replika. Misalnya bahwa simpul yang sedang digunakan untuk replika tersebut dalam fd:/1 dan fd:/2 tidak berfungsi. Biasanya, Cluster Resource Manager akan lebih memilih simpul lain dalam domain kesalahan yang sama. Dalam hal ini, misalnya karena masalah kapasitas tidak ada simpul lain di domain tersebut yang valid. Jika Cluster Resource Manager membangun penggantian replika tersebut, pengaturan harus memilih simpul di fd:/0. Namun, melakukan tindakan tersebut akan menciptakan situasi saat kendala Domain Kesalahan dilanggar. Mengemas replika meningkatkan kemungkinan seluruh set replika dapat tidak berfungsi atau hilang.

Catatan

Untuk informasi selengkapnya tentang batasan dan prioritas batasan umumnya, lihat topik ini.

Jika Anda pernah melihat pesan kesehatan seperti "The Load Balancer has detected a Constraint Violation for this Replica:fabric:/<some service name> Secondary Partition <some partition ID> is violating the Constraint: FaultDomain", Anda telah memukul kondisi ini atau sesuatu seperti itu. Biasanya hanya satu atau dua replika yang dikemas bersama sementara. Asalkan jumlah replika lebih sedikit dibandingkan jumlah replika minimum di domain tertentu, Anda aman. Pengemasan jarang terjadi, tetapi itu bisa terjadi, dan biasanya situasi ini sementara sejak simpul kembali. Jika simpul tetap tidak berfungsi dan Cluster Resource Manager perlu membangun penggantian, biasanya ada simpul lain yang tersedia di domain kesalahan ideal.

Beberapa beban kerja lebih suka selalu memiliki jumlah replika target, bahkan jika dikemas ke dalam domain yang lebih sedikit. Beban kerja ini bertaruh terhadap kegagalan domain permanen total simultan dan biasanya dapat memulihkan status lokal. Beban kerja lainnya lebih suka mengambil downtime lebih awal daripada kebenaran risiko atau hilangnya data. Sebagian besar beban kerja produksi berjalan dengan lebih dari tiga replika, lebih dari tiga domain kesalahan, dan banyak simpul yang valid per domain kesalahan. Oleh karena itu, perilaku default memungkinkan pengemasan domain secara default. Perilaku default memungkinkan keseimbangan normal dan failover untuk menangani kasus ekstrem ini, bahkan jika itu berarti pengemasan domain sementara.

Jika Anda ingin menonaktifkan pengemasan tersebut untuk beban kerja tertentu, Anda dapat menentukan kebijakan RequireDomainDistribution pada layanan. Ketika kebijakan ini ditetapkan, Cluster Resource Manager memastikan tidak ada dua replika dari partisi yang sama yang dijalankan dalam kesalahan atau domain peningkatan yang sama.

Kode:

ServicePlacementRequireDomainDistributionPolicyDescription distributeDomain = new ServicePlacementRequireDomainDistributionPolicyDescription();
serviceDescription.PlacementPolicies.Add(distributeDomain);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -PlacementPolicy @("RequiredDomainDistribution")

Sekarang, apakah mungkin untuk menggunakan konfigurasi ini untuk layanan dalam kluster yang tidak secara geografis membentang? Anda bisa, tetapi tidak ada alasan bagus juga. Konfigurasi domain yang diperlukan, tidak valid, dan disukai harus dihindari kecuali jika skenario mengharuskannya. Anda tidak dapat mencoba memaksa beban kerja yang diberikan untuk berjalan dalam satu rak, atau lebih suka beberapa segmen kluster lokal Anda daripada yang lain. Konfigurasi perangkat keras yang berbeda harus tersebar di domain kesalahan dan ditangani melalui batasan penempatan normal dan properti simpul.

Penempatan beberapa instans stateless dari partisi pada single simpul

Kebijakan penempatan AllowMultipleStatelessInstancesOnNode memungkinkan penempatan beberapa instans stateless partisi pada satu simpul. Secara default, beberapa instans dari satu partisi tidak dapat ditempatkan pada simpul. Bahkan dengan layanan -1, tidak mungkin untuk menskalakan jumlah instans di luar jumlah simpul dalam kluster, untuk layanan bernama tertentu. Kebijakan penempatan ini menghapus pembatasan ini dan memungkinkan InstanceCount ditentukan lebih tinggi dari jumlah simpul.

Jika Anda pernah melihat pesan kesehatan seperti "The Load Balancer has detected a Constraint Violation for this Replica:fabric:/<some service name> Secondary Partition <some partition ID> is violating the Constraint: ReplicaExclusion", maka Anda telah mencapai kondisi ini atau sesuatu seperti itu.

Untuk ikut serta menerapkan kebijakan penempatan ini pada layanan Anda, aktifkan konfigurasi berikut:

<Section Name="Common">
  <Parameter Name="AllowCreateUpdateMultiInstancePerNodeServices" Value="True" />
  <Parameter Name="HostReuseModeForExclusiveStateless" Value="1" />
</Section>

Dengan menentukan kebijakan AllowMultipleStatelessInstancesOnNode pada layanan, InstanceCount dapat diatur melampaui jumlah simpul dalam kluster.

Kode:

ServicePlacementAllowMultipleStatelessInstancesOnNodePolicyDescription allowMultipleInstances = new ServicePlacementAllowMultipleStatelessInstancesOnNodePolicyDescription();
serviceDescription.PlacementPolicies.Add(allowMultipleInstances);

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName -Stateless –PartitionSchemeSingleton –PlacementPolicy @(“AllowMultipleStatelessInstancesOnNode”) -InstanceCount 10 -ServicePackageActivationMode ExclusiveProcess 

Catatan

Saat ini kebijakan tersebut hanya didukung untuk layanan Stateless dengan mode aktivasi paket layanan ExclusiveProcess.

Peringatan

Kebijakan ini tidak didukung ketika digunakan dengan titik akhir port statis. Menggunakan keduanya dalam hubungannya dapat menyebabkan kluster yang tidak sehat karena beberapa instans pada simpul yang sama mencoba mengikat ke port yang sama, dan tidak dapat muncul.

Catatan

Menggunakan nilai tinggi MinInstanceCount dengan kebijakan penempatan ini dapat menyebabkan macetnya Peningkatan Aplikasi. Misalnya, jika Anda memiliki kluster lima simpul dan mengatur InstanceCount=10, Anda akan memiliki dua instans pada setiap simpul. Jika Anda menetapkan MinInstanceCount=9, peningkatan aplikasi yang dicoba bisa macet; dengan MinInstanceCount =8, kejadian ini dapat dihindari.

Langkah berikutnya