Membina API Boleh Skala pada AWS Spot Instances

Hai semua! Nama saya Kirill, saya CTO di Adapty. Kebanyakan seni bina kami adalah pada AWS, dan hari ini saya akan bercakap tentang cara kami mengurangkan kos pelayan sebanyak 3 kali dengan menggunakan contoh spot dalam persekitaran pengeluaran, serta cara menyediakan penskalaan automatik mereka. Mula-mula akan terdapat gambaran keseluruhan tentang cara ia berfungsi, dan kemudian arahan terperinci untuk bermula.

Apakah Kejadian Spot?

Spot instance ialah pelayan pengguna AWS lain yang sedang melahu, dan mereka menjualnya dengan diskaun yang besar (Amazon menulis sehingga 90%, dalam pengalaman kami ~3x, berbeza-beza bergantung pada rantau, AZ dan jenis contoh). Perbezaan utama mereka daripada yang biasa ialah ia boleh dimatikan pada bila-bila masa. Oleh itu, untuk masa yang lama kami percaya bahawa adalah perkara biasa untuk menggunakannya untuk persekitaran dara, atau untuk tugas mengira sesuatu, dengan hasil perantaraan disimpan pada S3 atau dalam pangkalan data, tetapi bukan untuk jualan. Terdapat penyelesaian pihak ketiga yang membolehkan anda menggunakan tompok pada pengeluaran, tetapi terdapat banyak tongkat untuk kes kami, jadi kami tidak melaksanakannya. Pendekatan yang diterangkan dalam artikel berfungsi sepenuhnya dalam kefungsian AWS standard, tanpa skrip tambahan, mahkota, dsb.

Di bawah ialah beberapa tangkapan skrin yang menunjukkan sejarah harga untuk kejadian spot.

m5.besar di rantau eu-barat-1 (Ireland). Harga kebanyakannya stabil selama 3 bulan, pada masa ini menjimatkan 2.9x.

Membina API Boleh Skala pada AWS Spot Instances

m5.besar di rantau us-timur-1 (N. Virginia). Harga sentiasa berubah selama 3 bulan, pada masa ini menjimatkan daripada 2.3x kepada 2.8x bergantung pada zon ketersediaan.

Membina API Boleh Skala pada AWS Spot Instances

t3.kecil di rantau us-timur-1 (N. Virginia). Harga telah stabil selama 3 bulan, pada masa ini menjimatkan 3.4x.

Membina API Boleh Skala pada AWS Spot Instances

Seni bina perkhidmatan

Seni bina asas perkhidmatan yang akan kita bincangkan dalam artikel ini ditunjukkan dalam rajah di bawah.

Membina API Boleh Skala pada AWS Spot Instances

Pengimbang Beban Aplikasi → Kumpulan Sasaran EC2 → Perkhidmatan Bekas Elastik

Pengimbang Beban Aplikasi (ALB) digunakan sebagai pengimbang, yang menghantar permintaan kepada Kumpulan Sasaran EC2 (TG). TG bertanggungjawab untuk membuka port pada instance untuk ALB dan menyambungkannya ke port kontena Elastic Container Service (ECS). ECS ialah analog Kubernetes dalam AWS, yang menguruskan bekas Docker.

Satu contoh boleh mempunyai beberapa bekas berjalan dengan port yang sama, jadi kami tidak boleh menetapkannya dengan tetap. ECS memberitahu TG bahawa ia sedang melancarkan tugas baharu (dalam terminologi Kubernetes ini dipanggil pod), ia menyemak port percuma pada contoh dan menetapkan salah satu daripadanya kepada tugas yang dilancarkan. TG juga kerap menyemak sama ada instance dan API sedang mengusahakannya menggunakan pemeriksaan kesihatan, dan jika ia melihat sebarang masalah, ia berhenti menghantar permintaan ke sana.

Kumpulan Penskalaan Auto EC2 + Pembekal Kapasiti ECS

Rajah di atas tidak menunjukkan perkhidmatan EC2 Auto Scaling Groups (ASG). Daripada namanya, anda boleh memahami bahawa ia bertanggungjawab untuk menskalakan keadaan. Walau bagaimanapun, sehingga baru-baru ini, AWS tidak mempunyai keupayaan terbina dalam untuk mengurus bilangan mesin yang sedang berjalan daripada ECS. ECS memungkinkan untuk menskalakan bilangan tugas, contohnya, mengikut penggunaan CPU, RAM atau bilangan permintaan. Tetapi jika tugas menduduki semua contoh percuma, maka mesin baharu tidak dicipta secara automatik.

