Adakah gagasan tentang cara menjalankan pemeliharaan di situs yang selalu digunakan?

18

Saya membantu dengan situs game besar di Australia. Kami menjalankan kompetisi mulai pukul 07:00 waktu setempat hingga 01:00 hari berikutnya, setiap hari dalam seminggu. Kami belum melewatkan satu hari sejak situs ini dirilis. Secara alami, ini membuat pemeliharaan sangat sulit untuk dijalankan, dan kami menemukan bahwa server pementasan kami hingga 50 berkomitmen di depan cabang produksi kami. Biasanya, pengembang utama harus bangun sangat pagi untuk menggabungkan cabang dan memastikan semuanya berfungsi dengan baik.

Kami telah mencoba membuat situs pementasan kami sama seperti yang kami bisa dengan lokasi produksi, tetapi kami hanya bisa membuatnya sangat mirip.

Situs kami didasarkan Laravel dengan server Node.JS untuk waktu nyata. Kami menggunakan Laravel Forge.

Adakah yang punya saran tentang bagaimana kita bisa mendorong pembaruan lebih sering? Kami terbuka untuk apa pun.

cheese5505
sumber
Mengapa penyebaran begitu lama?
Michael Hampton
@MichaelHampton Penerapan kami tidak butuh waktu lama, hanya saja kami tidak sanggup membayar waktu henti jika terjadi kesalahan.
cheese5505
1
Maka, saya kira pertanyaannya adalah: Mengapa kemunduran butuh waktu begitu lama?
Michael Hampton
@MichaelHampton kami belum melihat dengan benar rollback, namun terkadang kami melakukan pembaruan besar yang akan membuat situs ini terlalu lama.
cheese5505
5
Apa pun yang menghabiskan banyak waktu, itulah yang perlu Anda perhatikan.
Michael Hampton

Jawaban:

22

Ada banyak hal yang dapat Anda lakukan untuk meningkatkan proses penempatan Anda. Beberapa dari mereka adalah:

  • Pastikan kode Anda diuji dengan baik.

    Idealnya Anda harus memiliki cakupan uji unit 100%, serta pengujian integrasi untuk setiap skenario yang mungkin.

    Jika Anda belum mendapatkan ini, Anda mungkin harus meninggalkan semuanya dan menyelesaikannya.

    Lihatlah perkembangan yang didorong oleh perilaku.

    Memiliki rangkaian uji lengkap akan memungkinkan Anda untuk ...

  • Jalankan integrasi berkelanjutan.

    Setiap kali seseorang melakukan perubahan, CI kemudian dapat secara otomatis menjalankan test suite di atasnya. Jika test suite lulus, maka dapat langsung digunakan (atau menjadwalkan penempatan). Untuk perubahan yang tidak memerlukan perubahan signifikan pada database Anda, ini saja akan menghemat banyak waktu dan sakit kepala.

    Jika ada masalah, CI juga dapat memberi Anda rollback satu klik.

    CI jauh kurang berguna jika suite pengujian Anda tidak lengkap dan benar, karena seluruh premis bersandar pada kemampuan untuk memvalidasi kode Anda dengan cara otomatis.

  • Buat pembaruan atom.

    Idealnya Anda tidak hanya menyalin file baru dari yang lama di server produksi. Alih-alih, gunakan alat seperti capistrano, yang menyalin setiap file ke lokasi baru, dan kemudian menggunakan tautan simbolis untuk menunjuk ke penyebaran yang diinginkan. Rolling back adalah instan karena hanya dengan mengubah symlink untuk menunjuk ke penyebaran sebelumnya. (Meskipun ini tidak selalu mencakup migrasi database Anda.)

    Lihat juga apakah wadah seperti Docker dapat membantu Anda.

  • Buat perubahan kecil, lebih sering.

    Apakah Anda memiliki tes, CI, atau tidak sama sekali, ini saja dapat membantu Anda secara signifikan. Setiap perubahan harus memiliki cabang git sendiri, dan penyebaran harus memiliki perubahan sesedikit mungkin. Karena perubahan lebih kecil, ada kemungkinan kesalahan yang kecil selama penerapan.

    Pada catatan itu, buat perubahan lebih terisolasi jika memungkinkan. Jika Anda telah membuat perubahan pada game Omaha, dan itu tidak memengaruhi Texas Hold'em, 5 card stud, atau yang lainnya, maka itulah satu-satunya game yang perlu ditangguhkan untuk pemeliharaan.

  • Analisis apa saja yang sudah berjalan lama.

    Anda menyebutkan beberapa bagian penerapan Anda membutuhkan waktu lama. Ini mungkin perubahan skema basis data. Sebaiknya lihat DBA di basis data Anda, bersama dengan setiap perubahan skema, untuk melihat apa yang dapat berkinerja lebih baik.

    Mintalah seorang ahli masalah melihat bagian lain dari penyebaran yang memakan banyak waktu.

  • Bekerja dengan jam yang aneh.

    Anda mungkin sudah melakukan ini, tetapi perlu disebutkan. Pengembang (dan sysadmin!) Seharusnya tidak diharapkan bekerja "9 hingga 5" lagi, terutama untuk operasi 24x7. Jika seseorang diharapkan menghabiskan waktu semalam untuk menjaga penyebaran, memperbaiki masalah, dan kemudian menjaga jadwal siang hari, harapan Anda tidak realistis, dan Anda membuat orang itu kelelahan.

