搭建mysql主从复制及读写分离高可用基础架构(下)

2018-10-24 杰克 HA高可用高并发

      接上篇,在主从配置构建完成后即可搭建后面的读写分离部分了。逻辑架构并没有太大变化,只是在web前端部署了mysql-proxy用于读写分离。当然,也可以使用其他产品,比如mycat、amoeba等。

拓扑.jpg

mysql-proxy是mysql自家的官方中间件产品,安装并不复杂但需要很多依赖组件。在实际安装的时候因各自centos的安装版本不同可能会存在缺少依赖组件的情况,我将所有我认为需要的安装的组件均在安装之前 yum 安装上了,后面如果还有缺少的欢迎大家补充。

yum.png

将mysql-proxy下载后解压出来,这里我放在了“/mysql-proxy”目录下。注意后面配置文件的路径要与实际一致。为配置方便同时创建 lua脚本目录及 logs日志目录,并将2个.lua脚本文件复制到新建的lua目录下

proxy.png

然后在 /etc 目录下创建mysql-proxy配置文件mysql-proxy.cnf并填写如下配置。之前有人跟我说 proxy-address 项只填写IP地址不写 “:端口” 程序会使用默认的4040端口启动,但我在实际测试不行。如果IP地址后面不写 “:端口” 程序会以默认mysql的3306端口启动。我这里最终填写的是 192.168.1.244:4040

proxy-cnf.png

注意:mysql-proxy.cnf 配置文件里不能有多余的字符,空格也不行。上图每行后面的 # 部分的内容都要删除,否则启动会报如下错误:

err.png

最后配置mysql-proxy的读写脚本文件 rw-splitting.lua 可以说lua脚本文件是mysql-proxy的灵魂,对数据库的读写请求及后端分发规则均靠lua脚本来实现。好在官方程序里有个标准脚本文件也就是 rw-splitting.lua  文件内容对照官网资料基本能看懂,将 min_idle_connections 及 max_idle_connections 项从默认的 4,8 都改成 1

lua.png

所有配置文件都配置完成后可使用  /mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf  命令并加载mysql-proxy.cnf配置文件来启动 mysql-proxy  启动成功后使用netstat命令可以看到程序已经开始监听4040端口

start-netstat.png

程序启动后终端目前还不能连接mysql-proxy,因为在mysql-proxy.cnf里名为 pub 密码 123456 的数据库账户还没有在后端的mysql上创建。数据库账户一般存放在mysql库user表里,在上一篇的主从配置中并没有同步mysql库,所以需要分别登录后端的2台mysql里都创建这个账户并配置只允许192.168.1.244连接:

pub-user.png


以上步骤完成后,一个简单的读写分离架构就搭建完成。后面我们来测试验证读写分离的效果。从mysql-proxy.cnf配置文件及架构图上来看:192.168.1.231是主写入服务端,192.168.1.232是只读服务端,要验证读写分离的结果需要2台mysql的数据有差异才能进行分辨。临时将主从同步断开。登录从服务器192.168.1.232执行stop slave; 命令停止主从同步,并使用 show slave status\G 命令查看确认主从同步进程是否停止

stop-slave.png

登录2台主从服务器mysql,查看同一库表class下的数据是否一致

一致.png

然后我在我PC上使用navicat for mysql 来模拟终端写入数据,终端使用4040端口连接 mysql-proxy

navicat.png

连接上mysql-proxy后打开class库表,编辑code字段,增加几个数字并保存。然后关闭打开的class表

navicat-class1.png

回到2台主从服务器mysql  在主从同步关闭的情况查看同一库表class下的数据已经不一致了,数据写到了主写入服务器192.168.1.231上

差异.png

再回到模拟终端用 navicat for mysql 重新打开class表,发现从模拟终端打开看到的数据与在从服务器192.168.1.232上看到的数据一致。与主写入服务器192.168.1.231上的数据不一致,从这二个结果验证了数据的写入在主写入服务器 192.168.1.231上,数据的读取在从服务器 192.168.1.232上。并且数据不会写到从服务器192.168.1.232上,对于模拟终端来说从服务器192.168.1.232仅只读,即使pub账户在从服务器192.168.1.232有写入权限。测试结果与主配置文件 mysql-proxy.cnf 里的配置一致。mysql-proxy中间件成功实现了读写分离

all-data.png


      至此,基于mysql-proxy的读写分离已搭建完成并成功实现。

      不过在实际生产环境中,mysql-proxy 属于轻量级的mysql中间件产品,在一些业务复杂或数百万千万的并发环境中一般都不会选用它,可能会选择基于JAVA开发功能强大的amoeba等产品来实现


标签: 主从复制 高可用 读写分离 mysql-proxy 高并发

发表评论:

Powered by emlog 京ICP备17037512-1 e-mail:jackhkyin@163.com QQ:393147796