Ini telah berubah dengan kemunculan ECS Capacity Providers (ECS CP). Kini setiap perkhidmatan dalam ECS boleh dikaitkan dengan ASG, dan jika tugasan tidak sesuai dengan kejadian yang sedang dijalankan, maka yang baharu akan dinaikkan (tetapi dalam had ASG yang ditetapkan). Ini juga berfungsi dalam arah yang bertentangan, jika ECS CP melihat kejadian terbiar tanpa tugas, maka ia akan memberikan arahan ASG untuk menutupnya. ECS CP mempunyai keupayaan untuk menentukan peratusan sasaran beban contoh, supaya sebilangan mesin tertentu sentiasa bebas untuk menskala tugasan dengan cepat; Saya akan membincangkan perkara ini sedikit kemudian.

Templat Pelancaran EC2

Perkhidmatan terakhir yang akan saya bincangkan sebelum menerangkan secara terperinci tentang mencipta infrastruktur ini ialah Templat Pelancaran EC2. Ia membolehkan anda membuat templat mengikut mana semua mesin akan bermula, supaya tidak mengulanginya dari awal setiap kali. Di sini anda boleh memilih jenis mesin untuk dimulakan, kumpulan keselamatan, imej cakera dan banyak parameter lain. Anda juga boleh menentukan data pengguna yang akan dimuat naik ke semua kejadian yang dilancarkan. Anda boleh menjalankan skrip dalam data pengguna, contohnya, anda boleh mengedit kandungan fail Konfigurasi ejen ECS.

Salah satu parameter konfigurasi yang paling penting untuk artikel ini ialah ECS_ENABLE_SPOT_INSTANCE_DRAINING= benar. Jika parameter ini didayakan, maka sebaik sahaja ECS menerima isyarat bahawa tika tempat sedang diambil, ia memindahkan semua tugas yang berfungsi padanya kepada status Pengeringan. Tiada tugas baharu akan diberikan kepada tika ini; jika terdapat tugasan yang ingin dilaksanakan sekarang, tugasan itu akan dibatalkan. Permintaan daripada pengimbang juga berhenti datang. Pemberitahuan pemadaman contoh datang 2 minit sebelum acara sebenar. Oleh itu, jika perkhidmatan anda tidak melaksanakan tugas lebih lama daripada 2 minit dan tidak menyimpan apa-apa ke cakera, maka anda boleh menggunakan tikar spot tanpa kehilangan data.

Mengenai cakera - AWS baru-baru ini lakukan Ia adalah mungkin untuk menggunakan Sistem Fail Elastik (EFS) bersama-sama dengan ECS; dengan skema ini, walaupun cakera tidak menjadi halangan, tetapi kami tidak mencuba ini, kerana pada dasarnya kami tidak memerlukan cakera untuk menyimpan keadaan. Secara lalai, selepas menerima SIGINT (dihantar apabila tugasan dipindahkan ke status Pengeringan), semua tugasan yang dijalankan akan dihentikan selepas 30 saat, walaupun ia belum selesai; anda boleh menukar masa ini menggunakan parameter ECS_CONTAINER_STOP_TIMEOUT. Perkara utama adalah tidak menetapkannya selama lebih daripada 2 minit untuk mesin spot.

Mencipta perkhidmatan

Mari kita teruskan untuk membuat perkhidmatan yang diterangkan. Dalam proses itu, saya juga akan menerangkan beberapa perkara berguna yang tidak disebutkan di atas. Secara umum, ini adalah arahan langkah demi langkah, tetapi saya tidak akan mempertimbangkan beberapa kes yang sangat asas atau, sebaliknya, kes yang sangat khusus. Semua tindakan dilakukan dalam konsol visual AWS, tetapi boleh diterbitkan semula secara pemrograman menggunakan CloudFormation atau Terraform. Di Adapty kami menggunakan Terraform.

Templat Pelancaran EC2

Perkhidmatan ini mencipta konfigurasi mesin yang akan digunakan. Templat diurus dalam bahagian EC2 -> Instances -> Pelancaran templat.

Imej mesin Amazon (AMI) — nyatakan imej cakera yang dengannya semua kejadian akan dilancarkan. Untuk ECS, dalam kebanyakan kes adalah berbaloi menggunakan imej yang dioptimumkan daripada Amazon. Ia sentiasa dikemas kini dan mengandungi semua yang diperlukan untuk ECS berfungsi. Untuk mengetahui ID imej semasa, pergi ke halaman AMI yang dioptimumkan Amazon ECS, pilih wilayah yang anda gunakan dan salin ID AMI untuknya. Sebagai contoh, untuk wilayah us-east-1, ID semasa pada masa penulisan ialah ami-00c7c1cf5bdc913ed. ID ini mesti dimasukkan ke dalam item Tentukan nilai tersuai.

