数据库主从延迟

为了实现数据库的高可用,一般需要搭建数据库集群,即所谓的n主n从的数据库结构。主库主要用作对数据库的写操作,然后再同步给从库;从库主要用作对数据的查询。

对主库的数据的更新操作时,数据的变更会同步给从库。这段同步的时间就是主从延迟。

主从延迟时间一般非常短,一般在1ms左右。主从延迟是不可控的,不能杜绝,也不知道在同步过程会发生什么。如果主从同步过程中其他的请求进来查询从库取的就是脏数据。

但是大部分业务几乎是可以忽略这个主从延迟,因为主从延迟时间非常之短。但是如果你的系统并发量非常高,并且需要保证数据是绝对的安全与正确,那只能牺牲性能来得到数据的保证了。

解决办法:
1.如果业务量不大,那就所有读写操作都从主库读取,从库只用作冷备。

2.打开主从数据库的强一致性协议。主从同步默认的是异步方式,即在主库数据更新后就立即返回给客户端成功状态,不用管从库是否同步完成。
数据库主从延迟_第1张图片

打开Semi-sync(半同步),即在主库数据更新后,然后同步给从库。若从库同步完成再返回给客户端请求完成的状态。

打开主从的半同步命令
master:
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_master_timeout=xxx;

slave:
stop slave io_thread;
set global rpl_semi_sync_slave_enabled=1;
start slave io_thread;

半同步状态如下:

数据库主从延迟_第2张图片

但是半同步对数据库性能影响较大,适合并发量不高,但对数据完整性,准确性有很高的需求的业务,例如:银行。

3。如果并发量非常高。查询比写入占比更高的话,就接个缓存中间件,如redis,memcached等。查询就直接从缓存中查询。避免极高并发下,主从延迟由从库取的是脏数据。

你可能感兴趣的:(数据库)