টেবিল স্তর লক জন্য অপেক্ষা থেকে প্রশ্নগুলি রোধ করার উপায়


10

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

  • আপডেট-ক্যোয়ারী প্রক্রিয়া করা হয় SET status = 1 WHERE id = 5(সূচী সেট করা আছে)
  • পৃষ্ঠার ক্যাশেড ফাইলগুলি মুছে ফেলা হয়

এই মুহুর্তে পুরো পৃষ্ঠাটি ধীর হয়ে যায়। ডাটাবেস নিজেই কয়েক মিনিটের জন্য ব্যস্ত। আমি কয়েকবার প্রসেসলিস্টটি এনেছি এবং বিভিন্ন নির্বাচন-জিজ্ঞাসার প্রায় 60 টি এন্ট্রি দেখেছি, যা সবগুলিই টেবিল স্তরের লকের জন্য অপেক্ষা করছিল

১. টেবিলের এই আপডেটটি টেবিল স্তরের লকটির জন্য অপেক্ষা করার জন্য টেবিলের article_commentsজন্য নির্বাচন-বিবৃতিগুলিকে প্রভাবিত করতে পারে কেন আমি তা আবিষ্কার করি না article। প্রসেসলিস্টে প্রায় সমস্ত ওয়েটিং কোয়েরি এই টেবিল থেকেই ছিল। আপডেট / সন্নিবেশগুলি নির্বাচনের ক্ষেত্রে অগ্রাধিকার দেওয়া হয় এবং এটি এ জাতীয় সমস্যার কারণ হতে পারে তা সম্পর্কে আমি পড়েছি, তবে মন্তব্যগুলি সক্রিয় হওয়ার পরে নিবন্ধ-সারণীটি নিজেই আপডেট হয় না, সুতরাং নির্বাচকদের অপেক্ষা করা উচিত নয়। আমি কি এটা মিস করেছি?
২. এই আচরণটি রোধ করতে বা কমপক্ষে আরও ভাল ভারসাম্য বজায় রাখার জন্য ইনোডিবি-তে পরিবর্তনের পাশাপাশি কিছু আছে কি? নতুন সার্ভারে ডাটাবেস সরিয়ে নেওয়ার আগে এই সমস্যাটি উপস্থিত হয়নি বলে আমি খুব বিরক্ত। আমি অনুমান করি যে এখানে কিছু ভুল কনফিগারেশন রয়েছে তবে কীভাবে সনাক্ত করতে হয় তা আমি জানি না।


1
সাধারণ লগিং সক্ষম করুন এবং এই টেবিলগুলির মধ্যে JOIN বিবৃতি দেখুন। আপনি যখন নির্বাচন করুন এটি একটি অন্তর্নিহিত রিড লক তৈরি করে। যেহেতু মাইআইএসএএম ROW লেভেল লকিং সমর্থন করে না, এটি টেবিল স্তরে লক করে। পুরানো সার্ভারে সম্ভবত এই লকটি ঘটছিল তবে কেহই দেখছে না? হোস্টগুলির মধ্যে লাইনের জন্য আপনার মাই সিএনএফ লাইনের সাথে তুলনা করুন এবং বিশেষত আপনার কী_বফারটি সঠিকভাবে সুর করা আছে তা নিশ্চিত করুন।
এলোমেলো

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

আমরা সম্প্রতি একটি একই সমস্যা ছিল। প্রাথমিকভাবে আমাদের key_buffer_sizeসেট ছিল 1GB10GBসমস্যা কমাতে এটি বাড়ছে ।
হালুক

@ রিক জেমস, আপনাকে ধন্যবাদ তুমি আজ আমাকে অনেক কষ্ট বাঁচিয়েছ। আপনার অ্যামাজনে বা অন্য কোথাও একটি ইচ্ছার তালিকা রয়েছে? :) আমি ক্যুইরি_ক্যাচি_লিমিট 1024 এ সেট করেছি now এখন কোনও লক সমস্যা নেই। আমি প্রথমে মাইএসকিএল ক্লায়েন্ট থেকে এটি ভেরিয়েবলগুলিতে করেছি। বিশ্বব্যাপী ক্যোয়ারী_ক্যাচি_মিলিট = 1024 সেট করুন; এখন আমি এটি my.cnf এ লিখব। এই সমাধানটি আমাকে কোনও চাপ ছাড়াই ইনোডাব মাইগ্রেশন পরিকল্পনা করার সময় পেয়েছে তাই আপনাকে ধন্যবাদ।

