Selasa, 15 Oktober 2024

MYSQLHA-centos7-OK

Cara Replikasi MySQL Master To Master Di Centos7

Suatu saat nanti, mungkin diantara pembaca tulisan ini akan membutuhkan yang namanya Replikasi database MySQL. Fungsi dari replikasi ini salah satunya untuk high availability karena database akan ter-replikasi ke dua server database yang berbeda.

Misal, kita asumsikan terdapat dua buah server MySQL dan pastikan MySQL sudah terinstall pada masing-masing server, jika belum coba baca tulisan ini Cara Install Nginx, Php7, MySQL 5.6, PhpMyAdmin Di Centos 7 :

DB-server1 : 192.168.84.100
DB-server2 : 192.168.81.100

jadi, jika kedua database yang berada pada server yang berbeda tersebut direplikasi, maka apapun yang terjadi pada table di DB-server1, misal kita melakukan insert data ke DB-server1 maka secara otomatis data tersebut akan ada di server DB-server2, syncronize dan tercopy secara otomatis. Begitupun sebaliknya, jika ada perubahan data pada table database di server DB-server2 maka akan terupdate juga di server DB-server1.

Namun, berbeda dengan replikasi MySQL Master/Slave, setiap perubahan di server master maka akan tercopy ke server slave, namun apapun yang terjadi pada table di server slave tidak akan tercopy ke server master. Jadi slave server hanya menerima data saja.

Perbedaan antara replikasi master/master dan master/slave sebenarnya adalah jika replikasi master/master maka kedua service slave pada masing-masing server berjalan, jadi keduanya bertindak sebagai master dan slave. Jika fungsi slave adalah menerima data dari master, maka jika keduanya bertindak sebagai master dan slave maka secara otomatis keduanya akan saling kirim/terima data, logis tidak? namun jika master/slave hanya pada server slave saja service slave berjalan, jadi yang slave hanya menerima data dari master. Lebih jelasnya bisa lihat contoh slave status dibawah ini:

$ [root@DB server1 ~]# mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.84.100
                  Master_User: dbuser_replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000008
          Read_Master_Log_Pos: 771248
               Relay_Log_File: mysql-relay-log.000005
                Relay_Log_Pos: 771411
        Relay_Master_Log_File: mysql-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: dbny4


$ [root@DB server2 ~]# mysql>  SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.81.100
                  Master_User: dbuser_replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysql-relay-log.000005
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: dbny4

Ok, sepertinya cukup mengenai penjelasan Master/Master dan Master/Slave. Pada tulisan ini yang akan dipraktekan adalah konfigurasi replikasi mysql master to master atau master/master.

Konfigurasi pada DB-server1

Masuk ke server DB-server1 lalu edit file /etc/my.cnf

$ vi /etc/my.cnf

kemudian tambahkan seperti dibawah ini:

server-id=1
log-bin="mysql-bin"
binlog-do-db=dbny4
replicate-do-db=dbny4
relay-log="mysql-relay-log"

jika sudah, simpan dan restart service mysql.

$ systemctl restart mysql

Penjelasan

server-id=1 : kita asumsikan bawah server DB-server1 server id nya adalah 1 atau bisa diubah sesuai keinginan, asalkan tidak sama dengan server satunya lagi.
log-bin="mysql-bin" : ini untuk mysql log bin, biarkan seperti ini saja.
binlog-do-db=dbny4 : diubah sesuai dengan nama database.
replicate-do-db=dbny4 : ganti dengan nama database yang akan di replikasi.
relay-log="mysql-relay-log" : biarkan seperti ini pada relay log.

selanjutnya masuk ke console MySQL (masih di server DB-server1) dengan cara ketik mysql lalu enter, seperti dibawah ini:

$ mysql
mysql>

lalu cek master status nya yang mana informasi dari master status ini yang akan digunakan untuk proses replikasi:

mysql> show master status;
+------------------+----------+----------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB   | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+----------------+------------------+-------------------+
| mysql-bin.000008 |   886372 | m4n4g3r3_dbny4 |                  |                   |
+------------------+----------+----------------+------------------+-------------------+
1 row in set (0,00 sec)

Ok, konfigurasi pada server DB-server 1 kita tahan dulu sampai disini. Lanjut ke konfigurasi server DB-server2.

Konfigurasi server DB-server2

