Apa Cara Terbaik untuk membuat Pengaturan Replikasi MySQL Master-Slave dan Mengatasi Masalahnya?

14

Saya sangat baru dalam Administrasi Database.

Saya menghadapi banyak masalah saat mengatur replikasi master-slave mysql.

Saya juga menghadapi masalah pemecahan masalah replikasi mysql biasa.

Adakah yang bisa membantu untuk memahami bagaimana saya harus menangani semua ini?

Abdul Manaf
sumber
Beberapa pertanyaan: Mengapa Anda perlu melakukan replikasi, apa yang ingin Anda capai? Apa OS dari setiap komputer yang berpartisipasi dalam replikasi? Apa versi MySQL di setiap komputer? Apakah tabel MyISAM, InnoDB, sesuatu yang lain?
Craig Efrein
@CraigEfrein Saya perlu mengatur replikasi karena server ini akan digunakan dalam produksi. Saya Menggunakan Debian / ubuntu di setiap mesin. mysql5.1 sebagai vaersion. Terutama tabel adalah InnoDB.
Abdul Manaf
Oke, saya akan memposting konfigurasi yang saya gunakan di antara dua debian sedikit. Ini dengan asumsi ofcourse bahwa Anda memiliki MySQL diinstal pada semua komputer dan bahwa mereka semua menggunakan versi yang sama dan memiliki ruang disk yang cukup. Saat menggunakan replikasi MySQL, Anda harus memikirkan di mana Anda meletakkan log bin Anda, yang dapat tumbuh cukup besar tergantung pada beberapa faktor. Saya akan memasukkan informasi itu dalam posting saya
Craig Efrein

Jawaban:

19

Saya memberikan tautan ke tutorial. Ingatlah bahwa pada Ubuntu, file my.cnf ada di /etc/mysql/my.cnf dan tidak di /etc/my.cnf seperti di tutorial howtoforge. Dalam pengaturan saya, saya tidak menggunakan FLUSH TABLES WITH READ LOCK; pada tuan. Jika server master Anda memiliki banyak aktivitas menulis, Anda mungkin perlu mengunci tabel Anda dengan menjalankan perintah itu sebelum membuat cadangan. Jika Anda menggunakan FLUSH TABLES WITH READ LOCK ;, lalu setelah pencadangan Anda, Anda ingin menjalankan UNLOCK TABLES. Jika Anda mengalami masalah, beri tahu saya.

Berikut adalah tutorial yang saya temukan di howto forge, dibuat untuk Redhat / CentOS: http://www.howtoforge.com/mysql_database_replication

Tutorial lain yang terlihat bagus untuk Ubuntu http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

Berikut ini konfigurasi yang saya gunakan:

Di Server MASTER

Konfigurasikan server master:

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

Mulai ulang MySQL:

/etc/init.d/mysql restart

Terhubung ke konsol mysql: mysql -u root -ppassword

Buat dan berikan izin kepada pengguna replikasi.

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

Pastikan untuk menyalin informasi ini di suatu tempat atau membiarkannya tetap terlihat

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

mysql> quit 

Buang database ke file:

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

Salin dump database ke server slave menggunakan scp atau gunakan ftp jika Anda suka:

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

Di Server BUDAK

Edit konfigurasi mysql:

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

Mulai ulang MySQL: /etc/init.d/mysql restart

Pulihkan cadangan:

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

Terhubung ke MySQL:

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;

Jalankan 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)

Setelah itu, perlu diingat bahwa replikasi dapat gagal karena berbagai alasan. Pada slave, Anda dapat memonitor status dengan menjalankan perintah SHOW SLAVE STATUS \ G; Atau mengatur tugas cron untuk memonitor status dan mengirim email jika gagal. Dapatkan familar dengan output dari perintah ini. Jika replikasi berjalan dengan benar, Anda akan melihat "Slave_IO_State: Menunggu master mengirim acara".

Setelah Anda mendapatkan pengaturan ini dengan benar, saya dapat memberi Anda skrip untuk memantau replikasi itu.

Berikut ini skrip untuk memonitor kesalahan log di MySQL. Jika Anda menambahkan baris

[mysqld]

log-error = /var/log/mysql/mysql.err

restart mysql: /etc/init.d/mysql restart

Kemudian Anda dapat menggunakan skrip berikut untuk memantau file log. Jika log berubah dengan cara apa pun, Anda akan menerima email yang memberi tahu Anda bahwa ada kesalahan pada server slave. Jika Anda ingin log kesalahan diperiksa secara teratur, Anda harus menambahkan skrip ini ke crontab Anda.

Berikut ini contoh skrip: /somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="[email protected]"

# 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

Untuk menambah crontab.

Jadikan skrip dapat dieksekusi:

chmod +x /somepath/monitor_mysql_log.sh

Perbarui crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

Dan skrip akan dijalankan setiap menit.

Skrip yang saya sediakan adalah skrip yang saya buat dengan cepat. Selain itu, agar server Anda dapat mengirim email, Anda harus menginstal sesuatu seperti postfix atau sendmail.

