MYSQL主库从库复制原理
一、文件同步
1、文件级别同步方案
scp,Nftp,http,samba,rsync,csync2,union
http://oldboy.blog.51cto.com/2561410/775056
思想:①文件级别也可以利用mysql,MongoDB等软件。
②两个服务器同时写数据,双写就是一个同步机制。
2、文件系统级别同步
drbd(基于文件系统同步网络RSID1),同步几乎任何业务数据。
mysql数据库的官方推荐drbd同步数据,所有单点服务如:NFS,MFS(DRBD)等都可以用drbd。
3、数据库同步方案
a.自身同步机制:
mysql replication,mysql主从复制(逻辑的SQL从写)。
oracle dataguard(物理的磁盘块,逻辑的SQL语句从写)。
b.第三方drbd,参考
http://oldboy.blog.51cto.com/2561410/1240412
二、MYSQL主从复制介绍
MYSQL支持单向、双向、链式级联、实时、异步复制。在复制过程中,一台服务器充当主服务器(master),而一个或多个其他的服务器充当从服务器(slave)。复制可以是单向,双向,环状。
1、主从服务器互为备份
主从服务器架构的设置,可以大大加强数据库架构的健壮性,主从同步本身就是备份。
主从备份方式:
①主库的binlog放到从库,应用到从库里;
②双写;
③用应用程序写1分钟的log放到内存里;
④异步同步换成实时同步;谷歌的半同步插件,要成功都成功,从向主反馈信息;
2、主从服务器读写分离分担网站压力
主从服务器架构可通过程序(php,java)或代理软件(mysql-proxy,amoeba)对用户(客户端)的请求实现读写分离,即通过在从服务器上仅仅处理用户的select查询请求,降低用户查询相应时间及读写同时在主服务器带来的压力。如何分离:大公司通过程序分离;测试环境:代理软件(mysql-proxy,amoeba);门户网站:分布式dbproxy(读写分离,hash负载均衡,健康检查)。
3、根据业务拆分从库
三、理论
1、从库配置连接主库:
CHANGE MASTER TO
MASTER_HOST='10.10.11.163',
MASTER_PORT=3306,
MASTER_USER='用户名',
MASTER_PASSWORD='密码';
MASTER_LOG_FILE='mysql-bin.000010',
MASTER_LOG_POS=4226;
start slave:开启同步;
从库:中继日志,relay-log;master.info
①配置从库
②master-data=1,做从库;
③开启开关之前,主从库一致;
④建立主库账号专门用于从库的账号;
⑤主库要打开binlog开关,否则无法实现同步;
⑥从库打开开关的过程实际是让IO和SQL工作的工程。
2、主从复制原理过程
简单描述MYSQL replication的复制过程
①Slave服务器上执行start slave,开启主从复制开关。
②此时,Slave服务器的IO线程会通过在Master上授权的复制用户权限请求连接Master服务器,并请求从指定Binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令时指定的)之后发送Binlog日志内容;
③Master服务器接收到来自Slave服务器的IO线程的请求后,Master服务器上负责复制的IO线程根据slave服务器的IO线程请求的信息读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给slave端的IO线程。返回的信息中除了Binlog日志内容外,还有本次返回日志内容后在Master服务器端的新的Binlog文件名称以及在Binlog中的下一个指定更新位置;
④当slave服务器的IO线程获取到来自master服务器上IO 线程发送日志内容及日志文件及位置后,将binlog日志内容依次写入到slave端自身的relay log(中继日志)文件(MYSQL-relay-bin.XXXXXX)的最末端,并将新的Binlog文件名和位置记录到master-info文件中,以便下一次读取maser端新的binlog日志时能够告诉maser服务器需要从新binlog日志的哪个文件位置开始请求新的binlog日志内容。
⑤slave服务器端的sql线程会实时的检测本地relay log中新增加的日志内容,然后及时的把log文件中的内容解析程在master端曾经执行的sql语句的内容,并在自身slave服务器上按语句顺序执行应用这些SQL语句,应用完毕后清理应用过的日志。
⑥经过上面的过程,就可以确保master端和slave端执行了同样的sql语句。当复制状态正常的情况下,master端和slave端的数据是完全一样的,mysql的同步机制是有一些特殊的情况的。