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.
sumber
Jawaban:
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.
sumber
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.
sumber
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:
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.
sumber
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.
sumber
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.
sumber
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.
sumber