mysql数据同步的问题,主要出现的原因就两点:
1、主库由于高并发,写入binlog太过频繁,导致从库来不及同步,从而使得数据不同步
解决办法:由于高并发导致的问题,所以只能通过限制并发数来解决问题,将并发数限制在一个可以实现同步的范围内,这样就可以保证主从同步。
具体做法:(1)、可以使用降流的方式来保证,但是我们的并发量比较稳定,所以不需要
(2)、可以使用mq的方式来实现消息削峰。让消费者去mq中消费消息。
这时候会有一个问题,比如消费者服务器每秒也是可以处理100条数据,但是数据库只能在50条时保证数据的同步。此时要怎么处理。
首先需要明确一点的是。出现高并发问题肯定是多线程的情况下。(试想:如果是单线程,还需要处理并发导致问题吗,他直接线性的处理就可以了。每次只处理一条数据)
所以在这个基础上,也就是要处理消费者多线程的问题就可以了。比如之前说的消费者可以处理100条,他的处理能力要大于数据库的,那么此时为了保证数据同步,就限制
消费者服务的线程数就可以了。(之前消费者服务的线程数是100个,现在给他控制在50个就可以了)。
2、因为从库是通过订阅relcylog来实现同步的,而mysql是通过单线程,并且随机对一个从库进行同步的。所以如果访问的是未同步的从库,就会导致数据不同步
解决办法:升级mysql版本,mysql5.6以上在单线程的基础上,开启了多个work线程,实现并发往从库中复制,可以减少或者保证数据同步。
这里需要衍生出来一个问题,如果mq出现消息积压的问题,需要怎么解决
解决办法:可以说增加服务节点,也就是消费者服务,来增加处理消息的个数。以解决消息积压的问题。
最后:对于上述的问题,如果说完之后,面试官再问,那么可以说我们是这么解决的,顺带问他有没有其他好的解决方案!!!