মাইএসকিউএল মাস্টার-স্লেভ রেপ্লিকেশন সেটআপ তৈরি এবং এটির সমস্যা সমাধানের সর্বোত্তম উপায় কী?


14

আমি ডাটাবেস প্রশাসনে খুব নতুন am

মাইএসকিএল মাস্টার-স্লেভ প্রতিরূপ স্থাপন করার সময় আমি অনেক সমস্যার মুখোমুখি হয়েছি।

আমি নিয়মিত মাইএসকিএল প্রতিলিপি সমস্যা সমাধানের সমস্যাগুলির মুখোমুখি।

কেউ কীভাবে বুঝতে সাহায্য করতে পারে যে আমি এই সমস্তগুলি কীভাবে মোকাবিলা করব?


দু'একটি প্রশ্ন: আপনাকে কেন প্রতিলিপি করতে হবে, আপনি কী অর্জন করতে চাইছেন? প্রতিরূপে অংশ নেওয়া প্রতিটি কম্পিউটারের ওএস কী? প্রতিটি কম্পিউটারে মাইএসকিউএল এর সংস্করণটি কী? টেবিলগুলি মাইআইএসএএম, ইনোডিবি, অন্য কিছু?
ক্রেগ এফ্রেইন

@ ক্রেইগএফ্রেইন আমাকে এই প্রতিলিপিগুলি সেট করতে হবে কারণ এই সার্ভারগুলি উত্পাদনে ব্যবহার করা উচিত I আমি প্রতিটি মেশিনে ডেবিয়ান / উবুন্টু ব্যবহার করছি। mysql5.1 vaersion হিসাবে। প্রাথমিকভাবে সারণীগুলি InnoDB।
আব্দুল মানাফ

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

উত্তর:


19

আমি টিউটোরিয়ালের লিঙ্ক সরবরাহ করেছি। কেবল মনে রাখবেন যে উবুন্টুতে, my.cnf ফাইলটি /etc/mysql/my.cnf এ আছে এবং হাটফোরজ টিউটোরিয়ালের মতো /etc/my.cnf এ নেই। আমার সেটআপে, আমি লক পড়ার সাথে ফ্ল্যাশ ট্যাবলেট ব্যবহার করিনি; মাস্টার উপর। যদি আপনার মাস্টার সার্ভারে প্রচুর লেখার ক্রিয়াকলাপ থাকে তবে ব্যাক আপ নেওয়ার আগে আপনাকে সেই কমান্ডটি চালিয়ে আপনার টেবিলগুলি লক করতে হবে। আপনি যদি লক পড়ার সাথে ফ্ল্যাশ ট্যাবলেট ব্যবহার করেন ;, তবে আপনার ব্যাকআপের পরে, আপনি আনলক ট্যাবলেটগুলি চালাতে চাইবেন। আপনি যদি কোনও সমস্যায় পড়ে থাকেন তবে আমাকে জানান।

এখানে টিউটোরিয়ালটি আমি রেডহাট / সেন্টোস-এর জন্য তৈরি হাওটো ফরজে পেয়েছি: http://www.howtoforge.com/mysql_database_replication

উবুন্টুর জন্য অন্য টিউটোরিয়ালটি ঠিক আছে দেখুন

আমি যে কনফিগারেশনটি ব্যবহার করেছি তা এখানে:

মাস্টার সার্ভারে

মাস্টার সার্ভারটি কনফিগার করুন:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

মাইএসকিউএল পুনরায় চালু করুন:

/etc/init.d/mysql restart

মাইএসকিএল এর কনসোলের সাথে সংযুক্ত করুন: মাইএসকিএল-ই রুট -প্যাসওয়ার্ড

প্রতিলিপি ব্যবহারকারীকে অনুমতি এবং অনুমতি প্রদান করুন।

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

এই তথ্যটি কোথাও অনুলিপি করতে বা এটি দৃশ্যমান রেখে দেওয়ার বিষয়টি নিশ্চিত করুন

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

একটি ফাইলের ডাটাবেস ডাম্প:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

স্ক্যালপ ব্যবহার করে স্লেভ সার্ভারে ডাটাবেস ডাম্পটি অনুলিপি করুন বা আপনি চাইলে ftp ব্যবহার করুন:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

স্ল্যাভ সার্ভারে

মাইএসকিএল কনফিগারেশন সম্পাদনা করুন:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

মাইএসকিউএল পুনরায় চালু করুন: /etc/init.d/mysql restart

ব্যাকআপ পুনরুদ্ধার করুন:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

মাইএসকিউএলে কানেক্ট করুন:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

চালান SHOW SLAVE STATUS\G:

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: 
               Skip_Counter: 0
        Exec_Master_Log_Pos: 17324288
            Relay_Log_Space: 17324425
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
          Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: 0
1 row in set (0.02 sec)

