GNU/Linux >> Belajar Linux >  >> Debian

Menyiapkan Replikasi Master-Master dengan MySQL di Debian 8 (Jessie)

Tutorial ini menjelaskan pengaturan MySQL yang direplikasi (replikasi Mater/Master) dengan 2 node di mana data dapat dibaca dan ditulis ke kedua node secara bersamaan. MySQL berhati-hati untuk mereplikasi data ke node lain dan memastikan bahwa kunci kenaikan otomatis utama tidak bertabrakan.

Sejak versi 5, MySQL hadir dengan dukungan bawaan untuk replikasi master-master, memecahkan masalah yang dapat terjadi dengan kunci yang dibuat sendiri. Di versi MySQL sebelumnya, masalah dengan replikasi master-master adalah bahwa konflik segera muncul jika node A dan node B keduanya memasukkan kunci peningkatan otomatis pada tabel yang sama. Keuntungan replikasi master-master dibandingkan replikasi master-slave tradisional adalah Anda tidak perlu memodifikasi aplikasi Anda untuk membuat akses tulis hanya ke master, dan lebih mudah untuk menyediakan ketersediaan tinggi karena jika master gagal, Anda masih memiliki master lainnya.

1 Catatan Awal

Dalam tutorial ini saya akan menunjukkan cara mereplikasi database exampledb dari server server1.example.com dengan alamat IP 192.168.1.101 ke server server2.example.com dengan alamat IP 192.168.1.102 dan sebaliknya. Setiap sistem adalah budak dari master lain dan master dari budak lain pada saat yang sama. Kedua sistem menjalankan Debian 8; namun, konfigurasi harus berlaku untuk hampir semua distribusi dengan sedikit atau tanpa modifikasi.

2 Menginstal MySQL 5.5

Jika MySQL belum terinstal di server1 dan server2, instal sekarang:

server1/server2:

apt-get -y install mysql-server-5.5 mysql-client-5.5

Untuk memastikan bahwa replikasi dapat bekerja, kita harus membuat MySQL mendengarkan di semua antarmuka, oleh karena itu kita mengomentari baris bind-address =127.0.0.1 di /etc/mysql/my.cnf:

server1/server2:

nano /etc/mysql/my.cnf
[...]# Alih-alih melewatkan jaringan, defaultnya sekarang adalah mendengarkan hanya di# localhost yang lebih kompatibel dan tidak kurang aman.#bind-address =127.0.0.1[...]

Mulai ulang MySQL setelahnya:

server1/server2:

layanan mysql restart

Kemudian periksa dengan

server1/server2:

netstat -ketuk | grep mysql

bahwa MySQL benar-benar mendengarkan di semua antarmuka:

netstat -ketuk | grep mysql
tcp 0 0 *:mysql *:* DENGARKAN 15437/mysqld
server1:~#

Sekarang kita menyiapkan replikasi user slave2_user yang dapat digunakan oleh server2 untuk mengakses database MySQL di server1.

server1:

Masuk ke shell MySQL:

mysql --defaults-file=/etc/mysql/debian.cnf

Pada shell MySQL, jalankan perintah berikut:

server1:

GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' DIIDENTIFIKASI OLEH 'secretpassword';
HAK ISTIMEWA FLUSH;
keluar;

Ganti kata "sandi rahasia " dengan kata sandi aman pilihan Anda. Sekarang kita lakukan dua langkah terakhir lagi di server2:

server2:

mysql --defaults-file=/etc/mysql/debian.cnf
GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' DIIDENTIFIKASI OLEH 'secretpassword';
HAK ISTIMEWA FLUSH;
keluar;

Ganti kata "sandi rahasia " dengan kata sandi yang aman di sini juga. Catat kata sandi yang kami butuhkan nanti. 

3 Beberapa Catatan

Berikut ini saya akan berasumsi bahwa kedua server MySQL kosong (belum berisi database apa pun kecuali database 'mysql').

Jika itu tidak terjadi di server Anda, maka Anda harus mengunci dan membuang database di server pertama dan mengimpornya di server kedua sebelum melanjutkan. Jangan membuka kunci database sebelum replikasi diatur. Di bawah ini beberapa perintah yang menunjukkan cara menyalin semua database ke server baru jika Anda tidak memulai dengan penyiapan MySQL yang "bersih".

Contoh cara mengunci semua tabel database di database MySQL.

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only =ON;

Contoh cara dump semua database ke dalam file all_databases.sql.

mysqldump --defaults-file=/etc/mysql/debian.cnf -cCeQ --hex-blob --quote-names --routines --events --triggers --all-databases -r all_databases.sql 

Contoh cara mengimpor semua tabel di server kedua dari file all_databses.sql.

mysql --defaults-file=/etc/mysql/debian.cnf  

4 Menyiapkan Replikasi

Sekarang kita mengatur replikasi master-master di /etc/mysql/my.cnf. Opsi konfigurasi penting untuk replikasi master-master adalah auto_increment_increment dan auto_increment_offset:

  • auto_increment_increment mengontrol kenaikan antara nilai AUTO_INCREMENT yang berurutan.
  • auto_increment_offset menentukan titik awal untuk nilai kolom AUTO_INCREMENT.