Craig Efrein
sumber
terima kasih banyak saya suka ini dan saya bisa membuat replikasi ...
Abdul Manaf
dapatkah Anda memberikan saya skrip untuk memantau replikasi.
Abdul Manaf
Hanya catatan singkat, skrip yang baru saja saya tambahkan adalah sesuatu yang akan Anda instal di server slave. Anda dapat menginstalnya di server master, tetapi log kesalahan pada server slave akan menjadi yang paling Anda minati berdasarkan pertanyaan Anda.
Craig Efrein
terima kasih atas perhatian Anda. Tapi pada dasarnya saya tertarik dengan pemecahan masalah kesalahan replikasi saya pikir skrip ini akan memonitor perubahan dari log kesalahan yang mana saya akan mengaturnya.
Abdul Manaf
Karena server slave Anda hanya akan menerima data dan tidak memperbaruinya, sebagian besar informasi yang dicatat dalam log kesalahan adalah tentang replikasi. Jika misalnya tabel pada master menjadi rusak, budak tidak akan mereplikasi tabel dan pada dasarnya berhenti mereplikasi. Jika Anda melihat kesalahan dalam log kesalahan dari server slave. Ini biasanya indikasi yang cukup bagus bahwa ada sesuatu yang salah dengan replikasi.
Craig Efrein
7

Mysqldump cepat, tetapi memulihkan dump bisa sangat lambat untuk DB besar, dan mengunci meja tidak dapat diterima di situs langsung. Cara yang jauh lebih baik dan lebih cepat untuk mengatur budak adalah dengan menggunakan XtraBackup Percona . XtraBackup memberikan sedikit beban pada master, tidak memerlukan kunci dan pemulihan pada slave sangat cepat. Mekanisme ini memang menghasilkan klon lengkap seluruh database, termasuk hal-hal seperti tabel pengguna, yang akan memecah beberapa hal yang ditetapkan oleh instalasi stok, seperti pengguna debian-sys-Maint, yang tidak selalu merupakan hal yang buruk !

Sebagai bonus, setelah Anda tahu cara melakukan ini, Anda dapat menggunakan mekanisme yang sama persis untuk cadangan harian Anda. Pencadangan lebih lambat daripada mysqldump, tetapi pemulihan jauh lebih cepat, yang hanya Anda butuhkan jika Anda berada dalam situasi di mana Anda panik dan harus memulihkan cadangan! Jika Anda pernah mendapatkan kesalahan replikasi besar, cukup gunakan prosedur ini untuk membuang budak dan membangunnya kembali; itu benar-benar tidak butuh waktu lama.

Anda perlu menyiapkan repo apt / yum Percona Percona untuk distro Anda, lalu instal xtrabackuppaket pada master dan slave. Saya juga sangat merekomendasikan penggunaan utilitas kompresi pigz (paralel gzip, tersedia di sebagian besar repo standar) karena membuat perbedaan besar untuk kecepatan cadangan.

Prosesnya seperti ini (di Ubuntu, distro lain mungkin sedikit berbeda), dan mengasumsikan Anda sudah menginstal MySQL pada slave Anda:

  1. Pertama, ambil cadangan pada master: 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(atur nilai throttle untuk membatasi dampak cadangan pada layanan langsung)
  2. Salin file cadangan ke slave (gunakan scp -l 400000agar tidak membuat kelaparan bandwidth jaringan untuk klien langsung)
  3. Hentikan mysql pada slave: service mysql stop
  4. Pindahkan direktori data MySQL lama: mv /var/lib/mysql /var/lib/mysql2(atau kompres di suatu tempat jika Anda kekurangan ruang disk)
  5. Buat direktori data baru dan pindah ke dalamnya: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. Untar file cadangan ke dalam folder baru: tar xvzif /path/to/backup/mysql.tgz. Perhatikan iopsi pada operasi tar - ini tidak akan berfungsi tanpanya . Ini akan memakan waktu cukup lama jika Anda memiliki DB besar.
  7. Menjalankan alat Innobackupex pada file diekstrak: /usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql. Ini secara efektif menjalankan pemulihan kerusakan pada file dari log biner. Ini hanya membutuhkan beberapa detik; gunakan jumlah memori yang lebih kecil jika di server yang lebih kecil.
  8. Dengan asumsi bahwa berhasil menyelesaikan, hapus cadangan dan tetapkan kepemilikan file: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Mulai mysql: service mysql start
  10. Dapatkan master log nama file dan posisi cadangan (catatan TIDAK info di xtrabackup_slave_info): cat xtrabackup_binlog_info. Itu akan mengatakan sesuatu sepertimysql-bin.000916 13889427
  11. Hubungkan ke MySQL dan periksa barang-barang yang ada.
  12. Setel ulang pengaturan replikasi menggunakan detail yang Anda dapatkan tentang log: 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;(Ubah untuk mencocokkan rincian server DB nyata)
  13. Mulai ulang budak: START SLAVE;
  14. Periksa status budak saat mengejar master hingga 'detik_behind_master' adalah 0: SHOW SLAVE STATUS\G

Budak Anda sudah siap. Jika perlu, Anda sekarang dapat mengatur replikasi melingkar:

  1. Pada slave: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;Perhatikan nama dan posisi file log (seperti mysql-bin.000031 dan 17244785).
  2. Pada master 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;:, memasukkan nilai dari slave yang baru saja kita lihat.
  3. Pada tuan: START SLAVE;
  4. Di budak: UNLOCK TABLES;

Anda sekarang harus siap dengan replikasi melingkar.

Sejauh pemecahan masalah berjalan, toolkit Percona memiliki segala macam hal untuk membantu seperti pemeriksaan untuk menemukan korupsi diam, pengukuran lag dan banyak lagi. Bentuk replikasi korupsi yang paling umum dapat dihindari dengan menetapkan binlog_format = MIXEDdi my.cnf Anda. Yang mengatakan, dalam pengalaman saya replikasi pada umumnya tidak merepotkan.

Sinkron
sumber
Apa kesetiaanmu?
Pacerier
Tidak ada, selain sebagai pengguna yang puas.
Sinkronisasi