目录
4、show slave status能看到哪些消息(比较重要)
前言
- 在企业应用中,成熟的业务通常数据量都比较大
- 单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求
- 配置多台主从数据库服务器以实现读写分离
横向扩展:集群化,压力分摊
一、MySQL主从复制的理解
1、MySQL的复制类型
- statement:基于语句的复制。在主服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高
- row: 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍
- mixed:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
数据一般放在二进制日志文件中
2、MySQL主从复制的工作流程
- master 节点将数据的改变记录成二进制日志(bin log),当master上的数据发生改变时,则将其改变写入二进制日志中。
- slave节点会在一定时间间隔内对master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求
- 同时master节点为每个I/O 线程启动一个dump线程,用于向其发送二进制事件,并保存值slave节点本地的中继日志(relay log)中,slave节点将启动sql线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行,使得其数据和master节点的保持一致,最后,I/O线程和sql线程进入睡眠状态,等待下一次被唤醒。
3、MySQL架构(一主多备)
3.1 一主多备
一般用来做读写分离的master 写 其他 salve 读这种架构最大问I/O 压力集在master 上 多台同步影响IO
3.2 M-S-S
中继:分担master压力,slave中继需要开启bin-log并配置log-savle-update
总结:slave中继可以使用black-hole存储引擎,不会把数据存储到磁盘,值记录在二进制日志
3.3 M-M/双主互备 (互为主从)
(很多人误以为这样可以做到mysql负载均衡,实际没什么好处,每个服务器需要同样的同步更新,破坏了事务隔离性和数据一致性)
3.4 M-M-M
监控三台机器互相做对方master
天生的缺陷:复制延迟,salve上同步要慢于master,如果大并发的情况那么延迟更严重mysql5.6 已经自身可以实现fail over故障切换
4、MySQL主从复制延迟原因
- master服务器高并发,形成大量事务
- 网络延迟
- 主从硬件设备导致(cpu主频、内存io、硬盘io)
- 本来就不是同步复制、而是异步复制
5、MySQL主从复制延迟的优化
- 从库优化Mysql参数。比如增大innodb buffer pool size,让更多操作在Mysql内存中完成,减少磁盘操作。
- 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
- 从库使用SSD磁盘
- 网络优化,避免跨机房实现同步
二、搭建MySQL主从复制
- master:192.168.157.10 mysq5.7
- slave 1:192.168.157.45 mysql5.7
- slave 2:192.168.157.55 mysql5.7
- 客户端:192.168.157.65 mysql
- 关闭服务器的 firewalld和selinux设置
1、配置主从服务器时间同步
配置时间同步,可以使用chrony ,也可以使用ntp,但是两者只能使用其一
1.1 主服务器时间同步配置
yum -y install ntp
vim /etc/ntp.conf
#在文件末尾添加
server 127.127.157.0 #设置时间源为本地
fudge 127.127.157.0 stratum 8 #设置时间层级(15以内)
#启动ntpd服务
service ntpd start
#查看udp123端口
netstat -naup | grep :123
1.2 从服务器时间同步配置
yum -y install ntp
service ntpd start
#进行时间同步,同步主服务器的时间
/usr/sbin/ntpdate 192.168.23.10
#配置周期性同步时间
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.23.103
2、mysql配置文件配置
2.1 主服务器配置
systemctl stop firewalld
setenforce 0
vim /etc/my.cnf
.....
server-id = 10 #配置server id,集群内mysql服务器server -id不可以重复
log-bin=mysql-bin #主服务器开启二进制日志
binlog_format=mixed #使用混合模式
log-slave-updates=true #允许从服务器更新二进制日hi
#重启mysql服务
systemctl restart mysqld
#进入数据库
mysql -uroot -123456
#刷新二进制日志
flush logs;
#创建主从复制授权用户
grant replication slave on *.* to 'myslave'@'192.168.157.%' identified by '123456';
#查看当前 二进制日志名file和偏移量position
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
</