前言:在企业实际应⽤中,成熟的业务通常数据量都⽐较⼤,⽽单台MySQL服务器在安全性、⾼可⽤性和⾼并发⽅⾯都⽆法满⾜实际的需求,我们可以在多台MySQL服务器(Master-Slave)部署主从复制来实现同步数据,再通过读写分离来提升数据库的并发负载能⼒。有点类似于rsync,但是不同的是rsync是对磁盘⽂件做备份,⽽mysql主从复制是对数据库中的数据、语句做备份。
一、相关概述
主从复制:主数据库(Master)发送更新事件到从数据库(Slave),从数据库读取更新记录,并执⾏更新记录,使得从数据库的内容与主数据库保持⼀致。
1、MySQL ⽀持的复制类型
1)基于语句的复制(STATEMENT):在主库上执⾏的 SQL 语句,在从库上执⾏同样的语句。MySQL 默认采⽤基于语句的复制,效率⽐较⾼。
2)基于⾏的复制(ROW):把改变的内容复制过去,⽽不是把命令在从库上执⾏⼀遍。
3)混合类型的复制(MIXED):默认采⽤基于语句的复制,⼀旦发现基于语句⽆法精确复制时,就会采⽤基于⾏的复制
2、MySQL主从复制的⼯作过程
1)Master 服务器保存记录到⼆进制⽇志
· MySQL主库上进⾏的增、删、改的数据更新,都会按顺序写⼊到⾃⼰的⼆进制⽇志(Binary log)当中
2)Slave 服务器复制Master 服务器的⽇志
· 然后MySQL从库开始一个I/O线程连接主库,读取主库的二进制日志,备份到从服务器的中继日志(Relay log)中。如果已经跟上主库,它会睡眠并等待Master产生新的事件,I/O线程将这些时间写入中继日志
3)Slave 服务器重放复制过来的⽇志
· 然后从库打开SQL线程,SQL线程读取I/O线程写⼊的中继⽇志,并且根据中继⽇志的内容更新从库的数据,使其与主库中的数据⼀致
重点:复制过程有⼀个很重要的限制,即复制在 Slave 上是串⾏化的,也就是说Master 上的并⾏更新操作不能在 Slave 上并⾏操作
⼆、读写分离
1、读写分离的概念
读写分离:读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),⽽从数据库处理SELECT查询操作。数据库复制被⽤来把事务性操作导致的变更同步到集群中的从数据库。
2、读写分离的作用
1)因为数据库的"写"(写10000条数据可能要3分钟)操作是⽐较耗时的。但是数据库的"读"(读10000条数据可能只要5秒钟)。
2)所以读写分离,解决的是,数据库的写⼊,影响了查询的效率。注意:数据库不⼀定要读写分离,如果程序使⽤数据库较多时,⽽更新少,查询多的情况下会考虑使⽤。利⽤数据库主从同步,再通过读写分离可以分担数据库压⼒,提⾼性能
3、MySQL 读写分离原理
1)读写分离就是只在主服务器上写,只在从服务器上读
2)基本的原理是让主数据库处理事务性查询,⽽从数据库处理 select 查询
3)数据库复制被⽤来把主数据库上事务性查询导致的变更同步到集群中的从数据库
4、比较常见的mysql读写分离有两种:
1)基于程序代码的内部实现
· 在代码中根据select、insert进行路由分类,这类方法也是目前生产环境中较为常用的,优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要研发人员来实现,运维人员无从下手。
2)基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接收到客户端请求后通过判断后转发到后端数据库。如下有两个常用代理:
· Mysql-proxy:其为mysql的开源项目,通过其自带的lua脚本进行sql判断。
· Amoeba:由陈思儒开发,该程序由Java语言进行开发。这个软件致力于mysql的分布式数据库前端代理层,它主要为应用层访问mysql的时候充当sql路由功能。Amoeba能够完成多数据源的高可用、负载均衡、数据切片等功能。
三、MySQL主从复制的部署
1、环境准备
需要两台或两台以上的MySQL数据库服务器,可一主一从或一主多从,下面展示的是两台Ubuntu服务器的配置,主(106.12.155.232) 从(154.221.20.249),
2、MySQL的主从配置
1)主服务器
· bind-address设置成0.0.0.0或者用“#”隐掉
· server_id 主服务器编号
· log-bin = mysql-bin 开启Binary log日志,可通过 show variables like '%log_bin%'; 查看开启状态
· binlog-do-db = database1设置要同步的数据库【此处不填则同步全部】
· binlog_ignore_db = database2设置不需要同步的库
· grant replication slave on *.* to user@154.221.20.249 identified by "password"; 给从服务器授权【此处user是主服务器账号,password是主服务器密码】,设置完可在154.221.20.249服务器上远程连接106.12.155.232,能连上说明已经对从服务器开启远程访问
1)从服务器
· bind-address设置成0.0.0.0或者用“#”隐掉
· server_id 从服务器编号
· relay-log = mysql-relay 开启中继器日志,可通过 show variables like '%relay_log%'; 查看开启状态
· relay log日志相关参数转自文档 MySQL的日志 - relay log_程序猿集锦的博客-CSDN博客_relaylog