নতুন কোড লাইভ স্থাপন করা হচ্ছে


29

লাইভ (ই-কমার্স) সাইটে নতুন কোড মোতায়েনের সেরা অনুশীলন কোনটি?

ডিরেক্টরিটির পুরানো এবং পুরানো নামটির নামকরণ public_html_newকরার সময় আমি আপ্পিকে +/- 10 সেকেন্ডের জন্য থামিয়েছি । আমি আবার অ্যাপাচি শুরু করার আগে এটি একটি স্বল্প ডাউন-টাইম তৈরি করে।public_htmlpublic_html_old

গিট ব্যবহার করে লাইভ ডিরেক্টরিতে নতুন রেপো টানতে একই প্রশ্নটি চলে goes সাইটটি সক্রিয় থাকাকালীন আমি কি রেপো টানতে পারি? এবং যদি আমার পাশাপাশি একটি ডিবি অনুলিপি করা প্রয়োজন হয় তবে কীভাবে?

লাইভ সাইটের টার (ব্যাকআপ উদ্দেশ্য) সংক্ষেপণের সময় আমি লক্ষ্য করেছি যে মিডিয়া ডিরেক্টরিতে পরিবর্তনগুলি ঘটেছিল। এটি আমার কাছে ইঙ্গিত করেছিল যে ফাইলগুলি পর্যায়ক্রমে পরিবর্তন হতে থাকে। এবং যদি এই পরিবর্তনগুলি হস্তক্ষেপ করতে পারে যদি নিয়োগের সময় অ্যাপাচি বন্ধ না করা হয়।

উত্তর:


13

লোড ব্যালেন্সার ব্যবহার করা ভাল ধারণা। সাইটটি যদি কয়েক সেকেন্ড ডাউনটাইম সম্পর্কে চিন্তা করার জন্য যথেষ্ট গুরুত্বপূর্ণ হয় তবে দোষ সহ্য করার বিষয়ে চিন্তা করা যথেষ্ট গুরুত্বপূর্ণ to

একদিকে, যদি এটি ইউনিক্স সিস্টেমে থাকে তবে আপনি পুনর্নবীকরণের সময় অ্যাপাচিকে আটকে রাখতে পারেন (বা সিমলিংক আপডেট ইত্যাদি):

killall -STOP httpd  # Pause all httpd processes
mv public_html public_html_orig
mv public_html_new public_html
killall -CONT httpd  # Resume all httpd processes

এটি অ্যাপাচে নাম পরিবর্তন করার সময় নতুন অনুরোধ গ্রহণ করা থেকে বিরত রাখবে। আপনি যদি সিমলিংক বা অন্য কোনও পদ্ধতির পছন্দ করেন তবে একই ধারণাটি ব্যবহার করা যেতে পারে:

killall -STOP httpd  # Pause all httpd processes
rm /var/www/html
ln -s /var/www/version/03 /var/www/html
killall -CONT httpd  # Resume all httpd processes

নোট করুন যে কোনও মুলতুবি সংযোগ বা প্যাকেটগুলি ওএস-এ সারি করবে। অত্যন্ত ব্যস্ত সাইটের জন্য, আপনার httpd কর্মী প্রকারের জন্য উপযুক্ত হলে লিজইনব্যাক্লগ টিউন করার বিষয়টি বিবেচনা করুন এবং টিসিপি শোনার ব্যাকলগ সম্পর্কিত আপনার ওএস সেটিংস পরীক্ষা করুন।

আপনি httpd.conf এ ডকুমেন্টরুটও পরিবর্তন করতে পারেন এবং একটি চমত্কার পুনঃসূচনা করতে পারেন apachectl graceful) এখানে অপূর্ণতা ত্রুটিগুলির বর্ধিত ঝুঁকি, যেহেতু আপনাকে কোনও Directoryকনফিগারেশনও আপডেট করতে হবে ।


