এটি একটি পিএইচপি অ্যাপ্লিকেশন। পুরো কোডবেস আপডেট করার সময় আমি কীভাবে ডাউনটাইম হ্রাস করতে পারি?
এটি একটি পিএইচপি অ্যাপ্লিকেশন। পুরো কোডবেস আপডেট করার সময় আমি কীভাবে ডাউনটাইম হ্রাস করতে পারি?
উত্তর:
কর্মক্ষেত্রে আমরা সাধারণত যা করি তা হ'ল:
/www/app-2009-09-01
/www/application
/www/app-2009-09-08
/www/application
, যা এখনও বলা হয় , তবে যা নতুন উত্সগুলিতে ইঙ্গিত করে:/www/app-2009-09-08
এই সমস্ত প্রক্রিয়াটি একটি স্বয়ংক্রিয় স্ক্রিপ্টের মাধ্যমে সম্পন্ন হয় (প্রয়োজনের সময় কেবলমাত্র স্বয়ংক্রিয় নয় এটি এটিকে প্রবর্তন করে)। এর অর্থ:
এই প্রতীকী লিঙ্ক পূর্বের পূর্বের আরেকটি সুবিধা হ'ল উৎপাদনে উত্সগুলির নতুন সংস্করণটি রাখার পরে যদি আমরা একটি বিপর্যয়মূলক বাগটি লক্ষ্য করি তবে আপডেটটি "রোলব্যাক" করা খুব সহজ: আমাদের কেবল প্রতীকী লিঙ্কগুলি ফিরে যেতে হবে।
অবশ্যই, এটি আপনাকে প্রযোজনায় রাখার আগে আপনার স্টেজিং সার্ভারে নতুন সংস্করণটি পরীক্ষা করতে বাধা দেয় না - তবে, কে জানে ... কখনও কখনও, সত্যিই এমন একটি বড় ত্রুটি পাওয়া যায় যা কেউই দেখতে সক্ষম হয় নি টেস্টিং :-(
উদাহরণস্বরূপ, কারণ স্টেজিং মেশিনে নিয়মিত কোনও লোড-টেস্টিং হয় না
((আমি "রোলব্যাক" জিনিসটি 3 বছরে 4 বা 5 বারের মতো ব্যবহার করেছি - প্রতিবার, এটি দিনটি সংরক্ষণ করেছে - এবং ওয়েবসাইটগুলি ^^)
এখানে এক ধরণের চটজলদি উদাহরণ রয়েছে: ধরুন আমার অ্যাপাচি কনফিগারেশনে আমার এই ভার্চুয়ালহোস্ট রয়েছে:
<VirtualHost *>
ServerName example.com
DocumentRoot /www/application
<Directory /www/application>
# Whatever you might need here (this example is copy-pasted from a test server and test application ^^ )
Options Indexes FollowSymLinks MultiViews +SymLinksIfOwnerMatch
AllowOverride All
php_value error_reporting 6135
php_value short_open_tag on
</Directory>
</VirtualHost>
সুন্দর "মানক" ... একমাত্র জিনিসটি /www/application
সত্যিকারের ডিরেক্টরি নয়: এটি উত্সগুলির বর্তমান সংস্করণে কেবল একটি প্রতীকী লিঙ্ক।
যার অর্থ যখন আপনি উত্সগুলি সার্ভারে রেখেছেন, তবে এখনও স্যুইচ করা হয়নি, আপনার কাছে এরকম কিছু থাকবে:
root@shark:/www
# ll
total 8
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-01
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-08
lrwxrwxrwx 1 root root 19 2009-09-08 22:08 application -> /www/app-2009-09-01
লক্ষ্য করুন যে syMLinc "পুরানো সংস্করণ" নির্দেশ করে
এখন, নতুন সংস্করণটি সার্ভারে পুরোপুরি আপলোড হয়ে গেছে, আসুন স্যুইচ করুন:
root@shark:/www
# rm /www/application
root@shark:/www
# ln -s /www/app-2009-09-08 /www/application
এবং, এখন, /www/application
উত্সগুলির নতুন সংস্করণে নির্দেশিত বিষয়গুলি:
root@shark:/www
# ll
total 8
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-01
drwxr-xr-x 2 root root 4096 2009-09-08 22:07 app-2009-09-08
lrwxrwxrwx 1 root root 19 2009-09-08 22:09 application -> /www/app-2009-09-08
এবং আমাদের কেবল অ্যাপাচি পুনরায় চালু করতে হবে:
root@shark:/www
# /etc/init.d/apache2 restart
* Restarting web server apache2
তিনটি পদক্ষেপ " লিঙ্কটি সরান; নতুন লিঙ্কটি তৈরি করুন; অ্যাপাচি পুনরায় চালু করুন " দ্রুত করা উচিত; অর্থাত্ একটি স্বয়ংক্রিয় স্ক্রিপ্ট দ্বারা, কোনও মানুষের দ্বারা নয়।
এই সমাধানটি ব্যবহার করে:
এবং যদি 0 এ স্ট্যাট অপশন সহ এপিসির মতো কিছু অপকোড-ক্যাশে ব্যবহার করা হয় তবে এর অর্থ ডাউনটাইমের চেয়েও কম ঝুঁকিপূর্ণ হতে পারে, আমি মনে করি।
অবশ্যই এটি "সাধারণ" সংস্করণ - যদি আপনার কাছে কিছু আপলোড করা ফাইল থাকে, উদাহরণস্বরূপ, আপনাকে অন্য কোনও সিমিলিংক ব্যবহার করতে হবে, বা অন্য কোনও ভার্চুয়ালহোস্ট বা যা কিছু ...
আশা করি এটি আরও স্পষ্ট :-)
আপনি কি বিদ্যমান কোডটি নিতে এবং এই প্রকল্পটিকে একটি পৃথক পরীক্ষার পিএইচপি ফাইলে মাইগ্রেট করতে পারবেন না এবং আপনার আপডেটগুলি তৈরি করার সময় তা ব্যবহার করতে পারবেন? আমার অর্থ হ'ল, আপনার একটি টেস্ট সার্ভার এবং একটি প্রোডাকশন সার্ভার থাকা উচিত যাতে আপনাকে কোনও আপডেট তৈরি করতে হবে তখন আপনাকে কোনও ডাউনটাইম ব্যয় করতে হবে না।
আপডেট হওয়া কোডবেস দিয়ে একটি দ্বিতীয় সার্ভার সেট আপ করুন এবং যথাসম্ভব দ্রুত তাদের স্যুইচ করুন। :-)
যদি সম্ভব না হয় তবে নিশ্চিত হয়ে নিন যে আপনার কোডবেস কয়েক ডজন ছোট ছোট ভাগে বিভক্ত। তারপরে ডাউনটাইম তখনকার সময়ে কেবল একটি উপ-পার্টের মধ্যে সীমাবদ্ধ থাকবে। ছোট কোডব্লকগুলি প্রতিস্থাপন করা সহজ এবং বেশিরভাগই সমস্যা ছাড়াই চলতে থাকবে। প্রথমে পরীক্ষার পরিবেশে এটি চেষ্টা করুন, যদিও!
প্রথমত, আমি প্রায়শই পাস্কাল মার্টিনের প্রতিক্রিয়া অনুরূপ একটি পদ্ধতি ব্যবহার করি এবং পছন্দ করি।
আমার আরও একটি পদ্ধতি যা আমি পছন্দ করি তা হ'ল আমার এসসিএমকে নতুন কোড ঠেকাতে ব্যবহার করা। সঠিক প্রক্রিয়াটি আপনার এসসিএম (গিট বনাম এসএনএন বনাম ...) এর উপর নির্ভর করে। আপনি যদি এসএনএন ব্যবহার করে থাকেন তবে আমি একটি "অনলাইন" বা "উত্পাদন" শাখা তৈরি করতে চাই যা আমি সার্ভারে নথি রুট হিসাবে চেকআউট করি। তারপরে, যখনই আমি অন্য শাখা / ট্যাগ / ট্রাঙ্ক থেকে নতুন কোডটি চাপতে চাই, আমি কেবলমাত্র "অনলাইন" শাখায় নতুন কোডটি প্রতিশ্রুতিবদ্ধ এবং ডকুমেন্টের মূলের মধ্যে এসএনএন আপডেট চালাই। এটি খুব সহজ রোলব্যাকগুলির জন্য অনুমতি দেয় কারণ সার্ভারে কী ডাউন হয়েছে / ডাউন হয়েছে এবং কে এটি করেছে এবং কখন করেছে তার একটি সম্পূর্ণ সংশোধন লগ রয়েছে। আপনি সেই টেস্ট বাক্সে সহজেই সেই "অনলাইন" শাখাটি পরিচালনা করতে পারেন, আপনি যে অ্যাপটি ধাক্কা খাওয়ার কথা বলছেন তা পরীক্ষা করার অনুমতি দেয়।
প্রক্রিয়াটি গিট এবং এসসিএমের অন্যান্য শৈলীর জন্য একই, কেবল তাদের কাজের প্রবাহের স্টাইলের জন্য আরও প্রাকৃতিক হতে পরিবর্তিত।
আপডেটগুলি ধাক্কা দেওয়ার পরিবর্তে টান / পোল করতে চান? কেবল একটি ক্রোন জব বা অন্য, স্মার্ট মেকানিজম স্বয়ংক্রিয়ভাবে এসএনএন আপডেট চালায়।
অতিরিক্ত: আপনি এই প্রক্রিয়াটি ডিস্কে যে অ্যাপ্লিকেশন লিখেছেন সেগুলি ব্যাকআপ করার জন্যও ব্যবহার করতে পারেন। কেবল একটি ক্রোন জব বা অন্য কোনও প্রক্রিয়া চালিত এসএনএন কমিট করুন। এখন আপনার অ্যাপ্লিকেশনটি তৈরি করা ফাইলগুলি আপনার এসসিএম, রিভিশন লগ ইত্যাদিতে ব্যাক আপ করা হবে। (উদাঃ, কোনও ব্যবহারকারী যদি ডিস্কে কোনও ফাইল আপডেট করে তবে আপনি এটি পুনরায় ফিরিয়ে দিতে চান তবে কেবল পুরানো সংস্করণটি পুশ করুন)।
আমি পাস্কাল মার্টিনের ক্ষেত্রেও একই রকম ব্যবহার করি। তবে প্রোডাকশন সার্ভারে আমার অ্যাপের একাধিক সংস্করণ আপলোড করার পরিবর্তে, আমি আমার ফায়ারওয়ালের পিছনে "বিল্ডগুলি" রাখি, প্রতিটি বিল্ড নম্বর এবং তারিখের সাথে পৃথক ডিরেক্টরিতে রেখেছি। যখন আমি একটি নতুন সংস্করণ আপলোড করতে চাই তখন আমি একটি সাধারণ স্ক্রিপ্ট ব্যবহার করি যা "rsync -avh --delay-আপডেট" অন্তর্ভুক্ত। "বিলম্ব = আপডেট" পতাকাটি সমস্ত আপডেট না হওয়া অবধি অস্থায়ী ফোল্ডারে সমস্ত কিছু (যে আলাদা) তা আপলোড করবে এবং তার যথাযথ পথে স্থানান্তর শেষে সমস্ত কিছু একবারে সরিয়ে নিয়ে যাবে যাতে অ্যাপটি কখনই কোনও অবস্থাতে না আসে অর্ধ-পুরাতন-অর্ধেক নতুন রাষ্ট্র। উপরের পদ্ধতির মতোই এটির প্রভাব রয়েছে, কেবলমাত্র আমি প্রোডাকশন সাইটে অ্যাপটির একটি সংস্করণ না রেখে (কেবলমাত্র প্রোডাকশন সার্ভারে আইএমও কেবল খালি প্রয়োজনীয় ফাইল থাকা ভাল)।