উত্তর:


8

মাইআইএসএএম স্টোরেজ ইঞ্জিনটি কোনও ডিএমএল (INSERTs, আপডেট, মোছা) এর জন্য পুরো টেবিল লকগুলি সম্পাদন করার জন্য অত্যন্ত কুখ্যাত। InnoDB অবশ্যই দীর্ঘমেয়াদে এই সমস্যাটি সমাধান করবে।

আমি মাইআইএসএএম বনাম ইনোডিবি ব্যবহারের পক্ষে এবং বিবাদগুলি সম্পর্কে লিখেছি

আপনার বর্তমান প্রশ্নের বিষয়ে, এখানে একটি সম্ভাব্য দৃশ্য রয়েছে:

  • articleএবং article_commentsউভয়ই মাইআইএসএএম টেবিল
  • article_commentsstatusকলাম হিসাবে এক বা একাধিক সূচক রয়েছে
  • এর জন্য সূচক পৃষ্ঠাগুলি article_commentsমাইআইএসএএম কী বাফারে ( কী_বফার_সাইজ আকারে আকারে ) ক্যাশ করা হয়েছে , যার ফলে মাইআইএসএএম কী বাফার থেকে পুরানো সূচি পৃষ্ঠাগুলি রয়েছে out
  • আপনার কাছে SELECT অনুসন্ধানগুলি রয়েছে যা articleএবং এর মধ্যে JOINগুলি সম্পাদন করেarticle_comments

আমার প্রস্তাবিত দৃশ্যে, কোনও ডিএমএল থেকে মুক্ত articleথাকার জন্য অপেক্ষা করার কারণে লেখার অনুমতি দেওয়া থেকে টেবিলের বিরুদ্ধে নির্বাচনগুলি রাখা যেতে পারে ( এক্ষেত্রে article_comments, একটি UPDATE)


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

চূড়ান্ত সমাধান: টেবিলগুলি InnoDB এ রূপান্তর করুন। মাইআইএসএএম- কে সব কিছু কীভাবে ইনোডিবিতে রূপান্তর করতে হয় সে সম্পর্কে আমার পোস্টটি ডিবা.স্ট্যাকেক্সেঞ্জার / এ / 22৪২২ / ৮877 দেখুন
রোল্যান্ডোমাইএসকিউএলডিবিএ

7

এই মুহুর্তে পুরো পৃষ্ঠাটি ধীর হয়ে যায়। ডাটাবেস নিজেই কয়েক মিনিটের জন্য ব্যস্ত।

আপনার মতো গন্ধে কি খুব বড় ক্যুরি_ক্যাছে?

mysql> SHOW VARIABLES LIKE 'query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 | -- Not over 50M
| query_cache_type             | DEMAND   | -- Only if using SQL_CACHE
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

প্রচুর লেখার সাথে উত্পাদনের সিস্টেমের জন্য, আপনি পাশাপাশি ক্যোরি_ক্যাচ বন্ধ করতে পারেন।

প্রদত্ত টেবিলের জন্য ক্যোয়ারী_ক্যাশের সমস্ত প্রবেশিকা মুছে ফেলা হবে যখন কোনও টেবিলে কোনও লেখা আসে। কিউসি যত বড় হবে তত এই কাজটি ধীর।

মাইআইএসএএম "টেবিল স্তর" লক ব্যবহার করে। পড়া এবং লেখাগুলি একই সময়ে ঘটতে পারে না (একই টেবিলে)। অপরিশোধিত, কিন্তু কার্যকর।


1
হ্যাঁ ঠিক. আমাদের প্রায় M৪ এম ক্যাশেস রয়েছে। এই তথ্যের জন্য ধন্যবাদ যা আমার কাছে নতুন ছিল, তবে আমাদের পুরানো সার্ভারে একই মূল্য ছিল যেখানে আমরা টেবিললকিংগুলি লক্ষ্য করিনি। আমরা ইতিমধ্যে
ইনোডিবিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.