এই বিরতি অধিবেশন এখনও এই সাইট চলতে হবে?
নিকসএক্স

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

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

1
দয়া করে মনে রাখবেন যে কোনও উচ্চ ট্র্যাফিক ওয়েবসাইটে, এটি খুব সহজেই আপনার অ্যাপাচি পরিষেবাটিকে হত্যা করতে পারে। সরানোর পরে আপনার অ্যাপাচি প্রক্রিয়াটি 'আনলক' করার সাথে সাথে 200 আরকিউ / গুলি খুব সহজেই আপনার সংযোগ পুলটি ট্র্যাশ করবে (
ক্লাউডটি

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

32

একটি সংস্করণ ডিরেক্টরি যেমন ব্যবহার করা সবচেয়ে দ্রুত এবং সহজ

/var/www/version/01
/var/www/version/02

এবং আপনার html_root হিসাবে একটি বর্তমান প্রতীকী লিঙ্ক ব্যবহার করুন:

/var/www/html -> /var/www/version/02

আপনি যেমন শাখা এবং ট্যাগ চেকআউট করতে পারেন, প্রতীকী লিঙ্ক পরিবর্তন করে এবং অ্যাপাচি পুনরায় লোড করতে পারেন এই কৌশলটি একটি পুনর্বিবেচনা নিয়ন্ত্রণ সিস্টেমে (এসএনএন, গিট, মুরিউরিয়াল, ...) পুরোপুরি সংহত করে । ডাউনটাইম সংক্ষিপ্ত এই প্রযুক্তিটি ব্যবহার করে এবং এটা করতে পারবেন খুব সহজ রোলব্যাক

এটি আরও জটিল ডিপ্লোয়মেন্ট সিস্টেম যেমন RPM প্যাকেজগুলি, বা কনফিগারেশন পরিবর্তন পরিচালনা (শেফ, পুতুল ইত্যাদি) অবকাঠামোতে ভালভাবে সংহত করে।


4
সিম্পল সলিউশন সর্বদা সেরা ... :-) অবশ্যই উল্লেখ করতে ভুলবেন না যে কনফিগগুলিতে কিছু ফলোসিমলিংক এবং এই জাতীয় অ্যাপাচি পতাকা লাগতে পারে।
পিটার বলেছেন, মনিকা

@ পিটারহর্বাথ যা বলেছেন তাতে বিশেষ যত্ন নিন। সিমলিঙ্কযুক্ত ডকুমেন্টরুটগুলির সাথে কাজ করার সময় অ্যাপাচি খুব কৃপণ হয়ে উঠতে পারে। সাবধানে পরীক্ষা করতে ভুলবেন না!
mhutter

@ মিট্টার ধন্যবাদ :-) আসলেই সমস্যাটি হ'ল অ্যাপাচে ফলোসিম্লিংকগুলি সক্ষম করা সুরক্ষা সমস্যার কারণ হতে পারে ...
পিটার বলেছেন মনিকা পুনরুদ্ধার করুন

একটি সিমিলিংক আপডেট করা কোনও পারমাণবিক ক্রিয়াকলাপ নয়। এমনকি ln -snfমূল সিমলিংকটি ক্লোবার করার মতো কিছু ব্যবহার করেও অন্তর্নিহিত ক্রিয়াকলাপটি একটি unlinkএবং symlink। আপডেটের সময় ব্যবহারকারীরা 404 পাওয়ার সুযোগ রয়েছে। মূল ডিরেক্টরিটি কেবল উপায়ের বাইরে রেখে নতুন জায়গায় নামকরণ করা (ধরে নেওয়া আপনি ফাইল সিস্টেমগুলি অতিক্রম করছেন না) এর চেয়ে এটি আর ভাল নয়। উপরের উত্তরটি তার পাশের একটি চেক চিহ্ন সহ দেখুন, যা এই উদ্বেগকে সম্বোধন করে।
গারগান্টুচেট

14

