Thursday, August 23, 2012

How to create a replication (Master/Slave) in MySQL

Overview

This post is based on my work on Master/Slave environments creation.
I Discover 2 way of creating a Slave/Replica from a Master.
the first way is by using a cold backup of the/var/lib/mysql folder from the Master which means that you will have to have a down time on your application if you want a consistent backup.
The second solution that I found out not long ago during a Slave/Replica crash that I couldn't resync with the master since they were out of sync since about 60 days. That second option for creating a Slave/Replica from a Master is by using a mysqldump backup using to proper options.
So here are the 2 solutions to share.

These 2 procedures assume that both Master and Slave/Replica hosts have already been install with MySQL.

If not you can follow this link to install MySQL How to Install MySQL on linux using RPM

NOTE:
Assuming
master host = 192.168.10.1
slave/replica host = 192.168.10.2 


Create a Slave/Replica using a cold backup (requires applications down time)

1. Create a replication account on the Master

create user repl@'192.168.10.1' IDENTIFIED BY 'yourpassword';
GRANT REPLICATION SLAVE, REPLICATION CLIENT 
        ON *.*
        TO repl@'192.168.10.1' [ IDENTIFIED BY 'yourpassword' ];
GRANT REPLICATION client, REPLICATION CLIENT 
        ON *.*
        TO repl@'192.168.10.1' [ IDENTIFIED BY 'yourpassword' ]; 

2. Modify the /etc/my.cnf file on the Master

under [mysqld] 

expire_logs_days=2 #  purge bin logs older than 2 days
log-bin=/var/lib/mysql/log-bin # bin location (use full path)
server-id=100 # unique id for the master (default is 1)
sync_binlog=1 # to sync the binlogs 

if you are using InnoDB it is recommended to use

innodb-flush-log-at-trx-commit=1 # This will flush the log write
innodb-support-xa=1 # mysql 5.5 and later 

3. Take note of the Master current bin log and position

This information will be needed when setting the Slave/Replica later one.

show master status\G
 
*************************** 1. row ***************************
            File: log-bin.000056
        Position: 425307404
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec) 

4. Restart your Master to enable the new parameters

You need to restart the Master in order to take the new parameters from themy.cnf.

service mysql restart

5. Do a cold backup of the Master

This backup is a cold backup of the /var/lib/mysql folder using the cp command.

service mysql stop
cp -Rp /var/lib/mysql  /tmp/.
cd /tmp
tar -zcvf mysql.tar mysql
rm -Rf /tmp/mysql

6. Restart the master

service mysql start

7. Transfer the backup to the Slave/Replica host using SCP

cd /tmp
scp mysql.tar root@192.168.10.2:/tpm/.

8. Stop MySQL on the slave host (192.168.10.2)

service mysql stop

9. Remove the content of /var/lib/mysql on the slave

I highly suggest that you take a backup of /var/lib/mysql before you erase it.


cd /var/lib/mysql
rm -Rf *

10. Untar the mysql.tar into /var/lib on the Slave

cp /tmp/mysql.tar /var/lib/.
cd /var/lib
tar -xvf mysql.tar
 
NOTE: if you are using 5.6 and later remove the file auto.cnf in /var/lib/mysql/ to avoid errno 1593
Errno: 1593
Fatal error: The slave I/O thread stops because master and slave
have equal MySQL server UUIDs; these UUIDs must be different for
replication to work.


11. Change the /etc/my.cnf on the slave

    under  [mysqld]
slave-skip-errors=1062 # skip duplicate transaction errors
log-bin=/var/lib/mysql/log-bin # log bin location
relay_log=/var/lib/mysql/mysql_relay-bin # Relay log location
log_slave_updates=1
server-id=101 # we usually put the last digits of the slave IP
skip-slave-start # Does not restart replication on instance restart


I recommend that once the Slave/Replica will be created and sync with the Master that you remove the slave-skip-errors=1062 from the my.cnf file then that you restart the Slave/Replica and you restart the replication.

12. Start MySQL on the Slave

service mysql start

13. Configure the replication on the slave

Note: Remember the bin log file name and position from step 3


CHANGE MASTER TO
    MASTER_HOST='192.168.10.1', 
    MASTER_USER='repl',
    MASTER_PASSWORD='yourpassword',
    MASTER_LOG_FILE='binlognamefrompoint3',
    MASTER_LOG_POS=positionfrompoint3;

