ফাইলের সাথে আরএসইএনসি আচরণ করা যা এখনও লেখা হচ্ছে?


13

যদি অ্যাপাচি একটি বড় ফাইল লেখার মাঝখানে থাকে এবং সেই ফাইলটিতে একটি আরএসআইএনসি ক্রোন জব চলে, আরএসসিএনসি ফাইলটি অনুলিপি করার চেষ্টা করে?

উদাহরণ

  • অ্যাপাচি -১: ফাইলটি বড় আকারে লেখা রয়েছে /var/www
  • অ্যাপাচি -২: অ্যাপাচি -১ এর ক্লোন। প্রতিটি পাঁচ মিনিটের মধ্যে /var/wwwসিঙ্ক করার জন্য ক্রস রান আরএসসিএন রয়েছে।

উত্তর:


21

যদি আপাচি কোনও জায়গায় কোনও ধরণের ফাইল লিখছে এবং এটি লেখার কাজ শেষ না করে এবং rsync কিক ইন করে, rsyncসেখানে বসে যা আছে তা অনুলিপি করবে।

অর্থাত যদি আপাচি একটি 5 এমবি ফাইল নিয়ে কাজ করে তবে কেবল 2 এমবি লিখিত থাকে এবং rsyncকিক ইন হয়, আংশিক 2 এমবি ফাইলটি অনুলিপি করা হবে। সুতরাং ফাইলটি মনে হবে এটি গন্তব্য সার্ভারে "দূষিত"।

আপনি যে ফাইলগুলি ব্যবহার করছেন তার আকারের উপর নির্ভর করে আপনি নিম্নলিখিতগুলি করতে --inplaceবিকল্পটি ব্যবহার করতে পারেন rsync:

এই বিকল্পটি পরিবর্তন করে যে ফাইলের ডেটা আপডেট করার দরকার পড়লে আরএসএনসি ফাইলটি কীভাবে স্থানান্তর করে: ফাইলের নতুন কপি তৈরি করার পরে এটি সম্পূর্ণ হওয়ার পরে এটি স্থানটিতে স্থানান্তরিত করার পরিবর্তে, আরএসআইএনসি পরিবর্তে আপডেট করা ডেটা সরাসরি গন্তব্যে লেখেন ফাইল।

এর সুবিধাটি হ'ল যদি কোনও 5 এমবি ফাইল কেবল প্রথম রানটিতে 2 এমবি অনুলিপি করে থাকে, পরের রানটি 2 এমবিতে উঠবে এবং পূর্ণ 5MB স্থিত না হওয়া পর্যন্ত ফাইলটি অনুলিপি করতে থাকবে।

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

এটি বলেছিল যে আপনি এটি বর্ণনা করেন; জোর আমার:

প্রতি পাঁচ মিনিটে ক্রোন রান আরএসসিএন হয় ...

সুতরাং আমি ধরে নিই যে এই ক্রোন জবটি পরিচালনা করার জন্য আপনার কাছে কিছু বাশ স্ক্রিপ্ট রয়েছে? ভাল, জিনিসটি rsyncকেবলমাত্র অনুলিপি করা ফাইলগুলি অনুলিপি করার জন্য যথেষ্ট স্মার্ট। এবং যদি আপনার কাছে এমন স্ক্রিপ্ট থাকে যা প্রতি 5 মিনিটের মধ্যে rsyncচলে তবে এটি দ্রুত চলে গেলে আপনি একে অপরের দিকে পদক্ষেপ না এড়াতে চেষ্টা করছেন । অর্থ, আপনি যদি প্রতি মিনিটে এটি চালান, এমন একটি ঝুঁকি রয়েছে যে rsyncফাইলের আকার বা নেটওয়ার্কের গতির কারণে এক বা একাধিক প্রক্রিয়া এখনও চলছে এবং পরবর্তী প্রক্রিয়াটি কেবল এটির সাথে প্রতিযোগিতায় থাকবে; একটি দৌড় শর্ত

এটি এড়ানোর এক উপায় হ'ল rsyncবাশ স্ক্রিপ্টে আপনার পুরো কমান্ডটি মোড়ানো যা কোনও ফাইল লক পরীক্ষা করে; নীচে আমি এই জাতীয় ক্ষেত্রে ব্যবহার করি একটি বয়লারপ্লেট বাশ স্ক্রিপ্ট ফ্রেমওয়ার্ক।

মনে রাখবেন যে কিছু লোক ব্যবহারের পরামর্শ দিবেন flockতবে যেহেতু flockআমি যে কয়েকটি সিস্টেমে ব্যবহার করি সেগুলিতে ইনস্টল করা হয়নি — এবং আমি উবুন্টু (যা এটি রয়েছে) এবং ম্যাক ওএস এক্সের (যা না) অনেকের মধ্যে ঝাঁপিয়ে পড়েছি — আমি কোনও বাস্তব সমস্যা ছাড়াই এই সাধারণ কাঠামোটি ব্যবহার করি:

