Բոլոր դասերը
Linux և սերվերներՍկսնակ9 րոպե ընթերցումԻմ ստեկում

VPS և cloud provider-ներ

Shared hosting, VPS, managed պլատֆորմներ, թե cloud․ ինչ ընտրել, ինչ չափի և ինչ անել առաջինը։

  • VPS
  • DigitalOcean
  • Hetzner
  • AWS
  • Sizing & cost
Քայլ 1/5
Մեկ VPS՝ էժան ու պարզ, բայց admin-ն էլ դու ես, backup-ներ անողն էլ, գիշերվա 3-ի զարթուցիչն էլ։

30 վայրկյանում

Վեբ հավելված host անելու չորս հիմնական ձև կա՝ shared hosting, virtual private server (VPS), managed պլատֆորմ, որը քո կոդը գործարկում է քո փոխարեն, և լիարժեք cloud provider՝ տասնյակ ծառայություններով։ Յուրաքանչյուրը վերահսկողությունը փոխանակում է հարմարավետության և գնի հետ։ Փոքր և միջին նախագծերի մեծ մասի համար լավ սպասարկվող VPS-ը արագ է, էժան և պարզ, եթե այն պաշտպանում ես, backup ես անում և հետևում ես դրան։

Ինչու եմ օգտագործում

  • Իմ production սերվերներն աշխատում են DigitalOcean droplet-ների վրա Ubuntu-ով, ուստի VPS instance-ների ընտրությունը, չափավորումը և պաշտպանությունը իմ ամենօրյա աշխատանքն է։
  • Չորս սերվեր միավորում եմ երկուսի մեջ՝ մեկը SaaS պրոդուկտի համար, մյուսը՝ մնացած բոլոր կայքերի, որովհետև ավելի քիչ, ճիշտ պաշտպանված սերվերներն ավելի էժան են և ավելի հեշտ են խնամվում։
  • Ստուգված restore-ով snapshot-ները և provider-ի մակարդակի firewall-ները այն baseline-ի մասն են, որը կիրառում եմ բոլոր սերվերների վրա։

Ինչպես է աշխատում

01Հավելված host անելու չորս ձև

Hosting-ի մասին մտածիր բնակարանի պես։ Shared hosting-ը սենյակ է ընդհանուր բնակարանում․ էժան է և կառավարվում է քո փոխարեն, բայց ռեսուրսները կիսում ես հարյուրավոր կայքերի հետ, չես կարող սեփական ծրագրեր տեղադրել, և մեկ աղմկոտ հարևանը քեզ դանդաղեցնում է։ Այն աշխատում է պարզ PHP կայքերի համար։ VPS-ը քո սեփական բնակարանն է՝ վիրտուալ մեքենա երաշխավորված CPU-ով, RAM-ով և սկավառակով և լրիվ root հասանելիությամբ, որտեղ դու ես պատասխանատու ներսի ամեն ինչի համար։ Managed պլատֆորմը (PaaS), ինչպես Vercel-ը, Render-ը, Fly.io-ն, Railway-ն կամ Laravel Cloud-ը, սպասարկվող բնակարան է․ դու push ես անում կոդը, իսկ այն հոգում է սերվերները, scaling-ը և TLS-ը՝ ավելի բարձր գնով մեկ ռեսուրսի համար և պլատֆորմի սահմանափակումներով։ Hyperscale cloud-ը (AWS, Google Cloud, Azure) ամբողջ քաղաք է՝ վիրտուալ մեքենաներ գումարած managed տվյալների բազաներ, queue-եր, storage և ցանց, շատ ճկուն և շատ բարդ։

  • Shared hosting՝ ամենաէժանը, ամենաքիչ վերահսկողությունը։ Լավ է brochure կայքերի և փոքր WordPress տեղադրումների համար։
  • VPS՝ լրիվ վերահսկողություն ցածր գնով․ անվտանգությունը, թարմացումները և backup-ները քոնն են։
  • Managed պլատֆորմ՝ ամենաարագ թողարկումը, վճարում ես հարմարավետության համար, սահմանափակ վերահսկողություն։
  • Hyperscale cloud՝ ամեն ինչ հասանելի է, բայց գինն ու կոնֆիգուրացիան իրական փորձառություն են պահանջում։

02Provider-ի ընտրություն

VPS hosting-ի համար հայտնի տարբերակներն են DigitalOcean-ը (droplet-ներ, պարզ UI, լավ փաստաթղթեր, managed տվյալների բազաներ և object storage), Hetzner-ը (գին-արտադրողականության շատ ուժեղ հարաբերակցություն, data center-ներ Եվրոպայում և ԱՄՆ-ում), Vultr-ը, Linode-ը (այժմ Akamai) և OVHcloud-ը։ AWS Lightsail-ը առաջարկում է պարզ VPS պլաններ AWS-ի ներսում։ Մեծ cloud-երը իմաստ ունեն, երբ քեզ պետք են կոնկրետ managed ծառայություններ, compliance սերտիֆիկացումներ, շատ region-ներ, կամ ընկերությունդ արդեն այնտեղ է աշխատում։ Համեմատելիս նայիր ամսական գնից այն կողմ․ ստուգիր data center-ների տեղերը, ներառված bandwidth-ը և դրանից ավելիի գինը, snapshot-ների և backup-ների որակը, արդյոք կա cloud firewall և private networking, managed տվյալների բազայի և object storage-ի տարբերակները, API-ի և Terraform-ի աջակցությունը և ինչպես է արձագանքում support-ը։ Գները փոխվում են, ուստի համեմատիր ընթացիկ գնային էջերը, ոչ թե հին blog post-երը։

  • Տեղադրություն՝ մոտ քո օգտատերերին․ հաշվի առ տվյալների պահման կանոնները, ինչպես GDPR-ը։
  • Ցանց՝ ներառված traffic, egress-ի գին, IPv6, DDoS պաշտպանություն։
  • Լրացուցիչներ՝ cloud firewall, private ցանց, snapshot-ներ, backup-ներ, object storage, managed DB։
  • Գործառնություններ՝ API, CLI, Terraform provider, status-ի պատմություն և support-ի որակ։

