大家好,我是Tom!作为一名开发同学,对于MySQL肯定是不陌生的,常见的事务特性、隔离级别、索引等也是家常便饭。今天,我们就来深入聊一聊关于MySQL高可用的话题。1、什么是高可用?维基百科定义:高可用性(Highavailability,缩写为HA)是指系统不间断地执行其功能的能力,代表系统的可用性程度。高可用性通常是通过提高系统的容错能力来实现的。MySQL的高可用是如何实现的?首先我们看一张图:流程:一开始,处理流程主要是场景1;客户端读写,访问主库;主库通过一定的机制将数据实时同步到备库;当主数据库突然出现故障(如:磁盘损坏等)时,无法正常响应客户端的请求。此时会自动切换主备,进入第二场景;客户端读写,访问备库(此时备库升级为新的主库);看起来天衣无缝,所以你能高枕无忧吗???兄弟,想多了。主备倒换确实可以满足高可用。但是有一个前提,就是主备库的数据必须同步。但是数据同步是异步操作,不可能做到实时,所以必须要有主备延时。2、什么是主备延时?主库完成一个事务,写入binlog。binlog中有一个time字段,用来记录主库的写入时间[timet1];binlog同步到备库,备库接收并存入relaylog[timet2];备库SQL执行线程执行binlog,将数据写入备库表[timet3];主备延时时间计算公式:t3-t1有没有简单的命令,直接查。在备用数据库上执行showslavestatus命令。seconds_behind_master,表示当前备库延迟多少秒。细心的同学会有疑惑。t3和t1属于两台机器。如果时钟不一致怎么办?初始化时备库连接主库,会执行SELECTUNIX_TIMESTAMP()获取主库当前系统时间。如果发现主库的系统时间与备库的系统时间不一致,备库在计算seconds_behind_master时会自动减去这个差值。注意:binlog数据传输的时间(t2-t1)很短,可以忽略。主要延迟花在了备库上执行binlog日志上。三、主备延迟的常见原因1、备库机器配置不佳。韵律。就像跑步一样,滞后差距会越来越大。解决方法:升级备库的机器配置。2.备库做私活。备库除了服务于正常的读取业务外,是否被其他特殊服务占用,如:操作数据统计等,这些操作消耗系统资源,也会影响数据同步速度。解决方案:借助大数据平台和数据异构性,满足各种特殊的统计查询。3、大事务我们知道binglog只有在事务提交的时候才会产生。如果是处理大交易,执行时间比较长(比如5分钟)。虽然备库获取binlog的速度很快,但是备库重放执行需要5分钟左右。延迟很大。例如,对于删除操作,请谨慎使用deletefromtablenames。建议批量删除,减少大额交易。4、当主库不可用时,主备倒换有哪些策略?1.可靠性优先当主库A出现故障不可用时,开始进入主备倒换。首先判断B库的seconds_behind_master是否小于设定的阈值(比如4秒),如果满足则将A库改为只读状态,并设置readonly为true。切断A库的写操作,保证没有新的写流量进来,判断B库的seconds_behind_master,直到为0,改变B库为读写状态。客户端的请求打到了B库,此时主备切换完成。优点:数据不会丢失,所以我们称之为高可靠性。缺点:中间有个阶段,A库和B库都是只读的,此时系统无法对外提供写服务。2.可用优先级当然,我们也可以一开始就直接将流量切换到备库,而不用等待主备数据同步完成。这样备库的流量可能有两个来源:主库之前的剩余流量binlog;以及客户端新请求的传入流量。两部分的流量影响会对数据的一致性产生一定的影响。我们来做个实验:第一次创建用户表:CREATETABLE`person`(`id`bigint(20)unsignedNOTNULLAUTO_INCREMENT,`name`varchar(32),PRIMARYKEY(`id`))ENGINE=创新数据库;插入2条记录:insertintoperson(name)values("tom");插入person(name)值(“jerry”);实验一:设置binlog格式为binlog_format=row;描述:行模式,写Binlog会记录所有字段的值;A库和B库在做数据同步的时候,都会报主键冲突。最后只有一行数据不一致,但是数据会丢失。优点:在同步过程中,可以及时发现问题。实验二:设置binlog格式为statement或者mixed;按照原来的SQL语句同步binlog,可以看到数据项不会少,但是主键id会乱。三、结语本着“外制外,内定先行”的原则,保证内部数据的正确性是我们的首要选择。所以一般建议大家先选择Reliable。但是,可靠性优先可能会导致数据库在一定时间内不可用。这个时间值取决于master和backup的延迟时间。所以我们应该尽可能的缩短主备库的延迟时间,这样一旦主库出现故障,备库就会更快的同步数据,完成主备切换,保证服务的正常运行。恢复得更快。