Untuk konfigurasi server DB-server2 ini sama seperti server DB-server1, yang perlu diubah adalah server-id pada file /etc/my.cnf menjadi seperti ini:

server-id=2
log-bin="mysql-bin"
binlog-do-db=dbny4
replicate-do-db=dbny4
relay-log="mysql-relay-log"

kita bisa lihat, server-id disini kita ubah menjadi angka 2. Jika sudah simpan perubahan pada file /etc/my.cnf tersebut dan restart service mysql nya.

Selanjutnya masuk ke console mysql server DB-server2, lalu jalankan show master status; .

mysql> show master status;
+------------------+----------+----------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB   | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+----------------+------------------+-------------------+
| mysql-bin.000003 |      120 | dbny4 |                  |                   |
+------------------+----------+----------------+------------------+-------------------+
1 row in set (0,00 sec)

Sekarang, balik lagi ke server DB-server1 dan masuk ke mysql console nya. Lalu jalan perintah mysql seperti dibawah ini:

mysql> create user 'dbuser_replica'@'%' identified by 'passwordnya';                                                                                                                                                                                                                                             mysql> GRANT REPLICATION SLAVE ON *.* TO 'dbuser_replica'@'%';                                                       

ubah dbuser_replica sesuai keiginan. User ini nantinya yang akan digunakan sebagai user untuk replikasi. Sesuaikan juga passwordnya sesuai dengan password yang di inginkan.

Jika sudah, lakukan hal yang sama di server DB-server2 . Pastikan sama baik user dan passwordnya.

Selanjutnya, kembali ke server DB-server1, lalu jalankan perintah dibawah ini:

CHANGE MASTER TO MASTER_HOST = '192.168.81.100',MASTER_USER = 'dbuser_replica', MASTER_PASSWORD = 'passwordnya', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 120;

Isi MASTER_HOST dengan alamat IP DB-server2. Ubah MASTER_LOG_FILE = 'mysql-bin.000003' dan MASTER_LOG_POS = 120 sesuai dengan informasi yang tampil pada show master status; pada server DB-server2

Lakukan hal yang sama pada server DB-server2 namun ubah pada MASTER_HOST dengan IP DB-server1, dan ubah MASTER_LOG_FILEMASTER_LOG_POS sesuai dengan show master status; pada server DB-server1.

Jika semua hal diatas sudah selesai dilakukan. Jalankan perintah ini di kedua server:

mysql> start slave;

Selesai.

Jika konfigurasi berjalan lancar dan berhasil, maka jika dicek dengan perintah SHOW SLAVE STATUS\G; pada masing-masing server akan tampil kira-kira seperti ini:

DB-server1

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.81.100
                  Master_User: dbuser_replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 896649
               Relay_Log_File: mysql-relay-log.000005
                Relay_Log_Pos: 896812
        Relay_Master_Log_File: mysql-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: dbny4
          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: 896649
              Relay_Log_Space: 906181
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 1099217b-cb2b-11ea-9504-0025907133a4
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0,00 sec)

ERROR: 
No query specified

DB-server2

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.84.100
                  Master_User: dbuser_replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000008
          Read_Master_Log_Pos: 896649
               Relay_Log_File: mysql-relay-log.000005
                Relay_Log_Pos: 896812
        Relay_Master_Log_File: mysql-bin.000008
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: dbny4
          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: 896649
              Relay_Log_Space: 906181
              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
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 1099217b-cb2b-11ea-9504-0025907133a4
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0,00 sec)

ERROR: 
No query specified 

Bagaimana mengujicoba bahwa replikasi nya benar-benar berhasil? cara mudahnya misal dengan melakukan insert data ke table di database server DB-server1 lalu cek apakah ada di table yang sama di server DB-server2, lakukan juga hal sebaliknya. 

=========================================================================

Replikasi master-slave MySql & Keepalived dengan IP virtual
Kredit Foto: https://www.alessandronuccio.it/

Replikasi master-slave MySql & Keepalived dengan IP virtual

Replikasi MySQL adalah proses yang memungkinkan Anda menyalin data secara otomatis dari satu server basis data ke server lainnya.

Dalam artikel ini, saya akan menunjukkan cara mengonfigurasi replikasi master-slave dan juga menggunakan layanan keepalived untuk toleransi kesalahan atau failover otomatis.

Tidak ada teks alt yang disediakan untuk gambar ini

Prasyarat