03Չափավորում և region

Սկսիր փոքրից և չափիր․ VPS-ը հետագայում resize անելը հեշտ է, և provider-ների մեծ մասը թույլ է տալիս մեծացնել րոպեների ընթացքում։ nginx-ով և PHP-ով կամ Node-ով փոքր կայքը հանգիստ աշխատում է 1-ից 2 vCPU-ի և 2 GB RAM-ի վրա։ Նույն մեքենայի վրա ավելացրու տվյալների բազա, Redis և queue worker-ներ, և 4 GB-ը կամ ավելին ավելի անվտանգ սկիզբ է։ Սովորաբար առաջին սահմանը հիշողությունն է, ոչ թե CPU-ն։ Shared vCPU պլանները էժան են և նորմալ վեբ հավելվածների մեծ մասի համար, dedicated vCPU պլանները կայուն արտադրողականություն են տալիս CPU-ծանր աշխատանքի համար։ Ընտրիր քո օգտատերերի մեծ մասին ամենամոտ region-ը, իրար հետ խոսող սերվերները պահիր նույն region-ում և հիշիր, որ Cloudflare-ի նման CDN-ը կարող է static ֆայլերը սպասարկել օգտատերերին մոտ ամենուր։ Մի քանի շաբաթ հետևիր load-ին, հիշողությանը և սկավառակին և resize արա տվյալների հիման վրա։

  • Վեբ սերվերների մեծ մասում հիշողությունը սպառվում է CPU-ից առաջ․ պլանավորիր տվյալների բազայի և worker-ների համար։
  • SSD կամ NVMe սկավառակ․ օգտատերերի upload-ները և backup-ները պահիր object storage-ում՝ հսկայական սկավառակի փոխարեն։
  • Մեծացնելը սովորաբար հեշտ է, սկավառակը փոքրացնելը հաճախ՝ ոչ։

04Snapshot-ներ, backup-ներ և private networking

Snapshot-ը սերվերի սկավառակի ամբողջական image է մեկ պահին։ Այն կատարյալ է ռիսկային փոփոխություններից առաջ, որովհետև կարող ես ամբողջ մեքենան հետ վերադարձնել։ Provider-ի backup-ները պլանավորված snapshot-ներ են, սովորաբար ամենօրյա կամ ամենշաբաթյա՝ փոքր հավելավճարով։ Բայց երկուսն էլ գտնվում են նույն provider-ի մոտ, և աշխատող տվյալների բազայի disk snapshot-ը կարող է հետևողական չլինել։ Այդ պատճառով արա նաև հավելվածի մակարդակի backup-ներ, օրինակ՝ տվյալների բազայի dump, և պատճենիր դրանք սերվերից դուրս, իդեալում՝ այլ provider-ի կամ region-ի object storage։ Backup-ը հաշվվում է միայն այն բանից հետո, երբ հաջողությամբ restore ես արել այն։ Private networking-ը քո սերվերները միացնում է ներքին ցանցով, որը հասանելի չէ ինտերնետից, այնպես որ app սերվերը կարող է հասնել տվյալների բազային՝ առանց այն public բացելու։

  • Snapshot՝ upgrade-ներից, migration-ներից և config-ի մեծ փոփոխություններից առաջ։
  • Տվյալների բազայի dump-եր գումարած off-site պատճեններ․ հետևիր 3-2-1 գաղափարին (3 պատճեն, 2 կրիչ, 1 off-site)։
  • Restore-ները պարբերաբար ստուգիր նոր սերվերի վրա։
  • Սերվերների միջև տվյալների բազայի և cache-ի traffic-ի համար օգտագործիր private ցանցը։

05Ծախսերի վերահսկում

Cloud հաշիվները լուռ են աճում։ Սովորական արտահոսքերն են մոռացված սերվերները և test միջավայրերը, հին snapshot-ները և չմիացված volume-ները, չափազանց մեծ instance-ները, որոնք ոչ ոք resize չի արել, load balancer-ները և static IP-ները, որոնք այլևս չես օգտագործում, և ամենից առաջ ելքային traffic-ը (egress), որը մեծ cloud-երում վճարվում է ըստ գիգաբայթի և կարող է գերազանցել սերվերի գինը։ Առատ ներառված traffic-ով VPS provider-ը bandwidth-ծանր կայքերի համար հաճախ շատ ավելի էժան է։ Պարզ սովորություններն օգնում են․ սահմանիր billing alert, յուրաքանչյուր ռեսուրս tag արա կամ անվանիր ըստ նախագծի, ամեն ամիս դիտիր հաշիվը, ջնջիր այն, ինչ չես օգտագործում, և static asset-ների առջևում դիր CDN։ Շատ փոքր, կիսադատարկ սերվերները ավելի քիչ, ճիշտ չափի սերվերների մեջ միավորելը հաճախ միաժամանակ կրճատում է և՛ ծախսը, և՛ սպասարկումը։

  • Billing alert-ներ և բյուջեներ յուրաքանչյուր հաշվի վրա։
  • Ամսական մաքրում՝ հին snapshot-ներ, volume-ներ, IP-ներ, test սերվերներ։
  • Հետևիր egress-ի գնին․ static ֆայլերը cache արա CDN-ում։
  • Reserved կամ savings պլանների պարտավորվիր միայն կայուն, երկարաժամկետ workload-երի համար։