পরে, মনে রাখবেন যে প্রতিলিপি বিভিন্ন কারণে ব্যর্থ হতে পারে। স্লেভটিতে, আপনি 'স্টলাস শ্যাভল স্ট্যাটাস \ জি কমান্ড' চালিয়ে স্ট্যাটাসটি পর্যবেক্ষণ করতে পারেন; বা স্থিতি পর্যবেক্ষণ করতে ক্রোন জব স্থাপন করা এবং যদি এটি ব্যর্থ হয় তবে ইমেলগুলি প্রেরণ করুন। এই আদেশ থেকে আউটপুট নিয়ে ফ্যামিলার পান। যদি প্রতিলিপিটি সঠিকভাবে চলমান থাকে তবে আপনার "স্লেভ_আইও_সেটেট: ইভেন্টটি প্রেরণের জন্য মাস্টার অপেক্ষা করা" দেখা উচিত।

একবার আপনি এই সেটআপটি সঠিকভাবে পেয়ে গেলে, সেই অনুলিপি পর্যবেক্ষণ করার জন্য আমি আপনাকে একটি স্ক্রিপ্ট সরবরাহ করতে পারি।

মাইএসকিউএলে ত্রুটি লগ নিরীক্ষণের জন্য এখানে একটি স্ক্রিপ্ট রয়েছে। আপনি যদি লাইন যুক্ত করেন

[Mysqld]

লগ-ত্রুটি = /var/log/mysql/mysql.err

পুনরায় আরম্ভ করুন mysql: /etc/init.d/mysql পুনরায় আরম্ভ করুন

তারপরে আপনি লগ ফাইলটি নিরীক্ষণ করতে নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন। লগটি কোনওভাবে পরিবর্তিত হলে, স্লেভ সার্ভারে একটি ত্রুটি ঘটেছে তা আপনাকে জানিয়ে একটি ইমেল পাবেন। আপনি যদি নিয়মিত ভিত্তিতে ত্রুটি লগ চেক করতে চান তবে আপনার ক্রোনটবে এই স্ক্রিপ্টটি যুক্ত করতে হবে।

এখানে একটি নমুনা স্ক্রিপ্ট: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

Crontab যোগ করতে।

স্ক্রিপ্টটি সম্পাদনযোগ্য করুন:

chmod +x /somepath/monitor_mysql_log.sh

ক্রোনটব আপডেট করুন:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

এবং স্ক্রিপ্ট প্রতি মিনিটে চালানো হবে।

আমি যে স্ক্রিপ্টটি দিয়েছি তা হ'ল একটি স্ক্রিপ্ট যা আমি খুব দ্রুত একসাথে রেখেছি। এছাড়াও, আপনার সার্ভারটি ইমেল প্রেরণে সক্ষম হওয়ার জন্য, আপনাকে পোস্টফিক্স বা সেন্ডমেলের মতো কিছু ইনস্টল করতে হবে।


অনেক ধন্যবাদ ধন্যবাদ আমি এটি পছন্দ করেছিলাম এবং আমি প্রতিলিপিটি সেট করতে সক্ষম হয়েছি ...
আব্দুল মানাফ

আপনি আমাকে প্রতিলিপি নিরীক্ষণের জন্য স্ক্রিপ্ট প্রদান করতে পারেন?
আবদুল মানাফ

কেবলমাত্র একটি দ্রুত দ্রষ্টব্য, আমি যে স্ক্রিপ্টটি সবে যুক্ত করেছি তা হ'ল গোলাম সার্ভারগুলিতে আপনি ইনস্টল করবেন। আপনি এটি মাস্টার সার্ভারে ইনস্টল করতে পারেন, তবে স্লেভ সার্ভারে ত্রুটি লগ হ'ল আপনি আপনার প্রশ্নের ভিত্তিতে সবচেয়ে বেশি আগ্রহী হবেন।
ক্রেগ ইফ্রেইন

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

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

7

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

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

আপনার ডিস্ট্রোর জন্য আপনাকে পারকোনার অ্যাপ / ইয়ম রেপো সেট আপ করতে হবে , তারপরে xtrabackupপ্যাকেজটি মাস্টার এবং স্লেভ উভয়েই ইনস্টল করুন । আমি পিগজ কম্প্রেশন ইউটিলিটি (প্যারালাল জিজিপ , বেশিরভাগ স্ট্যান্ডার্ড রেপোতে উপলব্ধ) এর ব্যবহারের জন্য দৃ strongly়ভাবে সুপারিশ করছি কারণ এটি ব্যাকআপ গতির ক্ষেত্রে একটি বিরাট পার্থক্য করে।

