MySQL中并行复制
这两天遇到了一个问题,就是一个业务的并发量比较高,在进行MySQL的并行复制的时候,经常会遇到sql线程断开的情况,查看错误日志则是说update了一个不存在的记录,IO线程是处于正常复制的状态,这个问题思考了一段时间,也查看了一些博客,总结了一些解决的办法,并且成功解决了这个问题,这里简单罗列一下:
这个参数是与MySQL的复制相关的,可以动态进行修改,这里给出官方文档连接:
https://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html#sysvar_slave_exec_mode
这个参数的默认格式是strict模式,也就是严格模式,还有一种模式是idempotent模式,也就是幂等模式,设置成idempotent模式可以让从库避免Error code 1032(从库上不存在某个记录)以及Error code 1062(重复的记录,需要存在主键)这两个错误,需要注意的是这个模式只是binlog模式是row的时候生效,在statement模式下不生效。
实际上我们解决这个问题就是使用的上面这种方法。
从原理上面将,这个参数的本质是跳过那些错误的语句,这个时候,可能有些同学会想了,这个跳过的功能,sql_slave_skip_counter参数和slave-skip-errors也可以做到,那么下面这三个参数有啥区别呢?
slave_exec_mode参数;
sql_slave_skip_counter=N参数;
slave-skip-errors=N参数。
这个我们会另外用一篇文章来讲述,今天重点不是这个。
2.修改参数slave_preserve_commit_order
这个参数从名字就可以看出来,是为了保证并行复制的时候slave上面的事务提交顺序,从而避免出现事务乱序导致的记录不存在问题,除此之外,需要将参数binlog_order_commits的值改为on,这个参数保证了binlog中的事务排序。
这种方式在实践操作的过程中还是不能完全避免sql线程的错误,但是可以有效的减少错误次数,之前可能每5分钟报一次,现在可能会变为15分钟报一次,可以说是有一些作用的。
3.写脚本,在出现错误的时候自动处理
这种是不得已而为之的方法,就是写脚本按照指定的时间去抓这个断裂的点,然后设置gtid_next的值,然后通过set session gtid_next那一套操作进行解决。
要想彻底的剖析这个问题,恐怕还得从并行复制的原理入手,这个留作一个任务吧,后续将用文章来讲述并行复制原理。今儿就到这里吧。