Mari kita asumsikan kita memiliki N node MySQL (N=2 dalam contoh ini), maka auto_increment_increment memiliki nilai N pada semua node, dan setiap node harus memiliki nilai auto_increment_offset yang berbeda (1, 2, ..., N).

Sekarang mari kita konfigurasikan dua node MySQL kita:

server1:

nano /etc/mysql/my.cnf

Cari bagian yang dimulai dengan [mysqld], dan masukkan opsi berikut ke dalamnya (komentari semua konflik yang ada pilihan):

[...][mysqld]
# ID Server Unik
server-id =1

# Jangan meniru database berikut
binlog-ignore -db =mysql
replicate-ignore-db =mysql

# Auto increment offset
auto-increment-increment =2

# Jangan ditiru kueri sql untuk ID server lokal
replicate-same-server-id =0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset =1

# Menghapus data binlog setelah 10 hari
expire_logs_days =10

# Ukuran maksimum binlog
max_binlog_size =500M

# Jalur berkas binlog
log_bin =/var/log/mysql/mysql-bin.log

[...]

Kemudian restart MySQL:

server1:

layanan mysql restart

Sekarang lakukan hal yang sama di server2:

server2:

nano /etc/mysql/my.cnf
[...]

# ID Server Unik
server-id =2

# Jangan meniru database berikut
binlog- abaikan-db =mysql
replicate-ignore-db =mysql

# Auto increment offset
auto-increment-increment =2

# Jangan replikasi kueri sql untuk ID server lokal
replicate-same-server-id =0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset =2

# Menghapus data binlog setelah 10 hari
expire_logs_days =10

# Ukuran maksimum binlog
max_binlog_size =500M

# Jalur berkas binlog
log_bin =/var/log/mysql/mysql-bin.log

[...]

server2:

layanan mysql restart

Selanjutnya kita lock database exampledb di server1, cari tahu status master server1, buat SQL dump dari exampledb (yang akan kita import ke exampledb di server2 agar kedua database berisi data yang sama), dan unlock database agar dapat digunakan kembali:

server2:

Sekarang kita memulai replikasi di Server 2. Buka shell MySQL:

mysql --defaults-file=/etc/mysql/debian.cnf

Dan jalankan perintah SQL berikut untuk mengaktifkan replikasi dari server1 ke server2:

UBAH MASTER KE MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='secretpassword';

Ganti sandi rahasia dengan kata sandi untuk balas Pengguna MySQL yang telah Anda atur di bab 2.

Sekarang periksa status budak dengan menjalankan perintah "tampilkan status budak\G" di shell MySQL.

tampilkan status budak\G

Outputnya akan seperti ini:

mysql> tampilkan status budak\G
*************************** 1. baris ****** *********************
Slave_IO_State:
Master_Host:192.168.1.101
Master_User:repl
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000001
Read_Master_Log_Pos:107
Relay_Log_File:mysqld-relay-bin.000003
Relay_Log_Pos:253
Relay_Master_Log_File :mysql-bin.000001
Slave_IO_Running:Tidak
Slave_SQL_Running:Tidak
Replicate_Do_DB:
Replicate_Ignore_DB:mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table_Wild :
Replicate_Wild_Ignore_Table:
Last_Errno:0
Last_Error:
Skip_Counter:0
Exec_Master_Log_Pos:107
Relay_Log_Space:410
Hingga_Kondisi:Tidak Ada
Hingga_Log_File:
Hingga_Log_Pos:0
Master_SSL_Allowed:Tidak
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_S /> Seco nds_Behind_Master:NULL
Master_SSL_Verify_Server_Cert:Tidak
Last_IO_Errno:0
Last_IO_Error:
Last_SQL_Errno:0
Last_SQL_Error:
Replicate_Ignore_Server:
1 baris dalam set (0,00 detik)

Baris yang harus Anda periksa adalah ini:

Master_Host:192.168.1.101
Master_User:repl
Master_Port:3306
Master_Log_File:mysql-bin.000001
Relay_Log_File:mysqld-relay-bin.000003
Slave_IO_Running:Tidak
Slave_SQL_Running:Tidak

Sekarang mulai replikasi dengan perintah ini pada shell MySQL:

mulai budak;

dan kemudian periksa kembali status budak:

tampilkan status budak\G

Dua baris berikut seharusnya menunjukkan "ya" sekarang:

Slave_IO_Running:Ya
Slave_SQL_Running:Ya
Seconds_Behind_Master:0

Jika "Seconds_Behind_Master" tidak 0, maka tunggu beberapa detik dan periksa kembali statusnya. Bidang ini menunjukkan apakah master dan slave sinkron.

Untuk langkah selanjutnya, kita perlu mengetahui nilai dari "Master_Log_File" dan "Read_Master_Log_Pos" perintah "tampilkan status budak\G". Dalam kasus saya ini adalah:

Master_Log_File:mysql-bin.000001
Baca_Master_Log_Pos:107

Tuliskan nilai yang Anda dapatkan di server Anda, kami membutuhkannya untuk langkah selanjutnya di server 1.