Kami telah menggunakan dua server Centos 7. 

Server dalam contoh ini memiliki IP berikut:

Utama: 192.168.7.130

Budak: 192.168.7.132


Langkah 1: Instal MySql

Instal MySQL di kedua server. Di sini saya telah menginstal MySQL 8.0.26 di kedua server centos.

Tautan: https://www.mysqltutorial.org/install-mysql-centos/

Setelah instalasi selesai, mulai layanan MySQL dan aktifkan untuk memulai secara otomatis saat boot dengan:

sudo systemctl aktifkan mysql
sudo systemctl mulai mysqldd        

Saat server MySQL dimulai untuk pertama kalinya, kata sandi sementara dibuat untuk pengguna root MySQL. Untuk menemukan kata sandi, gunakan perintah grep berikut:

sudo grep 'kata sandi sementara' /var/log/mysqld.log        

Jalankan perintah mysql_secure_installation untuk menetapkan kata sandi root baru Anda dan meningkatkan keamanan instans MySQL:

instalasi mysql_aman_        

Catatan: Menonaktifkan login jarak jauh saja akan menjadi Tidak(n) jika Anda ingin login dari jarak jauh dari server lain.

Langkah 2: Konfigurasikan Master 

Pertama, kita akan mengonfigurasi server MySQL utama dan membuat perubahan berikut:

  • Tetapkan IP pribadi. [Anda dapat menetapkan 0.0.0.0 jika Anda ingin mengakses dari IP virtual]
  • Tetapkan ID server yang unik.
  • Aktifkan pencatatan biner.

Untuk melakukannya, buka file konfigurasi MySQL dan tambahkan baris berikut di bagian [mysqld]:

sudo nano /etc/my.cnf
        

Kemudian,

alamat-bind = 192.168.7.130/0.0.0.
server-id = 1
log_bin = mysql-bin0        

Setelah selesai, mulai ulang layanan MySQL agar perubahan diterapkan

sudo systemctl mulai ulang mysqld        

Langkah selanjutnya adalah membuat pengguna replikasi baru. Masuk ke server MySQL sebagai pengguna root:

Login ke MySQL terlebih dahulu, lalu:

BUAT PENGGUNA 'replika'@'%' YANG DIIDENTIFIKASI OLEH 'Datasoft1998@'
BERIKAN REPLIKASI SLAVE PADA *.* KE 'replika'@'%';
BERIKAN SEMUA HAK ISTIMEWA PADA * . * KEPADA 'replika'@'%';
UBAH PENGGUNA 'replika'@'%' YANG DIIDENTIFIKASI DENGAN mysql_native_password OLEH 'Datasoft1998@';;        

Saat masih di dalam prompt MySQL, jalankan perintah berikut yang akan mencetak nama file biner dan posisinya.

TAMPILKAN STATUS MASTER\G
KELUARAN:

*************************** 1. baris ***************************
             Berkas: mysql-bin.000001
         Posisi: 1427
     Binlog_Do_DB:
 Binlog_Abaikan_DB:
Set_Gtid_yang_dieksekusi:
1 baris dalam set (0,00 detik)
        

Catat nama berkas, 'mysql-bin.000001' dan Posisi '1427'. Anda akan memerlukan nilai-nilai ini saat mengonfigurasi server slave. Nilai-nilai ini mungkin akan berbeda di server Anda.


Langkah 3: Konfigurasikan Slave 

Kita harus menyiapkan server slave seperti yang ada di server master. 

  • Tetapkan IP pribadi. [Anda dapat menetapkan 0.0.0.0 jika Anda ingin mengakses dari IP virtual]
  • Tetapkan ID server yang unik.
  • Aktifkan pencatatan biner.

Untuk melakukannya, buka file konfigurasi MySQL dan tambahkan baris berikut di bagian [mysqld]:

sudo nano /etc/my.cnf        

Kemudian,

alamat-bind = 192.168.7.132/0.0.0.
server-id = 1
log_bin = mysql-bin0        

Setelah selesai, mulai ulang layanan MySQL agar perubahan diterapkan

sudo systemctl mulai ulang mysqld        

Kemudian login ke MySQL dan Pertama, hentikan thread slave:

HENTIKAN BUDAK;        

Kemudian,

