it-swarm.asia

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

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?

14
Abdul Manaf

Saya memberikan tautan ke tutorial. Ingatlah bahwa pada Ubuntu, file my.cnf ada di /etc/mysql/my.cnf dan bukan di /etc/my.cnf seperti dalam 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 ;, kemudian setelah cadangan Anda, Anda akan 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 MASTER Server

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 [email protected]:/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;

Lari 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 berkala, Anda perlu 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. Juga, agar server Anda dapat mengirim email, Anda harus menginstal sesuatu seperti postfix atau sendmail.

19
Craig Efrein

Mysqldump cepat, tetapi memulihkan dump dapat sangat lambat untuk DB besar, dan mengunci tabel tidak dapat diterima di situs langsung. Cara yang jauh lebih baik dan lebih cepat untuk menyiapkan budak adalah dengan menggunakan Percona's XtraBackup . 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 diatur 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 mengatur repona/apt yum Percona untuk distro Anda, kemudian instal paket xtrabackup pada master dan slave. Saya juga sangat merekomendasikan penggunaan pigz utilitas kompresi (paralel gzip, tersedia di kebanyakan 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 (Tweak nilai throttle untuk membatasi dampak cadangan pada layanan langsung)
  2. Salin file cadangan ke budak (gunakan scp -l 400000 agar tidak kelaparan master 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. Batalkan file cadangan ke folder baru: tar xvzif /path/to/backup/mysql.tgz. Catat opsi i pada operasi tar - ia tidak akan berfungsi tanpanya . Ini akan memakan waktu cukup lama jika Anda memiliki DB besar.
  7. Jalankan alat Innobackupex pada file yang 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 atur kepemilikan file: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. Mulai mysql: service mysql start
  10. Dapatkan nama file master log dan posisi cadangan (perhatikan BUKAN info di xtrabackup_slave_info): cat xtrabackup_binlog_info. Itu akan mengatakan sesuatu seperti mysql-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 budak: FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; Catat nama dan posisi file log (sesuatu 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 master: START SLAVE;
  4. Pada 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 = MIXED di my.cnf Anda. Yang mengatakan, dalam pengalaman saya replikasi pada umumnya tidak merepotkan.

7
Synchro