প্রতিলিপি এসকিউএল ডাটাবেসে উৎস ডাটাবেস থেকে অন্য একটি (বা একাধিক) এবং তদ্বিপরীত ডেটা অনুলিপি করার প্রক্রিয়া। একটি ডাটাবেস সার্ভার থেকে ডেটা ক্রমাগত এক বা একাধিক সার্ভারে অনুলিপি করা হয়। আপনি প্রতিলিপি করা সার্ভারের পুল জুড়ে অনুরোধগুলি বিতরণ এবং ভারসাম্য রাখতে, ফেইলওভার এবং MariaDB ডেটাবেসের উচ্চ উপলব্ধতা প্রদান করতে প্রতিলিপি ব্যবহার করতে পারেন। মারিয়াডিবি (এবং মাইএসকিউএল) তৈরি করা দুই ধরনের ডাটাবেস প্রতিলিপি ব্যবহার করার অনুমতি দেয়:মাস্টার-মাস্টার এবং মাস্টার-স্লেভ . এই নিবন্ধে আমরা বিবেচনা করব কিভাবে Linux CentOS 7-এ উভয় ধরনের MariaDB প্রতিলিপি কনফিগার করা যায়।
মারিয়াডিবি ইনস্টল করা হচ্ছে
এর আগে আমরা CentOS 7-এ MariaDB ইনস্টলেশনের প্রক্রিয়া বর্ণনা করে একটি নিবন্ধ প্রকাশ করেছি। আপনি লিঙ্কটি অনুসরণ করে এটি পড়তে পারেন:https://woshub.com/mariadb-install-configure-tunning-centos। তাই আমরা মারিয়াডিবি ইন্সটলেশনের উপরই ফোকাস করব না, কিন্তু কিভাবে প্রতিলিপি কনফিগার করতে হয় সেদিকে এগিয়ে যাই।
মারিয়াডিবি-তে সাধারণ মাস্টার-মাস্টার রেপ্লিকেশন কনফিগার করা হচ্ছে
একটি মাস্টার-মাস্টার রেপ্লিকেশন স্কিমে, MariaDB/MySQL ডাটাবেস সার্ভারের যেকোনো একটি ডেটা লেখা বা পড়ার জন্য ব্যবহার করা যেতে পারে। প্রতিলিপি একটি বিশেষ বিনলগ ফাইলের উপর ভিত্তি করে, একটি মাস্টার সার্ভার ডাটাবেসের সাথে সমস্ত ক্রিয়াকলাপ সংরক্ষণ করে। একটি স্লেভ সার্ভার মাস্টারের সাথে সংযোগ করে এবং তার ডাটাবেসে কমান্ড প্রয়োগ করে।
1. মারিয়াডিবি:প্রথম মাস্টার সার্ভারের কনফিগারেশন (মাস্টার-১)
my.cnf-এ নিম্নলিখিত লাইন যোগ করুন আপনার প্রথম MariaDB সার্ভারে ফাইল:
#replicationserver_id =1report_host =masterlog_bin =/var/lib/mysql/mariadb-binlog_bin_index =/var/lib/mysql/mariadb-bin.indexrelay_log =/var/lib/mysql/relay-binrelay_log_b/// mysql/relay-bin.index
পরিষেবা mariadb পুনরায় চালু করুন
প্রতিলিপি কনফিগার করতে একটি ব্যবহারকারী তৈরি করুন:
mysql
'test_master'@'%' দ্বারা চিহ্নিত ব্যবহারকারী তৈরি করুন;
*.*-এ 'test_master'@'%';
একটি স্লেভ যোগ করতে, আমাদের মাস্টার-1 সার্ভার থেকে bin_log ডেটা পেতে হবে:
মারিয়াডিবি [(কোনটিই নয়)]> মাস্টার স্ট্যাটাস দেখান;
2. মারিয়াডিবি:দ্বিতীয় মাস্টার সার্ভারের কনফিগারেশন (মাস্টার-২)
দ্বিতীয় MariaDB সার্ভারের সাথে সংযোগ করুন, my.cnf ফাইলটি খুলুন এবং এতে নিম্নলিখিত কনফিগারেশন যোগ করুন:
#replicationserver_id =2report_host =master2log_bin =/var/lib/mysql/mariadb-binlog_bin_index =/var/lib/mysql/mariadb-bin.indexrelay_log =/var/lib/mysql/relay-binrelay_log_b//=mysql/relay-bin.index
দ্বিতীয় সার্ভারেও একটি নতুন ব্যবহারকারী তৈরি করুন:
'test_master2'@'%' দ্বারা চিহ্নিত ব্যবহারকারী 'test_master2'@'%' তৈরি করুন;
*.*-এ 'test_master2'@'%'-এ অনুলিপি স্লেভ মঞ্জুর করুন;
মাস্টার-২-এ বিন_লগ পান:
মারিয়াডিবি [(কোনটিই নয়)]> মাস্টার স্ট্যাটাস দেখান;
আসুন আমাদের সফ্টওয়্যার প্রতিলিপি ক্লাস্টারে MariaDB সার্ভারের মধ্যে সংযোগ কনফিগার করি:
দাসকে থামান:
স্লাভ বন্ধ করুন;
দ্বিতীয় সার্ভারে মাস্টার-1 যোগ করুন:
মাস্টারকে MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POScode;6>=6
প্রতিলিপি শুরু করুন:
স্টার্ট স্লেভ;
Master-1 এর সাথে সংযোগ করুন এবং একই পদক্ষেপগুলি অনুসরণ করুন, তবে পরিবর্তে দ্বিতীয় সার্ভার সম্পর্কে তথ্য উল্লেখ করুন:
স্লাভ বন্ধ করুন;
মাস্টারকে মাস্টার_হোস্টে পরিবর্তন করুন='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-LOG_FILE='mariadb-LOSTER/0br_6.07;
>দাস শুরু করুন;
দ্বিতীয় সার্ভারের স্থিতি পরীক্ষা করুন:
স্লেভ স্ট্যাটাস দেখান \G
আপনি স্ক্রিনশটগুলিতে দেখতে পাচ্ছেন, দুটি সার্ভারের মধ্যে সংযোগ রয়েছে এবং কোনও ত্রুটি ঘটে না৷
3. মারিয়াডিবি সার্ভারের মধ্যে প্রতিলিপি কিভাবে পরীক্ষা করবেন?
তারপর নিশ্চিত করতে যে দুটি মারিয়াডিবি সার্ভারের মধ্যে প্রতিলিপিটি মাস্টার+মাস্টারে কাজ করে, আমরা মাস্টার-1-এ একটি নতুন ডাটাবেস তৈরি করব এবং এতে একটি টেবিল তৈরি করব।
মারিয়াডিবি [(কোনটিই নয়)]> ডেটাবেস মাস্টার1 তৈরি করুন;
MariaDB [(কোনটি নয়)]> master1 ব্যবহার করুন;
MariaDB [master1]> টেবিল তৈরি করুন হ্যালো (
-> AuthorID INT NULL AUTO_INCREMENT নয়,
-> লেখকের নাম VARCHAR(100),
-> প্রাথমিক কী(AuthorID )
->);
নিশ্চিত করুন যে এই ডাটাবেসটি স্বয়ংক্রিয়ভাবে দ্বিতীয় মাস্টারে প্রতিলিপি হয়েছে এবং একই টেবিল রয়েছে:
মারিয়াডিবি [(কোনটিই নয়)]> ডেটাবেস দেখান;
মারিয়াডিবি [(কোনটিই নয়)]> মাস্টার1 ব্যবহার করুন;
মারিয়াডিবি [মাস্টার1]> টেবিল দেখান;
+-------------------+| টেবিল_ইন_মাস্টার1 |+-------------------+| হ্যালো |+-------------------+
সেকেন্ড মাস্টারেও ডাটাবেস তৈরি করা হয়েছে। সম্পূর্ণ চক্র পরীক্ষা করতে, দ্বিতীয় মাস্টার সার্ভারে Master1 ডাটাবেসে একটি টেবিল তৈরি করুন এবং এটি প্রথম সার্ভারে প্রদর্শিত হচ্ছে কিনা তা পরীক্ষা করুন।
MariaDB [master1]> Hello_master1 টেবিল তৈরি করুন (
-> AuthorID INT NULL AUTO_INCREMENT নয়,
-> লেখকের নাম VARCHAR(100),
-> প্রাথমিক কী(লেখক)
>->);
hello_master1 টেবিলটি প্রথম সার্ভারে প্রতিলিপি করা হয়েছে:
MariaDB [master1]> টেবিল দেখান;
+-------------------+| টেবিল_ইন_মাস্টার1 |+-------------------+| হ্যালো || hello_master1 |+-------------------+
আপনি দেখতে পাচ্ছেন, মাস্টার-1-এ নতুন টেবিল হাজির হয়েছে। প্রতিলিপি কাজ করে।
মারিয়াডিবিতে মাস্টার-স্লেভ রেপ্লিকেশন কীভাবে সেট আপ করবেন?
মাস্টার-স্লেভ মারিয়াডিবি রেপ্লিকেশন মোডে, একটি সার্ভার স্লেভ হিসাবে কাজ করে এবং মাস্টার সার্ভার থেকে ডেটা ক্রমাগত এতে লেখা হয়। স্লেভ সার্ভারে আপনার করা সমস্ত পরিবর্তন মাস্টার সার্ভারে স্থানান্তর করা হবে না। এই ডাটাবেস প্রতিলিপি টাইপ আরো স্থিতিস্থাপক এবং আরো প্রায়ই ব্যবহার করা হয়. এই কনফিগারেশনে, আপনার কাছে সর্বদা আপ-টু-ডেট ডাটাবেস সহ একটি ব্যাকআপ সার্ভার থাকে এবং যদি একটি স্লেভ সার্ভার ব্যর্থ হয়, মাস্টার কোনো ডেটা হারাবেন না। আপনি আপনার প্রকল্পের জন্য ডাটাবেস লোড বিতরণ করতে পারেন যাতে অ্যাপগুলি আপনার স্লেভ সার্ভার থেকে ডেটা পড়তে পারে এবং শুধুমাত্র মাস্টার সার্ভারে ডেটা লিখতে পারে। এইভাবে, আপনি যত দ্রুত সম্ভব ডাটাবেস প্রতিক্রিয়া তৈরি করুন।
MariaDB ডাটাবেসের মাস্টার+স্লেভ রেপ্লিকেশন কনফিগার করার সময়, মাস্টার সার্ভার (master1) উপরে বর্ণিত হিসাবে কনফিগার করা হয়।
স্লেভ সার্ভারে যান। স্লেভ my.cnf ফাইলে নিম্নলিখিত কনফিগারেশন যোগ করুন:
#replicationserver_id =2report_host =slave2log_bin =/var/lib/mysql/mariadb-binlog_bin_index =/var/lib/mysql/mariadb-bin.indexrelay_log =/var/lib/mysql/relay-binrelay_log_/b/lib_index =mysql/relay-bin.index
MariaDB পরিষেবা পুনরায় চালু করুন। প্রথম সার্ভার থেকে বিন_লগ তথ্য পান:
মারিয়াডিবি [(কোনটিই নয়)]> মাস্টার স্ট্যাটাস দেখান;
স্লেভ সার্ভারে mariadb কনসোলে এই কমান্ডগুলি চালান:
মারিয়াডিবি [(কোনটিই নয়)]> দাস বন্ধ করুন;
মারিয়াডিবি [(কোনটিই নয়)]> মাস্টারকে MASTER_HOST='IP_master' এ পরিবর্তন করুন, MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_6=4;
MariaDB [(কোনটিই নয়)]> স্লাভ শুরু করুন;
Set GLOBAL read_only =চালু;
আপনাকে অবশ্যই ডাটাবেস মেমরি ডাম্প তৈরি করতে হবে এবং আপনার স্লেভ সার্ভারে মারিয়াডিবিতে ডেটা প্রাথমিক আপলোড করার জন্য এটি ব্যবহার করতে হবে।
স্লেভ স্ট্যাটাস চেক করতে:স্লেভ স্ট্যাটাস দেখান\G;
মাস্টারে একটি ডাটাবেস তৈরি করতে:
মারিয়াডিবি [(কোনটিই নয়)]> ডাটাবেস তৈরি করুন master_hello;
নিশ্চিত করুন যে স্লেভ সার্ভারেও ডাটাবেস তৈরি করা হয়েছে:
মারিয়াডিবি [(কোনটিই নয়)]> ডেটাবেস দেখান;
স্লেভ সার্ভারে একটি ডাটাবেস তৈরি করুন এবং ডাটাবেসটি মাস্টারের প্রতিলিপি করা হয়েছে কিনা তা পরীক্ষা করুন৷
আপনি দেখতে পাচ্ছেন, আমরা ডাটাবেস তৈরি করেছি এবং এটি স্লেভে বিদ্যমান। এটি মাস্টারে উপস্থিত হয়েছে কিনা তা পরীক্ষা করা যাক। এটা নেই. ডেটা স্লেভ থেকে মাস্টারে প্রতিলিপি করা হয় না।
এর মানে হল যে মারিয়াডিবি প্রতিলিপি শুধুমাত্র এক দিকে কাজ করে। আসুন আরেকটি পরীক্ষা করি এবং master_hello মুছে ফেলি স্লেভ সার্ভার থেকে ডাটাবেস:
এটি মাস্টার সার্ভার থেকে মুছে ফেলা হয়েছে কিনা তা পরীক্ষা করুন:
আপনি দেখতে পাচ্ছেন, এটা ঠিক আছে এবং ডাটাবেস বিদ্যমান।
P. S.:আপনি যখন mariadb রেপ্লিকেশন কনফিগার করছেন, তখন আপনি কিছু অসুবিধার সম্মুখীন হতে পারেন, যার মধ্যে ফায়ারওয়াল সবচেয়ে বেশি হয়। ডিফল্টরূপে, সেন্টোসে ফায়ারওয়াল্ড ইনস্টল করা আছে, যা মারিয়াডিবি রেপ্লিকেশন পোর্ট (টিসিপি 3396) ব্লক করে। আপনি হয় iptables ব্যবহার করে পোর্ট খুলতে পারেন, অথবা আপনার ফায়ারওয়াল নিষ্ক্রিয় করতে পারেন (সবচেয়ে ভাল বিকল্প নয়)।
যে IP ঠিকানায় ডাটাবেস একটি সংযোগের জন্য অপেক্ষা করছে সেটি my.cnf.-এর বাইন্ড-অ্যাড্রেস প্যারামিটারে নির্দিষ্ট করা আছে। স্থানীয় এবং বাহ্যিক সংযোগের অনুমতি দিতে, আপনাকে এই লাইনটি মন্তব্য করতে হবে এবং iptables নিয়ম যোগ করতে হবে যা মাস্টার থেকে সংযোগের অনুমতি দেয়। /স্লেভ আইপি ঠিকানা পোর্ট 3306।
iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j ড্রপ
প্রাথমিক সেটআপের সময়, আমি এই সমস্যাটি পেয়েছি, কিন্তু এটি সহজেই সনাক্ত করা যায়। আপনি যদি স্লেভ স্ট্যাটাস চালান তাহলে স্লেভ স্ট্যাটাস দেখান\G
চেক করুন , আপনি এই ত্রুটি দেখতে পাবেন:
আপনি #replication
-এ কিছু প্যারামিটার যোগ করতে পারেন my.cnf ফাইলে ব্লক করুন। নীচে আমি কিছু উদাহরণ এবং দরকারী পরামিতিগুলির একটি সংক্ষিপ্ত বিবরণ দেব। আমি অন্যান্য ফাংশনের কিছু উদাহরণ দেব যা আপনি mariadb ডাটাবেস প্রতিলিপি কনফিগার করার সময় সহায়ক হতে পারে।
server_id =1
— সার্ভার আইডি নির্দিষ্ট করুন, সাধারণত আমরা 1 দিয়ে শুরু করি, তবে আপনি এমন কোনো নম্বর ব্যবহার করতে পারেন যা প্রতিলিপির জন্য ব্যবহৃত অন্যান্য সার্ভারগুলির সাথে মেলে না৷
report_host =মাস্টার
— সাধারণত আপনি সার্ভারের হোস্টের নাম উল্লেখ করেন, কিন্তু আপনি পরিবর্তে এর IP ঠিকানা লিখতে পারেন।
log_bin =/var/lib/mysql/mariadb-bin
— হল আপডেট লগের পথ (log_bin)।
log_bin_index =/var/lib/mysql/mariadb-bin.index
— আপনাকে খুঁজে বের করতে দেয়, কোন লগ বর্তমানে সক্রিয় এবং কোন লগ আগে ব্যবহার করা হয়েছিল।
relay_log =/var/lib/mysql/relay-bin
relay_log_index =/var/lib/mysql/relay-bin.index
— হল প্রতিলিপি লগ।
আপনি যদি একটি নির্দিষ্ট ডাটাবেস বা নির্বাচিত ডাটাবেসের প্রতিরূপ কনফিগার করতে চান তবে নিম্নলিখিত পরামিতিগুলি ব্যবহার করুন:
replicate-do-db =dbname
— যদি আপনার একাধিক ডাটাবেসের প্রয়োজন হয়, তাহলে কমা দিয়ে আলাদা করে তাদের নাম উল্লেখ করুন।
প্রতিলিপি থেকে কিছু ডাটাবেস বাদ দিতে (স্বাভাবিকভাবে, পরিষেবা ডেটাবেসগুলি প্রতিলিপি থেকে বাদ দেওয়া হয়:information_schema, mysql এবং performance_schema):
binlog-ignore-db =dbname
আপনার বিন_লগের জন্য লগ ইতিহাসের সময় সেট করতে:
expire_logs_days =10
— যেখানে লগ সংরক্ষণ করা হবে সেই দিনগুলির সংখ্যা 10৷
এছাড়াও, যদি আপনার মাস্টার সার্ভার থেকে ডেটা একটি ভিন্ন নামে একটি ডাটাবেসে লেখা হয়, আপনি এটি কনফিগার ফাইলে সেট করতে পারেন:
replicate-rewrite-db=dbmastername->dbslavename
প্রতিলিপি কনফিগারেশন সম্পন্ন হয়. আমি মনে করি এই নিবন্ধটি ব্যবহার করে আপনি কোনো সমস্যা ছাড়াই মাস্টার + মাস্টার এবং মাস্টার + স্লেভ মোডে মারিয়াডিবি প্রতিলিপি কনফিগার করতে সক্ষম হবেন।