14. Start the replication on the slave

start slave;

15. Validate the replication

In the result of this command the most important line is Seconds_Behind_Master.
If the value in the line is NULL, this means that your replication with the Master is not working.
If the value is greater than 0, this means that your replication is catching on. if you run this command few time, the value should go down.
If the value is equal to 0, that means that your replication is running and up to date.

show slave status\G 

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: log-bin.000056
          Read_Master_Log_Pos: 982311504
               Relay_Log_File: mysql_relay-bin.000130
                Relay_Log_Pos: 60222517
        Relay_Master_Log_File: log-bin.000056
             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: 982311504
              Relay_Log_Space: 60406973
              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: 123

Create a Slave/Replica using a mysqldump backup (No down time)

This option is almost identical to the first one except this time you are using a mysqldump backup and there will be no down time on the master.

1. Create a replication account on the Master

create user repl@'192.168.10.2' IDENTIFIED BY 'yourpassword';
GRANT REPLICATION SLAVE, REPLICATION CLIENT 
        ON *.*
        TO repl@'192.168.10.2' [ IDENTIFIED BY 'yourpassword' ];

2. Modify the /etc/my.cnf file on the Master

under [mysqld] 

expire_logs_days=2 #  purge bin logs older than 2 days
log-bin=/var/lib/mysql/log-bin # bin location (use full path)
server-id=100 # unique id for the master (default is 1)
sync_binlog=1 # to sync the binlogs 

if you are using InnoDB it is recommended to use

innodb-flush-log-at-trx-commit=1 # This will flush the log write
innodn-support-xa=1 # mysql 5.5 and later 

3. Take note of the Master current bin log and position

This information will be needed when setting the Slave/Replica later one.

show master status\G
 
*************************** 1. row ***************************
            File: log-bin.000056
        Position: 425307404
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec) 

4. Restart your Master to enable the new parameters

You need to restart the Master in order to take the new parameters from themy.cnf.

service mysql restart

5. Take a backup of the Master using mysqldump

mysqldump -uroot --password=your_password --all-databases  --add-drop-database --flush-logs --master-data=2  > /tmp/mysql_backup.sql
gzip mysql_backup.sql

6. Restart the master

service mysql start

7. Transfer the backup to the Slave/Replica host using SCP

cd /tmp
scp mysql_backup.gz root@192.168.10.2:/tpm/.


8. Unzip the mysql_backup.sql.gz

cd /tmp 
gunzip mysql_backup.sql.gz 

9. Change the /etc/my.cnf on the slave

    under  [mysqld]
slave-skip-errors=1062 # skip duplicate transaction errors
log-bin=/var/lib/mysql/log-bin # log bin location
relay_log=/var/lib/mysql/mysql_relay-bin # Relay log location
log_slave_updates=1
server-id=101 # we usually put the last digits of the slave IP
skip-slave-start # Does not restart replication on instance restart


I recommend that once the Slave/Replica will be created and sync with the Master that you remove the slave-skip-errors=1062 from the my.cnf file then that you restart the Slave/Replica and you restart the replication.

10. Start MySQL on the Slave

service mysql start

11. Restore the mysqldump backup into the Slave/Replica environment

this restore will overwrite all the databases.

cd /tmp
mysql -uroot -pyour_password < mysql_backup.sql

12. restart the Slave/Replica instance

service mysql restart

13. Configure the replication on the slave

Note: Remember the bin log file name and position from step 3


CHANGE MASTER TO
    MASTER_HOST='192.168.10.1', 
    MASTER_USER='repl',
    MASTER_PASSWORD='yourpassword',
    MASTER_LOG_FILE='binlognamefrompoint3',
    MASTER_LOG_POS=positionfrompoint3;

14. Start the replication on the slave

start slave;

15. Validate the replication

In the result of this command the most important line is Seconds_Behind_Master.
If the value in the line is NULL, this means that your replication with the Master is not working.
If the value is greater than 0, this means that your replication is catching on. if you run this command few time, the value should go down.
If the value is equal to 0, that means that your replication is running and up to date.

show slave status\G 

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.10.1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: log-bin.000056
          Read_Master_Log_Pos: 982311504
               Relay_Log_File: mysql_relay-bin.000130
                Relay_Log_Pos: 60222517
        Relay_Master_Log_File: log-bin.000056
             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: 982311504
              Relay_Log_Space: 60406973
              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: 123













No comments:

Post a Comment