অ্যাপাচি বন্ধ না করে ডিরেক্টরিগুলির নামকরণও কাজ করা উচিত। এটি উইন্ডোটি উল্লেখযোগ্যভাবে সংক্ষিপ্ত করবে। mv public_html public_html_old && mv public_html_new public_htmlএকটি সেকেন্ডের ভগ্নাংশে শেষ করা উচিত।

বেশ কয়েকটি ত্রুটি হ'ল এই পদ্ধতির 404কোনও অনুরোধ যা একটি উইন্ডো চলাকালীন এখনও ঘটে তা পরিচালনা করবে will এবং যদি আপনি ডিরেক্টরি না করে উপরের কমান্ডটি চালনা করেন তবে এটি public_html_newব্যর্থ হবে এবং 404প্রতিটি অনুরোধে একটি সাইট দিয়ে আপনাকে ছেড়ে দেবে ।

ডিরেক্টরি সহ এটি পরমাণুভাবে করা সমর্থন নয়। তবে আপনি এটি সিমলিংক দিয়ে করতে পারেন। নামের কোনও ডিরেক্টরি রাখার পরিবর্তে ডিরেক্টরিতে public_htmlএকটি ডিরেক্টরি রয়েছে public_html.version-numberএবং public_htmlসেই ডিরেক্টরিতে নির্দেশক বলে একটি সিমলিংক রয়েছে । এখন আপনি বলা একটি ডিরেক্টরি public_html.new-version-numberএবং একটি নতুন সিমলিংক নামে তৈরি করতে পারেন public_html.new

তারপর আপনি নাম পরিবর্তন করতে পারেন public_html.newকরতে public_htmlatomically স্যুইচ। mvসেই নামটি সম্পাদন করার জন্য এটি "খুব বুদ্ধিমান" লক্ষ্য করুন , তবে এটি os.renameঅজগর বা renameস্মার্ট হওয়ার চেষ্টা না করে সিস্টেম কলকে কল করবে এমন অন্য কোনও কিছু থেকে ব্যবহার করা যেতে পারে ।

ডেটা বেসের সাথে কী করবেন তা নির্ভর করে আপনি কোন ডাটাবেসটি ব্যবহার করছেন এবং আপনি এটির জন্য কী ব্যবহার করছেন on আমরা আপনাকে আপনার প্রশ্নের সেই অংশটির একটি ভাল উত্তর দেওয়ার আগে আপনাকে ডাটাবেস সম্পর্কে আরও অনেক বিশদ সরবরাহ করতে হবে।


1
আমার ডেবিয়ান সিস্টেমে mvএমন একটি -Tবিকল্প রয়েছে যা এটিকে সিমলিংক অনুসরণ করা থেকে বিরত রাখে। এই আপনি atomically নামান্তর দেব public_html.newউপর public_htmlঅভিমানী উভয় নরম লিঙ্ক দেওয়া হয়েছে।
গারগান্টুচেট

11

সিমলিংক এবং এমভি আপনার বন্ধু, তবে, নতুন সংস্করণ স্থাপনের সময় আপনার যদি সত্যই ব্যবহারকারীদের ত্রুটি পৃষ্ঠাটি এড়ানো দরকার, তবে আপনার কমপক্ষে ২ টি ব্যাকএন্ড সার্ভারের সামনে একটি বিপরীত প্রক্সি বা একটি লোড-ব্যালেন্সার থাকা উচিত (অ্যাপাচি তোমার ক্ষেত্রে).

মোতায়েনের সময়, আপনাকে একবারে একটি ব্যাকএন্ড থামাতে হবে, নতুন কোড মোতায়েন করতে হবে, এটি পুনরায় চালু করতে হবে এবং তারপরে বাকী ব্যাকেন্ডে পুনরাবৃত্তি করতে হবে।

শেষ ব্যবহারকারীরা সর্বদা প্রক্সি দ্বারা ভাল ব্যাকেন্ডে পরিচালিত হবে।