06Առաջին 10 րոպեն նոր սերվերի վրա

Նոր public սերվերը scan է արվում րոպեների ընթացքում, ուստի պաշտպանիր այն, մինչև որևէ բան deploy անելը։ Սերվերը ստեղծիր քո SSH key-ը ավելացրած, մուտք գործիր, թարմացրու փաթեթները, ստեղծիր քո սեփական sudo օգտատերը, երկրորդ տերմինալում հաստատիր, որ key login-ը աշխատում է այդ օգտատիրոջ համար, հետո անջատիր password-ի և root-ի մուտքը։ Միացրու firewall-ը միայն SSH-ով, HTTP-ով և HTTPS-ով և նույնը կրկնիր provider-ի cloud firewall-ում։ Միացրու անվտանգության ավտոմատ թարմացումները, տեղադրիր fail2ban, սահմանիր ժամային գոտին և hostname-ը, փոքր instance-ների վրա ավելացրու swap ֆայլ և արա մաքուր բազայի առաջին snapshot-ը։ Վերջում կարգավորիր monitoring-ը և սկավառակի alert-ը։ Յուրաքանչյուր քայլի հրամանները քննարկված են Linux-ի մյուս դասերում։

bash
ssh [email protected]                      # first login with your key
apt update && apt full-upgrade -y
adduser your_user && usermod -aG sudo your_user
rsync -a --chown=your_user:your_user ~/.ssh /home/your_user/
# New terminal: ssh [email protected] must work before continuing
printf "PasswordAuthentication no\nPermitRootLogin no\n" > /etc/ssh/sshd_config.d/10-hardening.conf
sshd -t && systemctl reload ssh
ufw allow OpenSSH && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable
apt install -y unattended-upgrades fail2ban
dpkg-reconfigure -plow unattended-upgrades
timedatectl set-timezone UTC && hostnamectl set-hostname web1

Օգտագործեք, երբ

  • VPS՝ փոքր և միջին հավելվածներ, կանխատեսելի traffic, Linux-ին տիրապետող թիմ, սահմանափակ բյուջե։
  • Managed պլատֆորմ՝ front-end և serverless-ին հարմար հավելվածներ, որտեղ թողարկման արագությունն ավելի կարևոր է, քան վերահսկողությունը։
  • Hyperscale cloud՝ managed ծառայություններ մեծ մասշտաբով, compliance պահանջներ, շատ region-ներ կամ ընկերության արդեն գոյություն ունեցող հաշիվ։
  • Shared hosting՝ պարզ կայքեր առանց custom ծրագրերի և առանց մեկի, ով կսպասարկի սերվերը։

Մի՛ օգտագործեք, երբ

  • Խուսափիր ինքնուրույն կառավարվող VPS-ից, եթե ոչ ոք չի կիրառելու թարմացումները, չի հետևելու backup-ներին և չի արձագանքելու alert-ներին։
  • Փոքր հավելվածի համար խուսափիր hyperscale cloud-ից միայն այն պատճառով, որ մեծ ընկերություններն են այն օգտագործում․ բարդությունն ու egress-ի ծախսերը իրական են։
  • Խուսափիր shared hosting-ից այն հավելվածների համար, որոնց պետք են background worker-ներ, WebSocket-ներ, custom extension-ներ կամ Node։

Այլընտրանքներ

  • Managed պլատֆորմներ (Vercel, Render, Fly.io, Laravel Cloud)

    Push ես անում կոդը, ստանում ես TLS, scaling և preview-ներ․ ավելի բարձր գին մեկ ռեսուրսի համար և ավելի քիչ վերահսկողություն։

  • AWS / Google Cloud / Azure

    Ցանկացած managed ծառայություն, որը կարող ես ուզել, IAM-ով, VPC-ներով և կոնֆիգուրացիայի իրական աշխատանքով։

  • Managed տվյալների բազաներ

    Շատ VPS provider-ներ վաճառում են managed PostgreSQL կամ MySQL backup-ներով և failover-ով՝ բեռնաթափելով ամենառիսկային մասը։

  • Bare-metal dedicated սերվերներ

    Ամբողջական ֆիզիկական մեքենաներ ծանր workload-երի համար լավ գնով, ավելի երկար provisioning-ով և առանց ակնթարթային resize-ի։

Լավագույն պրակտիկաներ

  1. Նոր սերվերը պաշտպանիր մինչև deploy-ը․ միայն key-եր, firewall, թարմացումներ, ոչ root sudo օգտատեր։
  2. Օգտագործիր և՛ host firewall, և՛ provider-ի cloud firewall։
  3. Տվյալների բազաները պահիր localhost-ում կամ private ցանցում, երբեք՝ public IP-ի վրա։
  4. Ռիսկային փոփոխություններից առաջ snapshot արա, պահիր տվյալների բազայի off-site backup-ներ և պարբերաբար ստուգիր restore-ները։
  5. Upload-ները և backup-ները պահիր object storage-ում, որպեսզի սերվերները մնան փոքր և փոխարինելի։
  6. Սահմանիր billing alert-ներ և ամեն ամիս վերանայիր ռեսուրսները։
  7. Փաստաթղթավորիր յուրաքանչյուր սերվեր՝ ինչ է աշխատում այնտեղ, ինչպես է deploy արվում և ինչպես այն restore անել։

