Master/Slave
mysql
Master: write/read,写操做都在主节点上操做nginx
Slaves: read,读操做都是从节点这边发出 sql
为何要复制?数据库
冗余:promte(提高为主),异地灾备,能够经过人工或者工具程序(MHA)实现安全
扩展:转移一部分“读”请求;服务器
支援安全的备份操做;多线程
测试须要; 架构
主/从架构实现:异步
在主节点上启用二进制日志,从节点启动链接线程,请求主节点把这个事件发给本身一份,从节点上有一个线程叫IO Thread,主节点上启用dump thread,IO Thread从节点将接受到的日志存储到中继日志,从服务器上的SQL THread负责从中继日志里生成一份数据。这样的数据同步方式是异步。主服务器负责写操做,从服务器负责读操做。ide
主从有可能致使主从数据不一致。如主服务多线程进程,从服务区是单线程进程,有可能致使主从数据不一致,从服务器的数据可能会落后于主服务器,这个问题是不可避免的,只能尽早发现,将不正确的数据手动更改,若是数据差异很大,手动恢复很难,能够在主服务器上作备份,把数据直接回复到从服务器上。
主服务器存到二进制log,存到从服务器上是异步操做的。传输是单向的。可是这里有个问题,若是写操做超出主服务器的性能,解决方法,使用双主模型
主从复制的三种形式:同步复制,异步复制,半同步复制
同步复制:
双主模型:写操做都在本地写,同步给另外一个节点,放到relay中。
主服务器都要启动中继日志和二进制日志,全部发给本节点的写操做,都要记录到二进制日志中,并经过dump thread发给对端主服务器,对端主服务器经过io thread将收到的数据存储到中继日志中,并依靠sql thread实现重放。主节点实现了冗余。每一个节点均可以读和写操做。这种操做能够下降读请求,每一个服务器负载一半的请求,可是写操做的请求数量是同样的,由于,双主的服务器都要写入一份数据。
利用中间件的读写分离器实现请求读写分离,中间件能够利用keepalive实现冗余。可是有了双主模型,就不须要读写分离,只须要用haproxy或者nginx或者lvs来实现请求的四层调度将请求调度到不一样服务器上便可。
mysql主从复制弊端可能运行一段时间后,根据业务逻辑的不同,可能致使主从数据不一致,致使获得的数据不一致。该状况在数据要求强一致的状况下是不容许存在的。
在主服务器上,操做是多线程并行的,可是记录到二进制文件中是串行记录,从服务器是单线程运行获取数据,这样致使从服务器拉取数据的速度落后于主服务器,致使了数据的差别,久而久之会致使数据严重不一致。若是这里设置读写分离,可能致使从服务器上读出的数据是错误的。双主模型一样有这个问题。主从数据不一致,建议解决办法是手动修改数据。若是数据差异太大,将从服务器关闭,在主服务器上作备份,恢复到从服务器上。
异步复制:
一主多从;
一从一主;
级联复制;一主复制给一从,同时,这个从服务器又是其余服务器的主,其余从服务器到这个中继服务器复制数据,级联的做用是下降主服务器的压力。中间的这个从服务器要启用二进制日志和中继日志,同时,中间这台从服务器仅起到过渡的做用,不须要保存数据,所以将block hole引擎用于这个中间从服务器上,使得不会产生数据保存,可是中继日志和二进制日志都有正常保存,起到过渡的效果。
循环复制;多主模式下,采用循环复制,可是链条更长,可能致使数据落后严重。
双主复制;
半同步复制:
一从多主模型:每一个主服务器提供不一样的数据库,master只保证slaves中的一个操做成功,就返回,其余slave无论。这个功能,是由google为MYSQL引入的。