Michael Hampton
sumber
Solusi paling sederhana di sini adalah dengan menggunakan scripting penempatan dalam alat seperti Capistrano dan bahkan mungkin melakukan load balancing juga.
JakeGould
Terima kasih atas sarannya. Kami akan melihat ini. Saat ini kami tidak memiliki test suite sama sekali, dan saya benar-benar ingin melihatnya tetapi situs tersebut telah dalam pengembangan selama lebih dari 8 bulan dan sangat besar sehingga diperlukan lebih dari satu minggu untuk membuatnya. Kami menjalankan Laravel Forge yang hanya menghubungkan versi baru ke folder tempat nginx diatur. Saya tidak dapat bekerja berjam-jam karena sekolah, dan hal yang sama juga untuk pengembang lainnya.
cheese5505
1
@ cheese5505 Saya tahu ini adalah frustasi dan ini tidak memecahkan masalah Anda, tetapi ketika Anda mengatakan ini, “... begitu besar itu akan mengambil lebih dari seminggu untuk membuat satu.” yang tampaknya terang-terangan konyol. Setiap pengembangan waras dan proses penyebaran akan memungkinkan server untuk dibangun dalam waktu kurang dari satu hari atau mungkin beberapa jam hingga satu jam. Anda harus benar-benar meninjau apa yang telah Anda lakukan untuk membangun tumpukan barang yang tidak dapat dikelola ini untuk menghindari hal ini. Masalahnya bukan kompleksitas tetapi pandangan ke depan dasar dalam perencanaan.
JakeGould
1
"Saat ini kami tidak memiliki test suite sama sekali" - perbaiki ini sekarang , sebelum mengembangkan fitur baru. Ini adalah titik sakit terbesar Anda dan akan menjadi risiko ketersediaan. Pengujian otomatis akan sangat membantu mencegah pemadaman dan akan mengurangi rasa sakit ops secara signifikan.
Josh
6

Tampaknya dari apa yang Anda katakan bahwa Anda memiliki jendela pemeliharaan dari jam 1 pagi sampai jam 7 pagi setiap hari masalahnya bukan waktu tetapi kenyamanan. Ini normal dan banyak orang hanya menanganinya sebagai bagian dari bisnis.

Anda dapat memiliki 2 (atau lebih backend) sistem dengan ujung depan yang mengarahkan lalu lintas ke mana pun saat ini tinggal. Setelah Anda senang bahwa rilis akan berfungsi, Anda memberi tahu ujung depan untuk beralih ke sistem baru. ini harus mudah untuk skrip dan membutuhkan waktu singkat.