Տարածված սխալներ

  • Provider-ի snapshot-ները համարել միակ backup՝ նույն provider-ի մոտ և երբեք restore չարված։
  • Նախ deploy անել, իսկ hardening-ը՝ հետո, երբ սերվերն արդեն օրերով scan է արվել։
  • Սկզբից ընտրել ամենամեծ instance-ը՝ չափելու և resize անելու փոխարեն։
  • Մոռանալ test սերվերները, snapshot-ները և volume-ները, որոնք ամիսներով շարունակում են վճարվել։
  • Ընտրել օգտատերերից հեռու region կամ հավելվածն ու տվյալների բազան բաժանել տարբեր region-ների միջև։

Խորը վերլուծություն

07Ինչ է իրականում vCPU-ն․ hypervisor-ներ, steal time և storage

VPS-ը վիրտուալ մեքենա է ֆիզիկական host-ի վրա, որը կիսվում է այլ հաճախորդների հետ և աշխատում է hypervisor-ի ներքո, ինչպես KVM-ն։ vCPU-ն սովորաբար host-ի core-ի մեկ hardware thread է, որը բաշխվում է բազմաթիվ guest-երի միջև։ Shared-CPU plan-երի դեպքում provider-ը ենթադրում է, որ ոչ բոլորն են միաժամանակ զբաղված․ երբ հարևաններդ զբաղված են, քո VM-ը սպասում է, և այդ սպասումը երևում է որպես steal time՝ st արժեքը top-ում և vmstat-ում։ Մի քանի տոկոսից բարձր կայուն steal-ը նշանակում է, որ վճարում ես CPU-ի համար, որը չես ստանում, և dedicated-CPU plan-ը կամ այլ host-ը լուծում է դա։ Storage-ն էլ է տարբերվում․ տեղական NVMe-ն արագ է և ցածր latency ունի, բայց կապված է host-ին, մինչդեռ ցանցային block volume-ները դիմանում են host-ի ձախողումներին և կարող են տեղափոխվել, բայց ունեն ավելի բարձր latency և IOPS սահմաններ՝ ըստ volume-ի չափի։ Իմանալը, թե որն ունես, բացատրում է benchmark-ի արդյունքները, որոնք այլապես անիմաստ են թվում։

bash
top -bn1 | head -5            # look at 'st' in the %Cpu(s) line
vmstat 1 10                   # last column 'st' = steal
lscpu | grep -E 'Model name|Thread|Hypervisor'
systemd-detect-virt           # kvm, xen, microsoft...
# Quick disk benchmark (apt install fio), on a test file, not a live DB
fio --name=randread --rw=randread --bs=4k --size=1G --runtime=30 \
    --ioengine=libaio --direct=1 --filename=/var/tmp/fio.test

08Սերվերները որպես կոդ․ cloud-init և վերակառուցելի մեքենաներ

Ամենահուսալի սերվերն այն է, որը կարող ես վերստեղծել րոպեների ընթացքում։ Գրեթե բոլոր provider-ները աջակցում են cloud-init-ը․ VM ստեղծելիս փոխանցում ես user-data փաստաթուղթ, և առաջին boot-ի ժամանակ այն ստեղծում է օգտատերեր, տեղադրում SSH key-եր, տեղադրում փաթեթներ և գործարկում հրամաններ։ Դա hardening-ի առաջին տասը րոպեն վերածում է ֆայլի, որը վերանայում ես և version-ավորում, ուստի յուրաքանչյուր նոր սերվեր սկսվում է նույնականորեն։ Terraform-ի կամ OpenTofu-ի նման գործիքները մեկ մակարդակ վեր են գնում և provider-ի API-ի միջոցով նկարագրում են հենց սերվերները, firewall-ները, volume-ները և DNS գրառումները, իսկ Ansible-ի նման կոնֆիգուրացիոն գործիքները կառավարում են մեքենայի ներսում ընթացիկ փոփոխությունները։ Նույնիսկ եթե երբեք ամբողջությամբ չավտոմատացնես, user-data-ն և գրավոր runbook-ը պահելը նշանակում է, որ կորած սերվերը անհարմարություն է, ոչ թե ճգնաժամ, քանի որ ոչ մի կարևոր բան գոյություն չունի միայն ինչ-որ մեկի հիշողության մեջ։

yaml
#cloud-config
users:
  - name: your_user
    groups: [sudo]
    shell: /bin/bash
    lock_passwd: true
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3...placeholder your_user@laptop
ssh_pwauth: false
disable_root: true
package_update: true
package_upgrade: true
packages: [ufw, fail2ban, unattended-upgrades]
runcmd:
  - [ufw, allow, OpenSSH]
  - [ufw, allow, 80/tcp]
  - [ufw, allow, 443/tcp]
  - [ufw, --force, enable]

09Availability փոքր բյուջեով․ RPO, RTO և single point of failure