Jenis contoh — nyatakan jenis contoh. Pilih yang paling sesuai dengan tugas anda.

Pasangan kunci (log masuk) — nyatakan sijil yang anda boleh sambungkan kepada contoh melalui SSH, jika perlu.

Tetapan rangkaian — nyatakan parameter rangkaian. Platform rangkaian dalam kebanyakan kes mesti ada Virtual Private Cloud (VPC). Kumpulan keselamatan — kumpulan keselamatan untuk keadaan anda. Memandangkan kita akan menggunakan pengimbang di hadapan kejadian, saya syorkan untuk menentukan kumpulan di sini yang membenarkan sambungan masuk hanya daripada pengimbang. Iaitu, anda akan mempunyai 2 kumpulan keselamatan, satu untuk pengimbang, yang membenarkan sambungan masuk dari mana-mana sahaja pada port 80 (http) dan 443 (https), dan yang kedua untuk mesin, yang membenarkan sambungan masuk pada mana-mana port daripada kumpulan pengimbang . Sambungan keluar dalam kedua-dua kumpulan mesti dibuka menggunakan protokol TCP ke semua port ke semua alamat. Anda boleh mengehadkan port dan alamat untuk sambungan keluar, tetapi kemudian anda perlu sentiasa memantau bahawa anda tidak cuba mengakses sesuatu pada port tertutup.

Storan (volume) — nyatakan parameter cakera untuk mesin. Saiz cakera tidak boleh kurang daripada yang dinyatakan dalam AMI; untuk ECS Optimized ialah 30 GiB.

Butiran lanjutan — nyatakan parameter tambahan.

Pilihan pembelian — sama ada kita mahu membeli contoh spot. Kami mahu, tetapi kami tidak akan menandai kotak ini di sini; kami akan mengkonfigurasinya dalam Kumpulan Penskalaan Auto, terdapat lebih banyak pilihan di sana.

Profil contoh IAM — nyatakan peranan yang akan melancarkan kejadian. Agar contoh dapat dijalankan dalam ECS, mereka memerlukan kebenaran, yang biasanya terdapat dalam peranan ecsInstanceRole. Dalam sesetengah kes ia boleh dibuat, jika tidak, maka di sini arahan tentang cara melakukan ini. Selepas penciptaan, kami menunjukkannya dalam templat.
Seterusnya terdapat banyak parameter, pada dasarnya anda boleh meninggalkan nilai lalai di mana-mana, tetapi setiap daripada mereka mempunyai penerangan yang jelas. Saya sentiasa mendayakan contoh yang dioptimumkan EBS dan pilihan T2/T3 Unlimited jika digunakan boleh pecah contoh.

Data pengguna — menunjukkan data pengguna. Kami akan mengedit fail /etc/ecs/ecs.config, yang mengandungi konfigurasi ejen ECS.
Contoh rupa data pengguna:

#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config

ECS_CLUSTER=DemoApiClusterProd — parameter menunjukkan bahawa contoh itu tergolong dalam kelompok dengan nama yang diberikan, iaitu, kelompok ini akan dapat meletakkan tugasnya pada pelayan ini. Kami belum mencipta gugusan lagi, tetapi kami akan menggunakan nama ini semasa menciptanya.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true — parameter menentukan bahawa apabila isyarat diterima untuk mematikan tika tempat, semua tugasan padanya harus dipindahkan ke status Pengeringan.

ECS_CONTAINER_STOP_TIMEOUT=1m - parameter menentukan bahawa selepas menerima isyarat SIGINT, semua tugas mempunyai 1 minit sebelum dibunuh.

ECS_ENGINE_AUTH_TYPE=docker — parameter menunjukkan bahawa skema Docker digunakan sebagai mekanisme kebenaran

ECS_ENGINE_AUTH_DATA=... — parameter sambungan ke pendaftaran kontena persendirian, tempat imej Docker anda disimpan. Jika ia terbuka, maka anda tidak perlu menyatakan apa-apa.

Untuk tujuan artikel ini, saya akan menggunakan imej awam daripada Docker Hub, jadi nyatakan parameter ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA tidak perlu.

