MySQL主从同步推迟解决方案ITeye - 凯发娱乐

MySQL主从同步推迟解决方案ITeye

2019-01-11 02:15:57 | 作者: 诗翠 | 标签: 同步,恳求,推迟 | 浏览: 3001


因为数据推迟问题的存在,当应用程序在Master 进步行数据更新,然后又马上需求从数据库中读取数据时,这时候假如应用程序从Slave上取数据(这也是当时Web开发的惯例做法),就可能呈现读取不到希望的数据,形成程序运转反常。 

处理这个问题有多种办法,比方最简略的在所有的insert和update之后,强制sleep几秒钟。这是十分粗鲁的办法,关于更新操作不是很高的中小型体系,此办法基本能处理问题。 

别的一种办法是应用程序把被更新的数据保存在本机的内存(或许集中式缓存)中,假如在写入数据完成后需求直接读取数据,则从本机内存中读取。这种办法的缺陷是极大的添加了应用程序的复杂度,并且可靠性并不能彻底得到保证。 

运用MySQL Proxy能够很便利的处理这个问题。MySQL Proxy是依据MySQL Client 和 MySQL Server之间的署理程序,能够完成对Client所发恳求的监控、修正。从Client视点看,经过Proxy拜访Server和直接拜访Server没有任何差异。关于既有的程序而言,只要把直接被拜访的Server的IP地址和端口号换成Proxy的IP地址和端口号就能够。 

MySQL Proxy的作业原理也较简略。在Proxy启动时能够指定Proxy所需求运用的lua脚本,在lua脚本中预先完成6个办法: 

    * connect_server()     // 接纳到Client的衔接恳求时调用 
    * read_handshake()   // 
    * read_auth()               // 读取Client的认证信息时调用 
    * read_auth_result() // 读取认证成果时调用 
    * read_query()            // 读取Client的query恳求时调用 
    * read_query_result()   //读取query成果时调用 

当 Proxy接纳到Client恳求时,在恳求的不同的阶段会调用上面的不同办法。这样Proxy运用者就能够依据自己的事务需求,自在的完成这6个办法到达意图。 

经过在read_query()中参加代码,咱们能够截取出当时的恳求是insert、update仍是select,然后把 insert和update恳求发送到Master中,把select恳求发送到Slave中,这样就处理了读写别离的问题。 

在处理了读写别离后,怎么处理同步推迟呢? 

办法是在Master上添加一个自增表,这个表仅含有1个的字段。当Master接纳到任何数据更新的恳求时,均会触发这个触发器,该触发器更新自增表中的记载。如下图所示:   

 mysql_proxy_write 

因为Count_table也参加Mysq的主从同步,因而在Master上作的 Update更新也会同步到Slave上。当Client经过Proxy进行数据读取时,Proxy能够先向Master和Slave的 Count_table表发送查询恳求,当二者的数据相一起,Proxy能够确定 Master和Slave的数据状况是共同的,然后把select恳求发送到Slave服务器上,不然就发送到Master上。如下图所示: 

 mysql_proxy_read 

经过这种办法,就能够比较完美的成果MySQL的同步推迟不可控问题。之所以所“比较完美”,是因为这种计划double了查询恳求,对Master和Slave构成了额定的压力。不过因为Proxy与实在的Mysql Server选用衔接池的办法衔接,因而额定的压力仍是能够承受的 第二种计划:  让缓存顶一会 假如更新了某个item,把item id放进redis,过期时刻5分钟。 
下次读取该item时,假如id在redis射中,读主库,不射中,读从库。  第三种计划: 自己写个dbproxy层, 一般情况下读从库,有呼应时刻要求的程序里边设置 
readMaster=true, 让dbproxy读主库。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章