一、实验环境
实验用途 | IP地址 | 操作系统 |
---|---|---|
MySQL主服务器 | 192.168.31.61 | Centos7.9 |
MySQL从服务器 | 192.168.31.62 | Centos7.9 |
需要关闭selinux,防火墙,并清空Iptables规则。
软件名称 | 版本 |
---|---|
MySQLl数据库 | 5.7 |
二、实验原理
- MySQL Replication,可以实现将数据从一台库服务器( master)复制到一 台或多台数据库服务器 (slave)。默认情况下属于异步复制,无需维持长连接,通过配置,可以复制所有的库或者几个甚至中一些表,这个功能是 MySQL 内建的,本身自带的。
复制过程简单的说就是 master 将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志行数据操作。
DML:SQL操作语句, update, insertinsert,delete
Relay log (中继日志)
- Replication的作用
- Fail Over
故障切换 - Backup Server
备份服务,无法对 SQL 语句执行产生的故障恢复,有限备份 - High Performance
高性能,可以多台 slave, 实现读写分离
- Replication 工作原理
整体上来说,复制有 3 个步骤:
- master 将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
- slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- slave 重做中继日志中的事件,修改 salve 上的数据。
- MySQL 主从复制:
- 第一步:master 记录二进制日志。在每个事务更新数据完成之前,master 在二进制日志记录这些改变。MySQL 将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master 通知存储引擎提交事务。
- 第二步:slave 将 master 的 binary log 拷贝到它自己的中继日志。首先,slave 开始一个工作线程——I/O 线程。I/O 线程在 master 上打开一个普通的连接,然后开始 binlog dump process。Binlog dump process 从 master 的二进制日志中读取事件,如果已经执行完 master 产生的所有文件,它会睡眠并等待 master 产生新的事件。I/O 线程将这些事件写入中继日志。
- 第三步:SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重新执行其中的事件而更新 slave 的数据,使其与 master 中的数据一致。
- Replication 常见方案
-
One master and Muti salve 一主多备
一般用来做读写分离的,master 写,其他 slave 读,这种架构最大问题 I/O 压力集中 在 Master 上<多台同步影响 IO>
-
M-S-S
使用一台 slave 作为中继,分担 Master 的压力,slave 中继需要开启 bin-log,并配置 log-slave-updates
Slave 中继可使用 Black-hole 存储引擎,不会把数据存储到磁盘,只记录二进制日志。
-
M-M 双主互备 (互为主从)
很多人误以为这样可以做到 MySQL 负载均衡,实际没什么好处,每个服务器需要做同样的同步更新,破坏了事物的隔离性和数据的一致性。
-
M-M-M
监控三台机器互相作对方的 master
天生的缺陷:复制延迟,slave 上同步要慢于 master,如果大并发的情况那延迟更严重
三、搭建主从
1.安装MySQL
主从2台服务器都要安装,下面过程以主服务器安装为例,与从服务器安装过程相同
#首先解压mysql5.7安装包
[root@master ~]# tar xvf mysql-5.7.tar.gz
#使用yum本地安装mysql
[root@master ~]# yum install -y mysql*.rpm
#启动mysql
[root@master ~]# systemctl start mysqld
#关闭密码强度审计插件
[root@master ~]# echo "validate-password=OFF" >> /etc/my.cnf
#重启mysql
[root@master ~]# systemctl restart mysqld
#筛选日志文件,查找mysql初始root密码
[root@master ~]# grep password /var/log/mysqld.log | head -1
2021-07-14T11:50:39.368593Z 1 [Note] A temporary password is generated for root@localhost: /j_ieG?jn8!!
#登录mysql
[root@master ~]# mysql -u root -p'/j_ieG?jn8!!'
#修改root密码
mysql> set password for root@localhost=password('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> exit
#测试修改的密码
[root@master ~]# mysql -u root -p'123456'
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
至此MySQL安装完成,下面开始进行主从的搭建
2.MySQL主服务器配置
[root@master ~]# mysql -u root -p'123456'
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database test; #创建测试主从同步的数据库
Query OK, 1 row affected (0.00 sec)
mysql> use test; #切换使用新建的数据库
Database changed
mysql> create table test1(id int,name varchar(20)); #创建测试表test1
Query OK, 0 rows affected (0.01 sec)
mysql> exit