রেপ্লিকেশন SQL ডাটাবেসে সোর্স ডাটাবেস থেকে অন্য একটি (বা একাধিক) ডাটাবেসে ডেটা কপি করার প্রক্রিয়া এবং বিপরীত দিকেও। একটি ডাটাবেস সার্ভার থেকে ডেটা 끊임없이 এক বা একাধিক সার্ভারে কপি হয়। আপনি রেপ্লিকেশন ব্যবহার করতে পারেন রিকোয়েস্ট ডিস্ট্রিবিউট এবং ব্যালেন্স করতে রেপ্লিকেটেড সার্ভারের পুল জুড়ে, MariaDB ডাটাবেসের ফেইলওভার এবং হাই অভেইলেবিলিটি প্রদান করতে। MariaDB (এবং MySQL) দুটি ধরনের ডাটাবেস রেপ্লিকেশন মোড ব্যবহার করার অনুমতি দেয়: মাস্টার-মাস্টার এবং মাস্টার-স্লেভ। এই আর্টিকেলে আমরা লিনাক্স CentOS 7-এ উভয় ধরণের MariaDB রেপ্লিকেশন কনফিগার করার পদ্ধতি দেখব।
MariaDB ইনস্টলেশন
আমরা আগে CentOS 7-এ MariaDB ইনস্টলেশন প্রক্রিয়া বর্ণনা করে একটি আর্টিকেল প্রকাশ করেছিলাম। আপনি এখানে ক্লিক করে পড়তে পারেন: https://woshub.com/mariadb-install-configure-tunning-centos। তাই আমরা MariaDB ইনস্টলেশনের ওপর ফোকাস না করে, রেপ্লিকেশন কনফিগার করার পদ্ধতিতে যাব।
MariaDB-এ সিম্পল মাস্টার-মাস্টার রেপ্লিকেশন কনফিগারেশন
মাস্টার-মাস্টার রেপ্লিকেশন স্কিমায়, MariaDB/MySQL ডাটাবেস সার্ভারের যেকোনো একটি ব্যবহার করা যায় ডেটা লেখা বা পড়ার জন্য। রেপ্লিকেশন একটি বিশেষ binlog ফাইলের উপর ভিত্তি করে, যেখানে মাস্টার সার্ভার ডাটাবেসের সকল অপারেশন সংরক্ষণ করে। স্লেভ সার্ভার মাস্টারের সাথে সংযোগ করে কমান্ডগুলো তার ডাটাবেসে প্রয়োগ করে।
১. MariaDB: প্রথম মাস্টার সার্ভার (মাস্টার-১) কনফিগারেশন
আপনার প্রথম MariaDB সার্ভারের my.cnf ফাইলে নিচের লাইনগুলো যোগ করুন:
#replication server_id = 1 report_host = master log_bin = /var/lib/mysql/mariadb-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
service mariadb restart
রেপ্লিকেশন কনফিগার করার জন্য একটি ইউজার তৈরি করুন:
mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';
মাস্টার-১ সার্ভার থেকে বিন_লগ ডেটা পেতে হবে স্লেভ যোগ করতে:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000002 | 664 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
২. MariaDB: দ্বিতীয় মাস্টার সার্ভার (মাস্টার-২) কনফিগারেশন
দ্বিতীয় MariaDB সার্ভারের সাথে সংযোগ করুন, my.cnf ফাইল খুলুন এবং নিচের কনফিগারেশন যোগ করুন:
#replication server_id = 2 report_host = master2 log_bin = /var/lib/mysql/mariadb-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
দ্বিতীয় সার্ভারেও একটি নতুন ইউজার তৈরি করুন:
create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';
মাস্টার-২-এ bin_log পান:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 667 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)
আমাদের সফটওয়্যার রেপ্লিকেশন ক্লাস্টারে MariaDB সার্ভিসের সংযোগ কনফিগার করা যাক:
স্লেভ বন্ধ করুন:
STOP SLAVE;
দ্বিতীয় সার্ভারে মাস্টার-১ যোগ করুন:
CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;
রেপ্লিকেশন শুরু করুন:
START SLAVE;
মাস্টার-১-এ সংযোগ করুন এবং একই ধাপগুলো অনুসরণ করুন, কিন্তু দ্বিতীয় সার্ভারের তথ্য দিয়ে:
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;
দ্বিতীয় সার্ভারের স্ট্যাটাস চেক করুন:
show slave status \G
স্ক্রিনশটে দেখুন, দুটি সার্ভারের মাঝপথে সংযোগ আছে, এবং কোনো এরর নেই।
৩. MariaDB সার্ভারগুলোর মাঝপথে রেপ্লিকেশন চেক কিভাবে করবেন?
তারপর মাস্টার-মাস্টারে রেপ্লিকেশন কাজ করছে কিনা নিশ্চিত করতে, আমরা মাস্টার-১-এ একটি নতুন ডাটাবেস তৈরি করব এবং সেটিতে একটি টেবিল তৈরি করব।
MariaDB [(none)]> create database master1;
MariaDB [(none)]> use master1;
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
নিশ্চিত করুন যে এই ডাটাবেসটি স্বয়ংক্রিয়ভাবে দ্বিতীয় মাস্টারে রেপ্লিকেট হয়েছে এবং একই টেবিলটি রয়েছে:
MariaDB [(none)]> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | master1 | | mysql | | performance_schema | +--------------------+
MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;
+-------------------+ | Tables_in_master1 | +-------------------+ | hello | +-------------------+
ডাটাবেস দ্বিতীয় মাস্টারেও তৈরি হয়েছে। পূর্ণ চক্র চেক করতে, দ্বিতীয় মাস্টার সার্ভারে Master1 ডাটাবেসে একটি টেবিল তৈরি করুন এবং চেক করুন এটি প্রথম সার্ভারে প্রদর্শিত হচ্ছে কিনা।
MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );
hello_master1 টেবিল প্রথম সার্ভারে রেপ্লিকেট হয়েছে:
MariaDB [master1]> show tables;
+-------------------+ | Tables_in_master1 | +-------------------+ | hello | | hello_master1 | +-------------------+
আপনি দেখতে পাচ্ছেন, নতুন টেবিল মাস্টার-১-এ প্রদর্শিত হয়েছে। রেপ্লিকেশন কাজ করছে।
MariaDB-এ মাস্টার-স্লেভ রেপ্লিকেশন সেটআপ কিভাবে করবেন?
মাস্টার-স্লেভ MariaDB রেপ্লিকেশন মোডে, একটি সার্ভার স্লেভ হিসেবে কাজ করে, এবং মাস্টার সার্ভার থেকে ডেটা liên tục সেটিতে লেখা হয়। স্লেভ সার্ভারে আপনি যেসব পরিবর্তন করবেন সেগুলো মাস্টার সার্ভারে ট্রান্সফার হবে না। এই ডাটাবেস রেপ্লিকেশন টাইপ আরও রেজিলিয়েন্ট এবং অধিক ব্যবহৃত হয়। এই কনফিগারেশনে, আপনার সর্বদা একটি ব্যাকআপ সার্ভার থাকে আপ-টু-ডেট ডাটাবেসের সাথে, এবং যদি একটি স্লেভ সার্ভার ফেল করে, মাস্টার কোনো ডেটা হারাবে না। আপনি আপনার প্রজেক্টের ডাটাবেস লোড ডিস্ট্রিবিউট করতে পারেন যাতে অ্যাপ্লিকেশনগুলো আপনার স্লেভ সার্ভার থেকে ডেটা পড়ে এবং ডেটা শুধু মাস্টার সার্ভারে লেখে। এইভাবে, আপনি ডাটাবেস রেসপন্স যতটা সম্ভব দ্রুত করতে পারেন।
MariaDB ডাটাবেসের মাস্টার+স্লেভ রেপ্লিকেশন কনফিগার করার সময়, মাস্টার সার্ভার (মাস্টার১) উপরে বর্ণনাকৃতভাবে কনফিগার করা হয়।
স্লেভ সার্ভারে যান। স্লেভের my.cnf ফাইলে নিচের কনফিগারেশন যোগ করুন:
#replication server_id = 2 report_host = slave2 log_bin = /var/lib/mysql/mariadb-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
MariaDB সার্ভিস রিস্টার্ট করুন। প্রথম সার্ভার থেকে bin_log ইনফো পান:
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | mariadb-bin.000001 | 664 | | | +--------------------+----------+--------------+------------------+
স্লেভ সার্ভারে mariadb কনসোলে এই কমান্ডগুলো চালান:
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
MariaDB [(none)]> START SLAVE;
যদি আপনি বিদ্যমান MariaDB ডাটাবেসের জন্য রেপ্লিকেশন কনফিগার করেন, তবে রেপ্লিকেশন শুরু করার আগে ডাটাবেসকে রিড-অনলি মোডে রাখতে হবে যাতে bin_log নম্বর আপডেট না হয়।
SET GLOBAL read_only = ON;
আপনাকে ডাটাবেস মেমরি ডাম্প তৈরি করতে হবে এবং সেটি আপনার স্লেভ সার্ভারে MariaDB-র প্রাথমিক ডেটা আপলোডের জন্য ব্যবহার করতে হবে।
স্লেভ স্ট্যাটাস চেক করতে: SHOW SLAVE STATUS\G;
মাস্টারে একটি ডাটাবেস তৈরি করতে:
MariaDB [(none)]> create database master_hello;
নিশ্চিত করুন যে ডাটাবেসটি স্লেভ সার্ভারেও তৈরি হয়েছে:
MariaDB [(none)]> show databases;
+--------------------+ | Database | +--------------------+ | information_schema | | master_hello | | master_test | | mysql | | performance_schema | | test | +--------------------+
স্লেভ সার্ভারে একটি ডাটাবেস তৈরি করুন এবং চেক করুন ডাটাবেসটি মাস্টারে রেপ্লিকেট হয়েছে কিনা।
আপনি দেখতে পাচ্ছেন, আমরা ডাটাবেস তৈরি করেছি এবং এটি স্লেভ-এ আছে। আসুন চেক করি মাস্টারে প্রদর্শিত হয়েছে কিনা। এটি প্রদর্শিত হয়নি। ডেটা স্লেভ থেকে মাস্টারে রেপ্লিকেট হয় না।
আরেকটি চেক করি এবং স্লেভ সার্ভার থেকে master_hello ডাটাবেস মুছে ফেলি:
চেক করুন মাস্টার সার্ভার থেকে মুছে গেছে কিনা:
আপনি দেখতে পাচ্ছেন, এটি ঠিক আছে এবং ডাটাবেসটি বিদ্যমান।
P.S.: MariaDB রেপ্লিকেশন কনফিগার করার সময় আপনি কিছু পিটফলের সম্মুখীন হতে পারেন, 그중 সবচেয়ে ঘন Ereignisse ফায়ারওয়াল। ডিফল্টভাবে, CentOS-এ firewalld ইনস্টল থাকে, যা MariaDB রেপ্লিকেশন পোর্ট (TCP 3396) ব্লক করে। আপনি হয় পোর্টটি iptables ব্যবহার করে খুলতে পারেন, অথবা ফায়ারওয়াল ডিজেবল করতে পারেন (সেরা অপশন নয়)।
বাইন্ড-অ্যাড্রেস প্যারামিটারে my.cnf-এ ডাটাবেস যে IP ঠিকানায় কানেকশনের জন্য অপেক্ষা করছে সেটি নির্দিষ্ট করা থাকে। লোকাল এবং এক্সটার্নাল কানেকশন অনুমতি দিতে, আপনাকে এই লাইনটি কমেন্ট আউট করতে হবে এবং মাস্টার/স্লেভ IP ঠিকানা থেকে পোর্ট 3306-এ কানেকশন অনুমতি দেওয়ার iptables রুল যোগ করতে হবে।
iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP
প্রাথমিক সেটআপের সময়, আমি এই সমস্যার সম্মুখীন হয়েছিলাম, কিন্তু এটি সহজে শনাক্ত করা যায়। আপনি যদি স্লেভ স্ট্যাটাস চেক SHOW SLAVE STATUS\G চালান, তবে এই এররটি দেখতে পাবেন:
আপনি my.cnf ফাইলে #replication ব্লকে কিছু প্যারামিটার যোগ করতে পারেন। নিচে আমি কিছু উদাহরণ এবং উপকারী প্যারামিটারların সংক্ষিপ্ত বিবরণ দিচ্ছি। MariaDB ডাটাবেস রেপ্লিকেশন কনফিগার করার সময় উপকারী হতে পারে এমন কিছু অন্যান্য ফাংশনের উদাহরণও দিচ্ছি।
server_id = 1— সার্ভার ID নির্দিষ্ট করুন, সাধারণত ১ থেকে শুরু করা হয়, কিন্তু আপনি যে কোনো নম্বর ব্যবহার করতে পারেন যা রেপ্লিকেশনে ব্যবহৃত অন্যান্য সার্ভারের সাথে মিলবে না।report_host = master— সাধারণত সার্ভারের হোস্টনেম নির্দিষ্ট করা হয়, কিন্তু আপনি এর IP ঠিকানাও দিতে পারেন।log_bin = /var/lib/mysql/mariadb-bin— আপডেট লগের পাথ (log_bin)।log_bin_index = /var/lib/mysql/mariadb-bin.index— বর্তমানে কোন লগ সক্রিয় এবং tidligere কোন লগগুলো ব্যবহার করা হয়েছে তা জানার সুবিধা দেয়।relay_log = /var/lib/mysql/relay-binrelay_log_index = /var/lib/mysql/relay-bin.index— এগুলো রেপ্লিকেশন লগ।
আপনি যদি একটি নির্দিষ্ট ডাটাবেস বা নির্বাচিত ডাটাবেসের রেপ্লিকা কনফিগার করতে চান, তবে নিচের প্যারামিটারগুলো ব্যবহার করুন:
replicate-do-db = dbname— একাধিক ডাটাবেসের জন্য, তাদের নাম কমা দিয়ে আলাদা করুন।
কিছু ডাটাবেস রেপ্লিকেশন থেকে বাদ দিতে (সাধারণত সার্ভিস ডাটাবেসগুলো রেপ্লিকেশন থেকে বাদ দেওয়া হয়: information_schema, mysql এবং performance_schema):
binlog-ignore-db = dbname
আপনার bin_log-র জন্য লগ হিস্টরি টাইম সেট করতে:
expire_logs_days = 10— এখানে ১০ হলো লগ সংরক্ষণের দিনের সংখ্যা।
এছাড়া, আপনার মাস্টার সার্ভারের ডেটা যদি ভিন্ন নামের ডাটাবেসে লেখা হয়, তবে কনফিগারেশন ফাইলে এটি সেট করতে পারেন:
replicate-rewrite-db=dbmastername->dbslavename
রেপ্লিকেশন কনফিগারেশন সম্পন্ন। আমি মনে করি এই আর্টিকেল ব্যবহার করে আপনি কোনো সমস্যা ছাড়া MariaDB রেপ্লিকেশন মাস্টার + মাস্টার এবং মাস্টার + স্লেভ মোডে কনফিগার করতে পারবেন।