MariaDB semi-synchronous test

Environmental Science:

  • 192.168.205.17: as master server
  • 192.168.205.27: as slave server
  • 192.168.205.37: as slave server

Edition:

  • OS: centos 7 1810 with mini install
  • mariadb-5.5.60

Purpose:

By default, the replication function of MySQL is asynchronous. Asynchronous replication can provide the best performance. The main library sends the binlog log log to the slave library and ends without verifying whether the slave library has received it. This means that when the primary server or the slave server fails, it is possible that the binlog logs sent from the primary server are not received from the primary server, which will result in inconsistency between the data of the primary server and the slave server, and even loss of data during recovery. Semi-synchronization solves the problem of performance and data security integration. When stepping from the server, as long as one confirms that the synchronization is completed from the server, the result is returned without waiting for the complete replication. This solves the problem of waiting for all the results to be returned from the server when the data synchronization replication is completed, and achieves the best combination of performance and data security.

Steps:

  1. Install the database on all servers, initialize and run the following scripts
        [root@master ~]#cat /data/maridb_yum.sh 
    rpm -q mariadb-server ||yum install -y mariadb-server
    mkdir /data/{mysql,logs}
    chown mysql:mysql /data/{mysql,logs}
    sed -i '/\[mysqld\]/a log-bin=/data/logs/bin' /etc/my.cnf
    sed -i '/\[mysqld\]/a innodb_file_per_table = on' /etc/my.cnf
    sed -i '/\[mysqld\]/a skip_name_resolve = on' /etc/my.cnf
    sed -i 's@(datadir=).*@\1/data/mysql@' /etc/my.cnf 
  2. Modify configuration files
    [root@master ~]#vi /etc/my.cnf
    [mysqld]
    server-id=17
    [root@slave1 ~]#vi /etc/my.cnf
    [mysqld]
    server-id=27    
    [root@slave2 ~]#vi /etc/my.cnf
    [mysqld]
    server-id=37  
  3. Setting up synchronous account number on master server and recording location or backup master server restore slave server
    MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.205.%' identified by 'centos';
    MariaDB [(none)]> show master logs;                                                                 
    +------------+-----------+
    | Log_name   | File_size |
    +------------+-----------+
    | bin.000001 |     30373 |
    | bin.000002 |   1038814 |
    | bin.000003 |       406 |
    +------------+-----------+
    3 rows in set (0.00 sec)
  4. Modify change master to from the server and enable slave

    MariaDB [(none)]> CHANGE MASTER TO 
        -> MASTER_HOST='192.168.205.17', 
        -> MASTER_USER='repluser', 
        -> MASTER_PASSWORD='centos', 
        -> MASTER_PORT=3306,
        -> MASTER_LOG_FILE='bin.000003', 
        -> MASTER_LOG_POS=406; 
    Query OK, 0 rows affected (0.01 sec)
    
    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> show slave status\G
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.205.17
                      Master_User: repluser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: bin.000003
              Read_Master_Log_Pos: 406
                   Relay_Log_File: mariadb-relay-bin.000002
                    Relay_Log_Pos: 523
            Relay_Master_Log_File: bin.000003
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
  5. To enable master-slave semi-synchronous replication, you need to install a plug-in
    [root@centos7 data]#rpm -ql mariadb-server
    /usr/lib64/mysql/plugin/semisync_master.so
    /usr/lib64/mysql/plugin/semisync_slave.so
  6. You can see which plug-ins are installed in the database
    MariaDB [(none)]> show plugins;
  7. Install plug-ins on the primary server
    MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> show plugins;
    ...
    | rpl_semi_sync_master           | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
    +--------------------------------+----------+--------------------+--------------------+---------+
    43 rows in set (0.00 sec)
  8. View the status of semi-synchronization
    MariaDB [(none)]> show global variables like '%semi%' ;
    +------------------------------------+-------+
    | Variable_name                      | Value |
    +------------------------------------+-------+
    | rpl_semi_sync_master_enabled       | OFF   | #Semi-synchronous default off
    | rpl_semi_sync_master_timeout       | 10000 | #Time-out milliseconds, 10 seconds
    | rpl_semi_sync_master_trace_level   | 32    |
    | rpl_semi_sync_master_wait_no_slave | ON    |
    +------------------------------------+-------+
    4 rows in set (0.00 sec)
  9. Enable semi-synchronization
    MariaDB [(none)]> set global rpl_semi_sync_master_enabled=on;
    Query OK, 0 rows affected (0.00 sec)
  10. View semi-synchronous status information
    MariaDB [(none)]> show global status like '%semi%';
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 0     |
    | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
    | Rpl_semi_sync_master_net_wait_time         | 0     |
    | Rpl_semi_sync_master_net_waits             | 0     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | ON    |
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
    | Rpl_semi_sync_master_tx_wait_time          | 0     |
    | Rpl_semi_sync_master_tx_waits              | 0     |
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
    | Rpl_semi_sync_master_wait_sessions         | 0     |
    | Rpl_semi_sync_master_yes_tx                | 0     |
    +--------------------------------------------+-------+
    14 rows in set (0.00 sec)
  11. Install slave semi plug-ins on all slave nodes;
    MariaDB [(none)]>  install plugin rpl_semi_sync_slave soname 'semisync_slave.so';       
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> show plugins;
    ...
    | rpl_semi_sync_slave            | ACTIVE   | REPLICATION        | semisync_slave.so | GPL     |
    +--------------------------------+----------+--------------------+-------------------+---------+
    43 rows in set (0.00 sec)
  12. To view slave's semi-synchronous state and enable it, you need to restart the thread, and then see that the semi-synchronous state is on.

    MariaDB [(none)]> show global variables like '%semi%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | OFF   |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.00 sec)
    MariaDB [(none)]> set global rpl_semi_sync_slave_enabled=on; 
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> show global variables like '%semi%';      
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | ON    |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.00 sec)
    MariaDB [(none)]> stop slave;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> start slave;
    Query OK, 0 rows affected (0.00 sec)
    MariaDB [(none)]> show global status like '%semi%';  
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Rpl_semi_sync_slave_status | ON    |
    +----------------------------+-------+
    1 row in set (0.00 sec)
  13. View the status of the primary node at this point
    MariaDB [(none)]> show global status like '%semi%';
    +--------------------------------------------+-------+
    | Variable_name                              | Value |
    +--------------------------------------------+-------+
    | Rpl_semi_sync_master_clients               | 2     |
    | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
    | Rpl_semi_sync_master_net_wait_time         | 0     |
    | Rpl_semi_sync_master_net_waits             | 0     |
    | Rpl_semi_sync_master_no_times              | 0     |
    | Rpl_semi_sync_master_no_tx                 | 0     |
    | Rpl_semi_sync_master_status                | ON    |
    | Rpl_semi_sync_master_timefunc_failures     | 0     |
    | Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
    | Rpl_semi_sync_master_tx_wait_time          | 0     |
    | Rpl_semi_sync_master_tx_waits              | 0     |
    | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
    | Rpl_semi_sync_master_wait_sessions         | 0     |
    | Rpl_semi_sync_master_yes_tx                | 0     |
    +--------------------------------------------+-------+
    14 rows in set (0.00 sec)
  14. Test to create a library on the primary node
    MariaDB [(none)]> create database db1;
    Query OK, 1 row affected (0.00 sec)
  15. Synchronization can be seen from the node
    MariaDB [(none)]> show databases;     
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db1                |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
  16. In this way, we stop slave1 and create a database in the main node, which shows that it can be successfully copied to the slave2 node only.
    [root@slave1 ~]#systemctl stop mariadb
    MariaDB [(none)]> create database db2; 
    Query OK, 1 row affected (0.01 sec)
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db1                |
    | db2                |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    6 rows in set (0.00 sec)
  17. If all slave nodes are stopped and a database is created from the master node, it will take 10 seconds to display the success.
    [root@slave2 ~]#systemctl stop mariadb;
    MariaDB [(none)]> create database db3;
    Query OK, 1 row affected (10.00 sec)
  18. When the two servers are restarted, the view data is synchronized
    [root@slave1 ~]#systemctl start mariadb 
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | db1                |
    | db2                |
    | db3                |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    7 rows in set (0.00 sec)

Keywords: Linux MariaDB MySQL Database CentOS

Added by Ameslee on Wed, 07 Aug 2019 07:56:52 +0300