4
আপনি যখনই ইতিমধ্যে এটি পোস্ট করে দেখলাম আমি কেবল এই উত্তরে কাজ করছি। ব্যালেন্সার + ২ সার্ভারগুলি খারাপ আপগ্রেড থেকে প্রক্রিয়াটি অদৃশ্য এবং সহজতর করে তোলে ...
বার্ট সিলভারস্ট্রিম

9

আপনি যদি কোনও উত্পাদন সিস্টেমে নিয়মিত পরিবর্তনগুলি প্রয়োগ করেন তবে আমি একটি কাঠামোগত জীবনচক্রের যত্ন নেব। একটি ভাল অনুশীলন হ'ল ক্যাপিস্ট্রানো http://capistranorb.com/ । এটি বেশ কয়েকটি প্ল্যাটফর্ম এবং কনফিগারেশনে এক বা একাধিক সার্ভারে সফ্টওয়্যার মোতায়েন করার জন্য একটি ওপেন সোর্স সমাধান।

ম্যাজেন্টোর জন্য এখানে একটি প্লাগইন রয়েছে: https://github.com/augustash/capistrano-ash/wiki/Magento- উদাহরণ

একক সার্ভার এবং প্রায় বিরামবিহীন রূপান্তরগুলির জন্য, আমি সিমলিংকগুলি ব্যবহার করার পরামর্শ দিই।


4

আমি যেভাবে এটি করি তা হ'ল আমার স্থানীয় দেব পরিবেশ থেকে গিথুবের মতো একটি অনলাইন গিট সংগ্রহস্থলে আমার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ। আমার উত্পাদনের পরিবেশটি একটি রিমোট রিপোজিটরি বন্ধ হয়ে যায় তাই সার্ভারে এসএসএস করা এবং git pullসর্বশেষ পরিবর্তনগুলি আনার জন্য চালানো দরকার। আপনার ওয়েবসারভার বন্ধ করার দরকার নেই।

আপনার প্রকল্পে এমন ফাইলগুলি রয়েছে যাগুলির সেটিংস এবং / অথবা সামগ্রীগুলি আপনার স্থানীয় সংস্করণ (যেমন কনফিগারেশন ফাইল এবং মিডিয়া আপলোডগুলি) থেকে পৃথক হয় আপনি পরিবেশের ভেরিয়েবলগুলি ব্যবহার করতে পারেন এবং / অথবা কোনও ফাইলগুলিতে এই ফাইলগুলি / ডিরেক্টরিগুলি .gitignoreসংকলন প্রতিরোধের জন্য সংযুক্ত করতে পারেন।


3

আমার প্রথম ধারণাটি হ'ল:

# deploy into public_html_new, and then:
rsync -vaH --delete public_html_new/ public_html/

আরএসএনসি ব্যবহার করা ভাল সমাধান ছিল। এটি কেবলমাত্র সত্যই পরিবর্তিত ফাইলগুলি পরিবর্তন করেছে। সতর্কতা অবলম্বন করুন, শেষে প্যাশগুলি এখানে স্ল্যাশগুলি গুরুত্বপূর্ণ।

সাধারণত অ্যাপাচি পুনরায় চালু করার প্রয়োজন হয় না, এটি জাভা দুনিয়া নয়। এটি অনুরোধে প্রতিটি পিএইচপি ফাইলের পরিবর্তনের জন্য অনুসন্ধান করে এবং স্বয়ংক্রিয়ভাবে পরিবর্তিত হওয়াতে পুনরায় পুনরায় পড়া (এবং পুনরায় টোকেনাইজ) করে।

গিট টান একই রকম দক্ষ ছিল, যদিও এটি স্ক্রিপ্ট করা কিছুটা শক্ত ছিল। অবশ্যই এটি বিভিন্ন সংযুক্তকরণ / পরিবর্তন সনাক্তকরণের সম্ভাবনার বিস্তৃত বর্ণালী সক্ষম করেছে।

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

