Replikasi MySQL® memungkinkan satu server database (disebut sebagai server sumber dalam artikel ini) untuk direplikasi ke satu atau lebih server database (disebut sebagai server replika dalam artikel ini). Dengan MySQL, replikasi tidak sinkron. Ini berarti server replika tidak perlu terhubung secara permanen untuk menerima pembaruan dari server sumber. Misalnya, Anda dapat menghentikan utas replika di server replika dan memulai kembali di lain waktu, dan secara otomatis menyinkronkan dengan sumbernya.
Tutorial ini menyediakan pengaturan sederhana (server sumber tunggal mereplikasi ke server replika tunggal) yang mereplikasi semua database dari sumber ke sana.
Prasyarat
Sebelum memulai tutorial ini, selesaikan langkah-langkah berikut.
- Instal sistem operasi Anda. (Langkah-langkah dalam artikel ini diselesaikan menggunakan sistem operasi CentOS®)
- Instal mysql
- Instal mysql-devel
- Instal server mysql
Catatan: Prosedur dalam artikel ini menjelaskan konfigurasi replikasi pada kumpulan server baru tanpa data atau database. Ini penting karena data yang ada di server membuang replikasi. Anda dapat menggunakan prosedur ini untuk rasa lain dari Linux®
Kumpulkan Informasi IP
Konfigurasi MySQL dalam artikel ini direplikasi melalui IP pribadi server cloud Anda. Catat IP pribadi setiap server.
Sumber:
[user@mysql-source ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 40:40:51:B7:A4:2E
inet addr:67.23.9.185 Bcast:67.23.9.255 Mask:255.255.255.0
inet6 addr: fe80::4240:51ff:feb7:a42e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28878 errors:0 dropped:0 overruns:0 frame:0
TX packets:15147 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:37708534 (35.9 MiB) TX bytes:1129533 (1.0 MiB)
eth1 Link encap:Ethernet HWaddr 40:40:1A:AF:35:F2
inet addr:10.176.41.72 Bcast:10.176.63.255 Mask:255.255.224.0
inet6 addr: fe80::4240:1aff:feaf:35f2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230 (230.0 b) TX bytes:762 (762.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Anda ingin mencatat IP yang ditampilkan untuk eth1
. Alamat IP tercantum tepat setelah inet addr:
. Dalam contoh ini, IP pribadi server sumber adalah 10.176.41.72. Ulangi ini pada server replika dan catat IP pribadi.
Replika:
[user@mysql-replica ~]$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 40:40:BE:90:EB:1E
inet addr:67.23.10.69 Bcast:67.23.10.255 Mask:255.255.255.0
inet6 addr: fe80::4240:beff:fe90:eb1e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29047 errors:0 dropped:0 overruns:0 frame:0
TX packets:13527 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:37743828 (35.9 MiB) TX bytes:1473375 (1.4 MiB)
eth1 Link encap:Ethernet HWaddr 40:40:AE:5B:35:3A
inet addr:10.176.41.207 Bcast:10.176.63.255 Mask:255.255.224.0
inet6 addr: fe80::4240:aeff:fe5b:353a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230 (230.0 b) TX bytes:762 (762.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Alamat IP untuk server replika kami dalam contoh ini adalah 10.176.41.207. Saat Anda memiliki kedua IP pribadi yang dicatat di suatu tempat, Anda dapat mulai mengonfigurasi.
Konfigurasikan server
Sumber
-
Edit /etc/my.cnf file di server sumber untuk mengaktifkan pencatatan log biner dan mengatur nama server.
[user@mysql-source ~]$ sudo vi /etc/my.cnf
-
Tambahkan baris ini di bawah
mysqld
bagian.log-bin=/var/lib/mysqllogs/RackspaceServerID-theServerShortName-binary-log expire_logs_days=7 server-name=<server_number>
-
Setel pengguna replikasi.
mysql> GRANT REPLICATION SLAVE ON *.* to 'replicant'@'slaveIP' IDENTIFIED BY 'somepassword';
Sumber my.cnf konfigurasi selesai.
Persiapan replika
-
Verifikasi bahwa zona waktu cocok antara sumber dan replika.
-
Setel item berikut:
relay-log=/var/lib/mysqllogs/RackspaceServerID-theServerShortName-relay-log relay-log-space-limit = 16G read-only=1 server-name=<server_number>
Salinan awal data ke replika
Pilih salah satu opsi berikut untuk menyalin data ke replika.
- mysqldump
- Salin file datar
mysqldump
Pertimbangkan opsi ini jika direktori data berukuran wajar, dan jika tabel Anda dapat dikunci selama prosedur berlangsung.
mysqldump -A --flush-privileges --master-data=1 | gzip -1 > ~rack/master.sql.gz
Transfer file dump ke replika dan impor.
Salin file datar
Untuk metode ini, hentikan MySQL di kedua server dan pindahkan direktori data keluar dari replika. Jika MySQL tidak berhenti di kedua server, perlu membuat cadangan:
# mv /var/lib/mysql{,.prereplication}
Gunakan salah satu metode yang tercantum di atas untuk membuat direktori data pada replika menjadi salinan dari sumbernya. Misalnya:
# rsync -azv --progress --delete /var/lib/mysql/ slave:/var/lib/mysql/
Ketika penyalinan data selesai, restart MySQL di kedua server. Verifikasi bahwa innodb-log-file-size
di /etc/my.cnf diatur sama untuk replika dan sumber, atau MySQL tidak akan memulai replika.
Jika replika adalah versi MySQL yang lebih baru, jalankan mysql_upgrade
pada replika sebelum mengeluarkan start slave
perintah.
Lampirkan replika ke sumber
Anda memerlukan nama file dan posisi log biner dari sumber yang sesuai dengan cadangan. Jika Anda menggunakan mysqldump
, ini akan disertakan dalammaster.sql.gz file itu sendiri.
# zgrep -m 1 -P 'CHANGE MASTER' master.sql.gz
CHANGE MASTER TO MASTER_LOG_FILE = '<binary log filename>', MASTER_LOG_POS = <binary log position>;
Untuk salinan tingkat file seperti salinan dingin yang diperoleh dengan mematikan MySQL dan menggunakan rsync
, nama file dan posisi log biner akan menjadi file log pertama yang dibuat setelah memulai ulang MySQL.
Anda dapat memperolehnya dengan mengikuti langkah-langkah berikut:
# service mysqld stop
# tail -n 1 /var/lib/mysqllogs/db1-1234-bin-log.index
/var/lib/mysqllogs/db1-1234-bin-log.000001
# rsync ...
# service mysqld start
Dalam hal ini, mulai dari nama file db1-bin-log.000001 + 1 = db1-1234-bin-log.000002
di awal file ini. Anda akan mendapatkan hasil ini:
MASTER_LOG_FILE = 'db1-1234-bin-log.000002', MASTER_LOG_POS = 4
Sekarang jalankan CHANGE MASTER
pada replika untuk menyetel kredensial untuk menghubungkan ke sumber, serta file log biner dan posisi untuk memulai replikasi.
mysql> change master to master_host='master-ip',master_user='userSetAbove', master_password='passwordSetAbove',master_log_file='logfile-from-above-command', master_log_pos=4;
mysql> start slave;
Kredensial root MySQL
Pastikan replika baru memiliki kredensial yang sama di /root/.my.cnf file sebagai server sumber. Database MySQL dan tabel hibah pengguna juga disinkronkan ke replika.
Belanda
Karena Anda mengimpor database MySQL dari sumbernya, semua kata sandi sekarang sama. Sama seperti Anda memperbarui /root/.my.cnf pada dbReplica agar sesuai dengan dbSource, Anda mungkin perlu memperbarui /etc/holland/backupsets/default.conf file untuk menggunakan kredensial yang sama sebagai sumber untuk rackspace_backup
.
Pengujian
Uji pengaturan Anda dengan membuat database tiruan pada sumber dan memverifikasi bahwa itu muncul di replika. Setelah diverifikasi, Anda dapat menghapus basis data dummy dan mengonfirmasi bahwa replika secara otomatis menjatuhkannya.
Jika Anda melihat kesalahan seperti Last_IO_Error: error connecting to master
, uji pengguna replikasi secara manual. Dari replika, coba dua hal:
nc masterIP 3306
Jika Anda melihat kesalahan di sini, hibah Anda salah, mungkin karena Anda berada di segmen jaringan yang berbeda dari yang Anda kira. Kesalahan akan terlihat sepertiHost dbSlave is not allowed to connect to this MySQL server
.
mysql -ureplicant -hmasterDb -p
Jika Anda mendapatkan kesalahan, hibah Anda salah.
Jika salah satu dari mereka gagal terhubung, Anda mungkin perlu menyesuaikan firewall atau memverifikasi bahwa Anda membuat asumsi yang benar tentang bagaimana jaringan dikonfigurasi untuk pelanggan ini.
Pemfilteran
Disarankan agar Anda tidak menggunakan pemfilteran replikasi. Jika Anda ingin mengecualikan beberapa tabel dari replika, satu-satunya metode yang disarankan adalah dengan salah satu dari my.cnf berikut opsi yang dikonfigurasi pada replika:
replicate-wild-do-table=dbase1.%
replicate-wild-do-table=dbase3.%
replicate-wild-ignore-table=dbase2.%
replicate-wild-ignore-table=dbase4.someTable
Pola dapat berisi karakter wildcard %
dan \_
, yang memiliki arti yang sama dengan LIKE
operator pencocokan pola. Jika Anda perlu menggunakan karakter literal_, hindari sebagai berikut:
replicate-wild-ignore-table=%.%\_tmp
Di MySQL 5.5, opsi pemfilteran tingkat basis data peka huruf besar/kecil pada platform yang mendukung sensitivitas huruf besar/kecil dalam nama file. Opsi pemfilteran tingkat tabel tidak peka huruf besar-kecil pada platform apa pun, terlepas dari nilailower_case_table_names
variabel sistem.
Acara
Jika my.cnf telah diaktifkan pada sumber, Anda dapat menonaktifkannya di replika. Jika penjadwal acara memang perlu diaktifkan pada replika, verifikasi bahwa acara yang ada dibuat dengan CREATE EVENT ... DISABLE ON SLAVE
dengan sesuatu seperti:select db, name from mysql.event where status not in
(‘disabled’,‘slavename_disabled’);
Pemantauan
Selalu pantau replikasi. Di Emerging, kami biasanya menggunakanSiteScope Content Match dengan check_replication.php , yang biasanya hidup di snamee httpd yang berjalan di replika.
Anda perlu mengeluarkan HIBAH untuk ini pada sumbernya, yang mereplikasi ke replika:
GRANT REPLICATION CLIENT ON *.* TO 'rep_monitor'@'slavePrimaryIP' IDENTIFIED BY 'somePassword';
Dengan asumsi Anda berada di belakang firewall, 'slavePrimaryIP' harus menjadi alamat IP internal server replika [192.168.100.x]. Di check_replication.php skrip, atur host=‘192.168.100.x
, IP internal server tempat skrip berjalan. Ini biasanya sama dengan slavePrimaryIP
.
Hubungi manajer akun Anda dan minta pengaturan monitor SiteScope. URL harus berupa IP publik dari server pemantauan, misalnyahttps://68.23.45.32/check_replication.php
Catatan: Script dapat memiliki elemen tambahan di dsn list
array dan periksa beberapa replika dengan probe SiteScope tunggal. Dokumentasi PHP menyatakan bahwa koma setelah elemen array terakhir adalah opsional dan dapat dihilangkan. Namun, dengan pemeriksaan SiteScope yang memeriksa beberapa replika, mungkin kurang jelas replika mana yang bermasalah saat peringatan dihapus dengan cepat. Dalam hal ini, masuk akal untuk memiliki check_replication.php dan pemeriksaan SiteScope terkait yang berjalan pada setiap replika.
Sekarang duduk dan biarkan server replika Anda mereplikasi dari sumbernya. Pastikan untuk tidak melakukan penulisan apa pun ke server replika karena itu merusak replikasi! Semua penulisan yang dilakukan pada sumber dikirim secara otomatis ke replika melalui log biner dan replikasi. Untuk informasi lebih lanjut tentang replikasi MySQL, lihathttps://dev.mysql.com/doc/refman/5.0/en/replication.html.