কোনও ডাউনটাইম ছাড়াই একটি ওয়েব অ্যাপ্লিকেশন আপডেট করা


31

এটি একটি পিএইচপি অ্যাপ্লিকেশন। পুরো কোডবেস আপডেট করার সময় আমি কীভাবে ডাউনটাইম হ্রাস করতে পারি?

উত্তর:


44

কর্মক্ষেত্রে আমরা সাধারণত যা করি তা হ'ল:

  • আমরা আপডেট করার আগে সার্ভারের ডকুমেন্টের মূলটি হ'ল:
    • মধ্যে /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

তিনটি পদক্ষেপ " লিঙ্কটি সরান; নতুন লিঙ্কটি তৈরি করুন; অ্যাপাচি পুনরায় চালু করুন " দ্রুত করা উচিত; অর্থাত্ একটি স্বয়ংক্রিয় স্ক্রিপ্ট দ্বারা, কোনও মানুষের দ্বারা নয়।

এই সমাধানটি ব্যবহার করে:

  • উত্সগুলির নতুন সংস্করণটি আপলোড করার জন্য আপনার যতটা সময় প্রয়োজন আপনি নিতে পারেন: প্রতিলিপি পরিবর্তন না করা অবধি অ্যাপাচি এগুলি ব্যবহার করবে না
  • যখন সবকিছু ঠিক আছে, কেবল সিমলিংকটি স্যুইচ করুন: এটি 1 বা 2 ফাইল পরিবর্তনের চেয়েও দ্রুত এগিয়ে যাবে ... যার অর্থ কার্যত কোনও ডাউনটাইম নয় :-)

এবং যদি 0 এ স্ট্যাট অপশন সহ এপিসির মতো কিছু অপকোড-ক্যাশে ব্যবহার করা হয় তবে এর অর্থ ডাউনটাইমের চেয়েও কম ঝুঁকিপূর্ণ হতে পারে, আমি মনে করি।


অবশ্যই এটি "সাধারণ" সংস্করণ - যদি আপনার কাছে কিছু আপলোড করা ফাইল থাকে, উদাহরণস্বরূপ, আপনাকে অন্য কোনও সিমিলিংক ব্যবহার করতে হবে, বা অন্য কোনও ভার্চুয়ালহোস্ট বা যা কিছু ...


আশা করি এটি আরও স্পষ্ট :-)


এটিও এক ধরণের সার্ভার অদলবদল। :-)
উইম টেন ব্রিংক

প্রতীকী লিঙ্কগুলি পরিচালনা করতে মোড_উইরাইট?

@ গ্যামবুকা: না: অ্যাপাচি-র ডকুমেন্টরুট (বা ভার্চুয়ালহোস্ট ডকুমেন্ট রুট) এর একটি বিষয়, যা / www / অ্যাপ্লিকেশন; উদাহরণস্বরূপ, প্রতীকী লিঙ্ক - এটি যে যেখানে পয়েন্ট করে তা বিবেচ্য নয়।

2
ভয়ঙ্কর উত্তর। যদিও আরও একটি পরামর্শ: আপনি প্রতীকী লিঙ্কটি লিঙ্কযুক্ত না করেই ঘটতে পারেন। উদ্ধৃত হিসাবে: "তিনটি পদক্ষেপ ... দ্রুত তৈরি করা উচিত; অর্থাত্ একটি স্বয়ংক্রিয় স্ক্রিপ্ট দ্বারা, কোনও মানুষের দ্বারা নয়" " এমভি কমান্ডটি একটি পারমাণবিক অপারেশন, সুতরাং আপনি 'ln -s / www / app-2011-01-28 / www / অ্যাপ্লিকেশন-টেম্প' এর মতো একটি সিমিলিংক তৈরি করতে পারেন এবং তারপরে একটি 'এমভি-টি / www / অ্যাপ্লিকেশন-টেম্প করতে পারেন / WWW / অ্যাপ্লিকেশান।

