কীভাবে মাইএসকিএল মাস্টার-স্লেভে মাস্টার নির্ধারণ করবেন


17

আমি মাইএসকিউএল মাস্টার-ক্রীতদাসের প্রতিলিপি স্থাপন করছি এবং যেখানে আমি দাসকে মাস্টার হিসাবে উন্নীত করব (যেখানে মাস্টার নীচে চলে যাবে সে ক্ষেত্রে) কিভাবে ব্যর্থতার পরিস্থিতি সামলানো যায় তা নির্ধারণ করার চেষ্টা করছি।

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

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

মাইএসকিউএলে কি কোয়েরি আছে তা দেখার জন্য বর্তমান সার্ভারটি মাস্টার-স্লেভ প্রতিরূপে মাস্টার কিনা?


আপনি মাইএসকিউএল এর কোন সংস্করণ ব্যবহার করছেন ???
রোল্যান্ডোমাইএসকিউএলডিবিএ

এটি মাইএসকিএল আউটপুটServer version: 5.5.23 MySQL Community Server (GPL)
এথন হায়ন

উত্তর:


13

@ রোল্যান্ডোমাইএসকিউএলডিবিএ এই প্রশ্নের সঠিক উত্তর দিয়েছে ... তবে তিনি এও উল্লেখ করেছেন যে তার সমাধান "দ্রুত ও নোংরা"।

এবং এটি একটি খুব সত্য বিবৃতি। :)

এখানে যে বিষয়টি আমাকে উদ্বেগ করছে তা উত্তরটির সাথে নয়, বরং মূল প্রশ্নটি একটি ভুল অনুমান হিসাবে দেখা যাচ্ছে:

আমি দুটি সার্ভারকে জিজ্ঞাসা করতে পারি এবং জিজ্ঞাসা করতে পারি যে কোনটি একজন মাস্টার, তারপরে সেই সাথে সমস্ত প্রশ্নগুলি সম্পাদন করুন।

সমস্যাটি হ'ল মাইএসকিউএল প্রতিরূপে, মাস্টার কখনই সত্যই সচেতন হন না যে এটি মাস্টার।

"প্রচার থেকে মাস্টার" ধারণাটি আসলে মাইএসকিউএল অ্যাসিক্রোনাস প্রতিরূপে ধারণা নয়। একটি মাইএসকিউএল সার্ভারকে মাস্টার রোল হিসাবে "প্রচার করা" এমন কিছু যা মাইএসকিউএল সার্ভারের "বাহ্যিক" হয়, যা মাইএসকিউএল সার্ভারগুলির "অভ্যন্তরীণ" থেকে কিছু ঘটে তার বিপরীতে happens

"মাস্টার টু প্রমোশন" কোনও ধরণের সার্ভার বিধান দ্বারা করা হয়নি, কারণ, প্রযুক্তিগতভাবে বলতে গেলে, প্রতিটি মাইএসকিউএল সার্ভারে বাইনারি লগিং সক্ষম রয়েছে এমন একটি মাস্টার, এমনকি যদি এর কোনও দাস না থাকে। SHOW MASTER STATUSঠিক একইভাবে কাজ করে এবং ঠিক একই ফলাফলটি ফেরত দেয়, ক্রীতদাস বা না, এবং 2 দাস সহ একটি মাস্টার 1 গোলাম বা 0 দাসের একজন মাস্টারের চেয়ে কম বা কম নয়। একইভাবে, একজন দাস যার দাসেরা সমস্ত অফলাইনে থাকে এখনও ঠিক তেমনি একজন মাস্টার, কারণ দাসরা অনলাইনে ফিরে এলে তারা যেখানে চলে গেছে সেখানে প্রতিলিপি তুলবে।

এক অর্থে, উভয় সার্ভারের একমাত্র "সচেতনতা" এটি মাস্টার কিনা তা নয়, বরং এটি ক্রীতদাস (বা "নয়")।

রোল্যান্ডোর সমাধান এটাই জিজ্ঞাসা করে: "তুমি কি দাস?" যদি উত্তরটি না হয়, তবে অনুমান করা যায় যে এটি অবশ্যই মাস্টার হতে হবে ... যা STOP SLAVE;জারি করা হলে তিনি ত্রুটিযুক্ত ধারণা হিসাবেও উল্লেখ করেছিলেন । তবে থামানো দাস এখনও দাস, সুতরাং "দাস নয়" (সময়ের কোনও মুহুর্তে) "মাস্টার হওয়ার" সমীকরণ করে না।

অনুরূপ মাস্টার উপর একই পরীক্ষা করা যেতে পারে:

