Build Mysql master-slave database

Posted by Trenchant on Sat, 12 Feb 2022 02:10:56 +0100

mysql 5.7 installation

Download yum source

$ vagrant up		# Start the virtual machine
$ vagrant ssh		# Connect to virtual machine
# Download mysql 5.7
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 

Install yum source locally

yum install -y mysql-community-server

Check whether the mysql source is successfully installed

yum repolist enabled | grep "mysql.*-community.*"

The following message appears indicating that the installation was successful:

mysql-connectors-community/x86_64 MySQL Connectors Community                 20
mysql-tools-community/x86_64      MySQL Tools Community                      12
mysql57-community/x86_64          MySQL 5.7 Community Server                 50

Use the yum install command to install Mysql:

$ yum install -y mysql-community-server
...
already installed:
  mysql-community-libs.x86_64 0:5.7.34-1.el7                                            
  mysql-community-libs-compat.x86_64 0:5.7.34-1.el7                                     
  mysql-community-server.x86_64 0:5.7.34-1.el7                                          

Installed as a dependency:
  mysql-community-client.x86_64 0:5.7.34-1.el7                                          
  mysql-community-common.x86_64 0:5.7.34-1.el7                                          

replace:
  mariadb-libs.x86_64 1:5.5.68-1.el7                                                    

complete!
# Prompt for successful installation

Start mysql:

systemctl start mysqld

After startup, check the status of Mysql:

systemctl status mysqld

If the above command displays the following information, the installation is successful:

● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since II. 2021-05-18 20:50:27 CEST; 2min 18s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 12715 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 12496 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 12718 (mysqld)
   Memory: 158.3M
   CGroup: /system.slice/mysqld.service
           └─12718 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid...

5 June 18-20:50:13 k8s-master systemd[1]: Starting MySQL Server...
5 June 18-20:50:27 k8s-master systemd[1]: Started MySQL Server.

Set startup:

systemctl enable mysqld

Modify MySQL password

After mysql is installed, the default password generated is / var / log / mysqld Log file. Use the grep command to find the password in the log.

 grep 'temporary password' /var/log/mysqld.log
2021-05-18T18:50:21.200923Z 1 [Note] A temporary password is generated for root@localhost: ujTio<m:g5S%

Log in to mysql for the first time and change the password:

mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Test@123'; 

Allow remote login

Modify root to allow remote connection. It is not recommended for production environment:

mysql> use mysql;
mysql> UPDATE user SET Host='%' WHERE User='root';
mysql> flush privileges;

Open log (not required)

(not required) start the log of sql statement. It is not recommended to start it in the production environment:

View the log directory and open the log of sql statement:

mysql>  show variables like '%general_log%';
mysql>  set global general_log=on;

After startup, restart Mysql, and the above log configuration will become invalid.

Master-slave configuration of Mysql

Machine preparation

Follow the above steps to install mysql5 on the two machines 7. The ip addresses of the two machines are:

  • 10.0.2.15 172.28.128.3 main
  • 10.0.2.15. 172.28.128.4 from

Create two databases on the two machines, test and test2 respectively, and the character code is utf8:

mysql> CREATE DATABASE `test` CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (2.42 sec)
mysql> CREATE DATABASE `test2` CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (1.64 sec)
mysql> show databases;

Turn off the firewall

To ensure that the 3306 port of the firewall is open, if it is only for learning, you can directly close the firewall.

centos closes the firewall: service iptables stop or systemctl stop firewalld

master node configuration

[root@k8s-master vagrant]# hostname -I
10.0.2.15 172.28.128.3 172.17.0.1 

Configuration on 172.28.128.3 machine

vim /etc/my.cnf

#Server ID is the unique identification of the database service
server-id=1
#
##Log bin setting this parameter means that binlog function is enabled and the path name is specified
log-bin=/var/lib/mysql/mysql-bin
sync_binlog=0
##Sets the number of days the log expires
expire_logs_days=7
binlog-do-db=test
binlog-do-db=test2
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
  • The server ID here is used to identify the unique database. It must be set to different values in the slave database.
  • Binlog ignore DB: indicates the database ignored during synchronization
  • Binlog do DB: Specifies the database to be synchronized

Restart mysql and the configuration takes effect. Execute the following command: systemctl restart mysqld

After the restart is successful, log in to mysql.

Give the Slave database permission account, allow the user to read the log on the master database, and give 172.28.128.4, that is, the Slave machine has File permission,
It's not enough to only give the Slave machine File permission, but also give it the permission of REPLICATION SLAVE.

mysql> grant FILE on *.* to 'root'@'172.28.128.4' identified by 'Test@124';
mysql> grant replication slave on *.* to 'root'@'172.28.128.4' identified by 'Test@124';
mysql> flush privileges;

The users here are the users used from the library during synchronization.

Restart mysql (systemctl restart mysqld), log in to mysql and view the main database information

mysql> show master status;
+------------------+----------+--------------+-------------------------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                                | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql-bin.000001 |      154 | test,test2   | information_schema,sys,mysql,performance_schema |                   |
+------------------+----------+--------------+-------------------------------------------------+-------------------+
1 row in set (1.67 sec)

Configure slave Library

1. Modify / etc / my cnf

log-bin=mysql-bin
server-id=3
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
replicate-do-db=test
replicate-do-db=test2
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

Note: the server IDs of the two slave libraries are different and need to be unique.

2. Finished modifying / etc / my After CNF, restart mysql (systemctl restart mysqld)

Enter the mysql console of Slave and perform the following operations:

mysql>  mysql -uroot -p
mysql> stop slave;
mysql> 
change master to   master_host='172.28.128.3',master_user='root',master_password='Test@123',master_log_file='mysql-bin.000001', master_log_pos=154;
mysql> start slave;

Note: the above master_log_file is the file displayed in show master status in Master,
And master_log_pos is the Position displayed in show master status in Master.

When configuring the second slave library, you need to re obtain File and position from matser.
3. Then you can view the configuration information through show slave status.

mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Connecting to master
                  Master_Host: 172.28.128.3
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: k8s-node1-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Connecting
            Slave_SQL_Running: Yes
              Replicate_Do_DB: test,test2
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0

The message above has Slave_IO_Running: Yes and Slave_SQL_Running: Yes, it proves that the master-slave synchronization is successful.

reference resources

https://dev.mysql.com/doc/refman/5.7/en/replication.html

https://segmentfault.com/a/1190000010867488

Topics: MySQL