1
এমন কিছু আছে যা সিমলিংক পদ্ধতিতে আচ্ছাদিত ছিল না। আপনার উপায় অ্যাপাচি + মোড_এফপি নিয়ে কাজ করে তবে এটি লাইটটিপিডি + ফাস্টসিগিতে ব্যর্থ হতে পারে। একটি উচ্চ ট্র্যাফিক ওয়েবসাইটে, অনুরোধটি লিঙ্কটি অদলবদলের মাঝে পরিবেশন করা হবে যে, পিএইচপি কোড নির্ভরতা মিশ্র সংস্করণে ব্যর্থ হবে।
ডেনিস সি

2

আপনি কি বিদ্যমান কোডটি নিতে এবং এই প্রকল্পটিকে একটি পৃথক পরীক্ষার পিএইচপি ফাইলে মাইগ্রেট করতে পারবেন না এবং আপনার আপডেটগুলি তৈরি করার সময় তা ব্যবহার করতে পারবেন? আমার অর্থ হ'ল, আপনার একটি টেস্ট সার্ভার এবং একটি প্রোডাকশন সার্ভার থাকা উচিত যাতে আপনাকে কোনও আপডেট তৈরি করতে হবে তখন আপনাকে কোনও ডাউনটাইম ব্যয় করতে হবে না।


1

আপডেট হওয়া কোডবেস দিয়ে একটি দ্বিতীয় সার্ভার সেট আপ করুন এবং যথাসম্ভব দ্রুত তাদের স্যুইচ করুন। :-)

যদি সম্ভব না হয় তবে নিশ্চিত হয়ে নিন যে আপনার কোডবেস কয়েক ডজন ছোট ছোট ভাগে বিভক্ত। তারপরে ডাউনটাইম তখনকার সময়ে কেবল একটি উপ-পার্টের মধ্যে সীমাবদ্ধ থাকবে। ছোট কোডব্লকগুলি প্রতিস্থাপন করা সহজ এবং বেশিরভাগই সমস্যা ছাড়াই চলতে থাকবে। প্রথমে পরীক্ষার পরিবেশে এটি চেষ্টা করুন, যদিও!


যেহেতু অ্যাপটি খণ্ডিত মডিউলগুলির সাথে পরীক্ষা করা হয়নি, ফলে এটি অপ্রত্যাশিত পরিস্থিতিতে তৈরি হতে পারে।

যার অর্থ এই আপডেটের পরে এটি আপনার টোডো তালিকায় থাকবে। :-) এটিকে আরও মডুলার করুন এবং আপনি প্রতি মডিউল আপডেট করতে পারবেন।
উইম টেন ব্রিংক

1
এটি টুডো তালিকায় রয়েছে তবে এটি একটি দীর্ঘমেয়াদী লক্ষ্য। আমরা একটি তরুণ সূচনা, সুতরাং দেব দলের মধ্যে সংগঠনটি স্বাভাবিকভাবে কিছুটা সময় নেয়। = ডি

1

প্রথমত, আমি প্রায়শই পাস্কাল মার্টিনের প্রতিক্রিয়া অনুরূপ একটি পদ্ধতি ব্যবহার করি এবং পছন্দ করি।

