MySQL主从复制与读写分离

MySQL主从复制原理

MySQL的主从复制和 MySQL的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
(1)MySQL支持的复制类型
①基于语句的复制。在主服务器上执行的 SQL语句,在从服务器上执行同样的语句。
MySQL 默认采用基于语句的复制,效率比较高。②基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。③混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

(2)复制的工作过程MySQL 复制的工作过程如图 6.2 所示

①在每个事务更新数据完成之前,Master将这些改变记录进二进制日志。写入二进制日志完成后,Master通知存储引擎提交事务。
② Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程--I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlogdump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上
Master,它会睡眠并等待 Master 产生新的事件。I/0 线程将这些事件写入中继日志。③ SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

MySQL读写分离原理

简单来说,读写分离(图63)就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

目前较为常见的 MySQL 读写分离分为两种。
(1)基于程序代码内部实现
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
(2)基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。
① MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL判断,虽然是 MySQL 官方产品,但是 MySQL 官方并不建议将 MySQL-Proxy 用到生产环境。
② Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由 Java 语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
经过上述简单的比较,通过程序代码实现 MySQL读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种应用一般会考虑使用代理层来实现。本章后续案例通过 Amoeba 实现。

实验环境

本案例环境使用五台服务器模拟搭建,具体的网络拓扑如图6.4所示

3.案例实现思路
(1)安装 MySQL 数据库;
(2)配置 MySQL 主从复制;
(3)安装并配置 Amoeba;
(4)客户端测试读写分离。

案例实施

搭建MySQL主从复制

1.建立时间同步环境在主节点上搭建时间同步服务器。

(1)安装 NTP

(2)配置ntp

(3)
重启服务并设置为开机启动。

4. 安装 MySQL 数据库
在 Master、Slave1、Slave2 服务器上安装 MySQL 数据库
(1)编译安装 MySQL

(2)编辑配置文件

(3)优化调整

(4)初始化数据库。

(5)启动MySQL服务

配置master主服务器

1在/etc/my.cnf 中修改或者增加下面内容

2、重启MySQL服务

3、登录MySQL程序,给从服务器授权

其中 File 列显示日志名,Position 列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave 应从该点上进行新的更新。
6. 配置 Slave 从服务器
在 Slave1、Slave2 服务器上面分别执行下面步骤。
(1) 在/etc/my.cnf中修改或者增加下面内容,这里要注意 server-id 不能相同。

2、重启MySQL服务

3))登录 MySQL,配置同步。
按主服务器结果更改下面命令中 master_log_file 和 master_log_pos 参数。

4启动同步

查看 Slave 状态,确保以下两个值为YES

搭建MySQL读写分离

Amoeba(变形虫)项目开源框架于 2008 年发布一款 Amoeba for MySQL 软件。这个软件致力于 MySQL的分布式数据库前端代理层,它主要为应用层访问 MySQL 的时候充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由到相关的目标数据库、可并发请求多台数据库。通过 Amoeba 能够完成多数据源的高可用、负载均衡、数据切片的功能,目前 Amoeba 已在很多企业的生产线上使用,其版本可在官网进行下载。
1.在主机 Amoeba 上安装 Java 环境
因为 Amoeba 基于是jdk1.5开发的,所以官方推荐使用 jdk1.5或 1.6版本,高版本不建议使用。

Java 环境已配置成功。
2.安装并配置 Amoeba 软件

配置无误后,可以启动 Amoeba 软件,其默认端口为tcp 8066

4. 测试
(1)在 Client 主机上。

同时,在 Amoeba 的服务器上面有如下报错日志。amoeba Could not create a validated object, cause: ValidateObject failed是因为 dbServers.xml中的用户,需要在主从机上分配权限。同时注意该文件中的
<!-- mysql schema --><property name="schema">test</property>test 数据库肯定是要存在的。所以在 Master、Slave1 和 Slave2 上面创建 test 数据库,就可以解决此问题。
(2)在 Master上创建一个表,同步到各从服务器上,然后关掉各从服务器的 Slave功能,再插入区别语句。

分别在两台从服务器上执行以下操作。

从服务器上同步了表,手动插入其他内容。

(4)测试读操作。
在 Client 主机上第一次查询的结果如下

第二次查询结果如下

第三次查询的结果如下

由此验证,已经实现了MySQL读写分离。目前所有的写操作都全部在Master主服务器上,用来避免数据的不同步:所有的读操作都分摊给了Slave从服务器,用来分担数据库压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值