MySql教程

mysql主从复制、读写分离

本文主要是介绍mysql主从复制、读写分离,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

主从复制原理

主从复制原理核心在于2个日志文件,3个线程

  • 2个日志:二进制日志和中继日志
  • 三个线程:master上的dump线程,slave上的IO线程和SQL线程
  1. master服务器上的dump线程会监听二进制日志的更新,如果有更新内容就会提示slave服务器的I/O线程
  2. slave服务器的I/O线程会向master服务器申请同步二进制日志的更新
  3. master服务器的dump线程就会把同步的二进制日志的更新内容给予slave服务器,slave服务器的I/O线程就会将同步内容写入自己的中继日志
  4. slave服务器的sql线程会把中继日志中的更新语句执行到数据库中,以达到和master服务器趋近一致

二进制日志的保存方式

①STATEMENT(基于SQL语句):
每一条涉及到被修改的sql 都会记录在binlog中
缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题
②ROW(基于行):
只记录变动的记录,不记录sql的上下文环境
缺点:如果遇到update…set…where true 那么binlog的数据量会越来越大
③MIXED 推荐使用:
一般的语句使用statement,函数使用ROW方式存储

主从复制策略

  • 全同步:master请求服务时,等待slave全部同步之后才会回应client端
  • 半同步:master请求服务时,只要任意一个slave同步
  • 异步(默认):master请求服务时,只要master同步即回应请求,不管slave的状态

读写分离原理

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

读写分离的好处

  • 数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。
  • 利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能

实现方式

常见的MysQL读写分离分为以下两种:
基于程序代码内都实现

在代码中根据select、insert进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
①MySQI-Proxy。MySQI-Proxy为 MySQL 开源项目,通过其自带的lua脚本进行SQL 判断。
② Atlas是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy
0.8 .2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
③ Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

Amoeba简介

Amoeba: 是一 个以MySQL为底层数据存储,并对应提供MySQL协议接口的proxy(代理),外号变形虫。
读取请求发送给从服务器是,采用轮询调度算法。
amoeba使用的java语言编写,配置文件为xml。
amoeba主要负责对外的一个代理IP。
访问这个IP时,发送的请求为“写"请求,则会转给主服务器。
当发送的请求为“读"时,会通过调度转发给从服务器,使用轮询算法,轮流分配给两台从服务器。
amoeba可以视为调度器,如果主服务器挂掉(单点故障),则会有MHA解决这个问题。
 

主从复制、读写分离实验

下面为5台实验用虚拟机(防火墙、安全防护已关闭):

master:192.168.220.30 

slave1:192.168.220.35

slave2:192.168.220.40

amoeba:192.168.220.45

client:192.168.220.50

主从时间同步阿里云时钟服务器:

 创建一个定时任务,每10分钟同步一次时间:

配置主从同步:

 从服务器配置:

 

master上配置:

 

给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456;然后刷新权限表(flush privileges)

 从数据库:

slave同步主服务器:

 

同理slave2上进行同样操作

下面进行测试:

 主数据库进行操作:

 然后到从服务器上验证:

 可以看到有同步成功

下面进行读写分离实验:

首先安装java环境,安装jdk,将amoeba-mysql-binary-2.2.0.tar.gz和jdk-6u14-linux-x64.bin上传到opt目录下

cp jdk-6u14-linux-x64.bin /usr/local/
chmod +x jdk-6u14-linux-x64.bin 
./jdk-6u14-linux-x64.bin  			    #一直往下翻页--yes--enter
mv jdk1.6.0_14/ /usr/local/jdk1.6		#重命名以便于环境变量的设置

 

export JAVA_HOME=/usr/local/jdk1.6			                   #指定jdk的位置
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib  #指定执行文件的位置
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin #指定环境位置
export AMOEBA_HOME=/usr/local/amoeba		                   #amoeba文件的位置
export PATH=$PATH:$AMOEBA_HOME/bin		                      #调用家目录识别amoeba的bin文件

 

安装amoeba软件

 

 

配置amoeba读写分离,两个slave读负载均衡: 

 

 

下面用client端进行验证:

下面进行测试:

 测试一:client上创建一个表,三台MySQL服务器都能看到

client上:

三台mysql服务器:

master上的:

 slave上:

 测试二:测试读写分离

slave1,2上执行以下操作:

关闭主从同步

 然后在client上插入数据:

master上验证:

 

slave1,2上验证:

可以发现slave1,2上查看不到了

 测试三:读写分离中轮询读的操作

slave1操作:

slave2操作:

 client上查看:可发现是以轮询的方式查看的

这篇关于mysql主从复制、读写分离的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!