যদি বড় পরিবর্তন হয় তবে আমার পরামর্শটি ছিল আপনার প্রাথমিক সমাধান (দুটি নাম পরিবর্তন)।


এখানে কিছুটা কঠিন, তবে 100% পারমাণবিক সমাধান:

(1) আপনার ম্যাজেন্টো স্থান গ্রহণ করে এমন কিছু ফাইল সিস্টেমের একটি বিকল্প মাউন্ট করুন:

mount /dev/sdXY /mnt/tmp

(২) --bindআপনার সর্বজনীন_এইচটিএমএল_ নতুন পাবলিক_এইচটিএমএলে একটি মাউন্ট করুন:

mount --bind /path/to/public_html_new /path/to/public_html

এই জায়গা থেকে, অ্যাপাচি আপনার নতুন স্থাপনা দেখতে পাবে। 404 এর কোনও পরিবর্তন অসম্ভব।

(৩) আরএসসিএন-র সাথে সিনক্রোনাইস্টেশন করুন , তবে বিকল্প মাউন্ট পয়েন্টে):

rsync -vaH --delete /mnt/tmp/path/to/public_html_new/ /mnt/tmp/path/to/public_html/

(4) বাইন্ড মাউন্ট সরান

umount /path/to/public_html

কমান্ডটি পাবলিক_এইচটিএমএল মুছে দেবে এবং এর মধ্যে নতুনভাবে সর্বজনীন_ এইচটিএমএল_ মোতায়েন করবে?
নিকোএক্স

@nicoX না, এটি কেবল পরিবর্তনগুলি অনুলিপি করবে ।
পিটার বলেছেন মোনিকা

@nicoX এটি উভয় ডিরেক্টরি কাঠামোর মধ্যে দিয়ে যায় এবং যদি এটি কোনও পার্থক্য (নতুন ফাইল, পরিবর্তিত ফাইল, মুছে ফেলা ফাইল) সন্ধান করে তবে এটি দ্বিতীয় ডিরেক্টরিটি প্রথমটির সাথে মেলে, যেমনটি এটি প্রয়োজন তেমন পরিবর্তন করে। ফলাফল যদি আপনি সর্বজনীন_এইচটিএমএল মুছে ফেলে এবং তারপরে সর্বজনীন_এইচটিএমএল_ নতুন স্থানান্তরিত করেন তবে অস্থায়ী 404 সমস্যার কোনও সম্ভাবনা ছাড়াই if
পিটার বলেছেন মনিকা

1
না, এটি একটি ভাল ধারণা নয়। পরিবর্তনগুলির উপর নির্ভর করে আপনার একটি স্বল্প সময়ের থাকতে পারে যেখানে কোডটি public_htmlঅসঙ্গতিপূর্ণ অবস্থায় রয়েছে এবং আপনি এই সুযোগটি নিতে চান না।
সোভেন

@ এসভিডাব্লু আপনি ঠিক বলেছেন, কেবলমাত্র ছোটখাটো পরিবর্তন হলে আমার ধারণাটি ঠিক আছে। আমি সেই অনুযায়ী আমার উত্তর প্রসারিত।
পিটার বলেছেন মনিকা

1

আপনার HTTP সার্ভার চলমান থাকা অবস্থায় http_publicফোল্ডারটি সরানো / প্রতিস্থাপন করা সহজ mvবা ln -sআদেশগুলি বা সমমানের সাথে অর্জন করা যেতে পারে । ডাউনটাইমকে উল্লেখযোগ্যভাবে হ্রাস করতে আপনি কিছু স্ক্রিপ্টিং করতে পারেন, তবে আপনি যদি প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালিত করেন তবে স্ক্রিপ্টে আপনার আদেশগুলির রিটার্ন কোডগুলি সাবধানতার সাথে পরীক্ষা করে দেখুন।

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

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

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