企业架构MySQL读写分离

本文详细介绍了MySQL读写分离的背景、目的、原理及实现方式,包括通过业务代码配置和中间件代理两种方式。重点展示了在PHP中实现读写分离的示例代码,并提供了使用MyCAT作为中间件的详细配置步骤。此外,讨论了如何在业务代码中适配MyCAT以实现读写分离。
摘要由CSDN通过智能技术生成

学习目标和内容
1、能够理解读写分离的目的
2、能够描述读写分离的常见实现方式
3、能够实现通过业务代码配置读写分离案列
4、能够实现中间件读写分离案列
一、背景描述及其方案设计
1、业务背景描述
时间:2014.6.-2015.9
发布产品类型:互联⽹动态站点 商城
⽤户数量: 10000-12000(⽤户量猛增)
PV : 100000-500000(24⼩时访问次数总和)
QPS: 50-100*(每秒访问次数)
DAU: 2000(每⽇活跃⽤户数)
之前是单台MySQL提供服务,使用多台MySQL数据库服务器,降低单台压力,实现集群架构的稳定性和高可用性
通过业务比对和分析发现,随着用户活跃增多,读取数据的请求变多,故着重解决读取数据的压力
2、模拟运维设计方案
根据以上业务需求,在之前业务架构的基础上实现数据的读写分离
在这里插入图片描述

二、MySQL读写分离介绍
读写分离 读写操作,分发不同的服务器,读分发到对应的服务器(slave),写分发到对应的服务器(master)
1、读写分离的目的
读写分离 将读写业务分配到不同的服务器上,让服务器做特定的操作,不需要不断的切换工作模式,使工作效率提高 写主服务器,读从服务器
同时降低主服务器的压力,在正常业务下,也是读比较多的情况,写相对读少一些。
大约比例在写1/7读
读写分离:
①M-S下,读写必须分离,如果不分离,业务不可用出问题
②M-M 虽然可以随意读写操作,特定的操作交由特定的服务器操作,工作效率更高
2、读写分离的实现基础和原理
实现基础:通过主从复制机制实现数据的一致性 完整性
mysql的读写分离的基本原理是:
让master(主数据库)来响应事务性操作(create,update,delete,drop)
让slave(从数据库)来响应select非事务性操作
然后再采用主从复制来把master上的事务性操作同步到slave数据库中
没有主从复制,就无法实现业务上的读写分离
3、读写分离常见的实现方式
①业务代码的读写分离
需要在业务代码中,判断数据操作是读还是写,读连接从数据服务器操作,写连接主数据库服务器操作
以当前LNMP为例,就需要使用PHP代码实现读写分离
②中间件代理方式的读写分离
在业务代码中,数据库的操作,不直接连接数据库,而是先请求到中间件服务器(代理)
由代理服务器,判断是读操作去从数据服务器,写操作去主数据服务器

MySQL Proxy MySQL官方 测试版 不再维护
Atlas 奇虎360 基于MySQL Proxy
DBProxy 美团点评
Amoeba 早期阿里巴巴
cober 阿里巴巴
MyCat 基于阿里开源的Cober
也就是如下图示架构
在这里插入图片描述