Երկու թիվ availability-ի քննարկումները կոնկրետ են դարձնում։ RPO-ն (recovery point objective) այն է, թե որքան տվյալ կարող ես թույլ տալ կորցնել, ինչը սահմանում է backup-ների հաճախականությունը․ գիշերային dump-երը նշանակում են մինչև մեկ օրվա կորած պատվերներ։ RTO-ն (recovery time objective) այն է, թե որքան կարող ես անջատված լինել, ինչը սահմանում է, թե որքանը պետք է ավտոմատացված լինի։ Մեկ VPS-ը single point of failure է, և դա հաճախ ընդունելի է, եթե RPO-ն և RTO-ն համաձայնեցված և փորձարկված են։ Էժան բարելավումները գալիս են առաջինը՝ ավելի հաճախակի dump-եր կամ binlog-ի կամ WAL-ի շարունակական արխիվացում object storage, reserved կամ floating IP, որը կարելի է տեղափոխել փոխարինող սերվերի վրա, չափավոր պահված DNS TTL-ներ և փորձարկված restore։ Load balancer-ի հետևում երկու app սերվեր գործարկելը օգնում է միայն այն ժամանակ, երբ database-ը, session-ները և upload-ներն այլևս մեկ մեքենայի վրա չեն։

  • Համաձայնեցրու RPO-ն և RTO-ն բիզնեսի հետ՝ նախքան ճարտարապետություն ընտրելը։
  • Floating կամ reserved IP-ն թույլ է տալիս փոխել սերվերները՝ առանց DNS-ին սպասելու։
  • Restore-ի վարժանքները գրավոր RTO-ն վերածում են չափվածի։

10Մասշտաբավորման ճանապարհը մեկ VPS-ից

Մասշտաբավորիր քայլերով և միայն այն ժամանակ, երբ չափումները դա պահանջում են։ Առաջին քայլը ուղղահայացն է՝ ավելի մեծ plan, որը րոպեներ է տևում և ոչինչ չի փոխում հավելվածում։ Երկրորդ քայլը բաժանումն է՝ database-ը տեղափոխիր իր սեփական սերվեր կամ managed database private network-ում, որպեսզի հավելվածը և տվյալները դադարեն մրցել հիշողության համար, իսկ upload-ները տեղափոխիր object storage։ Երրորդ քայլը հորիզոնականն է՝ մի քանի նույնական app սերվեր load balancer-ի հետևում։ Դա պահանջում է stateless app սերվերներ՝ session-ները և cache-ը Redis-ում կամ database-ում, ֆայլերը object storage-ում, պլանավորված job-երը ճիշտ մեկ node-ի վրա և deploy-ներ, որոնք համաձայնեցված թարմացնում են բոլոր node-երը։ Չորրորդ քայլը read replica-ներն են, queue-երը դանդաղ աշխատանքի համար և CDN-ը ստատիկ բովանդակության համար։ Յուրաքանչյուր քայլ ավելացնում է ծախս և օպերացիոն աշխատանք, ուստի լավ կարգավորված մեկ սերվերը հաճախ ավելի հեռու է գնում, քան մարդիկ սպասում են։

  • Նախ ուղղահայաց, հետո բաժանիր database-ը, հետո՝ հորիզոնական։
  • Հորիզոնական մասշտաբավորումը պահանջում է stateless app սերվերներ։
  • Համոզվիր, որ cron-ը և scheduler-ները աշխատում են միայն մեկ node-ի վրա։

Իրական իրավիճակներ

01

Կենդանի կայքի միգրացիա նոր սերվեր նվազագույն downtime-ով

Խնդիր

Database-ով և օգտատերերի upload-ներով կայքը պետք է տեղափոխվի հին VPS-ից նորը այլ provider-ի մոտ։ Բիզնեսն ընդունում է առավելագույնը մի քանի րոպե downtime։

Ինչպես լուծել

Մեկ օր կամ ավելի առաջ DNS TTL-ը իջեցրու 300 վայրկյանի։ Նոր սերվերը կառուցիր քո hardening baseline-ից, deploy արա հավելվածը և upload-ները նախապես rsync արա։ Փորձարկիր այն curl --resolve-ով կամ hosts ֆայլի գրառումով։ Cutover-ի ժամանակ հին կայքը դիր maintenance mode-ի, արա վերջնական database dump և վերականգնիր այն նոր սերվերի վրա, գործարկիր upload-ների վերջին rsync-ը, հետո փոխիր DNS-ը։ Հին սերվերը թող աշխատի read-only և հետևիր երկու access log-երին, մինչև թրաֆիկն ամբողջությամբ տեղափոխվի։ Ստուգիր պատվերները, login-ները և email-ները, հետո նորից բարձրացրու TTL-ը։ Հին սերվերը և դրա snapshot-ը պահիր մեկ շաբաթ՝ նախքան ջնջելը։

02

Սերվերը դանդաղ է, և CPU-ի գրաֆիկներն անիմաստ են

Խնդիր

Shared-CPU VPS-ի վրա response time-երը պատահական ժամերի կրկնապատկվում են։ Հավելվածի CPU-ի օգտագործումը գրեթե չի փոխվում, և ոչ deploy-ներ են եղել, ոչ թրաֆիկի ցատկեր։

Ինչպես լուծել

Նայիր steal time-ին՝ vmstat 1 կամ top դանդաղ ժամանակահատվածում։ Եթե st-ը պարբերաբար բարձրանում է մոտ 5-10 տոկոսից վեր, նույն host-ի այլ tenant-ներ վերցնում են CPU ժամանակը, որին քո VM-ը սպասում է։ Ապացույցներ հավաքիր monitoring agent-ով, որը մի քանի օր գրանցում է steal-ը։ Տարբերակները՝ ամենաէժանից․ խնդրիր support-ին VM-ը տեղափոխել այլ host, resize արա այլ plan-ի (ինչը հաճախ տեղափոխում է այն), կամ անցիր dedicated-CPU plan-ի՝ կայուն արտադրողականության համար։ Բացառիր նաև սկավառակը․ համեմատիր iostat-ի latency-ն volume-ի IOPS սահմանի հետ, քանի որ սահմանափակված ցանցային volume-ը նման ախտանիշներ է տալիս ցածր CPU-ով։