LOCK_NAME="MY_GREAT_BASH_SCRIPT"
LOCK_DIR='/tmp/'${LOCK_NAME}.lock
PID_FILE=${LOCK_DIR}'/'${LOCK_NAME}'.pid'

if mkdir ${LOCK_DIR} 2>/dev/null; then
  # If the ${LOCK_DIR} doesn't exist, then start working & store the ${PID_FILE}
  echo $$ > ${PID_FILE}

  echo "Hello world!"

  rm -rf ${LOCK_DIR}
  exit
else
  if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}) 2>/dev/null; then
    # Confirm that the process file exists & a process
    # with that PID is truly running.
    echo "Running [PID "$(cat ${PID_FILE})"]" >&2
    exit
  else
    # If the process is not running, yet there is a PID file--like in the case
    # of a crash or sudden reboot--then get rid of the ${LOCK_DIR}
    rm -rf ${LOCK_DIR}
    exit
  fi
fi

ধারণাটি হ'ল সেই সাধারণ কোর - যেখানে আমার আছে। echo "Hello world!"যেখানে আপনার স্ক্রিপ্টের হৃদয় রয়েছে। এটির বাকীটি মূলত একটি লকিং মেকানিজম / লজিক ভিত্তিক mkdir। ধারণার একটি ভাল ব্যাখ্যা এই উত্তরে :

mkdir একটি ডিরেক্টরি তৈরি করে যদি এটি এখনও বিদ্যমান না থাকে, এবং যদি এটি হয় তবে এটি একটি প্রস্থান কোড নির্ধারণ করে। আরও গুরুত্বপূর্ণ বিষয়, এটি এই একক পারমাণবিক ক্রিয়ায় এটি করে যা এই দৃশ্যের জন্য নিখুঁত করে তোলে।

সুতরাং আপনার rsyncপ্রক্রিয়া ক্ষেত্রে , আমি echoআপনার rsyncকমান্ড থেকে কমান্ড পরিবর্তন করে এই স্ক্রিপ্ট ব্যবহার করার পরামর্শ দিচ্ছি । এছাড়াও, এর LOCK_NAMEমতো কিছুতে পরিবর্তন করুন RSYNC_PROCESSএবং তারপরে আপনি ভাল।

এখন rsyncএই স্ক্রিপ্টটিতে আপনার মোড়কের সাহায্যে, আপনি প্রতি মিনিটে কোনও রেসিং শর্তের ঝুঁকি ছাড়াই ক্রোন জব সেট করতে পারেন যেখানে দুই বা ততোধিক rsyncপ্রক্রিয়া একই কাজ করার জন্য লড়াই করছে। এটি আপনাকে গতি বা rsyncআপডেটগুলি বাড়িয়ে তুলবে যা আংশিক ফাইল স্থানান্তরিত হওয়ার সমস্যাটি দূর করবে না, তবে এটি সামগ্রিক প্রক্রিয়াটিকে গতিতে সহায়তা করবে যাতে কোনও পর্যায়ে পুরো ফাইলটি সঠিকভাবে অনুলিপি করা যায়।


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

@ লুইস আপনাকে স্বাগতম! এছাড়াও, আপনি যদি তাত্ক্ষণিক ফাইল পরিবর্তনের উপর ভিত্তি করে ফোল্ডারগুলিকে সিঙ্কে রাখতে চান তবে আমি উচ্চতর ব্যবহার / অ্যাডাপ্টিংয়ের সন্ধানের পরামর্শ দেব lsyncd। এটি আপনাকে "হট ফোল্ডার" রাখতে দেয় যা তাদের ক্রিয়াকলাপে সত্যই মনোযোগ দেয় এবং তারপরে পরিবর্তনগুলি যখন করা হয় তখন সেই ফাইলগুলিতে কাজ করে। আমি rsyncআমার উত্তরে বর্ণিত হিসাবে অনেক কিছু ব্যবহার করি তবে আমি এমন কেসগুলির lsyncdজন্য ব্যবহার করি যেখানে ক্রোন-নন / আরও তাত্ক্ষণিক ক্রিয়া প্রয়োজন।
জ্যাকগল্ড

3

হ্যাঁ - এবং একই সাথে ফাইলটি লিখিত হওয়ার পরে যদি rsync ফাইলটি পড়ছে তবে ফাইলটি দূষিত হতে পারে।

আপনি এটি চেষ্টা করতে পারেন: /unix//a/2558

আপনি এটি এলএসফ দিয়ে স্ক্রিপ্টও করতে পারেন:

lsof /path/to file

0 এর একটি প্রস্থান কোডটির অর্থ ফাইলটি ব্যবহৃত হচ্ছে এবং 1 এর প্রস্থান কোডটির অর্থ এই ফাইলটিতে কোনও ক্রিয়াকলাপ নেই।


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