আমার আরও একটি পদ্ধতি যা আমি পছন্দ করি তা হ'ল আমার এসসিএমকে নতুন কোড ঠেকাতে ব্যবহার করা। সঠিক প্রক্রিয়াটি আপনার এসসিএম (গিট বনাম এসএনএন বনাম ...) এর উপর নির্ভর করে। আপনি যদি এসএনএন ব্যবহার করে থাকেন তবে আমি একটি "অনলাইন" বা "উত্পাদন" শাখা তৈরি করতে চাই যা আমি সার্ভারে নথি রুট হিসাবে চেকআউট করি। তারপরে, যখনই আমি অন্য শাখা / ট্যাগ / ট্রাঙ্ক থেকে নতুন কোডটি চাপতে চাই, আমি কেবলমাত্র "অনলাইন" শাখায় নতুন কোডটি প্রতিশ্রুতিবদ্ধ এবং ডকুমেন্টের মূলের মধ্যে এসএনএন আপডেট চালাই। এটি খুব সহজ রোলব্যাকগুলির জন্য অনুমতি দেয় কারণ সার্ভারে কী ডাউন হয়েছে / ডাউন হয়েছে এবং কে এটি করেছে এবং কখন করেছে তার একটি সম্পূর্ণ সংশোধন লগ রয়েছে। আপনি সেই টেস্ট বাক্সে সহজেই সেই "অনলাইন" শাখাটি পরিচালনা করতে পারেন, আপনি যে অ্যাপটি ধাক্কা খাওয়ার কথা বলছেন তা পরীক্ষা করার অনুমতি দেয়।

প্রক্রিয়াটি গিট এবং এসসিএমের অন্যান্য শৈলীর জন্য একই, কেবল তাদের কাজের প্রবাহের স্টাইলের জন্য আরও প্রাকৃতিক হতে পরিবর্তিত।

আপডেটগুলি ধাক্কা দেওয়ার পরিবর্তে টান / পোল করতে চান? কেবল একটি ক্রোন জব বা অন্য, স্মার্ট মেকানিজম স্বয়ংক্রিয়ভাবে এসএনএন আপডেট চালায়।

অতিরিক্ত: আপনি এই প্রক্রিয়াটি ডিস্কে যে অ্যাপ্লিকেশন লিখেছেন সেগুলি ব্যাকআপ করার জন্যও ব্যবহার করতে পারেন। কেবল একটি ক্রোন জব বা অন্য কোনও প্রক্রিয়া চালিত এসএনএন কমিট করুন। এখন আপনার অ্যাপ্লিকেশনটি তৈরি করা ফাইলগুলি আপনার এসসিএম, রিভিশন লগ ইত্যাদিতে ব্যাক আপ করা হবে। (উদাঃ, কোনও ব্যবহারকারী যদি ডিস্কে কোনও ফাইল আপডেট করে তবে আপনি এটি পুনরায় ফিরিয়ে দিতে চান তবে কেবল পুরানো সংস্করণটি পুশ করুন)।


0

আমি পাস্কাল মার্টিনের ক্ষেত্রেও একই রকম ব্যবহার করি। তবে প্রোডাকশন সার্ভারে আমার অ্যাপের একাধিক সংস্করণ আপলোড করার পরিবর্তে, আমি আমার ফায়ারওয়ালের পিছনে "বিল্ডগুলি" রাখি, প্রতিটি বিল্ড নম্বর এবং তারিখের সাথে পৃথক ডিরেক্টরিতে রেখেছি। যখন আমি একটি নতুন সংস্করণ আপলোড করতে চাই তখন আমি একটি সাধারণ স্ক্রিপ্ট ব্যবহার করি যা "rsync -avh --delay-আপডেট" অন্তর্ভুক্ত। "বিলম্ব = আপডেট" পতাকাটি সমস্ত আপডেট না হওয়া অবধি অস্থায়ী ফোল্ডারে সমস্ত কিছু (যে আলাদা) তা আপলোড করবে এবং তার যথাযথ পথে স্থানান্তর শেষে সমস্ত কিছু একবারে সরিয়ে নিয়ে যাবে যাতে অ্যাপটি কখনই কোনও অবস্থাতে না আসে অর্ধ-পুরাতন-অর্ধেক নতুন রাষ্ট্র। উপরের পদ্ধতির মতোই এটির প্রভাব রয়েছে, কেবলমাত্র আমি প্রোডাকশন সাইটে অ্যাপটির একটি সংস্করণ না রেখে (কেবলমাত্র প্রোডাকশন সার্ভারে আইএমও কেবল খালি প্রয়োজনীয় ফাইল থাকা ভাল)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.