SELECT COUNT(1) FROM information_schema.processlist
 WHERE user = 'the_username_used_by_the_slave';

অথবা

SELECT COUNT(1) FROM information_schema.processlist
 WHERE command = 'binlog dump';

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

আরও খারাপ (এখনও এই পরিস্থিতিতে উভয়ের জন্য) তথ্য_সেমি.প্রসেসলিস্ট "টেবিল" হ'ল একটি ভার্চুয়াল টেবিল যা প্রতিবার নির্বাচিত হওয়ার পরে তা বাস্তবায়িত হয় এবং এতে সময় লাগে এবং সংস্থানগুলি লাগে। আপনার সার্ভারটি যত ব্যস্ত, তত বেশি ব্যয় হবে কারণ প্রতিটি থ্রেডের ক্রিয়াকলাপটি পিয়ার-ইন করতে হবে।

আরও হালকা ওজনের সমাধান হ'ল:

SELECT @@global.read_only;

কোন দাসের জন্য, আপনি / বিশ্বব্যাপী পরিবর্তনশীল সেট করতে পারতেন read_onlyযাতে SUPERঅধিকার ছাড়াই ব্যবহারকারীরা অজান্তেই এটিতে লিখতে না পারে (এবং আপনার অ্যাপ্লিকেশনটি না থাকা উচিত SUPER)। যদি আপনি ম্যানুয়ালি দাসকে মাস্টার রোলের "প্রচার" করেন তবে আপনাকে SET GLOBAL read_only = OFFলেখার সক্ষমতা তৈরি করতে হবে। (প্রতিলিপি সর্বদা দাসের কাছে লিখতে পারে, এটি সেট করা যাই হোক না কেন)।

তবে এটি এখনও, আমি মনে করি, একটি গুরুত্বপূর্ণ বিষয়টি মিস করে:

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

অথবা, সর্বনিম্ন, মাস্টার ব্যর্থ না হওয়া পর্যন্ত অ্যাপ্লিকেশনটি কখনই স্যুইচ করা উচিত নয় এবং তারপরে এটি নিজের মতো করে আর ফিরে যাওয়া উচিত নয়।

এখানে কেন আমি বলছি: একবার "সিদ্ধান্ত" নেওয়া হয় - যে কেউ বা যাই হোক না কেন - অন্য সার্ভারকে মাস্টার বানানোর জন্য, আবেদনটি অনলাইনে ফিরে আসার পরেও মূল কারণটিতে ফিরে যেতে কোনও কারণেই অনুমতি দেওয়া যাবে না হস্তক্ষেপ ছাড়াই।

ধরা যাক আপনি একটি বাগ আঘাত করেছেন এবং একটি সফ্টওয়্যার-জোর করে ক্র্যাশ রয়েছে; mysqld_safeযথাযথভাবে পুনরায় আরম্ভ হয় mysqldএবং InnoDB ক্র্যাশ পুনরুদ্ধার নির্দোষভাবে সম্পাদন করে। তবে এটি কয়েক মিনিট সময় নেয়।

এদিকে, মাস্টার নিচে রয়েছে তাই আপনার অ্যাপ্লিকেশনটি দাসের কাছে চলে গেছে। আপনার সিস্টেম যাই করুক না কেন লেনদেন তৈরি করা হয়েছে, অর্ডার দেওয়া হয়েছে, তহবিল স্থানান্তর করা হয়েছে, মন্তব্য পোস্ট করা হয়েছে, ব্লগ সম্পাদিত হয়েছে।

এখন, আসল মাস্টার অনলাইনে ফিরে আসবেন।

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

সুতরাং এটি সমালোচনা যে অ্যাপ্লিকেশনটিকে আপনার হস্তক্ষেপ ছাড়াই মূল মাস্টারের কাছে ফিরে যেতে দেওয়া হবে না।

অপেক্ষা করুন, আমি বর্ণনা করার সাথে সাথে আপনি কি এই দৃশ্যের সাথে সমস্যাটি পেয়েছেন? মাস্টার ব্যর্থ হয়েছে তবে আপনার অ্যাপ্লিকেশনটি দাসটি ব্যবহার করবে না, কারণ এটি মনে করে যে ক্রীতদাসটি এখনও ক্রীতদাস এবং কর্তা নয় ... information_schema.processlistক্রীতদাসের ক্যোয়ারী এখনও শূন্য নয়, এমনকি যদি মাস্টার সার্ভারটি চালিত হয় তবে ।

