Apa praktik terbaik untuk menyebarkan kode baru di situs langsung (e-commerce)?
Untuk saat ini saya telah menghentikan apache selama +/- 10 detik ketika mengganti nama direktori public_html_new
menjadi public_html
dan menjadi lama public_html_old
. Ini membuat down-time pendek, sebelum saya memulai Apache lagi.
Pertanyaan yang sama berlaku jika menggunakan Git untuk menarik repo baru ke direktori langsung. Bisakah saya menarik repo saat situs aktif? Dan bagaimana kalau saya perlu menyalin DB juga?
Selama tar (tujuan pencadangan) kompresi situs langsung saya perhatikan bahwa perubahan terjadi pada direktori media. Itu menunjukkan kepada saya bahwa file terus berubah secara berkala. Dan jika perubahan ini dapat mengganggu jika Apache tidak berhenti selama penyebaran.
Yang tercepat dan termudah adalah dengan menggunakan direktori versi seperti
dan gunakan tautan simbolis saat ini sebagai html_root Anda:
Teknik ini terintegrasi sempurna ke dalam sistem kontrol revisi (svn, git, lincah, ...) karena Anda dapat checkout cabang & tag, mengubah tautan simbolik dan memuat ulang Apache. The downtime minimal menggunakan teknik ini dan itu memungkinkan rollback sangat mudah .
Ini juga terintegrasi dengan baik dengan sistem penyebaran yang lebih kompleks seperti paket RPM, atau manajemen perubahan konfigurasi (koki, boneka, dll).
sumber
ln -snf
untuk menghancurkan symlink asli, operasi yang mendasarinya adalahunlink
dansymlink
. Ada kemungkinan pengguna mendapatkan 404 selama pembaruan. Ini tidak lebih baik dari sekadar mengganti nama direktori asli dan mengganti nama yang baru ke tempatnya (dengan asumsi Anda tidak melintasi sistem file). Lihat jawaban di atas dengan tanda centang di sebelahnya, yang membahas masalah ini.Mengganti nama direktori tanpa mematikan Apache seharusnya juga berfungsi. Itu akan memperpendek jendela secara signifikan.
mv public_html public_html_old && mv public_html_new public_html
harus selesai dalam sepersekian detik.Beberapa kelemahan adalah bahwa pendekatan ini akan memberikan
404
permintaan yang masih bisa terjadi selama jendela. Dan jika Anda menjalankan perintah di atas tanpa memilikipublic_html_new
direktori itu akan gagal dan meninggalkan Anda dengan situs memberikan404
pada setiap permintaan.Melakukannya secara atomis dengan direktori tidak mendukung. Tetapi Anda bisa melakukannya dengan symlink. Alih-alih memiliki direktori bernama
public_html
, memiliki direktori bernamapublic_html.version-number
dan symlink yang disebutpublic_html
menunjuk ke direktori itu. Sekarang Anda dapat membuat direktori bernamapublic_html.new-version-number
dan symlink baru bernamapublic_html.new
.Kemudian Anda dapat mengubah nama
public_html.new
untukpublic_html
beralih atom. Perhatikan bahwamv
"terlalu cerdas" untuk melakukan penggantian nama itu, tetapi itu bisa dilakukan menggunakanos.rename
dari python atau apa pun yang akan memanggilrename
system call tanpa berusaha menjadi pintar.Apa yang harus dilakukan dengan basis data tergantung pada basis data apa yang Anda gunakan, dan untuk apa Anda menggunakannya. Anda perlu memberikan lebih banyak detail tentang basis data sebelum kami dapat memberikan jawaban yang baik untuk bagian pertanyaan Anda itu.
sumber
mv
ada-T
opsi yang mencegahnya mengikuti symlink. Ini akan membiarkan Anda atom mengubah namapublic_html.new
lebihpublic_html
, dengan asumsi kedua adalah link lembut.Symlinks dan mv adalah teman Anda, namun, jika Anda benar-benar harus menghindari pengguna akhir mendapatkan halaman kesalahan saat menggunakan versi baru, Anda harus memiliki proxy terbalik atau penyeimbang beban di depan setidaknya 2 server backend (apache dalam kasus Anda).
Selama penerapan, Anda hanya perlu menghentikan satu backend pada satu waktu, menyebarkan kode baru, restart dan kemudian beralih pada backend yang tersisa.
Pengguna akhir akan selalu diarahkan ke backend yang baik oleh proxy.
sumber
Jika Anda menerapkan perubahan secara teratur pada sistem produksi, saya akan menjaga siklus hidup terstruktur. Praktik yang baik adalah Capistrano http://capistranorb.com/ . Ini adalah solusi open source untuk menyebarkan perangkat lunak pada satu atau lebih server pada beberapa platform dan konfigurasi.
Untuk Magento bahkan ada sebuah plugin: https://github.com/augustash/capistrano-ash/wiki/Magento-Example
Untuk server tunggal dan transisi yang hampir mulus, saya sarankan untuk menggunakan symlink.
sumber
Cara saya melakukannya adalah mengkomit perubahan saya dari lingkungan dev lokal saya ke repositori Git online seperti Github. Lingkungan produksi saya menjalankan repositori jarak jauh sehingga yang perlu saya lakukan adalah ssh ke server dan jalankan
git pull
untuk membawa perubahan terbaru. Tidak perlu menghentikan server web Anda.Jika Anda memiliki file di proyek Anda yang pengaturan dan / atau kontennya berbeda dari versi lokal Anda (seperti file konfigurasi dan unggahan media), Anda dapat menggunakan variabel lingkungan dan / atau menambahkan file / direktori ini ke
.gitignore
file untuk mencegah sinkronisasi dengan repositori.sumber
Ide pertama saya adalah:
Solusi yang baik adalah menggunakan rsync. Itu hanya mengubah file yang benar-benar berubah. Waspadalah, garis miring di ujung jalan di sini penting.
Biasanya apache tidak perlu restart, itu bukan dunia java. Ia memeriksa perubahan setiap file php berdasarkan permintaan, dan membaca ulang (dan mengubah token) pada perubahan secara otomatis.
Git pull sama efisiennya, meskipun sedikit lebih sulit untuk skrip. Tentu saja memungkinkan spektrum yang luas dari berbagai kemungkinan deteksi penggabungan / perubahan.
Solusi ini akan mulus hanya jika tidak ada perubahan besar - jika ada perubahan besar dalam penempatan, sedikit bahaya tidak dapat ditutup, karena tidak ada interval waktu yang dapat diabaikan, ketika kode akan diubah sebagian dan sebagian tidak.
Jika ada perubahan besar, saran saya adalah solusi awal Anda (dua ganti nama).
Berikut ini sedikit hardcore, tetapi solusi atom 100%:
(1) lakukan mount alternatif beberapa sistem file Anda, di mana magento Anda terjadi:
(2) lakukan
--bind
mount public_html_new Anda ke public_html:Dari titik ini, apache akan melihat penyebaran baru Anda. Perubahan 404 tidak dimungkinkan.
(3) lakukan sinkronisasi dengan rsync, tetapi pada titik mount alternatif):
(4) lepaskan bind mount
sumber
public_html
ini berada dalam kondisi tidak konsisten, dan Anda tidak ingin mengambil kesempatan ini.Memindahkan / mengganti
http_public
folder dapat dicapai dengan sederhanamv
atauln -s
perintah atau setara saat server http Anda terus berjalan. Anda dapat melakukan beberapa skrip untuk mengurangi downtime secara signifikan, tetapi periksa dengan hati-hati kode kembalinya dari perintah Anda dalam skrip jika Anda mengotomatiskan prosesnya.Yang mengatakan, jika Anda ingin mencapai tidak ada downtime, aplikasi Anda juga harus mendukungnya. Sebagian besar aplikasi menggunakan database untuk kegigihan. Memiliki versi N dari aplikasi Anda yang mengacaukan versi N +1 (atau kebalikan) dari model data Anda dapat merusak banyak hal jika tidak diramalkan oleh tim pengembang.
Dari pengalaman, mempertahankan konsistensi seperti itu melalui peningkatan tidak diberikan untuk sebagian besar aplikasi. Shutdown yang tepat, meskipun downtime, adalah cara yang baik untuk menghindari masalah konsistensi.
sumber