基于CentOS7,MySQL5.7的主从复制架构搭建实战1
一、环境说明
1. 软件版本
环境&软件 | 版本 |
---|---|
虚拟机&VMware Workstation | 15 Pro |
服务器&CentOS | CentOS-7-x86_64-DVD-1810.iso |
数据库&Mysql | 5.7.28 |
远程文件传输&WinSCP、Xftp | 5 |
远程连接&Xshell | 5 |
2. 架构介绍
机器名称 | 角色 | 权限 | IP |
---|---|---|---|
Master | 数据库Master | 可读写、主库 | 192.168.80.128 |
Slave1 | 数据库Slave | 只读、从库 | 192.168.80.55 |
Slave2 | 数据库Slave | 只读、从库 | 192.168.80.56 |
MHA | MHA Manager | 高可用监控 | 192.168.80.110 |
3. 软件下载地址:
- 操作系统:centos7下载地址 提取码:5555
- MySQL数据库:mysql5.7下载地址 提取码:pb3c
- MHA:mha下载地址 提取码:owwj
- Xshell:xshell5下载地址 提取码:xdao
二、环境准备—MySQL数据库安装(Master)
1. 将mysql拷贝到centos系统中
2. 对mysql安装包进行解压缩
注意:不需要全部安装rpm包,把核心和后续需要安装的rpm包进行安装即可
rpm包之间存在依赖关系,因此安装的时候注意安装顺序
3. 检查并卸载centos7中的自带的mysql数据库mariadb
-
查看是否存在
-
卸载并再次查看
注意: centos7中的自带的mysql数据库mariadb,需要卸载,否则回存在冲突
4. 安装MySQL
4.1 安装common
4.2 安装libs
4.3 安装libs的补丁包
4.4 安装client
4.5 安装server
报错:
缺少依赖(这里根据系统不同,缺少什么依赖就安装相应依赖的安装包即可)
解决依赖:(根据提示得知缺少perl依赖)
1.查找依赖对应包
yum search perl
2.yum安装对应包
yum -y install perl.x86_64
4.6 再次安装server,安装成功
5. 初始化mysql,此操作会 生成【root超级用户的默认登陆的密码】
6. 查看生成的密码
7. 启动mysql服务,查看mysql的状态
8.登陆mysql
9. 修改密码,重新登陆
10.关闭防火墙,方便多台主机正常通讯
-
如果安装了iptables,需要停止iptables (没有安装就直接跳过此步骤)
-
centos7默认,默认防火墙是firewalld
-
每次开机都禁用防火墙
三、主从同步架构搭建
1. 主从同步架构概述
MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默
认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,从节点可以复制主数据库
中的所有数据库,或者特定的数据库,或者特定的表。
- mysql主从复制用途:
- 实时灾备,用于故障切换(高可用)
- 读写分离,提供查询服务(读扩展)
- 数据备份,避免影响业务(高可用)
- 主从部署必要条件:
- 从库服务器能连通主库
- 主库开启binlog日志(设置log-bin参数)
- 主从server-id不同
2. 主从同步架构原理介绍
主从复制整体分为以下三个步骤:
* 主库将数据库的变更操作记录到Binlog日志文件中
* 从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中
* 从库读取中继日志信息在从库中进行Replay,更新从库数据信息
在上述三个过程中,涉及了Master的BinlogDump Thread和Slave的I/O Thread、SQL Thread,它们
的作用如下:
* Master服务器对数据库更改操作记录在Binlog中,BinlogDump Thread接到写入请求后,读取Binlog信息推送给Slave的I/O Thread。
* Slave的I/O Thread将读取到的Binlog信息写入到本地Relay Log中。
* Slave的SQL Thread检测到Relay Log的变更请求,解析relay log中内容在从库上执行。
上述过程都是异步操作,俗称异步复制,存在数据延迟现象。
下图是异步复制的时序图。
3. 使用主节点MySQL Master克隆从节点MySQL Slave1
使用vmware自带克隆功能,对当前的虚拟机master进行克隆
选择完整克隆
设置存储位置
设置MySQL_Slave1的ip地址为:192.168.80.55
vi /etc/sysconfig/network-scripts/ifcfg-ens33
重启网卡:
systemctl restart network
注意:
直接克隆主库master上的数据库到从库slave,需要避免uuid重复;防火墙的状态也需要注意保持关闭状态。
解决:删除从库的 /var/lib/mysql/auto.cnf 文件(否则,在后续从节点的状态中可能查看到错误:The slave I/O thread stops because master and slave have equal MySQL server UUIDs)
4. 搭建主从架构
4.1 配置主库:MySQL Master
4.1.1 修改MySQL的配置文件:
/etc/my.cnf
4.1.2 添加配置信息:
log_bin=mysql-bin # 开启binlog
server-id=1 # 保证不冲突即可
sync-binlog=1 # 每次执行写入行操作,都进行磁盘同步
#设置同步,不同步库
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#binlog-do-db=xxx
4.1.3 重启MySQL数据库,并授权
重启mysql:systemctl restart mysqld
授权1:
主库对从库进行授权操作(**只有经过主库授权的从库才能进行复制操作**)
授权2:
赋予远程操作权限,刷新权限
grant all privileges on *.* to 'root'@'%' identified by 'root';
查看主库状态:
4.2 配置从库:MySQL Slave1
4.2.1 修改MySQL的配置文件:
/etc/my.cnf
添加配置信息:
#log_bin=mysql-bin 从库不需要配置此项,从主库传递到从库,从库没必要开启binlog
server-id=2 # 保证不冲突即可
relay_log=mysql-relay-bin # 不写就使用默认的名称
read_only=1 # 设置只读,根据需求进行配置
4.2.2 重启MySQL数据库,并授权
重启mysql:systemctl restart mysqld
查看从库状态:
show slave status \G;
因为第一次配置,所以没有内容;如果存在数据,说明已经配置过了,不需要重复配置。
授权1: 同步初始化设置(针对前面配置的主库master中的binlog文件进行同步配置)
命令:
change master to master_host='192.168.80.128' ,master_port=3306,master_user='root',
master_password='root',master_log_file='mysql-bin.000002',master_log_pos=869;
配置的参数参考主节点的配置即可
查看从节点状态:
启动从节点,查看从节点状态
4.2.3 测试主从是否同步
在主库master中创建数据库和数据表,从库slave1中会自动同步主库master中的数据
注意:
如果没有同步成功,可以查看从节点的状态,从而对症下药
5. mysql主从复制:优化
问题:从机是根据主机master的某个二进制文件的某个pos点之后的信息进行同步;之前的数据就没法同步了,如果运行一段时间了,还以此参数进行同步,数据量会很大;因此都是从某个位置某个时间点进行同步的,之前的数据是没有处理的!
解决: 可以针对最近最新的从库,对主库进行完全的备份(mysqldump),此时再去配置主从同步的速度就会得到很大的提升!
在主库master中执行命令:
mysqldump --all-databases > mysql_datas_backup.sql -uroot -proot
将主库中的备份文件拷贝到从库中,进行复制即可
6. mysql主从复制存在的问题和解决方法(异步复制方式)
mysql主从复制存在的问题:
- 主库宕机后,数据可能丢失
- 从库只有一个SQL Thread,主库写压力大,复制很可能延时
解决方法:
- 半同步复制(解决数据丢失的问题)
- 并行复制(解决从库复制延迟的问题)