Baik untuk mengetahui: Adalah disyorkan untuk mengemas kini AMI dengan kerap, kerana versi baharu mengemas kini versi Docker, Linux, ejen ECS, dll. Untuk tidak melupakan perkara ini, anda boleh sediakan pemberitahuan mengenai keluaran versi baharu. Anda boleh menerima pemberitahuan melalui e-mel dan mengemas kini secara manual, atau anda boleh menulis fungsi Lambda yang secara automatik akan mencipta versi baharu Templat Pelancaran dengan AMI yang dikemas kini.

Kumpulan Penskalaan Automatik EC2

Auto Scaling Group bertanggungjawab untuk melancarkan dan menskala kejadian. Kumpulan diuruskan dalam bahagian EC2 -> Auto Scaling -> Auto Scaling Groups.

Templat pelancaran — pilih templat yang dibuat dalam langkah sebelumnya. Kami meninggalkan versi lalai.

Pilihan pembelian dan jenis contoh — nyatakan jenis kejadian untuk kelompok. Patuhi templat pelancaran menggunakan jenis contoh daripada Templat Pelancaran. Menggabungkan pilihan pembelian dan jenis contoh membolehkan anda mengkonfigurasi jenis contoh secara fleksibel. Kami akan menggunakannya.

Pangkalan Atas Permintaan Pilihan — bilangan kejadian biasa, bukan tompok yang akan sentiasa berfungsi.

Peratusan atas permintaan di atas asas — nisbah peratusan bagi kejadian biasa dan tempat, 50-50 akan diagihkan sama rata, 20-80 untuk setiap kejadian biasa 4 kejadian tempat akan dinaikkan. Untuk tujuan contoh ini, saya akan menunjukkan 50-50, tetapi pada hakikatnya kita paling kerap melakukan 20-80, dalam beberapa kes 0-100.

Jenis contoh — di sini anda boleh menentukan jenis kejadian tambahan yang akan digunakan dalam kelompok. Kami tidak pernah menggunakannya kerana saya tidak begitu faham maksud cerita tersebut. Mungkin ini disebabkan oleh had jenis kejadian tertentu, tetapi ia boleh ditingkatkan dengan mudah melalui sokongan. Jika anda tahu permohonan itu, saya akan gembira membacanya dalam ulasan)

Membina API Boleh Skala pada AWS Spot Instances

rangkaian — tetapan rangkaian, pilih VPC dan subnet untuk mesin, dalam kebanyakan kes anda harus memilih semua subnet yang tersedia.

Pengimbangan beban - tetapan pengimbang, tetapi kami akan melakukan ini secara berasingan, kami tidak akan menyentuh apa-apa di sini. Pemeriksaan kesihatan juga akan dikonfigurasikan kemudian.

Saiz kumpulan — kami menunjukkan had bilangan mesin dalam kelompok dan bilangan mesin yang dikehendaki pada permulaan. Bilangan mesin dalam kelompok tidak akan pernah kurang daripada minimum yang ditentukan dan lebih daripada maksimum, walaupun penskalaan harus berlaku mengikut metrik.

Dasar penskalaan — penskalaan parameter, tetapi kami akan menskalakan berdasarkan tugas ECS yang dijalankan, jadi kami akan mengkonfigurasi penskalaan kemudian.

Perlindungan skala dalam contoh — perlindungan kejadian daripada pemadaman apabila mengecilkan. Kami membolehkannya supaya ASG tidak memadamkan mesin yang menjalankan tugas. Pembekal Kapasiti ECS akan melumpuhkan perlindungan untuk keadaan yang tidak mempunyai tugas.

Tambah tag — anda boleh menentukan teg untuk contoh (untuk ini, kotak semak Teg keadaan baharu mesti ditanda). Saya syorkan untuk menentukan tag Nama, maka semua kejadian yang dilancarkan dalam kumpulan akan mempunyai nama yang sama, dan mudah untuk melihatnya dalam konsol.

Membina API Boleh Skala pada AWS Spot Instances

Selepas membuat kumpulan, bukanya dan pergi ke bahagian Konfigurasi lanjutan. Mengapa tidak semua pilihan boleh dilihat dalam konsol pada peringkat penciptaan.

Dasar penamatan — peraturan yang diambil kira semasa memadam kejadian. Mereka digunakan mengikut urutan. Kami biasanya menggunakan yang dalam gambar di bawah. Mula-mula, kejadian dengan Templat Pelancaran tertua dipadamkan (contohnya, jika kami mengemas kini AMI, kami mencipta versi baharu, tetapi semua kejadian berjaya beralih kepadanya). Kemudian kejadian yang paling hampir dengan jam pengebilan seterusnya dipilih. Dan kemudian yang tertua dipilih berdasarkan tarikh pelancaran.

Membina API Boleh Skala pada AWS Spot Instances