প্রক্রিয়াটি এর আগে চলে যায় (উবুন্টুতে, অন্যান্য ডিস্ট্রোগুলি কিছুটা ভিন্ন হতে পারে), এবং ধরে নেওয়া হয় আপনি ইতিমধ্যে আপনার দাসে মাইএসকিউএল ইনস্টল করেছেন:

  1. প্রথমে মাস্টারটির ব্যাকআপ নিন: mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz(লাইভ সার্ভিসে ব্যাকআপের প্রভাব সীমাবদ্ধ করতে থ্রটল মানটি টুইঙ্ক করুন)
  2. স্লেভের কাছে ব্যাকআপ ফাইলটি অনুলিপি করুন ( scp -l 400000লাইভ ক্লায়েন্টগুলির জন্য নেটওয়ার্ক ব্যান্ডউইথের মাস্টার অনাহারে না পড়ার জন্য ব্যবহার করুন)
  3. দাসের উপর মাইএসকিএল বন্ধ করুন: service mysql stop
  4. পুরানো মাইএসকিউএল ডেটা ডিরেক্টরিটি বাইরে সরিয়ে নিয়ে যান: mv /var/lib/mysql /var/lib/mysql2(বা আপনি ডিস্কের জায়গাতেই সংক্ষিপ্ত থাকলে এটিকে কোথাও সংক্ষেপ করুন)
  5. একটি নতুন ডেটা ডিরেক্টরি তৈরি করুন এবং এটিতে সরান: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Untar নতুন ফোল্ডারে ব্যাকআপ ফাইল: tar xvzif /path/to/backup/mysql.tgzটার অপারেশনে বিকল্পটি নোট করুন i- এটি ছাড়া এটি কাজ করবে না । আপনার বড় ডিবি লাগলে কিছুক্ষণ সময় লাগবে।
  7. নিষ্কাশিত ফাইল Innobackupex টুল চালান: /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql। এটি কার্যকরভাবে বাইনারি লগগুলি থেকে ফাইলগুলিতে ক্রাশ-পুনরুদ্ধার চালায়। এটি কেবল কয়েক সেকেন্ড সময় নেয়; একটি ছোট সার্ভারে থাকলে একটি ছোট মেমরি পরিমাণ ব্যবহার করুন।
  8. সাফল্যরূপে সমাপ্তি ধরে নিলে, ফাইলগুলির ব্যাকআপটি মুছে ফেলুন এবং মালিকানা সেট করুন: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. মাইএসকিএল শুরু করুন: service mysql start
  10. মাস্টার লগ ফাইলের নাম এবং ব্যাকআপ (নোট xtrabackup_slave_info নেই তথ্য) অবস্থান পান: cat xtrabackup_binlog_info। এটি কিছু বলবেmysql-bin.000916 13889427
  11. মাইএসকিউএলে কানেক্ট করুন এবং সেখানে স্টাফ রয়েছে কিনা তা পরীক্ষা করুন।
  12. লগগুলি সম্পর্কে আপনার যে বিবরণটি পেয়েছে তা ব্যবহার করে প্রতিরূপ সেটিংস পুনরায় সেট করুন: CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;(আসল ডিবি সার্ভারের বিবরণের সাথে মেলে পরিবর্তন করুন)
  13. দাসটিকে পুনরায় চালু করুন: START SLAVE;
  14. 'সেকেন্ড_বিহাইড_মাস্টার' 0 না হওয়া অবধি দাসের স্থিতি পরীক্ষা করুন as SHOW SLAVE STATUS\G

আপনার দাস এখন সব সেট আপ করা হয়েছে। প্রয়োজনে, আপনি এখন বিজ্ঞপ্তি প্রতিলিপি সেট আপ করতে পারেন:

  1. দাসে: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;লগ ফাইলের নাম এবং অবস্থান নোট করুন (mysql-bin.000031 এবং 17244785 এর মতো কিছু)।
  2. মাস্টারটিতে CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;:, স্লেভের কাছ থেকে মান সন্নিবেশ করা আমরা স্রেফ দেখলাম।
  3. মাস্টার উপর: START SLAVE;
  4. দাসের উপরে: UNLOCK TABLES;

আপনার এখন সমস্ত বৃত্তাকার প্রতিলিপি দিয়ে প্রস্তুত হওয়া উচিত।

সমস্যার সমাধান যতদূর যায়, পারকোনার টুলকিটে সমস্ত ধরণের জিনিস রয়েছে যেমন নিঃশব্দ দুর্নীতি চিহ্নিত করতে চেকসামিং , পিছনে পরিমাপ এবং আরও অনেক কিছু। প্রতিলিপি দুর্নীতির সর্বাধিক সাধারণ ফর্মগুলি binlog_format = MIXEDআপনার my.cnf এ সেট করে এড়ানো যেতে পারে । এটি বলেছিল, আমার অভিজ্ঞতার প্রতিলিপিটি সাধারণত ঝামেলাজনক নয়।


আপনার আনুগত্য কি?
পেসারিয়ার

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