Mysql支持单项、双向、链式级联、实时、异步复制,在复制过程中,一台服务器充当主服务器(master),另一个或多个其他的服务器充当从服务器(lave)。
复制可以是单向:M-->S,也可以是双向M<-->M,也可以多M环状同步等,不推荐双向、环状和多主一从复制方式
如果设置了链式级联复制类似A-->B-->C-->D,那么从服务器还会充当其下面从服务器的主服务器
当前生产中,大多数应用的mysql主从同步都是异步的复制方式,即不是严格实时的数据同步
配置好主从复制后,所有对数据库内容的更新必须在主服务器上进行,避免对主服务器和从服务器数据库内容更新不一致导致发生冲突,这通过禁止写从库实现。
方法1:采取忽略授权表的同步,同时对从服务器上的用户仅授权select权限,不同步mysql库,保证相同的用户在主库和从库具有不同的权限
忽略授权表同步,有两个思路1.master只发送需要同步的,2.slave只接收需要同步的
master端:
binlog-do-db= (二进制日志记录的数据库,多个数据库逗号隔开)
binlog-ignore-db= l(二进制日志中忽略的数据库)
slave端
replicate-do-db= (需要复制的数据库)
replicate-do-table= 设定需要复制的表
replicate-ignore-db= 设定需要忽略的复制数据库 (多数据库使用逗号,隔开)
replicate-ignore-table= 设定需要忽略的复制表
replicate-wild-do-table 同replication-do-table功能一样,但是可以通配符
replicate-wild-ignore-table 同replication-ignore-table功能一样,但是可以加通配符
方法2:在从服务器启动选项增加--read-only参数或者在my.cnf文配置文件中增加read-only参数,保证从服务器只允许来自从服务器线程或者具有super权限的用户的更新,而不接受来自普通用户的更新
授权用户和read-only参数同时使用效果更佳,也是生产环境中使用的方案
主从复制有利于数据库架构的健壮性、提升访问速度、易于维护管理。
1.主从服务器互为备份
当主服务器出现问题时,可以人工或自动切换到从服务器,参考资料http://oldboy.blog.51cto.com/2561410/1240412
① 挂到从库上,如果主库可以连上则将binlog拉到从库上,将从库的数据补到与主库一致(从库只备份)
② 双写,即写同时在主库和从库,压力会较大
③ 通过应用程序写一个1min的短时日志,恢复从库
④ 把异步同步换成实时同步(谷歌开发的一个半同步插件,主库和从库同时写成功才算成功,从库默认等待时间10s)
适用于非人为的硬件、服务故障,对于人为的误操作无能为力
2.主从服务器读写分离分担压力
主从服务器架构可通过程序(PHP、JAVA)或代理软件对客户端的请求实现读写分离,即主服务器进行update、delete等更新操作,从服务器提供select查询操作,保持实时同步,降低主库同时读和写的压力
中大型公司:PHP、JAVA
测试环境:代理软件(mysql-proxy、amoeba)
门户网站:分布式deproxy(百度、阿里读写分离,hash负载均衡,健康检查)
怎么确保写只在主库上进行
① 在从库上对连接用户的授权进行控制
② web程序的写指向主库,读指向从库
③设置从库只读不能写
④ 通过代理
3.根据服务器拆分业务
把几个不同的从服务器根据公司的业务进行拆分,例如有为外部用户提供查询的,有DBA用来进行备份的,还有提供公司内部人员访问的后台、脚本、日志分析及开发人员服务的
主从同步要求
在从库打开同步之前,要将同步位置点之前的主库数据灌到从库上,保证同步位置点之前主库与从库的数据一致;在主库上建立专门用于从库同步的专属账号;主库需要打开binlog。
主从同步原理
1.异步方式同步,是从库主动去找主库
2.逻辑同步模式(有多种模式),默认通过sql语句执行
3.主库通过记录binlog实现对从库的同步,binlog记录数据库的更新语句
4.主库1个IO线程,从库一个IO线程和一个SQL线程
5.从库关键文件,master.info、relay-log.000001、relay-log.info
6.如果从库还需要配置从库,需要开启log-bin和log-slave-updates参数
在从上配置change master to master_host=’ ’,master_port=’ ’,master_user=’ ’,master_passwod= ’’,master_log_file=’ ’,master_log_pos= ;start slave
首先,从库的sql进程开始工作,IO线程向主库发起请求
主库对从库的主机、端口、用户等进行验证,判断是否允许连接
允许连接后,主库从从库指定的日志位置点开始给从库发送binlog,并发送此次之后主库端新的binlog文件名称以及下一个指定更新位置
从库收到binlog后,IO线程将其写入relay-log.00000n,即中继日志
从库的sql线程实时检测中继日志的变化,如果发生变化就会读取日志,解析后形成sql在从库端执行写入从库,并将最后读取的文件名和位置记录到relay-log.info
从库的IO线程更新master.info,将最后取到的binlog文件名和位置点写入