Sekarang Anda memiliki pilihan untuk meninggalkan sistem lama seperti semula sehingga Anda dapat mundur atau memperbaruinya sehingga dapat digunakan sebagai cadangan untuk sistem langsung hingga saatnya membangun / menguji pembaruan berikutnya.

user9517 mendukung GoFundMonica
sumber
Ketika Anda membedakan backend dari frontend, apakah maksud Anda arsitektur perangkat lunak yang sepenuhnya modular? Atau arsitektur server seperti penyeimbang beban?
JakeGould
2
hanya sesuatu yang menerima koneksi dan mengirimkannya ke backend utama saat ini.
user9517 mendukung GoFundMonica
5

Mengubah jawaban lain: Anda harus mengikuti model penyebaran biru-hijau . Saat Anda ingin merilis versi baru, Anda menyebarkannya ke situs web pementasan internal. Kemudian, Anda dapat menjalankan tes otomatis di situs produksi versi berikutnya. Ketika tes melewati Anda arahkan penyeimbang beban untuk menggunakan situs web baru.

Ini membantu dengan cara berikut:

  1. Masalah parah selalu ditemukan dengan nol downtime.
  2. Beralih ke versi baru sama sekali tidak memiliki waktu henti karena versi baru sudah dimulai dan dihangatkan.
  3. Anda dapat beralih kembali ke versi lama kapan saja karena masih berjalan secara fisik.

Semua masalah lain yang telah Anda dan orang lain sebutkan menjadi tidak begitu parah ketika Anda dapat menggunakannya kapan saja dengan cara yang bebas stres. Model penyebaran biru-hijau adalah solusi yang cukup lengkap untuk masalah penempatan.

usr
sumber
Kami sudah memiliki server pementasan yang kami gunakan untuk menguji, tetapi saat ini produksi dan pementasan ada pada penyedia server yang berbeda di lokasi yang berbeda. Kami mencoba untuk memindahkan produksi ke tempat pementasan karena memberikan kinerja yang lebih baik bagi kami.
cheese5505
1
Kuncinya adalah hanya harus mengalihkan penyeimbang beban ke versi yang sudah terbukti. Dengan model saat ini Anda tidak memilikinya.
usr
1
Seberapa baik model ini sangat tergantung pada apa yang dilakukan situs. Jika situs tersebut stateless maka bagus tetapi jika bukan stateless Anda harus mengetahui bagaimana Anda akan mengalihkan status itu pada peralihan.
Peter Green
@PeterGreen sangat sulit bagi situs web untuk menjadi negara karena itu tidak memungkinkan untuk pengelompokan dan negara dapat hilang kapan saja di redeployment / reboot / crash / bluescreen dll. Oleh karena itu, ini sangat tidak umum.
usr
@ Usr sebagian besar situs web memiliki status. Keadaan itu dapat disimpan dalam file atau dalam database. Dalam kasus terakhir, basis data dapat berupa lokal atau jauh. Beberapa upgrade cenderung berdampak pada status peningkatan dan rollback yang tidak sesederhana hanya dengan beralih kode.
Peter Green
3

Apa yang akan Anda lakukan jika pusat data utama Anda mengalami pemadaman, yang terjadi di semua pusat data dari waktu ke waktu? Anda mungkin menerima downtime, Anda mungkin gagal ke pusat data lain, Anda mungkin berjalan dalam mode aktif-aktif di beberapa pusat data sepanjang waktu, atau Anda mungkin memiliki beberapa rencana lain. Apapun itu, lakukan ketika Anda melakukan rilis, dan kemudian Anda dapat menurunkan pusat data utama Anda selama rilis. Jika Anda siap untuk memiliki waktu henti ketika pusat data Anda mengalami pemadaman, maka Anda siap untuk memiliki waktu henti, jadi itu seharusnya tidak menjadi masalah selama rilis.

Mike Scott
sumber
2