03

Provider-ի account-ի հասանելիության կորուստ

Խնդիր

Թիմի անդամի email-ը կոտրվել է, և հարձակվողը փորձել է մուտք գործել cloud account։ Գիտակցում ես, որ բոլոր սերվերները, snapshot-ները և backup-ները գտնվում են այդ մեկ account-ում։

Ինչպես լուծել

Նախ զսպիր․ reset արա password-ը, յուրաքանչյուր օգտատիրոջից պահանջիր hardware key-եր կամ app-ի վրա հիմնված two-factor authentication, հետ վերցրու API token-ները և վերանայիր վերջին ակտիվությունը և ստեղծված ռեսուրսները։ Հետո վերացրու single point of failure-ը․ database dump-երը և upload-ները ամեն օր պատճենիր object storage այլ provider-ի մոտ՝ credential-ներով, որոնք կարող են գրել, բայց չեն կարող ջնջել, և միացրու object versioning կամ retention lock, որպեսզի backup-ները հնարավոր չլինի ջնջել։ Յուրաքանչյուր մարդու տուր իր սեփական account-ը least-privilege դերերով՝ ընդհանուր login-ների փոխարեն։ Փաստաթղթավորիր, թե ինչպես վերակառուցել սերվերները cloud-init-ից և այլ տեղում պահված backup-ներից, և դիր billing alert-ներ, որոնք նաև արագ բռնում են crypto-mining չարաշահումը։

Արագ ուղեցույց

Ստուգել CPU steal time-ը
vmstat 1 5 (սյունակ st)
Որ hypervisor-ի վրա եմ
systemd-detect-virt
Ավարտվե՞լ է արդյոք cloud-init-ը հաջողությամբ
cloud-init status --long
Առաջին boot-ի կարգավորման log-երը
sudo less /var/log/cloud-init-output.log
Փորձարկել կայքը նոր սերվերի վրա մինչև DNS-ը
curl --resolve example.com:443:203.0.113.20 https://example.com/
Ստուգել գրառման ընթացիկ TTL-ը
dig +noall +answer example.com A
Upload-ների վերջնական sync cutover-ի ժամանակ
rsync -aH --delete --dry-run old:/srv/app/uploads/ /srv/app/uploads/
Սկավառակի հիմնական benchmark
fio --name=t --rw=randread --bs=4k --size=1G --direct=1 --runtime=30
Դրսից տեսանելի բաց port-երը
nmap -Pn -p 1-1000 203.0.113.10

Իմ իրական նախագծերում

  • Գործարկում եմ չորս production Ubuntu սերվեր DigitalOcean droplet-ների վրա, որոնք host են անում Laravel և Next.js կայքեր իմ սեփական պրոդուկտների և հաճախորդների համար։
  • Դրանցից յուրաքանչյուրի իմ baseline-ը՝ միայն SSH key-եր, ufw գումարած provider-ի firewall միայն 22, 80 և 443 բաց port-երով, unattended-upgrades, fail2ban և ստուգված restore-ով snapshot-ներ։
  • Իմ պլանն է չորս սերվերը միավորել երկուսի մեջ՝ սերվերից դուրս backup-ներով և upload-ների տեղափոխմամբ S3-համատեղելի object storage, migration-ը կատարելով inventory, պատճենում, ստուգում, DNS-ի փոխարկում քայլերով և հին սերվերը պահելով, մինչև ամեն ինչ ստուգված լինի։

Հարցեր և պատասխաններ

Q1Ե՞րբ կընտրես VPS՝ Vercel-ի կամ Render-ի նման managed պլատֆորմի փոխարեն։

VPS-ը իմաստ ունի, երբ ինձ պետք է stack-ի լրիվ վերահսկողություն, օրինակ՝ background worker-ներ, cron, WebSocket-ներ, custom PHP extension-ներ կամ մեկ տվյալների բազա կիսող մի քանի հավելված, և երբ մեկ ռեսուրսի գինը կարևոր է։ Փոքր VPS-ը հաճախ արժե համարժեք managed ռեսուրսների մի մասը և ներառում է առատ traffic։ Գինը պատասխանատվությունն է․ թարմացումները, անվտանգությունը, backup-ները և monitoring-ը իմն են։ Managed պլատֆորմը հաղթում է, երբ թիմը ուզում է արագ թողարկել առանց operations աշխատանքի, պետք են preview deployment-ներ և ավտոմատ scaling, կամ հավելվածը front-end-ծանր է և համապատասխանում է պլատֆորմի մոդելին։ Շատ նախագծեր համատեղում են երկուսը՝ front end-ը պլատֆորմի վրա, API-ները և worker-ները՝ VPS-ի։

Q2Ինչպե՞ս ես որոշում, թե որքան մեծ պետք է լինի սերվերը։

Սկսում եմ նրանից, թե ինչ է աշխատելու դրա վրա՝ վեբ սերվեր, app runtime, տվյալների բազա, cache և worker-ներ, և նախ գնահատում եմ հիշողությունը, որովհետև RAM-ը սովորաբար վեբ workload-երի առաջին սահմանն է։ Փոքր հավելվածը նորմալ աշխատում է 2 GB-ի վրա․ նույն մեքենայի վրա տվյալների բազայով և worker-ներով սկսում եմ 4 GB-ից։ Հետո մի քանի շաբաթ չափում եմ իրական օգտագործումը՝ load average-ը core-երի նկատմամբ, available հիշողությունը, swap ակտիվությունը, սկավառակի աճը և response time-երը։ Provider-ների մեծ մասում մեծացնելը րոպեներ է տևում, ուստի համեստ սկսելը և տվյալների հիման վրա scale անելը ավելի էժան է, քան մեծ գուշակելը։ Եթե մեկ ռեսուրս գերակշռում է, ընտրում եմ դրա համար կարգավորված պլանի տիպ, օրինակ՝ dedicated CPU։