问:如何选择?
①业务上实现更加方便,成本低一下,如果使用的开发框架不支持分布式数据库的部署模式,
业务的SQL需要修改,改代码
②中间件代理服务器 更加适合管理更多的数据库服务器集群,查看到服务器是否可用,
不只可以实现读写分离,使用中间件实现分库、分表的操作
三、MySQL读写分离案列实现
1、简单业务代码实现
在php普通脚本使用分布式数据库中,可以进行封装一个mysql操作类(OOP面向对象化编程)。建立两个或者多个数据库连接。通过判断操作类型,执行连接操作对应的数据库服务器。
示列代码:
class Mysql{
//封装连接属性
//单例模式 单例模式只存在一个实体对象,节省资源内存
// static 直接类名调用 常驻内存
//构造方法
public function __construct()
{
$master = mysql_connect(主数据库信息);
KaTeX parse error: Expected 'EOF', got '}' at position 32: …nnect(从数据库信息); }̲ //sql语句执行方法 pu…sql)
{
//判断是读操作
if(strpos(KaTeX parse error: Expected '}', got 'EOF' at end of input: …){ mysql_query(sql,KaTeX parse error: Expected 'EOF', got '}' at position 9: slave); }̲ else{ //判断是写操作…sql,$master);
}
}
}
在这里插入图片描述

脚本使用
在这里插入图片描述

通过脚本实现效果
测试时,根据服务器的实际情况修改主机地址、用户名称、用户密码
在这里插入图片描述

当slave宕机时效果
在这里插入图片描述在这里插入图片描述

当M-S正常使用情况下
在这里插入图片描述

2、框架配置实现
①通过查看thinkphp5手册找到处理方案
支持分布式
在这里插入图片描述

支持读写分离
如果是双主架构,可以不开启读写分离
在这里插入图片描述

tp框架实现原理代码段源码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

②操作实现
一定要先去确定主从数据库的数据一致(tp5shop),用户名称和密码可以进行登录使用
在这里插入图片描述
在这里插入图片描述

测试可以down主库,看从库是否可以访问。thinkphp5中,如果slave宕机,master提供读服务。
在这里插入图片描述
在这里插入图片描述

3、MyCAT
3.1、介绍
在这里插入图片描述

准备一台服务器,作为数据库的中间件服务器,配置基本环境,网卡、FQDN
master 192.168.17.101
slave 192.168.17.108
mycat 192.168.17.109
Mycat 数据库中间件
国内最活跃的、性能最好的开源数据库中间件!
官方网址:http://www.mycat.io/
https://github.com/MyCATApache/MyCAT-Server/
因为mycat是由java语言开发,必须使用jdk进行启动和操作
3.2、jdk安装
①下载安装jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html
在这里插入图片描述

上传mycat和jdk到soft目录下
在这里插入图片描述

shell > tar zxvf jdk-10.0.1_linux-x64_bin.tar.gz
shell > mkdir /usr/local/java/jdk-10.0.1
shell > mv jdk-10.0.1 /usr/local/java/jdk-10.0.1
在这里插入图片描述

②配置环境变量
shell > vim /etc/profile
添加以下内容
export JAVA_HOME=/usr/local/java/jdk-10.0.1
export JAVA_BIN=/usr/local/java/jdk-10.0.1/bin
export PATH=$PATH:/usr/local/java/jdk-10.0.1/bin
export CLASSPATH=./:/usr/local/java/jdk-10.0.1/lib:/usr/local/java/jdk-10.0.1/jre/lib
MYCAT_HOME=/usr/local/mycat/bin
export JAVA_HOME JAVA_BIN PATH CALSSPATH MYCAT_HOME
在这里插入图片描述

使配置生效
shell > source /etc/profile
在这里插入图片描述

3.3、mycat安装配置
③解压安装MyCAT
shell > tar xvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local
实际解压到目录即可,无需安装
查看软件目录
在这里插入图片描述

logs目录可以查看到错误日志
在这里插入图片描述
在这里插入图片描述

④修改配置文件
默认server.xml可以不用修改
配置中间件的登录用户名称和用户密码 对应映射的虚拟库的名称
编辑
在这里插入图片描述
在这里插入图片描述

修改schema.xml
这个文件可以使用分享给大家的精简的,方便使用和操作,注意给予执行权限
在这里插入图片描述

Tip:负载均衡属性简单说明
balance 属性
负载均衡类型,目前的取值有 3 种:

  1. balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
  2. balance=“1”, 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
    互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
  3. balance=“2”, 所有读操作都随机的在 writeHost、readhost 上分发。
  4. balance=“3”, 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
    writeType 属性
    负载均衡类型,目前的取值有 3 种:
  5. writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
  6. writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
    ⑤启动mycat服务
    shell > /usr/local/mycat/bin/mycat start
    通过查看端口或者进程的方式,确认是否启动
    在这里插入图片描述

Tip:如果配置之后,启动mycat,不能够启动
通过查看/usr/local/mycat/logs/wrapper.log
查看具体报错信息
在这里插入图片描述

以上操作完成MyCAT的读写分离配置
3.4、mycat客户端和管理端
⑥测试查看代理客户端 8066
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⑦测试查看管理监控端 9066
在这里插入图片描述

可以查看各数据库服务器的状态
在这里插入图片描述

mysql > show @@help; //查看管理监控端的所有帮助命令
mysql > show @@heartbeat; //查看服务器状态
在这里插入图片描述

3.5、业务代码配置
①确定服务都可用
server07的mycat可用
server02 sever06的mysql可用
②修改配置业务代码
修改database.php配置
在这里插入图片描述
在这里插入图片描述

注意业务代码,不直接连接真实数据库服务器了,连接mycat代理服务器

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值