GANTI MASTER T
HOST_UTAMA='192.168.7.130',
MASTER_USER='replika',
KATA SANDI_UTAMA='Datasoft1998@',
MASTER_LOG_FILE='mysql-bin.000001',
LOG_MASTER_POS=1427;O        

Kemudian mulai slave,

MULAI BUDAK;        

Semua konfigurasi telah selesai, kini Anda dapat membuat basis data dari server utama, tetapi dapat melihat pantulannya di server budak. 

Ini adalah akhir dari pengaturan master-slave. Sekarang saatnya untuk tetap hidup guna memastikan toleransi kesalahan.

Langkah 2: Tetap Hidup:

Pertama, kita perlu tahu cara menjaga keepalived tetap berfungsi. Dalam pengaturan basis data Replikasi Master-Slave, ketika Master gagal, kita perlu membuat perubahan konfigurasi secara manual untuk beralih ke server berikutnya yang tersedia. Ketika ini terjadi, waktu henti diperkirakan terjadi karena failover manual akan memakan waktu.

Keepalived adalah utilitas yang menyediakan failover antarmuka. Dengan implementasi Keepalived yang baik, Anda akan dapat melakukan failover alamat IP virtual saat server induk tidak tersedia dan secara otomatis mengalihkan IP tersebut ke server siaga aktif. Hasilnya, server kedua akan menangani lalu lintas tanpa waktu henti di lingkungan produksi.

Prasyarat

Kita perlu mengonfigurasikan konfigurasi master-slave, yang telah kita lakukan sebelumnya. Dan yang kedua adalah kita perlu menyiapkan IP virtual.

Di sini kami menggunakan 3 set alamat IP pada dua server. 

Server Utama – 192.168.7.130

Server Budak – 192.168.7.132

Alamat IP Virtual – 192.168.2.115


Mengonfigurasi VIP:

Tampilkan alamat ip        
Tidak ada teks alt yang disediakan untuk gambar ini

Dari keluaran di atas, kita dapat melihat bahwa antarmuka jaringan adalah eth0 .


Berkas konfigurasi untuk antarmuka jaringan eth0 dapat ditemukan di:

/etc/sysconfig/network-scripts.

Untuk membuat antarmuka jaringan virtual, kita perlu menyalin berkas konfigurasi master.

cd /etc/sysconfig/skrip-jaringan
jika cp-eth0 jika cp-eth0:1/        

Sekarang edit file ifcfg-eth0:1 dan tambahkan IP virtual Anda di bagian IPADDR. Sebelum membuat ip virtual, periksa apakah ip virtual tersebut benar-benar ada atau tidak.


JENIS="Ethernet
PROXY_METHOD="tidak ada"
BROWSER_ONLY="tidak"
BOOTPROTO="tidak ada"
DEFROUTE="ya"
IPV4_FAILURE_FATAL="tidak"
IPV6INIT="ya"
IPV6_AUTOCONF="ya"
IPV6_DEFROUTE="ya"
IPV6_FAILURE_FATAL="tidak"
IPV6_ADDR_GEN_MODE="privasi-stabil"
NAMA="enp0s3"
UUID="b1d44459-6b90-435a-950e-9b6001cfcf1b"
PERANGKAT="enp0s3"
ONBOOT="ya"
IPADDR="192.168.2.115"
AWALAN="24"
GERBANG="192.168.40.60"
DNS1="192.168.40.60"
IPV6_PRIVACY="tidak"
ZONA=publik"
        

Kemudian,

systemctl memulai ulang jaringan        

Menginstal KeepAlived:

sudo yum -y instal keepalived        

Mari kita cadangkan file konfigurasi Keepalived default jika seandainya Anda ingin menggunakannya nanti sebagai templat atau referensi.

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.kembali        

Konfigurasikan File Konfigurasi Keepalived di Master Server

Ubah file /etc/keepalived/keepalived.conf :


skrip vrrp chk_mysql {
skrip "pidof mysqld"
selang waktu 2                      

berat 2
}
contoh vrrp VI_1 {
antarmuka enp0s3                
negara MASTER                     
id_router_virtual 50            

ip_src_unicast 192.168.7.130    
rekan unicast {
Nomor telepon 192.168.7.132                  
}
prioritas 102                                               
skrip trek {
     chk_mysql
}
alamat_ip_virtual {
192.168.2.115/24 pengembang enp0s3    
}              
}        

Konfigurasikan File Konfigurasi Keepalived di Server Slave