Baik untuk mengetahui: untuk mengemas kini semua mesin dalam kelompok, mudah digunakan Muat Semula Contoh. Jika anda menggabungkan ini dengan fungsi Lambda dari langkah sebelumnya, anda akan mempunyai sistem kemas kini contoh automatik sepenuhnya. Sebelum mengemas kini semua mesin, anda mesti melumpuhkan perlindungan skala dalam contoh untuk semua kejadian dalam kumpulan. Bukan konfigurasi dalam kumpulan, tetapi perlindungan daripada mesin itu sendiri, ini dilakukan pada tab pengurusan Instance.

Pengimbang Beban Aplikasi dan Kumpulan Sasaran EC2

Pengimbang dicipta dalam bahagian EC2 → Pengimbangan Beban → Pengimbang Beban. Kami akan menggunakan Pengimbang Beban Aplikasi; perbandingan pelbagai jenis pengimbang boleh dibaca di halaman perkhidmatan.

Pendengar - masuk akal untuk membuat port 80 dan 443 dan mengubah hala dari 80 ke 443 menggunakan peraturan pengimbang kemudian.

Zon Ketersediaan — dalam kebanyakan kes, kami memilih zon kebolehaksesan untuk semua orang.

Konfigurasikan Tetapan Keselamatan — sijil SSL untuk pengimbang ditunjukkan di sini, pilihan yang paling mudah ialah buat sijil dalam ACM. Mengenai perbezaan Dasar Keselamatan boleh dibaca dalam dokumentasi, anda boleh membiarkannya dipilih secara lalai ELBSecurityPolicy-2016-08. Selepas mencipta pengimbang, anda akan melihatnya Nama DNS, yang anda perlukan untuk mengkonfigurasi CNAME untuk domain anda. Sebagai contoh, ini adalah bagaimana ia kelihatan dalam Cloudflare.

Membina API Boleh Skala pada AWS Spot Instances

Kumpulan Keselamatan — buat atau pilih kumpulan keselamatan untuk pengimbang, saya menulis lebih lanjut mengenai perkara ini di atas dalam Templat Pelancaran EC2 → bahagian Tetapan rangkaian.

Kumpulan sasaran — kami mencipta kumpulan yang bertanggungjawab untuk menghalakan permintaan daripada pengimbang kepada mesin dan menyemak ketersediaannya untuk menggantikannya sekiranya berlaku masalah. Jenis sasaran mestilah Instance, Protokol и Port sebarang, jika anda menggunakan HTTPS untuk komunikasi antara pengimbang dan kejadian, maka anda perlu memuat naik sijil kepada mereka. Untuk tujuan contoh ini, kami tidak akan melakukan ini, kami hanya akan meninggalkan port 80.

Pemeriksaan kesihatan — parameter untuk menyemak kefungsian perkhidmatan. Dalam perkhidmatan sebenar, ini harus menjadi permintaan berasingan yang melaksanakan bahagian penting dalam logik perniagaan; untuk tujuan contoh ini, saya akan meninggalkan tetapan lalai. Seterusnya, anda boleh memilih selang permintaan, tamat masa, kod kejayaan, dll. Dalam contoh kami, kami akan menunjukkan kod Kejayaan 200-399, kerana imej Docker yang akan digunakan mengembalikan kod 304.

Membina API Boleh Skala pada AWS Spot Instances

Daftar Sasaran — di sini kereta untuk kumpulan dipilih, tetapi dalam kes kami ini akan dilakukan oleh ECS, jadi kami hanya melangkau langkah ini.

Baik untuk mengetahui: pada peringkat pengimbang anda boleh mendayakan log yang akan disimpan dalam S3 dalam sesuatu yang tertentu format. Dari sana ia boleh dieksport ke perkhidmatan pihak ketiga untuk analitik, atau anda boleh membuat pertanyaan SQL terus pada data dalam S3 dengan menggunakan Athena. Ia mudah dan berfungsi tanpa sebarang kod tambahan. Saya juga mengesyorkan menyediakan penyingkiran log daripada baldi S3 selepas tempoh masa tertentu.

Definisi Tugas ECS

Dalam langkah sebelumnya, kami mencipta semua yang berkaitan dengan infrastruktur perkhidmatan; kini kami meneruskan untuk menerangkan bekas yang akan kami lancarkan. Ini dilakukan dalam bahagian ECS → Takrifan Tugas.

Keserasian jenis pelancaran - pilih EC2.

Peranan IAM pelaksanaan tugas - pilih ecsTaskExecutionRole. Menggunakannya, log ditulis, akses kepada pembolehubah rahsia diberikan, dsb.

