前端用户的写操作,或者是数据库修改操作,都会记录到二进制日志文件,保存为事件;master通过3306端口将binlog发给slave mysql服务器,slave mysql服务器将binlog保存到relay log,读取relay log并执行一遍,将数据写入磁盘
1.1 主从示意图
1.2 一主多从、多级复制
2 mysql repication先天缺陷
mysql一个查询只能在一颗CPU上执行,若主有多个CPU,同时执行多个事务,多个事务的往数据库中写数据的速度会比较快,但是二进制日志会在内存中缓存,一段时间后才会一条一条从缓存同步到二进制日志文件。此时,二进制日志才会同步到从上,salve从中继日志一条一条读取事件,并执行,这样,主的速度比从快很多
3 mysql repication模式
异步:默认模式,master本地执行成功,即成功;不管二进制日志是否发送发送到slave
半同步:在一主多从模式下,master将二进制日志发送到多个slave,但只保证一个slave接收成功,则表示半同步成功,与同步类似。mysql 5.5后支持半同步。
同步:master执行一条语句,master二进制日志同步到slave中继日志中,slave读取中继日志文件并执行成功,返回信息通知master执行成功。
同步模式,mysql的速度会慢很多,前端应用将会等待很久。
4 mysql replication作用
1、slave下线做冷备份,热备较为复杂。
2、高可用,当主出现故障,从稍作处理即可上线工作
3、异地容灾
4、scale out:分摊读负载,一主多从,主写从读
5 在mysql主从中,不使用mysql代理,如何实现master负责写,slave负责读?(以discuz为例)
php模块本身并不和mysql产生交互,和mysql交互的是discuz,让discuz解决读写问题;
双主模型,可以减轻服务器读数据的压力,无法减轻写操作;并且容易出现重复记录二进制日志的情况,因此少采用。
6 主从、一主多从、双主都不能减轻一台服务器写的压力;当一台服务器不能承受写压力时:
1)scale on,提高其配置
2)scale out,数据拆分(垂直拆分、水平拆分)
7 mysql读写分离的实现mysql-proxy
amoeba
8 数据拆分
cobar
9 mysql日志
二进制日志 bin lpg
存放位置:数据目录下mysql-bin.xxxxxxxx
滚动:1 达到最大上线;2 flush logs;3 服务器重启
清除二进制日志命令:purge
格式:statement,基于语句,不建议使用
row,基于行,建议使用
mixed,混合
mysql-bin.index:二进制日志文件索引文件
查看当前mysql使用的二进制日志文件:show master stattus;
查看二进制日志文件内容:show binlog events in “file”;
查看二进制日志文件列表:show binary logs;
二进制日志记录事件包含的元素:timestamp,position(offset),event,server-id
二进制日志可用于即时点还原,但并不能替代数据备份?
使用二进制日志恢复数据时,并不能保证数据和以前完全一样。多颗CPU并行处理数据,但记录日志时是串行写入的。
事务日志
错误日志 error log
一般查询日志
中继日志 relay log
慢查询日志