Setelah itu Anda dapat meninggalkan shell MySQL:

berhenti

server1:

Kita lanjutkan di server pertama, buka shell MySQL di server1:

mysql --defaults-file=/etc/mysql/debian.cnf

Dan jalankan perintah MySQL berikut:

CHANGE MASTER TO MASTER_HOST='192.168.1.102', MASTER_USER='repl', MASTER_PASSWORD='secretpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

Anda harus mengganti beberapa hal pada perintah di atas:

  1. Alamat IP harus IP server MySQL kedua Anda.
  2. Kata sandi "sandi rahasia" harus yang Anda pilih di bab 2 untuk repl pengguna.
  3. MASTER_LOG_FILE dan MASTER_LOG_POS harus berupa nilai yang telah kita tulis di langkah terakhir.

Sekarang periksa dengan:

tampilkan status budak\G

pada shell MySQL jika tidak ada kesalahan.

mysql> tampilkan status budak\G
*************************** 1. baris ****** *********************
Slave_IO_State:
Master_Host:192.168.1.102
Master_User:repl
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000001
Read_Master_Log_Pos:107
Relay_Log_File:mysqld-relay-bin.000001
Relay_Log_Pos:4
Relay_Master_Log_File :mysql-bin.000001
Slave_IO_Running:Tidak
Slave_SQL_Running:Tidak
Replicate_Do_DB:
Replicate_Ignore_DB:mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table_Wild :
Replicate_Wild_Ignore_Table:
Last_Errno:0
Last_Error:
Skip_Counter:0
Exec_Master_Log_Pos:107
Relay_Log_Space:107
Hingga_Kondisi:Tidak Ada
Hingga_Log_File:
Hingga_Log_Pos:0
Master_SSL_Allowed:Tidak
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_S /> Kedua s_Behind_Master:NULL
Master_SSL_Verify_Server_Cert:Tidak
Last_IO_Errno:0
Last_IO_Error:
Last_SQL_Errno:0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:1 baris dalam set (0,00 detik)

Dan mulai budaknya.

mulai budak;

Periksa kembali status budak:

tampilkan status budak\G

Dua baris berikut seharusnya menunjukkan "ya" sekarang:

Slave_IO_Running:Ya
Slave_SQL_Running:Ya

Setelah itu Anda dapat meninggalkan shell MySQL:

berhenti

Jika tidak ada yang salah, replikasi master-master MySQL sekarang seharusnya berfungsi. Jika tidak, periksa /var/log/syslog untuk kesalahan MySQL di server1 dan server2.

5 Uji Replikasi

Sekarang saatnya untuk menguji pengaturan replikasi kami. Saya akan membuat database exampledb1 di server1 lalu memeriksa di server2 apakah database telah direplikasi ke server kedua:

server1:

Masuk ke konsol MySQL di server1 dan buat database:

mysql --defaults-file=/etc/mysql/debian.cnf
BUAT DATABASE exampledb1;

server2

Sekarang login ke konsol MySQL di server2 dan periksa apakah exampledb1 ada di sana sekarang:

mysql --defaults-file=/etc/mysql/debian.cnf
tampilkan database;

Seperti yang kita lihat, database baru juga muncul di server2.

mysql> tampilkan database;
+--------------------+
| Basis Data |
+--------------------+
| informasi_skema |
| contohdb1 |
| mysql |
| performance_schema |
+--------------------+
4 baris dalam set (0,00 detik)

Selanjutnya saya akan menguji apakah replikasi bekerja ke arah lain juga. Kami masih login di server2 dan membuat database exampledb2 di sana:

BUAT DATABASE exampledb2;

Sekarang kembali ke server1 dan jalankan "tampilkan database" di konsol MySQL:

server1

tampilkan database;

Hasilnya menunjukkan database baru kita exampledb2, jadi replikasi bekerja dua arah.

mysql> tampilkan database;
+--------------------+
| Basis Data |
+--------------------+
| informasi_skema |
| contohdb1 |
| contohdb2 |
| mysql |
| performance_schema |
+--------------------+
5 baris dalam set (0,01 detik)

  • MySQL:http://www.mysql.com
  • Debian:http://www.debian.org

Debian
  1. Cara Mengatur Replikasi Master-Master MySQL

  2. Cara mengatur Replikasi Streaming PostgreSQL dengan Slot Replikasi di Debian 10

  3. Cara Menginstal MySQL v5.7 menggunakan apt-get di Debian 8 Jessie

  1. Cara Mengonfigurasi Replikasi Master-Slave MySQL (MariaDB) di Debian 10

  2. Menginstal Lighttpd Dengan PHP5 Dan Dukungan MySQL Pada Debian Etch

  3. Cara menginstal WebDAV dengan Lighttpd di Debian 8 (Jessie)

  1. Menginstal Lighttpd Dengan PHP5 Dan Dukungan MySQL Di Debian Lenny

  2. Hosting Virtual Dengan vsftpd Dan MySQL Di Debian Squeeze

  3. Menggunakan ngx_pagespeed Dengan nginx Di Debian Jessie/pengujian