Dalam bahagian Definisi Bekas, klik Tambah Bekas.

Image — pautan ke imej dengan kod projek; untuk contoh ini saya akan menggunakan imej awam dari Docker Hub bitnami/contoh-nod:0.0.1.

Had Memori — had ingatan untuk bekas. Had Keras — had keras, jika kontena melebihi nilai yang ditentukan, arahan bunuh buruh pelabuhan akan dilaksanakan, bekas akan mati serta-merta. Had Lembut — had lembut, bekas boleh melebihi nilai yang ditentukan, tetapi parameter ini akan diambil kira apabila meletakkan tugas pada mesin. Sebagai contoh, jika mesin mempunyai 4 GiB RAM, dan had lembut bekas ialah 2048 MiB, maka mesin ini boleh mempunyai maksimum 2 tugas berjalan dengan bekas ini. Pada hakikatnya, 4 GiB RAM adalah kurang sedikit daripada 4096 MiB, ini boleh dilihat pada tab ECS Instances dalam kelompok. Had lembut tidak boleh lebih besar daripada had keras. Adalah penting untuk memahami bahawa jika terdapat beberapa bekas dalam satu tugas, maka hadnya disimpulkan.

Pemetaan pelabuhan - pada Pelabuhan hos Kami menunjukkan 0, ini bermakna port akan diberikan secara dinamik dan akan dipantau oleh Kumpulan Sasaran. Pelabuhan Kontena — port di mana aplikasi anda dijalankan selalunya dinyatakan dalam arahan pelaksanaan, atau diberikan dalam kod aplikasi anda, Dockerfile, dsb. Untuk contoh kami, kami akan menggunakan 3000 kerana ia disenaraikan dalam Dockerfile imej yang digunakan.

Pemeriksaan kesihatan — parameter pemeriksaan kesihatan kontena, jangan dikelirukan dengan parameter yang dikonfigurasikan dalam Kumpulan Sasaran.

alam Sekitar — tetapan persekitaran. unit CPU - serupa dengan had memori, hanya mengenai pemproses. Setiap teras pemproses ialah 1024 unit, jadi jika pelayan mempunyai pemproses dwi-teras dan bekas ditetapkan kepada 512, maka 4 tugasan dengan bekas ini boleh dilancarkan pada satu pelayan. Unit CPU sentiasa sepadan dengan bilangan teras; tidak boleh kurang sedikit daripadanya, seperti halnya dengan memori.

Perintah — arahan untuk memulakan perkhidmatan di dalam bekas, semua parameter ditentukan dipisahkan dengan koma. Ini boleh jadi gunicorn, npm, dll. Jika tidak dinyatakan, nilai arahan CMD daripada Dockerfile akan digunakan. Kami menunjukkan npm,start.

Pemboleh ubah persekitaran — pembolehubah persekitaran kontena. Ini boleh sama ada data teks ringkas atau pembolehubah rahsia daripada Pengurus Rahsia atau Stor Parameter.

Penyimpanan dan Pembalakan — di sini kami akan menyediakan log masuk CloudWatch Log (perkhidmatan untuk log daripada AWS). Untuk melakukan ini, hanya dayakan kotak semak Log CloudWatch Autokonfigurasi. Selepas mencipta Takrifan Tugas, sekumpulan log akan dibuat secara automatik dalam CloudWatch. Secara lalai, log disimpan di dalamnya selama-lamanya; Saya mengesyorkan menukar tempoh Pengekalan daripada Jangan Luput kepada tempoh yang diperlukan. Ini dilakukan dalam kumpulan CloudWatch Log, anda perlu mengklik pada tempoh semasa dan memilih yang baharu.

Membina API Boleh Skala pada AWS Spot Instances

Kluster ECS dan Pembekal Kapasiti ECS

Pergi ke bahagian ECS → Kluster untuk membuat kluster. Kami memilih EC2 Linux + Networking sebagai templat.

Nama kluster - sangat penting, kami menjadikan di sini nama yang sama seperti yang dinyatakan dalam parameter Templat Pelancaran ECS_CLUSTER, dalam kes kami - DemoApiClusterProd. Tandai kotak semak Buat kluster kosong. Secara pilihan, anda boleh mendayakan Container Insights untuk melihat metrik untuk perkhidmatan dalam CloudWatch. Jika anda melakukan semuanya dengan betul, maka dalam bahagian ECS Instances anda akan melihat mesin yang dibuat dalam kumpulan Auto Scaling.

Membina API Boleh Skala pada AWS Spot Instances