Q3Ո՞րն է տարբերությունը snapshot-ի և backup-ի միջև։

Snapshot-ը ամբողջ սկավառակի point-in-time image է, որն արվում է provider-ի կողմից։ Այն հիանալի է ձախողված upgrade-ից հետո սերվերը հետ վերադարձնելու համար, բայց սովորաբար գտնվում է նույն provider-ի և region-ի մոտ, և աշխատող տվյալների բազայի snapshot-ը կարող է հետևողական չլինել։ Backup-ը, ավելի խիստ իմաստով, քո տվյալների պատճեն է, որը կարող է գոյատևել սերվերի, հաշվի կամ provider-ի կորստից, օրինակ՝ տվյալների բազայի գիշերային dump և upload արված ֆայլեր՝ պատճենված այլ տեղի object storage։ Ես օգտագործում եմ երկուսն էլ և վստահում եմ դրանցից ցանկացածին միայն այն բանից հետո, երբ նոր սերվերի վրա test restore-ն իսկապես աշխատել է։

Q4Ի՞նչ ես անում նոր սերվերի վրա առաջին րոպեներին։

Մինչև որևէ բան deploy անելը՝ մուտք եմ գործում ստեղծման ժամանակ ավելացրած SSH key-ով, թարմացնում եմ բոլոր փաթեթները, ստեղծում եմ անձնական օգտատեր sudo-ով և երկրորդ session-ում հաստատում եմ, որ key login-ը աշխատում է այդ օգտատիրոջ համար։ Հետո անջատում եմ password authentication-ը և root login-ը SSH-ով և վավերացնում եմ config-ը sshd -t-ով։ Միացնում եմ ufw-ն միայն SSH-ով, HTTP-ով և HTTPS-ով և նույն կանոնները սահմանում եմ provider-ի firewall-ում։ Միացնում եմ unattended-upgrades-ը, տեղադրում եմ fail2ban, սահմանում եմ ժամային գոտին և hostname-ը, փոքր instance-ների վրա ավելացնում եմ swap, հետո մաքուր snapshot եմ անում։ Հաջորդը monitoring-ն ու սկավառակի alert-ն են, հետո՝ հավելվածը։

Q5Ինչպե՞ս ես վերահսկում cloud-ի ծախսերը։

Նախ տեսանելիություն՝ billing alert-ներ յուրաքանչյուր հաշվի վրա և յուրաքանչյուր ռեսուրս անվանված կամ tag արված ըստ նախագծի, որպեսզի ոչինչ անանուն չլինի։ Հետո ամսական վերանայում՝ մոռացված test սերվերները, հին snapshot-ները, չմիացված volume-ները և չօգտագործվող IP-ները կամ load balancer-ները ջնջելու համար։ Instance-ների չափը որոշիր monitoring-ի, ոչ թե գուշակությունների հիման վրա։ Հետևիր egress-ին․ մեծ cloud-երում ելքային traffic-ը վճարվում է ըստ գիգաբայթի, ուստի static asset-ների առջևում CDN-ը և ողջամիտ egress գնով object storage-ը կարևոր են։ Կայուն workload-երի համար reserved capacity-ն կամ savings պլանները նվազեցնում են ծախսը, բայց միայն այն բանից հետո, երբ օգտագործումը հայտնի է։ Հաճախ ամենամեծ խնայողությունը միավորումն է․ մի քանի կիսապարապ սերվեր դառնում են մեկ ճիշտ չափի սերվեր։

Q6Ինչո՞ւ օգտագործել private networking սերվերների միջև։

Private networking-ը նույն region-ի սերվերներին տալիս է ներքին ցանց private IP-ներով, որոնց ինտերնետը չի կարող հասնել։ Այդ դեպքում տվյալների բազան, Redis-ը կամ ներքին API-ները կարող են լսել միայն private ինտերֆեյսի վրա, ուստի դրանք երբեք public չեն բացվում, նույնիսկ եթե host firewall-ի կանոնը սխալ է։ Private ցանցով traffic-ը սովորաբար չի հաշվվում bandwidth-ի սահմանաչափի մեջ և ունի ավելի ցածր latency։ Այն նաև պարզեցնում է firewall կանոնները․ տվյալների բազայի port-ը թույլատրիր միայն private subnet-ից։ Լրացուցիչ պաշտպանության համար զգայուն միացումները միևնույն է գաղտնագրում եմ TLS-ով, քանի որ private-ը չի նշանակում մեկուսացված բոլոր provider-ների մյուս բոլոր հաճախորդներից։

Սենիոր մակարդակի հարցեր

S1Հաճախորդը ցանկանում է «high availability» փոքր բյուջեով։ Ինչպե՞ս ես մոտենում դրան։