সুতরাং অ্যাপ্লিকেশনটিতে কিছু আবিষ্কার করার তেমন কোনও পয়েন্ট নেই কারণ STOP SLAVEযে পরীক্ষাটি কার্যকর হওয়ার জন্য আপনাকে ম্যানুয়ালি করতে হবে।

আপনি যদি অ্যাপ্লিকেশনটি স্যুইচ করতে সক্ষম হন তবে আপনি আরও ভাল পদ্ধতির সাথে সার্কুলার প্রতিরূপ সহ সার্ভারগুলি কনফিগার করতে পারেন।

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

আপনি পৃথক হওয়ার কারণে মাইএসকিউএল সার্ভারগুলিতে এইচএ সরঞ্জামগুলি মোতায়েন করতে পারবেন না, তবে আপনি অ্যাপ্লিকেশন সার্ভারে চলমান এইচএপিপ্রক্সির সাহায্যে এটি প্রয়োগ করতে পারেন। অ্যাপ্লিকেশনটি লোকালহোস্টের "মাইএসকিউএল" এর সাথে সংযুক্ত, যা মোটেও মাইএসকিউএল নয়, তবে এটি আসলে হ্যাপ্রোক্সি ... এবং এটি উপযুক্ত মাইএসকিউএল মেশিনে টিসিপি সংযোগটি ফরোয়ার্ড করে।

HAProxy মাইএসকিউএল সার্ভারের সংযোগগুলি পরীক্ষা করতে পারে এবং কেবল কোনও মাইএসকিউএল মেশিনে ট্র্যাফিক অফার করে যা সংযোগগুলি গ্রহণ করে এবং প্রমাণীকরণের অনুমতি দেয়।

অ্যাপ্লিকেশন সার্ভারে চলমান HAProxy এর সংমিশ্রণ (অ্যাপ্লিকেশন সার্ভারের অন্যান্য কাজের তুলনায় এটির সংস্থানগুলির চাহিদা যথেষ্ট পরিমাণে হবে না - এটি কেবলমাত্র সকেটগুলি এক সাথে বেঁধে রাখা এবং তাদের পেডলোড উপেক্ষা করে) ... এবং মাইএসকিউএল বিজ্ঞপ্তিটির প্রতিলিপি প্রশ্নটি যা জানা গেছে তার ভিত্তিতে আমি সম্ভবত এই উদাহরণটি গ্রহণ করব।

অথবা, কঠোরভাবে ম্যানুয়াল সেটআপের জন্য, /etc/hostsঅ্যাপ্লিকেশনটি মাইএসকিউএল-এর সাথে সংযোগ স্থাপনের জন্য অ্যাপ্লিকেশন সার্ভারের ফাইলটিতে একটি প্রবেশের মতো "আবিষ্কার" এর চেয়ে সহজ কিছু দিয়ে যান , যা আপনি ম্যানুয়ালি আপডেট করতে পারেন - দাসের পদোন্নতি ধরে নিয়ে মাস্টার একটি ম্যানুয়াল প্রক্রিয়া হতে মনস্থ করা হয়।

অথবা, পারকোনা এক্সট্রাডিবি ক্লাস্টার ব্যবহার করে আরও জটিল কিছু। যদিও এর জন্য, আপনি একটি তৃতীয় সার্ভার যুক্ত করতে চাইবেন, কারণ PXC- তে 3 টি নোডের সাথে যদি 2 সার্ভার একে অপরকে দেখতে পান এবং 1 সার্ভার থেকে বিচ্ছিন্ন হয়ে যায় (যদি তিনটি এখনও চলমান থাকে) তবে 2 সার্ভার সুখে চলতে থাকে তবে 1 সার্ভারটি একটি সামান্য বলের মধ্যে কার্ল হয়ে যায় এবং কোনও কিছু করতে অস্বীকৃতি জানায় যেহেতু বুঝতে পারে যে এটি অবশ্যই বিজোড় হতে হবে। এটি কাজ করে কারণ 2 টি উপলব্ধি করে যে তারা এখনও নেটওয়ার্ক বিভক্ত হওয়ার আগে অনলাইনে থাকা নোডগুলির বেশিরভাগ গঠন করে এবং 1 বুঝতে পারে যে এটি নেই। PXC- এর সাথে আপনার অ্যাপ্লিকেশনটি কোন সার্ভারের সাথে সংযুক্ত রয়েছে তা সত্যিই কিছু যায় আসে না।