Pergi ke tab Pembekal Kapasiti dan buat yang baru. Izinkan saya mengingatkan anda bahawa ia diperlukan untuk mengawal penciptaan dan penutupan mesin bergantung pada bilangan tugas ECS yang dijalankan. Adalah penting untuk ambil perhatian bahawa pembekal hanya boleh diberikan kepada satu kumpulan.

Kumpulan Penskalaan Auto — pilih kumpulan yang dibuat sebelum ini.

Penskalaan terurus — dayakannya supaya pembekal boleh menskalakan perkhidmatan.

Kapasiti sasaran % — berapa peratusan mesin yang dimuatkan dengan tugasan yang kami perlukan. Jika anda menyatakan 100%, maka semua mesin akan sentiasa sibuk dengan menjalankan tugas. Jika anda menyatakan 50%, maka separuh daripada kereta akan sentiasa percuma. Dalam kes ini, jika terdapat lonjakan mendadak dalam muatan, teksi baharu akan segera mendapatkan kereta percuma, tanpa perlu menunggu contoh untuk digunakan.

Perlindungan penamatan terurus — dayakan, parameter ini membolehkan pembekal mengalih keluar perlindungan kejadian daripada pemadaman. Ini berlaku apabila tiada tugas aktif pada mesin dan membenarkan kapasiti Sasaran%.

Perkhidmatan ECS dan persediaan penskalaan

Langkah terakhir :) Untuk mencipta perkhidmatan, anda perlu pergi ke kluster yang dibuat sebelum ini pada tab Perkhidmatan.

Jenis pelancaran — anda perlu mengklik pada Beralih kepada strategi pembekal kapasiti dan pilih pembekal yang dibuat sebelum ini.

Membina API Boleh Skala pada AWS Spot Instances

Definisi Tugas — pilih Definisi Tugasan yang dibuat sebelum ini dan semakannya.

Nama perkhidmatan — untuk mengelakkan kekeliruan, kami sentiasa menunjukkan yang sama seperti Definisi Tugas.

Jenis perkhidmatan - sentiasa Replika.

Bilangan tugas — bilangan tugas aktif yang dikehendaki dalam perkhidmatan. Parameter ini dikawal oleh penskalaan, tetapi masih mesti ditentukan.

Peratus sihat minimum и Peratus maksimum — tentukan tingkah laku tugas semasa penempatan. Nilai lalai ialah 100 dan 200, menunjukkan bahawa pada masa penggunaan bilangan tugas akan meningkat beberapa kali, dan kemudian kembali ke nilai yang dikehendaki. Jika anda mempunyai 1 tugasan berjalan, min=0, dan max=100, maka semasa penggunaan ia akan dimatikan, dan selepas itu tugasan baharu akan dinaikkan, iaitu, ia akan menjadi masa henti. Jika 1 tugasan sedang berjalan, min=50, maks=150, maka penempatan tidak akan berlaku sama sekali, kerana 1 tugasan tidak boleh dibahagikan kepada separuh atau ditambah satu setengah kali ganda.

Jenis penggunaan — tinggalkan kemas kini Rolling.

Templat Peletakan — peraturan untuk meletakkan tugas pada mesin. Lalai ialah AZ Balanced Spread - ini bermakna setiap tugas baharu akan diletakkan pada kejadian baharu sehingga mesin dalam semua zon ketersediaan meningkat. Kami biasanya melakukan BinPack - CPU dan Spread - AZ; dengan dasar ini, tugasan diletakkan sepadat mungkin pada satu mesin bagi setiap CPU. Jika perlu untuk mencipta mesin baharu, ia dicipta dalam zon ketersediaan baharu.

Membina API Boleh Skala pada AWS Spot Instances

Jenis pengimbang beban — pilih Pengimbang Beban Aplikasi.

Peranan IAM perkhidmatan - pilih ecsServiceRole.

Nama pengimbang beban — pilih pengimbang yang dibuat sebelum ini.

Tempoh tangguh pemeriksaan kesihatan — jeda sebelum melakukan pemeriksaan kesihatan selepas melancarkan tugas baharu, biasanya kami menetapkannya kepada 60 saat.

Bekas untuk memuatkan baki — dalam item Nama kumpulan sasaran, pilih kumpulan yang dibuat sebelum ini, dan semuanya akan diisi secara automatik.

Membina API Boleh Skala pada AWS Spot Instances

Penskalaan Auto Perkhidmatan — parameter penskalaan perkhidmatan. Pilih Konfigurasi Penskalaan Auto Perkhidmatan untuk melaraskan kiraan yang diingini perkhidmatan anda. Kami menetapkan bilangan tugasan minimum dan maksimum semasa menskalakan.