Ubah file /etc/keepalived/keepalived.conf :


skrip vrrp chk_mysql {
skrip "pidof mysqld"
selang waktu 2                       
berat 2
}

contoh vrrp VI_1 {
antarmuka eth0                 
status CADANGAN                    
id_router_virtual 50            
ip_src_unicast 192.168.7.132   
rekan unicast {
Nomor telepon 192.168.7.130                   
}

prioritas 101                     

skrip trek {
     chk_mysql
}

alamat_ip_virtual {
192.168.2.115/24 pengembang enp0s3     
}               
}        

Jalankan Perintah di Kedua Server


firewall-cmd --langsung --permanen --tambahkan-aturan filter ipv4 INPUT 0
--dalam-antarmuka eth0 --tujuan 224.0.0.18 --protokol vrrp -j TERIMA;



firewall-cmd --direct --permanent --add-rule filter ipv4 KELUARAN 0
--out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j TERIMA;




firewall-cmd -reload;         

[Pilihan terbaik adalah mematikan firewall. Leluconnya tidak penting. Oh, saya lupa memberi tahu satu hal penting, Anda perlu menonaktifkan SELINUX dari enforcing -> disabled.]

Kemudian konfigurasikan layanan Keepalived untuk memulai secara otomatis saat server dimulai:

systemctl mengaktifkan keepalive
systemctl mulai keepalivedd        

Sekarang periksa status Keepalived di server Master dan Slave dengan:

layanan status tetap hidup        

Itu saja, sekarang Anda telah mengonfigurasi replikasi master-slave MySQL Anda dengan keepalived

===========================================================MySql master-slave replication &
Keepalived with virtual IP

Photo Credi: https://www.alessandronuccio.it/

====================================
https://www.linkedin.com/pulse/mysql-master-slave-replication-keepalived-virtual-ip-mahadi-hasan-joy

MySql master-slave replication & Keepalived with virtual IP

MySQL replication is a process that allows you to automatically copy data from one database server to another.

In this article, I will show how to configure master-slave replication and also use keepalived service for fault tolerance or automatic failover.

No alt text provided for this image

Prerequisites

We have used two Centos 7 servers. 

The servers in this example have the following IPs:

Master: 192.168.7.130

Slave: 192.168.7.132


Step 1: Install MySql

Install MySQL on both servers. Here I have installed MySQL 8.0.26 on both centos servers.

Link: https://www.mysqltutorial.org/install-mysql-centos/

Once the installation is completed, start the MySQL service and enable it to automatically start on boot with:

sudo systemctl enable mysql
sudo systemctl start mysqldd        

When the MySQL server starts for the first time, a temporary password is generated for the MySQL root user. To find the password use the following grep command:

sudo grep 'temporary password' /var/log/mysqld.log        

Run the mysql_secure_installation command to set your new root password and improve the security of the MySQL instance:

mysql_secure_installation        

Note: Just disabling remote login will be No(n) if you want to log in remotely from other servers.

Step 2: Configure Master 

First, we will configure the master MySQL server and make the following changes:

  • Set the private IP. [you can set 0.0.0.0 if you want to access from virtual ip]
  • Set a unique server ID.
  • Enable binary logging.

To do so open the MySQL configuration file and add the following lines in the [mysqld] section:

sudo nano /etc/my.cnf
        

then,

bind-address           = 192.168.7.130/0.0.0.
server-id              = 1
log_bin                = mysql-bin0        

Once done, restart the MySQL service for changes to take effect

sudo systemctl restart mysqld        

The next step is to create a new replication user. Log in to the MySQL server as the root user:

Login to MySQL first and then:

CREATE USER 'replica'@'%' IDENTIFIED BY 'Datasoft1998@'
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
GRANT ALL PRIVILEGES ON * . * TO 'replica'@'%';
ALTER USER 'replica'@'%' IDENTIFIED WITH mysql_native_password BY 'Datasoft1998@';;        

While still inside the MySQL prompt, execute the following command that will print the binary filename and position.

SHOW MASTER STATUS\G
OUTPUT:

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 1427
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
        

Take note of the file name, ‘mysql-bin.000001’ and Position ‘1427’. You’ll need these values when configuring the slave server. These values will probably be different on your server.


Step 3: Configure Slave 

We have to set up the slave server as the master has. 

  • Set the private IP. [you can set 0.0.0.0 if you want to access from virtual ip]
  • Set a unique server ID.
  • Enable binary logging.