Սկսում եմ արտահայտությունը թվերի վերածելով՝ ամսական քանի րոպե downtime է ընդունելի, և որքան տվյալների կորուստ։ Փոքր բիզնեսների մեծ մասին ավելի շատ պետք է արագ, փորձարկված վերականգնում, քան իրական redundancy։ Ուստի առաջին ներդրումներն են՝ հաճախակի off-site backup-ներ database-ի point-in-time recovery-ով, monitoring alert-ներով, cloud-init-ով կամ Terraform-ով նկարագրված ենթակառուցվածք, floating IP և փորձարկված restore, որը բավարարում է համաձայնեցված RTO-ն։ Իրական HA-ն, այսինքն՝ առանց single point of failure-ի, պահանջում է առնվազն երկու app սերվեր, load balancer, replicated կամ managed database և ընդհանուր storage, ինչը բազմապատկում է ծախսն ու բարդությունը։ Ներկայացնում եմ երկու տարբերակն էլ՝ գներով և ձախողման ռեժիմներով, և սովորաբար խորհուրդ եմ տալիս վերականգնման վրա կենտրոնացած դիզայնը, մինչև եկամուտը արդարացնի redundancy-ն։

S2Ե՞րբ կտեղափոխվես VPS-ից AWS-ի նման hyperscale cloud։

Ոչ միայն աճի պատճառով, քանի որ լավ չափված VPS կարգավորումը զարմանալիորեն հեռու է մասշտաբավորվում։ Տեղափոխությունն իմաստ ունի, երբ ի հայտ է գալիս կոնկրետ կարիք՝ managed ծառայություններ, որոնք թիմը այլապես վատ կսպասարկեր, ինչպես multi-zone managed database-ը, queue-երը կամ serverless ֆունկցիաները, compliance պահանջներ, որոնք պահանջում են սերտիֆիկացված ենթակառուցվածք և մանրամասն audit trail-եր, multi-region deploy, մեծ թիմի համար նուրբ identity և access control, կամ մայր ընկերություն, որը ստանդարտացնում է մեկ cloud-ի վրա։ Ծախսերն իրական են՝ ավելի բարդ networking և IAM, egress վճարներ, վճար յուրաքանչյուր հրապարակային IPv4 հասցեի համար և սեփականական ծառայություններին lock-in-ի ռիսկ։ Միջին ճանապարհը տարածված է․ միջուկը պահիր VPS-ի կամ տեղափոխելի container-ների վրա և օգտագործիր ընտրված managed ծառայություններ այնտեղ, որտեղ դրանք ակնհայտորեն աշխատանք են խնայում։

S3Ինչպե՞ս ես սերվերները դարձնում փոխարինելի, այլ ոչ թե եզակի։

Համոզվելով, որ ոչ մի կարևոր վիճակ կամ գիտելիք գոյություն չունի միայն մեքենայի վրա։ Կոնֆիգուրացիան կոդ է՝ cloud-init user-data առաջին boot-ի համար, Ansible կամ նմանատիպ գործիք ընթացիկ կոնֆիգուրացիայի համար, և Terraform կամ OpenTofu հենց սերվերների, firewall-ների և DNS-ի համար։ Հավելվածի deploy-ները գալիս են pipeline-ից, ոչ թե ձեռքով խմբագրումներից։ Տվյալներն ապրում են դրսում կամ շարունակաբար պատճենվում են դուրս՝ database-ները backup են արվում off-site, upload-ները object storage-ում են, log-երը ուղարկվում են կենտրոնացված։ Secret-ները գալիս են secret store-ից կամ պաշտպանված env ֆայլերից, որոնք վերակառուցվում են ավտոմատացմամբ։ Հետո ապացուցում եմ դա՝ ժամանակացույցով զրոյից վերակառուցելով սերվեր։ Գինը նախնական ջանքն ու կարգապահությունն է, քանի որ սերվերի վրա մեկ ձեռքով hotfix-ը խախտում է երաշխիքը, մինչև այն հետ դրվի կոդի մեջ։

Բառարան

Hypervisor
Ծրագրակազմ, ինչպես KVM-ն, որը մեկ ֆիզիկական host-ի վրա գործարկում է բազմաթիվ վիրտուալ մեքենաներ և բաշխում է դրա CPU-ն, հիշողությունը և սկավառակները։
vCPU
VM-ին տրված վիրտուալ պրոցեսոր, սովորաբար ֆիզիկական core-ի մեկ hardware thread, որը հնարավոր է կիսվի այլ guest-երի հետ։
Steal time
Ժամանակ, երբ VM-ը ցանկանում էր աշխատել, բայց hypervisor-ը CPU-ն տվել էր այլ guest-ի։ Բարձր steal-ը նշանակում է աղմկոտ հարևաններ։
IOPS
Input/output operations per second․ քանի փոքր կարդալու և գրելու գործողություն է սկավառակը մշակում, հաճախ սահմանափակված ըստ cloud volume-ի։
cloud-init
Cloud image-ների ստանդարտ առաջին boot-ի գործիքը, որը կիրառում է user-data՝ օգտատերեր, key-եր, փաթեթներ և հրամաններ։
Floating IP
Հրապարակային IP, որը կարելի է տեղափոխել տարածաշրջանի սերվերների միջև՝ թույլ տալով failover առանց DNS-ը փոխելու։
RPO
Recovery point objective․ տվյալների առավելագույն քանակը, չափված ժամանակով, որի կորուստը ընդունում ես միջադեպի ժամանակ։
RTO
Recovery time objective․ առավելագույն ժամանակը, որի ընթացքում ծառայությունը կարող է անջատված լինել, մինչև պետք է վերականգնվի։
Egress
Provider-ի ցանցից դուրս տվյալների փոխանցում, hyperscale cloud-ներում հաճախ վճարովի՝ ըստ գիգաբայթի։

Պրոդուկտի գաղափար ունե՞ք։Եկեք ստեղծենք այն։

Պատմեք ձեր գաղափարի, պրոդուկտի կամ թիմի մասին։ Սովորաբար պատասխանում եմ մեկ աշխատանքային օրվա ընթացքում։