Peranan IAM untuk Penskalaan Auto Perkhidmatan - pilih AWSServiceRoleForApplicationAutoScaling_ECSService.

Dasar penskalaan tugas automatik - peraturan untuk penskalaan. Terdapat 2 jenis:

  1. Penjejakan sasaran — menjejaki metrik sasaran (penggunaan CPU/RAM atau bilangan permintaan untuk setiap tugas). Sebagai contoh, kami mahu purata beban pemproses ialah 85%, apabila ia menjadi lebih tinggi, tugasan baharu akan ditambah sehingga mencapai nilai sasaran. Jika beban lebih rendah, maka tugasan akan dialih keluar, sebaliknya, melainkan perlindungan terhadap pengecilan didayakan (Lumpuhkan skala masuk).
  2. Penskalaan langkah - reaksi terhadap peristiwa sewenang-wenangnya. Di sini anda boleh mengkonfigurasi tindak balas kepada sebarang peristiwa (Penggera CloudWatch), apabila ia berlaku, anda boleh menambah atau mengalih keluar bilangan tugasan yang ditentukan, atau menentukan bilangan tugasan yang tepat.

Perkhidmatan mungkin mempunyai beberapa peraturan penskalaan, ini boleh berguna, perkara utama adalah memastikan ia tidak bercanggah antara satu sama lain.

Kesimpulan

Jika anda mengikut arahan dan menggunakan imej Docker yang sama, perkhidmatan anda harus mengembalikan halaman seperti ini.

Membina API Boleh Skala pada AWS Spot Instances

  1. Kami telah mencipta templat mengikut mana semua mesin dalam perkhidmatan dilancarkan. Kami juga mempelajari cara mengemas kini mesin apabila templat berubah.
  2. Kami telah mengkonfigurasikan pemprosesan isyarat berhenti contoh spot, jadi dalam masa seminit selepas menerimanya, semua tugas yang sedang dijalankan dialih keluar daripada mesin, jadi tiada apa-apa yang hilang atau terganggu.
  3. Kami menaikkan pengimbang untuk mengagihkan beban secara sama rata ke seluruh mesin.
  4. Kami telah mencipta perkhidmatan yang dijalankan secara langsung, yang mengurangkan kos mesin sebanyak kira-kira 3 kali.
  5. Kami telah mengkonfigurasikan penskalaan automatik dalam kedua-dua arah untuk mengendalikan peningkatan beban kerja tanpa menanggung kos masa henti.
  6. Kami menggunakan Pembekal Kapasiti supaya aplikasi menguruskan infrastruktur (mesin) dan bukan sebaliknya.
  7. Kami hebat.

Jika anda mempunyai lonjakan yang boleh diramalkan, contohnya anda mengiklankan dalam kempen e-mel yang besar, anda boleh menyediakan penskalaan dengan jadual waktu.

Anda juga boleh menskalakan berdasarkan data daripada bahagian yang berlainan dalam sistem anda. Sebagai contoh, kami mempunyai fungsi menghantar tawaran promosi individu pengguna aplikasi mudah alih. Kadangkala kempen dihantar kepada 1J+ orang. Selepas pengedaran sedemikian, sentiasa terdapat peningkatan besar dalam permintaan kepada API, kerana ramai pengguna log masuk ke aplikasi pada masa yang sama. Jadi, jika kami melihat bahawa terdapat lebih banyak penunjuk standard dalam baris gilir untuk menghantar pemberitahuan tolak promosi, kami boleh melancarkan beberapa mesin dan tugas tambahan dengan segera untuk bersedia untuk memuatkan.

Saya akan gembira jika anda memberitahu saya dalam ulasan kes-kes menarik menggunakan contoh spot dan ECS atau sesuatu tentang penskalaan.

Tidak lama lagi akan terdapat artikel tentang cara kami memproses beribu-ribu peristiwa analisis sesaat pada tindanan tanpa pelayan yang kebanyakannya (dengan wang) dan cara penggunaan perkhidmatan berfungsi menggunakan GitLab CI dan Terraform Cloud.

Langgan kami, ia akan menjadi menarik!

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

Adakah anda menggunakan contoh spot dalam pengeluaran?

  • 22,2% Ya6

  • 66,7% No18

  • 11,1% Saya belajar tentangnya daripada artikel dan merancang untuk menggunakannya3

27 pengguna mengundi. 5 pengguna berpantang.

Sumber: www.habr.com

Tambah komen