@ রোল্যান্ডোমাইএসকিউএলডিবিএ এই প্রশ্নের সঠিক উত্তর দিয়েছে ... তবে তিনি এও উল্লেখ করেছেন যে তার সমাধান "দ্রুত ও নোংরা"।
এবং এটি একটি খুব সত্য বিবৃতি। :)
এখানে যে বিষয়টি আমাকে উদ্বেগ করছে তা উত্তরটির সাথে নয়, বরং মূল প্রশ্নটি একটি ভুল অনুমান হিসাবে দেখা যাচ্ছে:
আমি দুটি সার্ভারকে জিজ্ঞাসা করতে পারি এবং জিজ্ঞাসা করতে পারি যে কোনটি একজন মাস্টার, তারপরে সেই সাথে সমস্ত প্রশ্নগুলি সম্পাদন করুন।
সমস্যাটি হ'ল মাইএসকিউএল প্রতিরূপে, মাস্টার কখনই সত্যই সচেতন হন না যে এটি মাস্টার।
"প্রচার থেকে মাস্টার" ধারণাটি আসলে মাইএসকিউএল অ্যাসিক্রোনাস প্রতিরূপে ধারণা নয়। একটি মাইএসকিউএল সার্ভারকে মাস্টার রোল হিসাবে "প্রচার করা" এমন কিছু যা মাইএসকিউএল সার্ভারের "বাহ্যিক" হয়, যা মাইএসকিউএল সার্ভারগুলির "অভ্যন্তরীণ" থেকে কিছু ঘটে তার বিপরীতে 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- এর সাথে আপনার অ্যাপ্লিকেশনটি কোন সার্ভারের সাথে সংযুক্ত রয়েছে তা সত্যিই কিছু যায় আসে না।
আমি বলি যে এই সমস্তটি "সার্ভারগুলিতে কোনটি মাস্টার তা দেখার জন্য অ্যাপ্লিকেশন জরিপটি প্রয়োগ করবেন না" বলার কারণ এটি আপনাকে তাড়াতাড়ি বা পরে দংশন করবে এবং এটি যতক্ষণ না কামড় দেবে ততক্ষণ আপনার পারফরম্যান্সে স্তব্ধ হয়ে যাবে।