目录
一. MySQL读写分离原理
简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。
目前较为常见的 MySQL 读写分离分为两种
(1) 基于程序代码内部实现
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
(2) 基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。
1) MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行 SQL 判断,虽然是 MySQL 官方产品,但是 MySQL 官方并不建议将 MySQL-Proxy 用到生产环境。
2) Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java 语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。经过上述简单的比较,通过程序代码实现 MySQL 读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java 应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种应用一般会考虑使用代理层来实现。本章后续案例通过 Amoeba 实现。
3) MyCAT 是一款开源的分布式关系型数据库中间件,主要用于解决大规模数据存储和高效查询的需求。它支持分布式 SQL 查询,兼容 MySQL 通信协议,能够通过数据分片提高数据查询处理能力。MyCAT的前端用户可以将其视为一个数据库代理,使用 MySQL 客户端工具和命令行访问,而后端则可以通过 MySQL 原生协议与多个 MySQL服务器通信,或者使用 JDBC 协议与大多数主流数据库服务器通信
二. 案例环境
由五台服务器模拟搭建,网络拓扑图
案例需求
通过mycat实现MySQL数据库的读写分离
案例实现思路
(1) 安装MySQL数据库
(2) 配置MySQL主从复制
(3) 安装并配置mycat2
(4) 客户端测试读写分离
三. 案例实时
1. 搭建MySQL主从复制
所有节点的时间要同步 关闭防火墙和SELinux
安装MySQL数据库参考之前的发布过的文章
2. 配置master主服务器
在/etc/my.cnf 中修改或增加
重启MySQL服务
登录MySQL程序,给从服务器授权
mysql -uroot -p
其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要,Slave应从该点上进行新的更新。
3. 配置Slave从服务器
slave1修改或增加内容 server-id不能相同
重启服务
登录到mysql配置同步
如果要第二台从要连接第一台从也要配置给从服务器授权
配置slave2
4. 验证主从复制效果
主服务器新建一个库
两台从查看
5. 搭建MySQL读写分离
MyCAT是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了 MySQL协议的服务器。前端用户可以把它看作一个数据库代理,用 MySQL客户端工具和命令行访问,其后端可以用 MySQL原生协议与多个MySQL 服务器通信,也可以用 JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端 MySQL服务器里或者其他数据库里。
MyCAT 发展到目前,已经不是一个单纯的 MySQL,代理了,它的后端可以支持MySQL、SQL Server、0racle、DB2、PostgreSQl 等主流数据库,也支持 MongoDB 这种新型 NoSQL,方式的存储。未来,它还会支持更多类型的存储。
不过,无论是哪种存储方式,在最终用户看,MyCAT里都是一个传统的数据库表,支持标准的 SQL,语句进行数据的操作,这样,对前端业务系统来说可以大幅降低开发难度,提升开发速度。
5.1 安装mycat软件 (代理第四台)
Mycat 需要依赖于 JAVA,因此需要在读写分离代理所在的系统预先安装,JAVA环境
unzip 解开后 mycat2 安装包,将其移动到目录“/usr/local”
为简化输入,可将系统环境变量文件“/etc/profile”最后一行的内容追加 Mycat 安装目录的可执行文件所在绝对路径,更新后的“/etc/profile”文件最后一行的完整内容为:
把依赖包 mycat2-1.21-release-jar-with-dependencies.jar 和 mysql-connector-java-8.0.18.jar,原样移动或者复制到目录"/usr/local/mycat/lib"
为mycat命令添加权限 执行mycat -h验证安装的正确性
5.2 配置读写分离
Mycat2读写分离配置可分为:创建数据库连接账号、启动Mycat2与读写分离配置等几个步骤
创建 Mycat2工作所必须的账号
启动 Mycat2服务,需要有真实的数据库服务器支撑才能运行,因此,需要在 MySQL 服务器(其它被 Mycat2 支持的数据库也如此)创建账号并给账号授权,然后在 Mycat2 所在的宿主系统用 MySQL, 客户端用创建好的账号远程进行连接,验证账号的有效性和正确性。
已经做好了 MySQL,数据库间的主从同步,因此创建 Mycat2 所需账号的操作只需也只能在主数据库上进行
主
启动mycat2(代理第四台)
与 Mycat1.X版本相比,Mycat2 的配置基本不需要手动去修改配置文件,而是可以在 Mycat2 启动之后,登录 Mycat 管理后台,用 SQL 指令或者客户端工具进行配置。在启动 Mycat2之前,需要对原型库的数据源做相应的修改,修改的项主要是主数据库的连接信息,一个完整的修改过的原型数据源文件“/usr/local/mycat/conf/datasources/prototypeDs.datasource.json”的内容如下: 密码、ip、用户
因为已经对系统变量做了设置,所以在任意路径执行“mycat start”就可以启动 Mycat2。在 Mycat2的安装目录“/usr/local/mycat”下,存在目录“logs,打开此目录中的日志文件“wrapper.log””,可了解 Mycat2 服务的运行状况
客户端
用客户端工具连接mycat的服务端口TCP 8066,用户名与密码在配置文件“/usr/locat/mycat/conf/users/root.user.json”
在客户端是没有安装mysql数据库的,要连接mycat就要安装mysql工具
用命令连接mycat管理后台的指令为“mysql -uroot -p123456 -P8066 -h192.168.10.104”,进入用户交互界面,表名mycat2运行正常,可在此交互界面进行读写分离配置
5.3 Mycat2配置读写分离
两种配置 MySQL读写分离的方法,一种是直接在 Mycat 的配置目录“/usr/1ocal/mycat/conf”的子目录编辑相关的文本文件(Mycat1.x版本只用这种方法)另一种登录到 Mycat 交互界面,用特殊语法的 SQL 命令进行配置。
这里用第二种方法
第一步:Mycat 增加数据源
需要正确输入的数据主要包括: MySQL, 主从数据库的 IP地址、数据库库名(schema)、数据库账号、数据库密码(生产数据库请使用复杂密码)、实例类型(READ、WRITE 或 READ WRITE)。
增加主库master
增加从库slave1和slave2
查看数据源信息
如果数据源配置有误可使用“/*+ mycat:resetConfig{} */;”进行重置
正确执行完上面语句后,在目录/usr/local/mycat/conf/datasources下自动生成三个文本文件,文件名以已经执行的SQL语句中“name”的键值做前缀
创建mycat集群
执行完命令后会在/usr/local/mycat/conf/clusters自动生成mycat集群配置文件“cls01.cluster.json”
修改群集配置表橙色的地方,表示所有显示请求路由到从节点(事务内除外)
另一句是所有节点按固定顺序依次接收读请求
修改负载均衡的默认策略为轮询
修改配置后需重启mycat
6. 验证mycat读写分离
登录mycat群集,创建测试库和测试表
注意:
在创建完库以后在mycat的schema目录下会有一个以该库命名的文件,要修改文件上mycat的群集,然后重启mycat
添加了一行“targetName”:“cls01”
停止slave1和2的主从同步
在master和slave1、2创建测试数据
主
从1
从2
测试
登录mycat集群,查询test.zhao的数据
第一次查询
第二次查询
第三次查询
登录mycat测试写入操作
在slave1和2上查询不到,在master上才能查看到这条语句内容,说明写操作在master服务器上,由此验证,已经实现了mysql读写分离,目前所有的操作都全部在master主服务器上,用来避免数据的不同步,所有的读操作都分摊给了slave从服务器,用来分担数据库的压力
主查看到了写入的数据
从查看不到 从1
从2