To do so open the MySQL configuration file and add the following lines in the [mysqld] section:

sudo nano /etc/my.cnf        

then,

bind-address           = 192.168.7.132/0.0.0.
server-id              = 1
log_bin                = mysql-bin0        

Once done, restart the MySQL service for changes to take effect

sudo systemctl restart mysqld        

Then login to the MySQL and First, stop the slave threads:

STOP SLAVE;        

then,

CHANGE MASTER T
MASTER_HOST='192.168.7.130',
MASTER_USER='replica',
MASTER_PASSWORD='Datasoft1998@',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1427;O        

Then start the slave,

START SLAVE;        

All configuration is done, now you can create a database from the master server, but can see the reflection on the slave server. 

This is the end of the master-slave setup. Now it's time to stay alive to ensure fault tolerance.

Step 2: Keep Alived:

First, we need to know how to keep keepalived work. In the Master-Slave Replication database setup, when the Master fails, we need to manually make the configuration changes in order to fail over to the next available server. When this happens, downtime is expected since manual failover will take time.

Keepalived is a utility that provides interface failover. With a good implementation of Keepalived, you will be able to failover a virtual IP address when the master server becomes unavailable and automatically switches that IP over to the hot standby server. As a result, the second server will handle the traffic without any downtime in the production environment.

Prerequisites

We need to configure the master-slave configuration, which we have done already. And the second one is we need to set up a virtual IP.

Here we use 3 sets of IP addresses on two servers. 

Master Server – 192.168.7.130

Slave Server – 192.168.7.132

Virtual IP Address – 192.168.2.115


Configuring VIP:

ip addr show        
No alt text provided for this image

From the above output, we can see that the network interface is eth0.


The configuration file for the eth0 network interface can be found in:

/etc/sysconfig/network-scripts.

In order to create a virtual network interface, we need to copy the master configuration file.

cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-eth0:1/        

Now edit the ifcfg-eth0:1 file and add your virtual IP in the IPADDR section. Before creating a virtual ip, check that physically it exists or not.


TYPE="Ethernet
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s3"
UUID="b1d44459-6b90-435a-950e-9b6001cfcf1b"
DEVICE="enp0s3"
ONBOOT="yes"
IPADDR="192.168.2.115"
PREFIX="24"
GATEWAY="192.168.40.60"
DNS1="192.168.40.60"
IPV6_PRIVACY="no"
ZONE=public"
        

then,

systemctl restart network        

Installing KeepAlived:

sudo yum -y install keepalived        

Let’s back up the default Keepalived configuration file if in case you’d like to use it later as a template or for reference.

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.back        

Configure Keepalived Config File in Master Server

Modify /etc/keepalived/keepalived.conf file:


vrrp_script chk_mysql {
script "pidof mysqld"
interval 2                      

weight 2
}
vrrp_instance VI_1 {
interface enp0s3                
state MASTER                     
virtual_router_id 50            

unicast_src_ip 192.168.7.130    
unicast_peer {
192.168.7.132                  
}
priority 102                                               
track_script {
     chk_mysql
}
virtual_ipaddress {
192.168.2.115/24 dev enp0s3    
}              
}        

Configure Keepalived config File in Slave Server

Modify /etc/keepalived/keepalived.conf file:


vrrp_script chk_mysql {
script "pidof mysqld"
interval 2                       
weight 2
}

vrrp_instance VI_1 {
interface eth0                 
state BACKUP                    
virtual_router_id 50            
unicast_src_ip 192.168.7.132   
unicast_peer {
192.168.7.130                   
}

priority 101                     

track_script {
     chk_mysql
}

virtual_ipaddress {
192.168.2.115/24 dev enp0s3     
}               
}        

Run Command on Both Servers


firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0
--in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;



firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 
--out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;




firewall-cmd -reload;         

[Best option will be to turn off the firewall. Jokes apart. Oh I have forgotten to tell an important thing, you need to disable SELINUX from enforcing -> disabled.]

Then configure the Keepalived service to automatically start at the start of the server:

systemctl enable keepalive
systemctl start keepalivedd        

Now check the status of the Keepalived on Master and Slave servers by:

service keepalived status        

That's all, now you have configured your MySQL master-slave replication with keepalived.

Tidak ada komentar:

Posting Komentar