MySQL主从复制

原理简介

主从复制过程存在三个线程,Master端的I/O线程,Slave的I/O线程与SQL线程。Master端需要开启binlog日志,Slave端需要开启relay日志。

1、Slave端的I/O读取master.info文件,获取binlog文件名和位置点,然后向Master端的I/O线程请求,该binlog文件名和位置点的binlog信息。

(master.info文件在配置主从复制时使用change master命令来指定生成)

2、Master端的I/O线程会根据Slave端的I/O线程请求的信息来读取Master的binlog日志信息与及读取到最新的binlog文件名和位置点一同返回给Slave的I/O线程。

3、Slave端的I/O线程会把获取到的binlog日志写入relay日志(中继日志)文件中,并且更新master.info文件信息。(把读取到Master最新的binlog日志文件名和位置点更新到master.info文件中,下一次当前位置去读取Master的binlog日志)

4、Slave端的SQL线程会定期读取relay日志,把二进制的日志解析成SQL语句,并执行这些SQL语句,同步数据到从库中。

MySQL主从复制

环境准备

软件及系统: CentOS 7.5 — 2台、MySQL 5.7 --- Yum安装

系统环境准备:

##关闭防火墙及SElinux安全机制
[root@mysql ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@mysql ~]# sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
[root@mysql ~]# reboot

##必要的软件环境准备
[root@mysql ~]# yum -y install wget vim net-tools
[root@mysql ~]# yum -y groupinstall "Development Tools"
[root@mysql ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
[root@mysql ~]# rpm -ivh mysql80-community-release-el7-1.noarch.rpm

⚠️需要修改MySQL的安装仓库的设置, 开启5.7的安装源, 关闭8.0的安装源

###安装构建

要求: master-slave架构

构建过程:

##安装配置过程
[root@mysql ~]# yum -y install mysql-community-server
[root@mysql ~]# systemctl enable mysqld && systemctl start mysqld
##主从配置过程
##------------------------------------主库设置------------------------------------##
[root@master ~]# vi /etc/my.cnf //开启二进制日志并设置服务ID
[mysqld]
server-id=21

log-bin=mysql-bin

[root@master ~]# systemctl start mysqld && systemctl enable mysqld
[root@master ~]# grep 'password' /var/log/mysqld.log
2019-06-22T01:53:04.173732Z 1 [Note] A temporary password is generated for root@localhost: ied,1qj(y/gH //注意修改密码

[root@master ~]# mysql -uroot -p'(Cyy..123)'

mysql> CREATE USER 'replication'@'192.168.233.22' IDENTIFIED BY "#Cyy..123#";
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.233.22';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 877 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

##------------------------------------主库设置------------------------------------##

##------------------------------------从库设置------------------------------------##
[root@slave ~]# vi /etc/my.cnf
[mysqld]
server_id=22

[root@slave ~]# systemctl start mysqld && systemctl enable mysqld
[root@slave ~]# grep 'password' /var/log/mysqld.log
2019-06-22T02:07:33.890742Z 1 [Note] A temporary password is generated for root@localhost: dFS:z5DQ/
[root@slave ~]# mysql -uroot -p'(Cyy..123)'

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.233.21',
-> MASTER_USER='replication',
-> MASTER_PASSWORD='#Cyy..123#',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=877;

mysql> start slave;
mysql> show slave status\\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.233.21
Master_User: replication
Master_Port: 3306
Connect_Retry: 60

Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 1206
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 649
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
##------------------------------------从库设置------------------------------------##
MySQL主从复制


分享到:


相關文章: