MySQL mendukung replikasi satu arah dan asinkron server bertindak sebagai server master. Satu atau lebih server lain bertindak sebagai server budak. Server master menulis pembaruan ke file log biner dan memelihara indeks file log untuk melacak rotasi log. Ketika seorang budak terhubung ke master, ia memberitahukan master tentang lokasi pembaruan terakhir yang berhasil dibaca budak di log. Server budak menerima pembaruan apa pun yang terjadi sejak saat itu, kemudian memblokir dan menunggu server master memberi tahu pembaruan berikutnya.
Mengapa menggunakan replikasi master-slave?
1. Pengaturan server master/server budak meningkatkan ketahanan. Jika terjadi masalah pada server master, Anda dapat beralih ke server budak sebagai cadangan.
2. Dengan membagi beban pemrosesan pertanyaan pelanggan antara server master dan server budak, Anda bisa mendapatkan waktu respons pelanggan yang lebih baik. Namun jangan melakukan update pada server master dan slave secara bersamaan, karena dapat menimbulkan konflik.
3. Keuntungan lain menggunakan replikasi adalah Anda dapat menggunakan server budak untuk melakukan pencadangan tanpa mengganggu server master. Server master dapat terus memproses pembaruan selama proses pencadangan.
MySQL menggunakan 3 thread untuk melakukan fungsi replikasi (1 di server master dan dua di server slave. Ketika START SLAVE dikeluarkan, server slave membuat thread I/O untuk terhubung ke server master dan membiarkan server master mengirim Biner log. Server master membuat thread untuk mengirim konten log biner ke server slave. Thread I/O server slave membaca konten yang dikirim oleh thread Binlog Dump server master dan menyalin data ke file lokal di slave. direktori data server, yaitu log relai. Utas ketiga adalah utas SQL. Server budak menggunakan utas ini untuk membaca log relai dan menjalankan pembaruan yang terdapat dalam log untuk menanyakan replikasi yang terjadi pada server master dan. informasi server budak.
Log relai default menggunakan nama file dalam bentuk host_name-relay-bin.nnnnnn, dengan nama_host adalah nama host server budak dan nnnnnn adalah nomor urut dengan 000001. Lacak file indeks log relai untuk mengidentifikasi log relai yang sedang digunakan. File indeks log relai default diberi nama host_name-relay-bin.index memiliki format yang sama dengan log biner dan dapat dibaca dengan mysqlbinlog. Ketika thread SQL telah mengeksekusi semua peristiwa di log relai, log relai akan secara otomatis dihapus
dari server dan dua file status tambahan akan dibuat di direktori data.
.--master.info dan relay-log.info. File status disimpan di hard disk dan tidak hilang ketika server budak dimatikan. Saat berikutnya server budak dimulai, file-file ini dibaca untuk menentukan berapa banyak biner itu telah membaca dari log server master, dan sejauh mana mereka menangani log relai mereka sendiri.
Untuk mengatur replikasi master-slave:
1. Pastikan versi MySQL yang diinstal di server master dan server budak sama, dan sebaiknya MySQL versi stabil terbaru
di server master. Replikasi menyiapkan akun koneksi. Akun ini harus diberikan izin REPLICATION SLAVE. Jika akun hanya digunakan untuk replikasi (disarankan), tidak ada izin lain yang perlu diberikan
mysql> GRANT REPLICATION SLAVE ON *.*
-> TO 'replication'. @'%.yourdomain.com' DIIDENTIFIKASI OLEH 'slavepass';
3. Jalankan pernyataan FLUSH TABLES WITH READ LOCK untuk menghapus semua tabel dan memblokir pernyataan tulis:
mysql> FLUSH TABLES WITH READ LOCK;
menjaga agar program klien mysql tidak keluar. Terminal mengambil snapshot dari direktori data server utama.
shell> cd /usr/local/mysql/
shell> tar -cvf /tmp/mysql-snapshot.tar ./data
Jika akun pengguna server budak berbeda dari server master, Anda mungkin tidak ingin menyalin basis data mysql. Dalam hal ini, database harus dikeluarkan dari arsip. Anda juga tidak perlu menyertakan file log atau file master.info atau relay-log.info apa pun di arsip.
Ketika kunci baca yang disetel oleh FLUSH TABLES WITH READ LOCK valid (yaitu, program klien mysql tidak keluar), baca nama log biner saat ini dan nilai offset di server utama:
mysql > SHOW MASTER STATUS
+--- --- ---------+----------+--------------+----------- --- ----+
|. File |. Posisi |. Binlog_Do_DB |. Binlog_Ignore_DB |
. --- ------+---+
|.mysql-
bin.003 |.73 |.tes |.
--- -------+----------+--------------+------------- --- --+
Kolom File menampilkan nama log, dan Posisi menampilkan offset. Dalam contoh ini, nilai log biner adalah mysql-bin.003 pada offset 73. Catat nilai ini. Nilai-nilai ini akan diperlukan nanti saat menyiapkan server budak. Mereka mewakili koordinat replikasi dari mana budak harus memulai pembaruan baru dari master.
Jika --logs-bin tidak diaktifkan saat server master berjalan, nama log dan nilai lokasi yang ditampilkan oleh SHOW MASTER STATUS kosong. Dalam hal ini, nilai yang perlu digunakan saat menentukan file log dan lokasi server budak di masa depan adalah string kosong ('') dan 4.
Setelah mengambil snapshot dan mencatat nama log dan offset, kembalikan ke ujung tengah sebelumnya dan restart Aktifkan aktivitas tulis:
mysql> UNLOCK TABLES
4. Pastikan bagian [mysqld] dari file my.cnf di host server master menyertakan opsi log-bin. Bagian ini juga harus memiliki opsi server-id=Master_id, di mana master_id harus berupa nilai bilangan bulat positif antara 1 dan 232–1. Misalnya:
[mysqld]
log-bin
server-id=1
Jika opsi tersebut tidak tersedia, Anda harus menambahkannya dan memulai ulang server.
5. Hentikan layanan mysqld di server slave dan tambahkan baris berikut ke file my.cnf-nya:
[mysqld]
server-id=2
Nilai slave_id sama dengan nilai Master_id dan harus berupa bilangan bulat positif antara 1 dan 232 –1.nilai. Selain itu, ID server budak harus berbeda dengan ID server master.
6. Simpan data di direktori cadangan. Pastikan izin pada file dan direktori ini sudah benar. Pengguna yang menjalankan server MySQL harus dapat membaca dan menulis file, sama seperti di server utama.
Shell> chown -R mysql:mysql /usr/local/mysql/data
7. Mulai server budak. Jalankan pernyataan berikut di server budak, ganti nilai opsi dengan nilai sebenarnya untuk sistem Anda:
mysql> GANTI MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
8. Mulai thread server budak:
mysql> START SLAVE;
Setelah menjalankan prosedur ini, server budak harus terhubung ke server master dan melengkapi apa pun pembaruan yang terjadi sejak snapshot.
9. Jika terjadi kesalahan replikasi, pesan kesalahan juga akan muncul di log kesalahan (HOSTNAME.err) server budak.
10. Saat menyalin dari server, file master.info dan HOSTNAME-relay-log.info akan ditemukan di direktori datanya. Budak menggunakan kedua file ini untuk melacak berapa banyak log biner master yang telah diproses. Jangan menghapus atau mengedit file-file ini kecuali Anda tahu persis apa yang Anda lakukan dan memahami sepenuhnya signifikansinya. Meski begitu, lebih baik menggunakan pernyataan CHANGE MASTER TO.