一 mysql主从复制的优化
说明:5.7之后才引出的
GTID:不需要再指明要读取的二进制日志文件,也不需要知道主库为了跟踪日志循环所维护文件的一个索引(position动态变化)
实验:基于GTID的主从复制!
重点:GTID和半同步复制解决的问题!
master配置文件
log-bin=mysql-bin
server_id=1 #每一个都不一样!
gtid_mode=ON
enforce_gtid_consistency=true
参数说明
log_bin: 自定义二进制日志存储的路径,默认是和mysql数据库文件存储在一起的!
server-id: 服务器ID,保证集群中唯一,所以在上面的从服务器中的server-id必须改成不一样的!
grant replication slave on *.* to repl@'172.25.2.%' identified by 'Wzj@170000';
show master status;
slave 配置文件
server-id=2
gtid_mode=ON
enforce_gtid_consistency=true
-- 说明:该步如果是之前异步复制所做的实验!
stop slave;
change master to master_host = '172.25.14.10', master_user = 'repl', master_password = 'Wzj@17000',master_auto_position =1 ;
start slave; -->看对应的开启的两个线程的状态!
show master status; -->查看下状态!
cat relay-log.info -->中继日志(shell中执行)
注意:半同步复制在slave端与异步复制的SQL语句的区别-->不需要声明日志文件和position位置!
异步复制:
对比
二 半同步
(1)简介
从MySQL5.5开始,MySQL以插件的形式支持半同步复制,要理解半同步,首先我们来看看异步,全同步的概念
1)异步复制(Asynchronous replication)
mysql默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整,也即数据一致性!
核心:master不管slave是否写入中继日志
2)全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务(也即从库的relay_log也回放)才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
核心:所有的slave必须对中继日志进行SQL回放!
3)半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以半同步复制最好在低延时的网络中使用。
核心:其中一个slave只需将接收到的二进制日志写入relay-log中即可!
说明:半同步的复制基于插件的开启!
三 基于GTID的半同步复制
主(master)
-- 安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
-- 测试
SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
-- 开启插件(半同步-->master)
SET GLOBAL rpl_semi_sync_master_enabled = 1;
从(slave)
-- 注意是slave,区别mster
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
-- 以变量的方式开启相应的配置-->全局回话有效!
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
测试
-- master
SHOW VARIABLES LIKE 'rpl_semi_sync%';
-- rpl_semi_sync_master_enabled | ON (开启)
-- 主从都测试下
SHOW VARIABLES LIKE 'rpl%'; -->含义!
实验测试
-- 测试
-- slave
STOP SLAVE IO_THREAD -->把从的I/O线程关闭了,也可以关闭网络-->目的:无法写入slave的中继日志,导致延时,证明是处于半同步的状态
-- master
-- 第一次默认10秒(超时,就会从全同步变成半同步),思考:如何修改呢?
insert into *.* values ('user4','660')
-- 插入数值:10.01秒左右才成功!
-- 此时会变成异步,再插入数据,没有延时,salve -->看不到数据!
-->保证业务上线正常运行
-->解决:半夜(峰值不是太高的时候,手动同步)
-->进一步测试
START SLAVE IO_THREAD; -- 看到:内容同步过来,此时又变成了半同步复制!
测试:发现多个slave的时候,随机选择一个slave(最快的那个),如果可以写,不用等,写不了就等10s超时!
三 读写分离-->MyCat、Proxy
四 高可用-->MHA