mysql主从复制介绍

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文件名和位置点写入

 

posted @ 2018-12-01 16:14  Forever77  阅读(276)  评论(0编辑  收藏  举报