Untuk menambah jawaban sebelumnya:

  • Gunakan strategi penyebaran yang memungkinkan untuk rollback dan perpindahan instan, Capistrano atau hampir semua sistem penyebaran lainnya akan membantu dengan ini. Anda bisa menggunakan hal-hal seperti snapshot database dan symlink kode untuk dapat dengan cepat kembali ke keadaan sebelumnya.

  • Gunakan manajemen konfigurasi lengkap, jangan biarkan apa pun dikelola secara manual. Sistem seperti SaltStack, Ansible dan Puppet adalah contohnya. Mereka dapat diterapkan untuk konfigurasi wadah Docker dan kotak gelandangan juga.

  • Gunakan HA untuk memastikan Anda dapat membatalkan permintaan saat memutakhirkan node. Jika pemutakhiran gagal, cukup turunkan simpul, dan ketika itu dibatalkan, bawa kembali dan solusi HA Anda akan melihat dan mendorong permintaan ke simpul tersebut lagi. HAProxy adalah sebuah contoh, tetapi nginx berfungsi dengan baik juga.

  • Pastikan aplikasi dapat menangani instance bersamaan, menggunakan repositori data terpusat versi untuk data non-kode yang perlu disimpan dalam disk, seperti cache. Dengan cara ini, Anda tidak akan pernah menjalankan aplikasi yang ditingkatkan untuk men-cache file dari versi yang berbeda. Ini akan dilakukan di atas pembersihan cache dan melakukan pemanasan cache tentu saja. (Masalah caching hanyalah sebuah contoh)

Saya biasanya mengatur alur kerja di mana manajer tim dapat menyetujui permintaan menggabungkan ke cabang khusus yang melakukan semua hal CI normal, tetapi sebagai langkah terakhir tambahan juga mulai mendorong ke node produksi. Apa yang pada dasarnya Anda lakukan adalah menjalankan penyebaran CI manual ke instance produksi. Jika instance itu tidak menghasilkan respons yang tidak valid, rusak, atau melakukan hal-hal aneh pada data Anda, Anda kemudian memutakhirkan semua node menggunakan solusi CI pilihan Anda. Dengan cara ini, jika satu penyebaran berfungsi, Anda tahu semua penyebaran akan bekerja untuk tag / komit tertentu.

Saat ini, kedengarannya seolah-olah Anda menjalankan aplikasi produksi pada satu node, dengan satu proses penyebaran, satu sumber dan satu target. Secara praktis ini berarti bahwa setiap langkah dalam alur kerja tersebut adalah titik kegagalan yang dengan sendirinya dapat merusak situs web. Memastikan bahwa hal seperti itu tidak dapat terjadi adalah dasar dari semua proses CI, HA dan failover. Jangan jalankan hanya satu simpul, jangan jalankan hanya satu proses HA, jangan jalankan hanya pada satu alamat IP, jangan jalankan hanya satu CDN dll. Ini mungkin terdengar mahal, tetapi menempatkan duplikat dari apa yang sudah Anda miliki di rak di server dengan koneksi sendiri biasanya biaya kurang dari satu jam downtime di situs bisnis.

John Keates
sumber
0

Saya secara global setuju dengan Michael pada setiap poinnya ( /server//a/739449/309477 ).

Menurut pendapat saya, peningkatan pertama yang harus Anda lakukan adalah menggunakan alat penyebaran (Capistrano).

Ini akan memungkinkan Anda untuk menggunakan secara damai, lalu beralih ke versi yang lebih baru secara instan. Jika terjadi kesalahan, Anda dapat langsung beralih ke versi yang berfungsi, hanya dengan mengubah symlink saat ini ke versi yang berfungsi.

Dan Capistrano cukup cepat untuk menangani pertama (dibandingkan dengan mulai menggunakan tes dan CI yang akan menjadi investasi waktu yang lebih besar).

Kedua, jika uang bukan masalah utama Anda, Anda harus memiliki server pengembangan iso-prod untuk menguji aplikasi Anda sebelum menggunakannya dalam produksi. Gunakan solusi industri (Ansible, Chef, Puppet) untuk mengelola instance VPS.

nahk
sumber