আমি বলি যে এই সমস্তটি "সার্ভারগুলিতে কোনটি মাস্টার তা দেখার জন্য অ্যাপ্লিকেশন জরিপটি প্রয়োগ করবেন না" বলার কারণ এটি আপনাকে তাড়াতাড়ি বা পরে দংশন করবে এবং এটি যতক্ষণ না কামড় দেবে ততক্ষণ আপনার পারফরম্যান্সে স্তব্ধ হয়ে যাবে।


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

1
সাহায্য করে আনন্দ পেলাম. আপনি যদি ইতিমধ্যে না থাকেন তবে একটি আপ-ভোট প্রশংসা হবে। বিজ্ঞপ্তিযুক্ত প্রতিলিপিটি মাস্টার / স্লেভের মতোই নির্ভরযোগ্য (এটি একই প্রযুক্তি, কেবল উভয় দিকের দিকে যাচ্ছে) যতক্ষণ আপনি বুঝতে পারবেন যে এটি কীভাবে কাজ করে এবং এটি একটি বুদ্ধিমান উপায়ে ব্যবহার করে। যতক্ষণ না সার্ভারগুলি যথাযথভাবে সিঙ্ক হয় এবং অ্যাপ্লিকেশনটি একবারে কেবল একটি সার্ভারে লিখতে থাকে, ততক্ষণ আমার কোনও সমস্যা হয়নি। auto_increment_*ভেরিয়েবলগুলি "এই ক্ষেত্রে" ক্ষেত্রে এই দৃশ্যে এখনও ব্যবহার করা ভাল are এছাড়াও, ব্যবহার করতে মনে রাখবেন binlog_format= rowবা mixed- না statement(এমনকি আপনি বিজ্ঞপ্তিটি করছেন না)।
মাইকেল - sqlbot

আমি গ্রহণযোগ্য উত্তরটিকে বিশুদ্ধভাবে পরিবর্তন করেছি কারণ এই বিশদ বিবরণটি সিস্টেমটিকে আরও দৃ be় হতে পুনরায় স্থপতি করতে সহায়তা করেছিল। @ রোল্যান্ডোমাইএসকিউএলডিবিএর উত্তরটি এখনও সঠিক এবং আমি প্রাথমিকভাবে বর্ণিত সমস্যাটি সমাধান করে। ধন্যবাদ!
ইথান হায়ন

10

আপনি যদি কেবলমাত্র মাস্টার / স্লেভ ব্যবহার করছেন তবে এখানে দ্রুত এবং মলিন কিছু রয়েছে:

SELECT COUNT(1) SlaveThreadCount
FROM information_schema.processlist
WHERE user='system user';

এটি আপনাকে কী বলে?

  • যদি SlaveThreadCount= 0 হয় তবে আপনার মাস্টার রয়েছে
  • যদি SlaveThreadCount> 0 হয় তবে আপনার কাছে স্লেভ রয়েছে

কায়েট : এটি যতক্ষণ না আপনি চালাবেন না ততক্ষণ কাজ করেSTOP SLAVE;

আরেকটি জিনিস চেষ্টা করে দেখুন: আপনি যদি স্লেভে বাইনারি লগিং নিষ্ক্রিয় করেন এবং আপনি চালনা করেন SHOW MASTER STATUS;তবে মাস্টার আপনাকে বর্তমান বাইনারি লগ দেয় gives দাস আপনাকে কিছুই দেয় না।


আশ্চর্যজনক, এটি ঠিক আমার প্রয়োজন। আপনি কি মনে করেন যে এটি সমস্যার অগোছালো সমাধান? কেবলমাত্র আমি ভাবতে পারি যে উভয় সার্ভারকেই মাস্টার হিসাবে প্রচার করা হচ্ছে, তবে বাস্তবে কখনই এটি হওয়া উচিত নয়।
ইথান হায়ন

যদি এই উত্তরটি আপনার প্রয়োজন হয় তবে দয়া করে আমার উত্তরটিতে চেকমার্কটি ক্লিক করে গৃহীত উত্তরটিকে চিহ্নিত করুন।
RolandoMySQLDBA

আমি এটি আরও 5 মিনিটের জন্য গ্রহণযোগ্য হিসাবে চিহ্নিত করতে পারি না :)
ইথান হায়ন

সমস্যা নেই. আমি খুশি হলাম আমি সাহায্য করতে পারলাম !!!
RolandoMySQLDBA

0

mysql প্রম্পট
mysql> দাস স্থিতি প্রদর্শন থেকে এই বিবৃতিটি কার্যকর করুন ;

স্লেভ এ এটি অনেকগুলি পরামিতি এবং তাদের মান / স্থিতি দেখায় যখন মাস্টার এ খালি সেট দেখায়

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